7

我正在尝试禁止来自 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。

知道如何进行这项工作吗?

4

2 回答 2

5

引用ASan 文档

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

副手,我认为它只适用于共享对象边界。

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

$ cat myasan.blacklist
fun:foo
$ clang -fsanitize=address -fsanitize-blacklist=myasan.blacklist -w sanitizerTest.c
$ ./a.out
$ 
于 2018-10-11T00:09:58.277 回答
0

我们偶尔会在启动后不久看到持续的 Address Sanitizer 误报,这似乎是您的示例中发生的情况。在我使用统一的消毒剂设置进行了足够干净的构建(包括手动对 Xcode 项目之外的依赖目录进行核对)之后,它们最终总是消失了,所以我怀疑问题在于链接文件的消毒剂设置略有不同,但我从来没有孤立过问题。(如果设置足够不同,链接将完全失败。)

    顺便说一句,坚持下去;使用我们现有的 CMake 构建让消毒剂在 Xcode 中工作需要做很多工作,但他们开始在有用的开发早期阶段发现错误。

于 2018-10-02T11:34:58.550 回答