在工具比较的上下文中,如果 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
这里找到了这个选项,但是这个选项在我使用的 Clang 版本中不起作用:
$ clang -fsanitize=address t.c -fsanitize-address-use-after-scope
clang: error: unknown argument: '-fsanitize-address-use-after-scope'
是否有 ASan 版本在执行上述程序时标记错误,有或没有特殊的命令行选项?