Gcc 消毒剂抑制

Gcc 消毒剂抑制,gcc,clang,address-sanitizer,sanitizer,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 -O0 -g -fsanitize=address -fno-omit-frame-po

我试图抑制来自clang/gcc中地址消毒剂的警告

我的源文件如下所示:

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

int main(){
  return foo();
}
很明显,第3行有一个溢出

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

interceptor_via_fun:foo
编译(叮当声也会产生警告)并运行:

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


你知道如何做到这一点吗?

我们偶尔会在启动后不久看到地址消毒剂的持续误报,这似乎就是你的示例中发生的情况。在我使用统一的消毒剂设置(包括在Xcode项目外手动取消依赖项目录)完成了一个足够干净的构建之后,它们最终都会消失,所以我怀疑问题在于链接具有稍微不同的消毒剂设置的文件,但我从来没有发现这个问题。(如果设置差异很大,链接将完全失败。)

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

引自:

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

顺便说一句,我认为它只适用于共享对象边界

抑制:在您自己的代码中,将
\u属性((无净化(“地址”))
添加到函数声明中,或使用编译时黑名单:

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

你真的用
clang
/
gcc
编译,还是用
clang++
/
g++
?是的,我用clang。但是与clang++没有什么不同,请注意,根据
-fsanize黑名单
标志是新的,现在只受
clang
支持。