Re: strcpy, strlcpy.
新城@筑波大学情報です。こんにちは。
In article <c2esvq$2ta5$1@nsvn01.zaq.ne.jp>
shirai@unixusers.net (Takashi SHIRAI) writes:
> >いいえ。トータルで考えれば、バグ入りプログラムからバグを見つ
> >けるより、最初からバグがないプログラムを書く方が楽(得)です。
> この「最初からバグがない」という点が過信に繋がり兼ねないと
> 思うので、私はこの考えには危険が伴うと思います。
strcpy() と strlcpy() の話と「最初からバグを入れない」という
話は別の話です。strcpy() を単純に strlcpy() 変えてもバグは残
ります。つまり、分類(A)(B)両方の話です。
> この過ちを侵している代表例が Samba ですね。こいつは一つも
> strcpy() を使わないように工夫していますが、長さ指定ミスによ
> る buffer overflow は過去幾つも発見されています。
具体的にどんなバグだったのでしょうか。これを検証すると面白い
データが得られると思います。
> strlcpy() 自体は有用な関数だと思いますが、それを使うことが
> 即「セキュリティ上の弱点に繋がる間違い」を完全に回避出来ると
> する思い込みは、却って危険だと思います。
同感です。
> 長さの指定を programmer に委ねている時点で fgets() も同じ
> ことだと思います。私は fgets() の代わりに asprintf() みたい
> な仕組みを実装することが多いですね。
asprintf() って何ですか?
strcpy()/strlcpy() のスタイルよりも snprintf() のスタイルの
方がよいとは思います。
> # 私は library bug に何度も悩まされた挙げ句、library 関数
> #の互換品を自作する癖がついちゃいましたが :-)
具体的に何というライブラリでしょうか。さしつかえなければ教え
て下さい。
「最初からバグが入らないようにする」というのは、雑誌
Software Design の1月号の Bart Eisenberg の Pacific
Connection に出ていたと思います。
In article <c2gqsb$q3u$1@dnknews.denken.or.jp>
TAKENAKA Kiyoshi <takenaka@criepi.denken.or.jp> writes:
> >人間がやることではないということには同意します。コンパイラな
> >ど言語処理系でやるべき仕事でしょう。でもコンパイラがしょぼい
> >と人間がやるしかありません。
> コンパイラがしょぼい場合は、人間ではなく、プログラムにやらせれば
> よいでしょう。
プログラムにやらせるとして、具体的にどうすればいいんですか?
コンパイル時に働くプログラムがコンパイラとして、実行時に何か
やればいいということですかね。実行時にライブラリ関数でやると
いうことでもいいですが、その方法の1つが strcpy() じゃなくて
strlcpy() ではあるんですけれど。
コンパイラでやる方法にも、StackGuard とか Fail-safe C とかい
ろいろあります。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
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