パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

PHP 5.3.7に重大なバグ、strncatの罠にはまる」記事へのコメント

  • by Anonymous Coward

    リンクの解説読みましたけど、問題は

    strncat(passwd, "$", 1);

    strlcat(passwd, "$", 1);
    に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?

    strcat→strncatの時点ではバグってないわけで。

    • Re: (スコア:5, 興味深い)

      まあ仰ることも間違いではないのですが、C言語界の背景というか
      strncatのsize指定が「意外性最小原則にそぐわない」仕様だということで
      数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。

      で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人は
      そんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。

      ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。
      まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。

      • Re: (スコア:1, すばらしい洞察)

        by Anonymous Coward
        strncat の第三引き数は size じゃないぞー(型は size_t だったりするかもしれないが)。
        第三引き数が size なのは strlcpy の方だぞ。

        引き数の意味を間違えて「意外性」どうのこうのとか、知ったかぶりするのはやめて欲しい。
        本人は悪意がないのかもしれないけど、まだぞろ誤解して、strcat() 使うなとか、
        strncat() 使うなとか、頭の悪いコード規約作ろうとうするやつが多発するから。

        今回のも罠でも何でもなくて strcat() で十分なのに、迷信に従って strncpy(), strlcpy() とかに書き換えた馬鹿がいるだけじゃないか。

        # *passwd = '$'; passwd[1] = 0; <--- 本当にやりたっかったこと
        • by ikotom (20155) on 2011年08月25日 2時46分 (#2008902)

          >strncat の第三引き数は size じゃないぞー(型は size_t だったりするかもしれないが)。
          ああ、ごめんなさい。あまり気にしないで書いてしまいましたが
          第三引数が「連結する文字数」なので size でなく length OR count だとかいう意味のご指摘ですよね?

          その辺にこだわる方もいらっしゃいますが私は型がsize_tなら何であれサイズと表しても
          間違いではないと思う派です。
          バッファサイズ、バイトサイズ、文字列サイズ。ということで。

          C言語で size_t が出てくる時、いつもこのうちのどれなのかで悩むので
          静的型付け大好き人間としては buf_size_t とか length_t とか標準で作って欲しいと密かに思っています。

          親コメント

コンピュータは旧約聖書の神に似ている、規則は多く、慈悲は無い -- Joseph Campbell

処理中...