在工具比较的背景下,如果它可以检测到以下程序中的问题,我不想对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版本在执行上述程序时标记错误,有或没有特殊的命令行选项?
答案 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