AddressSanitizer 抑制

9

我想要在clang/gcc中抑制地址检测器的警告。

我的源文件如下:

int foo(){
  double bar[] = {7,8};
  return bar[3];
}

int main(){
  return foo();
}

显然,在第三行存在溢出。

抑制文件(myasan.supp)包含:

interceptor_via_fun:foo

编译(clang还会创建一个警告)并运行:

clang -O0 -g -fsanitize=address -fno-omit-frame-pointer sanitizerTest.c
ASAN_SYMBOLIZER_PATH=/software/clang/7.0.0/bin/llvm-symbolizer  ASAN_OPTIONS=suppressions=myasan.supp ./a.out

但是地址泄漏检测器仍然抱怨溢出。
==8119==ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7ffeab4e75f8 at pc 0x0000004008bf bp 0x7ffeab4e75b0 sp 0x7ffeab4e75a8
READ of size 8 at 0x7ffeab4e75f8 thread T0
#0 0x4008be in foo() /tmp/asan/sanitizerTest.c:3
#1 0x400919 in main /tmp/asan/sanitizerTest.c:7
#2 0x7f549fbfb82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x400718 in _start (/tmp/asan/a.out+0x400718)

编译器是clang7。我也测试过clang6和gcc7。你有什么想法让它工作吗?

1
你真的使用 clang/gcc 进行编译吗?还是使用 clang++/g++ - Florian Weimer
是的,我使用 clang。但与 clang++ 没有区别。 - user1928546
2个回答

6

来自ASan文档的引用:

这种抑制机制只应用于抑制外部代码中的问题;它不适用于使用AddressSanitizer重新编译的代码。

我想,它只在共享对象之间起作用。

要进行抑制:在您自己的代码中添加__attribute__((no_sanitize("address")))到函数声明中,或者使用编译时黑名单:

$ cat myasan.blacklist
fun:foo
$ clang -fsanitize=address -fsanitize-blacklist=myasan.blacklist -w sanitizerTest.c
$ ./a.out
$ 

1
请注意,根据ASan文档-fsanitize-blacklist标志是新的,并且现在只有clang支持。 - damb

0

我们偶尔会在启动后不久看到持续的地址无害化器误报,这似乎是您示例中发生的情况。我总是通过使用统一的无害化器设置(包括手动清除 Xcode 项目之外的依赖目录)进行足够干净的构建,最终问题总是消失了,因此我怀疑问题出在链接具有略微不同的无害化器设置的文件上,但我从未分离出问题。(如果设置差异足够大,则链接将完全失败。)

顺便说一句,请坚持下去;花费了很多工作才能使无害化器与我们现有的 CMake 构建在 Xcode 中正常工作,但它们开始在开发的有用早期阶段发现错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接