新城@筑波大学情報です。こんにちは。

In article <c2v18b$1g7t$2@nsvn01.zaq.ne.jp>
        shirai@unixusers.net (Takashi SHIRAI) writes:
>  しらいです。
>  文法的に strcpy() を許さないような仕組みは簡単に用意出来る
> でしょうけど、strcpy() を全て strlcpy() に置換えたからと言っ
> て、文字列 copy 時の buffer overflow に関して programmer が
> 一切注意を払わなくて済むというのは思い上がりなんじゃないかと
> 思います。

誰も「一切注意を払わなくて済む」とは言っていないと思います。
strcpy() を使うより strlcpy() を使った方が形式的に分かるから、
その分、プログラミングが楽だという話です。

> >strcpy() を正しく使っているプログラムの例を出してもらえませ
> >んか。strcpy() を正しく使っているかどうか、パッと見ても分か
> >らないと思います。局所的に見てもわからなかったり。
>  例えば元々同じサイズの char 型配列間で copy する時なんかだ
> と、source 側で buffer overflow が起こっていない限り strcpy()
> で buffer overflow は発生し得ませんよね。

こういう場合でも、strcpy() より strlcpy() が楽です。

char a[100],b[100];
...
        strcpy( a,b );                  /* (1) */

        if( strlcpy(a,b,sizeof(a)) >= sizeof(a) )    /* (2) */
        {
            ....;
        }

ここで、(1) と (2) を比べます。strcpy() でバッファ・オーバー
フローが起きないことを調べるには、次のことを調べる必要があり
ます。

    ・元々同じサイズの char 型配列間で copy であることを確認する
    ・source 側で buffer overflow が起こっていないことを確認する

strlcpy() の場合、こうります。

    ・if文を通り越して下に抜けたことを確認する

こんな感じで、strlcpy() を使った方が、プログラマが楽できます。
コストが下がると言ってもいいです。

>  そもそも「問題意識」って「根性」とは別物だと私は考えている
> ので、「精神さえ鍛えれば竹槍で戦闘機が落とせる」なんて世界と
> 同列には考えられません。
>  横断歩道を渡る時には信号を過信せず左右の確認をしましょうと
> いったような、安全に対する問題意識の話をしているつもりなんで
> すが、これって精神論とはまた別ではありませんか?

問題意識は、わかりました。それで、問題意識が高ければ、使える
道具、この場合は、strlcpy() ですが、そういう道具を使うという
のが結論として出て来るんじゃないですか。

エアバッグも付けた方がいいし、横滑り防止装置も付けた方がいい。
交通信号も付けた方がいい。交通信号だけ信じて突っ込むのはバカ
です。

> >バッファ・オーバーランのバグが出たとして、それを探したり回収
> >したりするコストは、莫大ですよ。それに比べたら、strcpy() を 
> >strlcpy() にするのなんか、コストはそんなにかからないでしょ。
> 
>  そうですか?char 型 pointer を引数に持つ関数全てに size も
> 渡してやるのは結構大きなコストになると思いますけど。strlcpy()
> の portability もそこそこ大きな問題かと。

strlcpy() くらい、なければ自分で書いて入れたらいいじゃないで
すか。BSD からコピーしてきてもいいし。

可変長なら、ポインタと大きさをいっしょに渡すのは、安全なプロ
グラムを書く時には当然の話です。関数呼出しで、担当者が違うか
もしれないし、同じ担当者でも何ヵ月も置いてからいじるかもしれ
ないわけでしょ。これは大丈夫なんて、いちいち覚えていられませ
んよ。そんなことを覚えるのはコストがかかります。それよりは、
可変長の場合は全部大きさも引き回すようにした方が覚えるコスト
が下がって楽できるというものです。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\