Clang的ASan没有检测到悬空指针的使用

时间:2017-05-31 10:13:28

标签: c clang dangling-pointer address-sanitizer

在工具比较的背景下,如果它可以检测到以下程序中的问题,我不想对ASan不公平:

$ cat t.c
#include <stdio.h>

int *G;

int f(void) {
  int l = 1;
  int res = *G;
  G = &l;
  return res + *G;
}

int main(void) {
  int x = 2;
  G = &x;
  f();
  printf("%d\n", f());
}
$ clang -v
clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)
Target: x86_64-pc-linux-gnu
Thread model: posix
InstalledDir: /usr/bin
Found candidate GCC installation: /usr/bin/../lib/gcc/x86_64-linux-gnu/4.9
...
$ clang -O2 -fsanitize=address t.c
$ ./a.out 
1
$ clang -fsanitize=address t.c
$ ./a.out 
2

第二次出现G f时,调用未定义的行为,因为G在此时是不确定的。此外,G会被立即取消引用,这使得人们可能期望ASan检测到这种内存错误。它是ASan规范的一部分,它有时无法检测到它应该找到的那种问题,但我想知道我是否可以用它来找到这个特殊问题。

我找到了-fsanitize-address-use-after-scope here选项,但此选项在我正在使用的Clang版本中不起作用:

$ clang -fsanitize=address t.c -fsanitize-address-use-after-scope
clang: error: unknown argument: '-fsanitize-address-use-after-scope'

是否有ASan版本在执行上述程序时标记错误,有或没有特殊的命令行选项?

3 个答案:

答案 0 :(得分:1)

您在这里谈论的是使用后返回错误。这些应该由ASan支持,但由于显着更高的内存开销而默认禁用(详见here)。要启用,请使用ASAN_OPTIONS=detect_stack_use_after_return=1

运行

不幸的是我无法检查它是否适用于您的特定情况,但如果没有,您应该在ASan's tracker处提交错误。

答案 1 :(得分:0)

yugr指出了我在测试程序中激活错误检测的正确方法。 Clang 3.8中已经存在此功能。

为完整起见,Clang 3.8的结果如下。有趣的是,在默认优化级别检测到该问题,但未在-O2检测到。

$ clang -fsanitize=address t.c -Wall
$ ASAN_OPTIONS=detect_stack_use_after_return=1 ./a.out 
=================================================================
==21949==ERROR: AddressSanitizer: stack-use-after-return on address 0x7f5eeb100060 ...
READ of size 4 at 0x7f5eeb100060 thread T0
...
$ clang -O2 -fsanitize=address t.c -Wall
$ ASAN_OPTIONS=detect_stack_use_after_return=1 ./a.out
1

答案 2 :(得分:-1)

您的版本:clang version 3.8.0-2ubuntu4 (tags/RELEASE_380/final)

页面标题:Clang 5 documentation

您必须更新clang