1. ホーム
  2. c

[解決済み] なぜC言語ではstrcpyが安全でないのですか?重複

2022-03-03 13:13:22

質問

私は初心者で、今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を追加するとよいでしょう。