我希望地址消毒剂在捕获某些东西时中止。我认为它是默认设计的,但它似乎对我不起作用。我也试过ASAN_OPTIONS=halt_on_error=1
了,没有效果。以下是详细信息:
在我从事的一个项目中,我们使用了地址消毒剂,它在几周内发出了这个警告/错误,而没有人意识到这一点:
运行时错误:作为参数 xx 传递的空指针,它被声明为永远不会为空
尽管被称为运行时错误,但它不会停止程序或导致错误的退出代码。这是一个简单的程序来演示它:
/*
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。这是一个错误吗?手册说它应该停止。