エラー: strncat-param-overlap

Address Sanitizer のエラー: strncat-param-overlap

重複するバッファー内のメモリを移動するコードが原因で、診断が困難なエラーが生じる可能性があります。

この例では、CRT 関数に対するパラメーターが重複することによって生じるエラーを AddressSanitizer がいかにしてキャッチするかを示します。

(llvm-project/compiler-rt/test/asan/TestCases/strncat-overlap.cpp に基づく)

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

void bad_function() {
    char buffer[] = "hello\0XXX";
    strncat(buffer, buffer + 1, 3); // BOOM
    return;
}

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

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

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

結果のエラー

Screenshot of debugger displaying strncat-param-overlap error in example 1.

関連項目

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