地址消毒剂抑制

时间:2018-10-02 08:37:26

标签: gcc clang address-sanitizer sanitizer

我试图禁止来自clang / gcc中的地址清理器的警告

我的源文件如下:

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

int main(){
  return foo();
}

显然在第3行有一个溢出。

禁止文件(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。

有什么主意要怎么做吗?

2 个答案:

答案 0 :(得分:0)

启动后不久,我们偶尔会看到持久的Address Sanitizer误报,这似乎就是您的示例中正在发生的情况。在我使用统一的消毒剂设置进行了足够干净的构建(包括手动在Xcode项目外部手动放置依赖项目录)之后,它们最终总是消失了,因此我怀疑问题在于链接具有稍微不同的消毒剂设置的文件,但是我从未隔离过问题。 (如果设置足够不同,则链接将完全失败。)

顺便说一句;我们现有的CMake版本使消毒器在Xcode中工作需要大量的工作,但是他们在开发的有用早期阶段就开始发现错误。

答案 1 :(得分:0)

ASan documentation进行整形:

  

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

暂时,我认为它只能在共享对象边界上工作。

要在自己的代码中禁止显示,请在函数声明中添加__attribute__((no_sanitizer("address")))或使用编译时黑名单:

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