エラー: memcpy-param-overlap
Address Sanitizer エラー: memcpy-param-overlap
CRT 関数 memcpy
重複するメモリ サポートされていません。 CRT は、重複するメモリ memmove
をサポートする memcpy
の代替手段を提供します。
一般的なエラーとして、memmove
を memcpy
と同じ意味を持つものとして扱うことがあります。
例
// 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 フラグは、memcpy
とmemmove
を組み込み関数として扱うようにコンパイラに指示します。 これは、標準ライブラリの一部のバージョンが同じ方法で memcpy
と memmove
を実装するためです。 ASAN は動的分析ツールであるため、監視可能なランタイム効果を持つエラーのみを検出します。
結果のエラー
関連項目
AddressSanitizer の概要
AddressSanitizer の既知の問題
AddressSanitizer のビルドと言語リファレンス
AddressSanitizer ランタイム リファレンス
AddressSanitizer シャドウ バイト
AddressSanitizer クラウドまたは分散テスト
AddressSanitizer デバッガーの統合
AddressSanitizer エラーの例