strcpy関数:C言語での文字列コピーとバッファオーバーフロー対策

strcpy関数を使用する際に、元の文字列が長すぎると、ターゲット文字列のバッファがオーバーフローし、プログラムのクラッシュやデータの損失が発生する可能性があります。このような状況を避けるために、strcpy関数を呼び出す前に元の文字列の長さをチェックし、適切な処理方法を選択することができます。例えば、一部の内容のみをコピーするか、strcpyの代わりにより安全な関数を使用するなどが考えられます。

以下は、ソース文字列が長すぎる場合の対処方法を示す簡単なサンプルコードです。

#include <stdio.h>
#include <string.h>

void safe_strcpy(char *dest, const char *src, size_t dest_len) {
    if(strlen(src) < dest_len) {
        strcpy(dest, src);
    } else {
        strncpy(dest, src, dest_len - 1);
        dest[dest_len - 1] = '\0';
    }
}

int main() {
    char dest[10];
    const char *src = "This is a very long string";

    safe_strcpy(dest, src, sizeof(dest));

    printf("Copied string: %s\n", dest);

    return 0;
}

上記の例では、strcpy関数の代わりにsafe_strcpy関数を定義しました。この関数は、ターゲット文字列バッファのサイズをパラメータとして受け取ります。関数内部では、まずソース文字列の長さがターゲット文字列のサイズよりも小さいかどうかをチェックし、小さい場合はstrcpy関数を使用してコピーします。それ以外の場合は、部分的な内容のみをコピーするstrncpy関数を使用し、文字列の完全性を確保するために手動で文字列終端文字’\0’を追加します。

この方法により、ソース文字列が長すぎてバッファオーバーフローの問題が発生することを効果的に回避し、プログラムの安定性と安全性を確保できます。

bannerAds