メインコンテンツ

オーバーラップするメモリのコピーです

コピー関数のソース引数とコピー先引数にオーバーラップするメモリがある

説明

この欠陥は、memcpystrcpy などのコピー関数のコピー元引数とコピー先引数の間にメモリ オーバーラップがある場合に発生します。たとえば、strcpy のソース引数とコピー先引数が、同じ文字列の異なった要素を指すポインターである場合などです。

リスク

コピー関数のソース引数とコピー先引数の間にメモリ オーバーラップがある場合、C 標準によると、動作は未定義になります。

修正方法

メモリ オーバーラップが望ましいものであるかどうかを判断します。もしそうであれば、代替となる関数を見つけます。次に例を示します。

  • memcpy を使用して値を 1 つのメモリ位置から別のメモリ位置にコピーしている場合は、memmovememcpy の代わりに使用します。

  • strcpy を使用して 1 つの文字列を別の文字列にコピーしている場合は、次のように、memmovestrcpy の代わりに使用します。

    s = strlen(source);
    memmove(destination, source, s + 1);

    strlen は null 終端を除いた文字列長を決定します。したがって、s バイトではなく s+1 バイトを移動させなければなりません。

すべて展開する

#include <string.h>

char str[] = {"ABCDEFGH"};

void my_copy() {
    strcpy(&str[0],(const char*)&str[2]);
}

この例では、ソース引数とコピー先引数が、同じ文字列 str を指すポインターであるため、それらの許容されるバッファー間にメモリ オーバーラップがあります。

結果情報

グループ: プログラミング
言語: C | C++
既定値: オフ
コマンド ライン構文: OVERLAPPING_COPY
影響度: Medium

バージョン履歴

R2015b で導入