アドレスサニタイザーが何かをキャッチしたときに中止したいと思います。デフォルトでそれを行うように設計されていると思いましたが、うまくいかないようです。効果のないものも試しASAN_OPTIONS=halt_on_error=1
ました。詳細は次のとおりです。
私が取り組んでいるプロジェクトでは、アドレスサニタイザーを使用していますが、誰も気付かないうちにこの警告/エラーが数週間発生しました。
実行時エラー: null ポインターが引数 xx として渡されましたが、null になることはないと宣言されています
実行時エラーと呼ばれても、プログラムを停止したり、不正な終了コードを引き起こしたりすることはありません。これを示す簡単なプログラムを次に示します。
/*
gcc -fsanitize=address,undefined \
-Wformat \
-Werror=format-security \
-Werror=array-bounds \
-g -o xasan xasan.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
fprintf(stderr, "before\n");
memcpy(NULL, argc > 1 ? "" : NULL, argc > 1 ? 1 : 0);
fprintf(stderr, "after\n");
return 0;
}
argc のトリックは、gcc が memcpy 呼び出しを最適化しないようにするためのものです。基本的に、私たちのコードでmemcpy(dst, NULL, 0)
は、実行時エラー/警告の原因となります。
実行時エラーの後に「after」が出力されないことを期待しますが、出力され、プログラムの終了コードは 0 です。これはバグですか? 説明書には止めてくださいと書いてあります。