1

在工具比较的上下文中,如果 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 版本在执行上述程序时标记错误,有或没有特殊的命令行选项?

4

3 回答 3

2

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

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

于 2017-05-31T14:30:20.200 回答
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
于 2017-05-31T15:15:29.567 回答
-1

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

页面标题:Clang 5 documentation

你必须更新你的clang

于 2017-05-31T10:16:20.613 回答