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

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

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

      printf(some_string_text);

      は、

      printf("%s", some_string_text);

      としなさいというのがあり、目から鱗が
      • printf(some_string_text);

        は、

        printf("%s", some_string_text);

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

        fputs(some_string_text, stdout);

        にせよ、と教えてるんですけど... (セキュリティ以前の問題で)。
        • それだと動作が変わってしまうよ、、、
          • > それだと動作が変わってしまうよ、、、

            printf("%s", some_string_text);

            fputs(some_string_text, stdout);
            ではどのように動作が異なるのですか?
            • 少なくとも、プログラマが関数を選択する段階で必要な3つのポイントがあるでしょう。

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

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

              3.変更、拡張への対応
              "%s"を前提としている場合でも、
              • printf("%s", some_string_text);
                fputs(some_string_text, stdout);

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

                また、大元が
                printf(some_string_text);
                という変更・拡張を考慮しないコードで
              • by Anonymous Coward on 2003年06月21日 16時47分 (#342520)
                たしかに、厳密には動作が違うけれども、今の文脈だと同じとみなしていいですね。

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

                親コメント
              • by Anonymous Coward on 2003年06月21日 17時10分 (#342531)

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

                # printf 書いて気づいた

                親コメント

「毎々お世話になっております。仕様書を頂きたく。」「拝承」 -- ある会社の日常

処理中...