人々が「strcpy()
は危険です。strncpy()
代わりに使用してください」(またはstrcat()
などについての同様のステートメントですが、ここでは焦点として使用strcpy()
します) と言うとき、チェックインに境界がないことを意味しstrcpy()
ます。したがって、文字列が長すぎるとバッファ オーバーランが発生します。それらは正しいです。このような場合に使用strncpy()
すると、バッファ オーバーランを防ぐことができます。
strncpy()
これは本当にバグを修正するものではないと感じています。優れたプログラマーであれば簡単に回避できる問題を解決するものです。
C プログラマーは、文字列をコピーする前にコピー先のサイズを知っておく必要があります。strncpy()
それはとの最後のパラメータの仮定でもありstrlcpy()
ます: それらにそのサイズを指定します。文字列をコピーする前に、ソースのサイズを知ることもできます。次に、宛先が十分に大きくない場合は、を呼び出さないstrcpy()
でください。バッファを再割り当てするか、別のことをしてください。
なぜ私は好きではないのstrncpy()
ですか?
strncpy()
ほとんどの場合、これは悪い解決策です。文字列は予告なしに切り捨てられます。何らかの関数に決定させるのではなく、自分でこれを理解してから、実行したい一連のアクションを実行するための追加のコードを記述したいと思います。私は何をすべきかについて。
strncpy()
非常に非効率的です。宛先バッファのすべてのバイトに書き込みます。'\0'
目的地の最後に何千もの必要はありません。
'\0'
宛先が十分に大きくない場合、終了は書き込まれません。したがって、とにかく自分で行う必要があります。これを行うことの複雑さは、面倒なことには値しません。
では、 に行きstrlcpy()
ます。からの変更により改善されstrncpy()
ていますが、 の特定の動作がstrl*
それらの存在を正当化するかどうかはわかりません。目的のサイズを知る必要があります。strncpy()
宛先のすべてのバイトに必ずしも書き込むとは限らないため、より効率的です。しかし、次のようにすることで解決できる問題を解決します*((char *)mempcpy(dst, src, n)) = 0;
。
たとえば、文字列の一部ではなく完全な文字列が書き込まれると予想される場合など、バグが発生する可能性があると彼ら (および私) が言っていることは、セキュリティの問題につながる可能性がstrlcpy()
あると言っているとは思いません。strlcat()
ここでの主な問題は、コピーするバイト数は? プログラマーはこれを知っている必要があり、彼が知らない場合、strncpy()
またはstrlcpy()
彼を救わない場合。
strlcpy()
strlcat()
ISO C でも POSIX でもなく、標準ではありません。したがって、移植可能なプログラムでそれらを使用することは不可能です。実際、 にstrlcat()
は 2 つの異なるバリアントがあります。Solaris の実装は、長さ 0 を含むエッジ ケースに対して他の実装とは異なります。