パスワードを忘れた? アカウント作成
396328 journal

yhの日記: Interviews: Theo de Raadt Responds (8) 4

日記 by yh
(引っ越しました。)
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • Code-auditing by AT
    コードを監査するに当たって、何かアドバイスをいただけませんか。今までバグを見つけてきた経験から有用だったティップスや方法に関して教えていただけるとありがたいです。仕上がったばかりのコードの場合は、まずどこを探りますか?。成熟したコードの場合は?。

    Theo:
    一番のティップスは、今よりももっと良いプログラマーになる、ってことかな。特に、対象のプログラムがどんな関数を使っているのか調べること、そしてその関数の決まりごとをきっちりと守って使っているか確かめることが重要だよ。これを読む人の中の果たして何人が、libcの全ての関数の完全で正しいセマンティクスを知っているんだろう。全部と言わずに、今監査しているプログラムの中で使っているlibcの関数についてだけでも、ちゃんと分かっている人はどれだけいるんだろうね。(どういうことかって言うと、今までソースツリー全部を調べてきて、strncat()やstrncpy()の呼び出しのだいたい半分は微妙に間違っていたし、もし一文字足してしてヌル文字で終端するだけのつもりなら、それはやっぱりいい具合じゃないってこと)

    APIを完全に身に付けた時に、簡単にバグを見つけることができるようになるだろう。勤勉さが必要な他の仕事と一緒だと思うよ。注意深くあって欲しい。人は前例から学ぶものなのに、依然としてソフトウェアプログラミングの世界では、その途方もない複雑さが見つけにくいバグを生み、それはさらに新しいコードにコピーされているんだ。関数を間違って定義したマニュアルを見つけたことすらある。それを僕らが見つけた時には、すでに多くのプログラマーがその間違ったやり方でプログラムを書いていた…。

    ----------
    ssh使わない日はないし、BSDが押され気味なのはちょっと悔しいし、どれくらい直されるのかを見てみたいと言う恐いもの見たさでやってみました。

    訳に迷っているところばかりですけれど、特に一番最後

    lots of programmers had followed the instructions incorrectly...
    が怪しいです。私の訳だと、
    lots of programmers had followed the incorrect instructions...
    になっていますから。本当は「間違ったマニュアルを元にさらに間違ってコーディングされていた」ってことかな。

    strncat()とstrncpy()のくだりも、manは読みましたが、

    they copied a character extra
    が自信ありません。万年Hello worldなものでして。

    • strncat()とstrncpy()のくだりも、manは読みましたが、

      strcat/strcpy はバッファオーバーフローの元凶だということで strncat/strncpy に置き換えるのだが,それの使い方がなってないと言うことでしょうね. strncat/strncpy は,第3引数に「コピーする文字列のバイト数」を渡すけれど,これには終端のヌル文字を含まないので,うっかりそれを忘れてバッファの残りサイズをそのまま渡すと,

      • strncat の場合,最悪バッファの次の1バイトをゼロクリアする
      • strncpy の場合,最悪バッファの最後までコピーしたあげく終端のヌル文字がない

      ということになります.はっきりいってわかりにくいし,使いにくいので,その代わりに strlcat/strlcpy があるのですが.

      親コメント
      • numaさん、こんにちは。フォロー下さいましてどうもありがとうございます。うーん、じぇんじぇん違うですね。

        仕事が退けたらnumaさんにいただいたのをもとにググって、該当部分を書き直してみます。一回で済まずに、お手間をとらせることになってごめんなさい > yhさん。

        私などより、よほどましに訳せて、ここらの文脈に明るい方がいらっしゃると思いますので助け舟お願いします > お読みのみなさま。

        親コメント
  • by SOggy (10951) on 2003年05月01日 18時58分 (#308180) 日記

    コード監査 by AT
    コードを監査するに当たって、何かアドバイスをいただけませんか。今までバグを見つけてきた経験から有用だったティップスや方法に関して教えていただけるとありがたいです。出来立ての若いコードの場合は、まずどこを探りますか?。古いコードの場合は?。

    テオ:
    一番のティップスは、今よりももっと良いプログラマーになる、ってことかな。特に、対象のプログラムがどんな関数を使っているのか調べること、そしてその関数の決まりごとをきっちりと守って使っているか確かめることが重要だよ。これを読む人の中の果たして何人が、libcの全ての関数の完全で正しいセマンティクスを知っているんだろう。全部と言わずに、今監査しているプログラムの中で使っているlibcの関数についてだけでも、ちゃんと分かっている人はどれだけいるんだろうね。(どういうことかって言うと、今までソースツリー全部を調べてきて、strncat()やstrncpy()の呼び出しのだいたい半分は微妙に間違っていて、一文字余計にコピーしちゃってヌル終端しなくなるだけだとしても、それはやっぱりいい具合じゃないってこと)

    APIを完全に身に付けた時に、簡単にバグを見つけることができるようになるだろう。勤勉さが必要な他の仕事と一緒だと思うよ。注意深くあって欲しい。人は前例から学ぶものなのに、依然としてソフトウェアプログラミングの世界では、その途方もない複雑さが見つけにくいバグを生み、それはさらに新しいコードにコピーされているんだ。関数を間違って定義したマニュアルを見つけたことすらあるんだけれど、その時には多くのプログラマーが、間違ったマニュアルに重ねて間違ったプログラムを書いていた…。

    ----------
    フォロー下さったnumaさんと、日記でチェックしてくれたdsegさんのおかげで、少し修正しました。どうもありがとうございます。

    第一段落末尾のsloppyが「いい具合じゃない」と書きましたが、もっと強い否定の意味にした方が良いかもしれません。

    # extraが副詞なのは、場所で分かるべきべきべき。
    # セマンティクスはこなれた訳語がありますか?。最終的にこれ読む人はほとんど分かるからオッケー?。

typodupeerror

犯人はmoriwaka -- Anonymous Coward

読み込み中...