次の方法で共有


エラー: memcpy-param-overlap

Address Sanitizer エラー: memcpy-param-overlap

注釈

Note

/Oi エラーを確実に検出するには、memcpy-param-overlap フラグが必要です。 このフラグは、 memcpy やその他の関数を組み込み関数として扱うようにコンパイラに指示します。これは、標準ライブラリの一部のバージョンで実装されているために必要です。 ASan は動的分析ツールであるため、監視可能なランタイム効果を持つエラーのみを検出できます。 /O2も設定されている場合、これらの関数の組み込みバリアントが使用されるとは限らないため、ASan はmemcpy-param-overlapエラーを確実に検出できない可能性があることに注意してください。 詳細については、 /Oi ドキュメントを参照してください

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

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

Example

// 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

結果のエラー

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

こちらも参照ください

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