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

Linux/Unixでのセキュアなプログラムの書き方」記事へのコメント

  • ざっと眺めてみようとして分量にびびりました。翻訳も大変だったでしょうね。感謝&お疲れ様。存分に活用させて頂きます。
    • 確かに長いですね。
      ざっと目を通しましたが、やっぱり、C/C++プログラマとして、
      文字列処理系の問題は頭が痛いなぁと思いました。
      最後の方に、

      printf(some_string_text);

      は、

      printf("%s", some_string_text);

      としなさいというのがあり、目から鱗が
      • by oku (4610) on 2003年06月21日 3時28分 (#342282) 日記
        printf(some_string_text);

        は、

        printf("%s", some_string_text);

        としなさいというのがあり、目から鱗が落ちました。
        弊社の若人には、

        fputs(some_string_text, stdout);

        にせよ、と教えてるんですけど... (セキュリティ以前の問題で)。
        親コメント
        • それだと動作が変わってしまうよ、、、
          親コメント
          • だから、それで問題無いときはそうしなさいって事でしょ?

            なんで、ID持ちがこんな重箱の隅つつくような指摘するかな?
            • 「若人」に「教える」んだから、まず動作が変らない
              ものを教えるべき。

              動作が違っていても「それで問題無い」かどうか判るなら
              そこまで教える必要はない。
          • > それだと動作が変わってしまうよ、、、

            printf("%s", some_string_text);

            fputs(some_string_text, stdout);
            ではどのように動作が異なるのですか?
            • by okdt (17) on 2003年06月21日 14時45分 (#342472) 日記
              少なくとも、プログラマが関数を選択する段階で必要な3つのポイントがあるでしょう。

              1.成功時の戻り値の仕様
              printf:転送された文字数を返す。
              fputs: 非負の値を返す。

              2.エラー時の戻り値の仕様
              printf:出力エラーが発生したときは、負の値を返す。
              fputs:書込みエラーが発生するとEOFを返す。

              3.変更、拡張への対応
              "%s"を前提としている場合でも、printfでは"%10s"のような文字数指定への拡張が可能です。

              fputsではできません。

              それで、printfと等価なのは、fprintfの第一引数にstdoutを指定したものというところでしょう。

              ご参考になればよいのですが。
              親コメント
              • この例の場合を含め、しばしば、printf(3)は返り値を捨てて
                使いますよね。それならfputs(3)を使えばよくて
                (puts,getsは末尾の改行を扱う、fputs,fgetsは扱わない)
                元コメント [srad.jp]

                は多分「printfのほうがfputsより重いから」
                ではないですか?
                親コメント
              • printf("%s", some_string_text);
                fputs(some_string_text, stdout);

                これらの例では返り値を捨てているので、
                 1.成功時の戻り値の仕様
                 2.エラー時の戻り値の仕様
                の違いは動作には影響しないと思います。

                また、大元が
                printf(some_string_text);
                という変更・拡張を考慮しないコードで
              • > 3.変更、拡張への対応
                > "%s"を前提としている場合でも、printfでは"%10s"のよう
                > な文字数指定への拡張が可能です。

                それがどのように関係しているのか分かりません。

                /*a*/ printf("%s", some_string_text);
                /*b*/ fputs(some_string_text, stdout);
                /*c*/ printf("%10s", some_string_text);

                # aとbは同じ動作ですが、cは異なる動作となります。
              • たしかに、厳密には動作が違うけれども、今の文脈だと同じとみなしていいですね。

                最初の「動作が違う」という指摘は、もし意図的に重箱の隅をつつくつもりでなかったとすれば、fputs() ではなく puts() と勘違いしたのかな。

              • by Anonymous Coward on 2003年06月21日 17時10分 (#342531)

                どーでもいいことかも知れませんが、gcc の一部には printf("string constant\n")をputs("string constant")にすげ替えちゃうのがいるようです。

                # printf 書いて気づいた

                親コメント

にわかな奴ほど語りたがる -- あるハッカー

処理中...