在工具比较的背景下,如果 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
第二次调用 f
时第一次出现 G
会调用未定义的行为,因为此时 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 版本可以在执行上述程序时标记错误,无论是否有特殊的命令行选项?
最佳答案
您在这里讨论的是返回后使用错误。这些应该由 ASan 支持,但由于内存开销显着增加而默认禁用(例如,参见 here 了解详细信息)。如需启用,请运行 ASAN_OPTIONS=detect_stack_use_after_return=1
。
不幸的是,我无法检查它是否适用于您的特定情况,但如果不适用,您可能应该在 ASan's tracker 提交错误.
关于Clang 的 ASan 不检测悬空指针的使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44281933/