エラー: memcpy-param-overlap

Address Sanitizer エラー: memcpy-param-overlap

CRT 関数 memcpy は、重複するメモリをサポートしません。 CRT は、重複するメモリ memmove をサポートする memcpy の代替手段を提供します。

一般的なエラーとして、memmovememcpy と同じ意味を持つものとして扱うことがあります。

// example1.cpp
// memcpy-param-overlap error
#include <string.h>

__declspec(noinline) void bad_function() {
    char buffer[] = "hello";

    memcpy(buffer, buffer + 1, 5); // BOOM!
}

int main(int argc, char **argv) {
    bad_function();
    return 0;
}

この例をビルドしてテストするには、Visual Studio 2019 バージョン 16.9 以降の開発者コマンド プロンプトで次のコマンドを実行します。

cl example1.cpp /fsanitize=address /Zi /Oi
devenv /debugexe example1.exe

/Oi フラグ、組み込み関数として扱memmovememcpyうようにコンパイラに指示します。 これは、一部のバージョンの標準ライブラリが同じように実装memcpymemmoveされるために必要です。 ASAN は動的分析ツールであるため、監視可能なランタイム効果を持つエラーのみを検出します。

結果のエラー

例 1 の memcpy-param-overlap エラーが表示されているデバッガーのスクリーンショット。

関連項目

AddressSanitizer の概要
AddressSanitizer の既知の問題
AddressSanitizer のビルドと言語リファレンス
AddressSanitizer ランタイム リファレンス
AddressSanitizer シャドウ バイト
AddressSanitizer クラウドまたは分散テスト
AddressSanitizer デバッガーの統合
AddressSanitizer エラーの例