Re: strcpy, strlcpy.
新城@筑波大学情報です。こんにちは。
古い記事が読まれると、新しい記事よりも嬉しいですね。いい記事
だったんだなあという感じがして。
In article <c17e5u$2eji$1@news2.rim.or.jp>
dohzono@hf.rim.or.jp (Kazuo Fox DOHZONO) writes:
> つらつらとその理由を考えてみたのですが, 要するに strcpy では問題のある
> ようなアプリケーションが, strlcpy によって直ちに正しく動作するようにな
> るわけではない, ということかな.
>
> ・ほとんどの場合その前にチェック出来るハズ.
はい。それはそうです。strlcpy() は、バッファ・オーバーフロー
を起さないという目的で使うものです。strlcpy() を使ったからと
いって、間違ったプログラムが「正しく」動作するようになるわけ
ではありません。
> 何も考えずに strlcpy 使って, 長さを越えた場合に適当に truncate とかす
> る人がいたりすると, "foobar" で登録したデータが "foobar" でも "foo" で
> も読めてしまうといった問題が紛れ込んだりするかもしれません.
> それよりはテストで落ちてもらった方がありがたいと思うのですが.
テストでは、バッファ・オーバーフローは見つかりにくいんじゃな
いですか。それより、"foobar" が "foo" につめられて動作がおか
しいいう方が見つかりやすいんじゃないかなあ。
> ・間違いやすい人間に毎回長さを指定させるなんて.
> まぁこれも結構大きい理由でしょう. それと
> ・長さだけ指定してチェックしないってことはないよね?
> if (strlcpy (buf, src, sizeof buf) == sizeof buf)
> /* さて, どうするの? */;
> 間違いやすい人間に毎度毎度チェックさせるの? という話にもなります.
それは、同感です。まあ、マクロ一発という話もありますけど。
#define Strlcpy(dst, src, size) if( (strlcpy((dst),(src),(size))>=(size)) ) \
error("buffer over flow.")
それで、毎回チェックするのがいやになったら、C言語をやめて
Javaに移るわけです。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735