これは、この質問と 1 つの特定の回答に対するコメントに触発されたstrncpy
もので、C の非常に安全な文字列処理関数ではなく、 に達するまでゼロをパディングすることを知りましたn
。
具体的には、Rを引用するには..
strncpy は null で終了せず、宛先バッファーの残り全体を null で埋めますが、これは非常に時間の無駄です。独自の null パディングを追加することで前者を回避できますが、後者は回避できません。「安全な文字列処理」関数として使用することを意図したものではなく、Unix ディレクトリ テーブルおよびデータベース ファイルの固定サイズ フィールドを操作するためのものです。snprintf(dest, n, "%s", src) は、標準 C で唯一正しい「安全な strcpy」ですが、かなり遅くなる可能性があります。ちなみに、切り捨て自体が重大なバグになる可能性があり、場合によっては特権の昇格や DoS につながる可能性があるため、問題が発生したときに出力を切り捨てる「安全な」文字列関数をスローしても、それを「安全」または「」にする方法にはなりません。安全"。その代わり、
そしてジョナサン・レフラーから
strncat() は、strncpy() よりもインターフェイスがさらにわかりにくいことに注意してください。長さの引数とは正確には何ですか? strncpy() などに基づいて期待するものではないため、strncpy() よりもエラーが発生しやすくなります。文字列をコピーする場合、 memmove() だけが必要であるという強い議論があるという意見が増えています。なぜなら、常にすべてのサイズを事前に知っており、事前に十分なスペースがあることを確認しているからです。strcpy()、strcat()、strncpy()、strncat()、memcpy() のいずれよりも memmove() を使用してください。
だから、私は明らかにC標準ライブラリに少し錆びています。したがって、私は次の質問をしたいと思います。
どの C 標準ライブラリ関数が不適切に使用されているか、またはセキュリティの問題/コードの欠陥/非効率性を引き起こす/引き起こす可能性のある方法で使用されていますか?
客観性を保つために、回答にはいくつかの基準があります。
- 可能であれば、問題の機能の背後にある設計上の理由、つまり意図された目的を挙げてください。
- コードが現在置かれている誤用を強調してください。
- その誤用が問題につながる可能性がある理由を述べてください。それは明らかなはずですが、それはソフトな答えを防ぎます。
避けてください:
- 関数の命名規則に関する議論 (これが明らかに混乱を引き起こす場合を除く)。
- 「私は y よりも x の方が好きです」 - 好みは問題ありませんが、私は実際の予期しない副作用とそれらを防ぐ方法に興味があります。
これは主観的なものである可能性が高く、明確な答えがないため、すぐにコミュニティ wiki にフラグを立てます。
私もC99に従って働いています。