- PR -

32bit環境から64bit環境へのCプログラムの移植について

投稿者投稿内容
ちゃっぴ
ぬし
会議室デビュー日: 2004/12/10
投稿数: 873
投稿日時: 2007-06-20 00:48
> また、ちゃっぴさまご指摘の、pSrcの検証については

いえ、なんか誤解されているようですけど、私の指摘は関数内部で pSrc を検証しなくてもいいのかな〜?ということです。
# というより、私のあいまいな書き方がわからないですね〜。すいません。

まあ、実際のところ pSrc を検証しなくてもまあこの場合に限っては問題ないと思いますが、C言語で入力の長さすら検証せず strncpy するのは気持ち悪いので。。。

それから、関数の定義自体に不正な入力があった場合の考慮が欠けているのも気になります。
# C なので例外返すのは無理ですが、そういった場合戻り値使ったりしません?
_________________
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2007-06-20 01:53
引用:

ちゃっぴさんの書き込み (2007-06-20 00:48) より:
C言語で入力の長さすら検証せず strncpy するのは気持ち悪いので。。。


べつに問題ないと思うですが。
strcpy()だと極めてまずいですけど。

引用:

それから、関数の定義自体に不正な入力があった場合の考慮が欠けているのも気になります。


なにが入ってるのか、なにが返ってきたのかチェックしてないのが気になるといえば
気になりますが、それはよそでやっているかもしれないし、これだけではなんとも。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2007-06-20 10:14
ちゃっぴさま

ご回答ありがとうございます。
また、こちらからの返信が度々遅れまして申し訳ありません。

引用:

> また、ちゃっぴさまご指摘の、pSrcの検証については

いえ、なんか誤解されているようですけど、私の指摘は関数内部で pSrc を検証しなくてもいいのかな〜?ということです。
# というより、私のあいまいな書き方がわからないですね〜。すいません。



なるほど、本当にまったく誤解していました。
こちらこそ理解力不足で申し訳ございません。

関数内先頭で、pSrcが不正な文字列であったりした場合、
エラー時の戻り値をセットして処理を抜ける、
などと言った処理が必要ではないか、と言うお話ですよね。
確かに必要だと思います。

ただ、ぽんすさまの以下ご指摘にもあるように、

引用:

なにが入ってるのか、なにが返ってきたのかチェックしてないのが気になるといえば
気になりますが、それはよそでやっているかもしれないし、これだけではなんとも。



現在のところプログラムの全容を確認していないので、
どこでどのような処理をしているのか、
関数の中で引数のチェックは本当に不要なつくりになっているのか、
などなど、確認したいと思います。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-06-20 10:25
引用:

ぽんすさんの書き込み (2007-06-20 01:53) より:
引用:

ちゃっぴさんの書き込み (2007-06-20 00:48) より:
C言語で入力の長さすら検証せず strncpy するのは気持ち悪いので。。。


べつに問題ないと思うですが。
strcpy()だと極めてまずいですけど。



問題あると思いますよ。
ブラウザのコードでこんなのが見つかったら、
緊急レベルの脆弱性につながるかもしれません。

書き込みはしていないにしろバッファオーバーランなわけで。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2007-06-20 10:34
関係ないですが、

>*pMonth = NULL;

ってコンパイラがよきに計らってくれているだけで、おかしいですね。
1co
常連さん
会議室デビュー日: 2005/08/10
投稿数: 39
投稿日時: 2007-06-20 10:43
あしゅさま、mioさま、ご指摘ありがとうございます。

当方の知識が乏しく、本当に申し訳ないのですが、
この関数ひとつとっても、
「たまたま動いていた」とか、「なんとなくコンパイラが処理してくれていた」と言う箇所が複数ありますし、
引数のチェックも欠落しているのでは?と言う心配もありますし、
かなり心配になってきました。

これは、相当細かくチェックしないといけませんね。。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-06-20 13:02
引用:

べつに問題ないと思うですが。
strcpy()だと極めてまずいですけど。


strncpy() であっても危険ですよ。strncpy() はヌルが見つからない場合、ヌル文字なしで n 文字埋めてしまい、ヌル終端されていない文字列ができあがってしまいます。そのため、提示されているコードの後続部分 atoi() が正しく動作する保証もなくなります。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2007-06-20 20:10
引用:

あしゅさんの書き込み (2007-06-20 10:25) より:
引用:

ぽんすさんの書き込み (2007-06-20 01:53) より:
引用:

ちゃっぴさんの書き込み (2007-06-20 00:48) より:
C言語で入力の長さすら検証せず strncpy するのは気持ち悪いので。。。


べつに問題ないと思うですが。
strcpy()だと極めてまずいですけど。



問題あると思いますよ。
ブラウザのコードでこんなのが見つかったら、
緊急レベルの脆弱性につながるかもしれません。

書き込みはしていないにしろバッファオーバーランなわけで。


長さ3バイトのバッファに対して、長さ2バイト以内のコピーを行っているので
バッファオーバーフローは生じ得ません。

引用:

未記入さんの書き込み (2007-06-20 13:02) より:
strncpy() であっても危険ですよ。strncpy() はヌルが見つからない場合、ヌル文字なしで n 文字埋めてしまい、ヌル終端されていない文字列ができあがってしまいます。そのため、提示されているコードの後続部分 atoi() が正しく動作する保証もなくなります。


それは最初にcoasmさんが指摘されたことで言い尽くされてますよね。
"20070617"から"06"を切り出しているのだから、もとより06のうしろは
null終端されていません。
strncpyする前に長さをチェックしても意味がありません。

スキルアップ/キャリアアップ(JOB@IT)