[解決済み] strncpyがNULL終了しないのはなぜですか?
質問
strncpy()
は、バッファオーバーフローから保護すると考えられています。しかし、もしそれが null 終端せずにオーバーフローを防ぐのであれば、すべての可能性において、その後の文字列操作はオーバーフローすることになります。そのため、これを防止するために、私は自分自身がそうしていることに気づきました。
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
man strncpy
を与える。
は
strncpy()
関数も同様ですがn
バイトのsrc
のバイトがコピーされます。したがって、もし最初のn
のバイトがsrc
を含む場合、結果はヌル文字で終端されません。
のような一見何の変哲もないものをヌル文字で終端することなく
printf( "FOO: %s\n", dest );
...クラッシュする可能性があります。
より良い、より安全な
strncpy()
?
どのように解決するのですか?
strncpy()
は、より安全な
strcpy()
として使われるのではなく、ある文字列を別の文字列の途中に挿入するために使われることになっています。
のような文字列を扱う関数は、すべて
snprintf()
と
vsnprintf()
は、バッファオーバーフローのエクスプロイトなどを緩和するために、後の規格で追加された修正です。
ウィキペディア
言及
strncat()
を書く代わりに、安全な
strncpy()
:
*dst = '\0';
strncat(dst, src, LEN);
EDIT
私はそれを逃した
strncat()
は、文字列がLEN文字より長いか等しい場合、文字列をNULL終端するときにLEN文字を超えます。
とにかく
strncat()
のような自作ソリューションの代わりに
memcpy(..., strlen(...))
/whatever の実装は
strncat()
がライブラリでターゲット/プラットフォーム最適化されている可能性があります。
もちろん、dstが少なくともnullcharを保持していることを確認する必要があるので、正しい使い方の
strncat()
のようなものでしょう。
if (LEN) {
*dst = '\0'; strncat(dst, src, LEN-1);
}
また、私は
strncpy()
は、部分文字列を別の文字列にコピーするのにあまり有用ではないことを認めます。もしsrcがn文字より短ければ、コピー先の文字列は切り捨てられます。
関連
-
[解決済み】ENOENTが「そのようなファイルやディレクトリはありません」という意味であるのはなぜですか?
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
[解決済み] C言語で関数型プログラミングを行うためのツールにはどのようなものがありますか?
-
[解決済み] C言語では「?」演算子は何をするのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] マクロで無意味なdo-while文やif-else文を使っているのはなぜですか?
-
[解決済み] printfは、フォーマット文字列の中に改行がないと、呼び出し後にフラッシュしないのはなぜですか?
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
構造体の配列--[エラー] '['トークンの前に一次式があることが予想される
-
Solve Dev-c++ [エラー] 'for' ループの初期宣言は、C99 または C11 モードでのみ許可されます。
-
[解決済み] C 言語の Null 終端文字列
-
[解決済み] flexible array member not at end of structエラーの原因は何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] C言語標準に準拠した構造体の初期化方法
-
[解決済み] C言語でファイルが存在するかどうかを確認する最も良い方法は何ですか?
-
[解決済み] なぜ16進数には0xがつくのですか?
-
[解決済み] ストラクチャーとユニオンの違い
-
[解決済み] C言語で "unsigned long "をprintfする方法は?