[解決済み] なぜC言語ではstrcpyが安全でないのですか?重複
質問
私は初心者で、今Cで文字列をコピーする方法を勉強しています。
ここで、私が出会った問題を紹介します。
文字列1から文字列2にコピーするために "strcpy" コマンドを使用しようとすると、Visual Studio 2013 はエラー/警告メッセージを表示し、 "strcpy" は安全ではないので、代わりに strcpy_s を使用するように勧めますと表示します。
なぜ strcpy が安全でないのか、説明していただけますか?また、strcpyに代わるより安全な方法は何でしょうか?
以下は私のコードです。
#include<stdio.h>
#include<string.h>
main()
{
char str1[] = "Copy a string.";
char str2[15];
char str3[15];
int i;
/* with strcpy() */
strcpy(str2, str1);
/* Without strcpy() */
for (i = 0; str1[i]; i++)
str3[i] = str1[i];
str3[i] = '\0';
/* Display str2 and str3 */
printf("The content of str2: %s\n", str2);
printf("The content of str3: %s\n", str3);
return 0;
}
P.S. Visual Studio 2013 64-bit ultimate on Windows 7 64-bit ultimate を使用しています。 お忙しい中、ありがとうございました。
解決方法は?
strcpy には送信先バッファの大きさを知る方法がない (つまり length パラメータがない) ので、これを使ったずさんなプログラミングはバッファのオーバーランや他のメモリの破壊につながる可能性があります。 このようなオーバーランは、クラッシュや奇妙な動作につながり、マルウェア作者に悪用される可能性があります。
ところで、長さのパラメータを受け取るstrncpyを見てください。 注意点としては、バッファが小さすぎる場合、strncpyは文字列を終了させないので、それなりに危険であることです。
あなたのコメントや質問に対する答えですが、それは文脈に依存します。 もし、バッファが十分に大きいことが分かっていれば(例えば、前の行で正しいサイズでバッファを確保した)、strcpyを使用します。 オーバーフローの可能性がある場合は、strncpyを使用し、バッファの最後の位置をnullに設定することを確認してください。 前の5、6行が安全であることを示すのに十分でなければ、strncpyを使用してください。
strncpy_s については、上の Andon のコメントも参照してください。 最後に、もしstrcpyを使うなら、その場所での警告を抑制するために#pragmaを追加するとよいでしょう。
関連
-
[解決済み】デバッガgdbの使用時に不明な終了シグナルが発生する。
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】なぜか。"エラー: 配列型を持つ式への代入"
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] なぜlist.join(string)ではなくstring.join(list)なのでしょうか?
-
[解決済み] ランダムな文字列を使用するこのコードは、なぜ "hello world" と表示されるのですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
-
[解決済み] と'is'のどちらかを使って文字列を比較すると、異なる結果になることがあるのはなぜですか?
-
[解決済み] Stringでswitch文が使えないのはなぜですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】strcmpが機能しない
-
[解決済み] clang: error: linker command failed with exit code 1が表示されるのはなぜですか?
-
[解決済み】初期化がキャストなしで整数からポインタを作成 - C言語
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み】ヒープ割り当てで初期化されていない値が作成された
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】Linuxでexeclp()がどのように動作するのか理解できません。
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み] テスト