- - PR -
32bit環境から64bit環境へのCプログラムの移植について
投稿者 | 投稿内容 | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-06-20 00:48
> また、ちゃっぴさまご指摘の、pSrcの検証については
いえ、なんか誤解されているようですけど、私の指摘は関数内部で pSrc を検証しなくてもいいのかな〜?ということです。 # というより、私のあいまいな書き方がわからないですね〜。すいません。 まあ、実際のところ pSrc を検証しなくてもまあこの場合に限っては問題ないと思いますが、C言語で入力の長さすら検証せず strncpy するのは気持ち悪いので。。。 それから、関数の定義自体に不正な入力があった場合の考慮が欠けているのも気になります。 # C なので例外返すのは無理ですが、そういった場合戻り値使ったりしません? _________________ | ||||||||||||||||
|
投稿日時: 2007-06-20 01:53
べつに問題ないと思うですが。 strcpy()だと極めてまずいですけど。
なにが入ってるのか、なにが返ってきたのかチェックしてないのが気になるといえば 気になりますが、それはよそでやっているかもしれないし、これだけではなんとも。 | ||||||||||||||||
|
投稿日時: 2007-06-20 10:14
ちゃっぴさま
ご回答ありがとうございます。 また、こちらからの返信が度々遅れまして申し訳ありません。
なるほど、本当にまったく誤解していました。 こちらこそ理解力不足で申し訳ございません。 関数内先頭で、pSrcが不正な文字列であったりした場合、 エラー時の戻り値をセットして処理を抜ける、 などと言った処理が必要ではないか、と言うお話ですよね。 確かに必要だと思います。 ただ、ぽんすさまの以下ご指摘にもあるように、
現在のところプログラムの全容を確認していないので、 どこでどのような処理をしているのか、 関数の中で引数のチェックは本当に不要なつくりになっているのか、 などなど、確認したいと思います。 | ||||||||||||||||
|
投稿日時: 2007-06-20 10:25
問題あると思いますよ。 ブラウザのコードでこんなのが見つかったら、 緊急レベルの脆弱性につながるかもしれません。 書き込みはしていないにしろバッファオーバーランなわけで。 | ||||||||||||||||
|
投稿日時: 2007-06-20 10:34
関係ないですが、
>*pMonth = NULL; ってコンパイラがよきに計らってくれているだけで、おかしいですね。 | ||||||||||||||||
|
投稿日時: 2007-06-20 10:43
あしゅさま、mioさま、ご指摘ありがとうございます。
当方の知識が乏しく、本当に申し訳ないのですが、 この関数ひとつとっても、 「たまたま動いていた」とか、「なんとなくコンパイラが処理してくれていた」と言う箇所が複数ありますし、 引数のチェックも欠落しているのでは?と言う心配もありますし、 かなり心配になってきました。 これは、相当細かくチェックしないといけませんね。。 | ||||||||||||||||
|
投稿日時: 2007-06-20 13:02
strncpy() であっても危険ですよ。strncpy() はヌルが見つからない場合、ヌル文字なしで n 文字埋めてしまい、ヌル終端されていない文字列ができあがってしまいます。そのため、提示されているコードの後続部分 atoi() が正しく動作する保証もなくなります。 | ||||||||||||||||
|
投稿日時: 2007-06-20 20:10
長さ3バイトのバッファに対して、長さ2バイト以内のコピーを行っているので バッファオーバーフローは生じ得ません。
それは最初にcoasmさんが指摘されたことで言い尽くされてますよね。 "20070617"から"06"を切り出しているのだから、もとより06のうしろは null終端されていません。 strncpyする前に長さをチェックしても意味がありません。 |