Clang 的 ASan 不检测悬空指针的使用

标签 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

第二次调用 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/

相关文章:

c - 判断一个数字是否完美的程序

c++ - 用于检测模板函数的 Sfinae 类型特征不适用于 std::forward

c: 调试模糊内存泄漏的策略?

c++ - C++中的动态分配列表

c - 存储压缩集的最佳方式

Windows 终端应用程序中的 C 颜色文本

c++ - 为 OpenCV 的 C++ createTrackbar 运行 C 包装器时出现编译段错误(核心已转储)

c++ - Cppdepend C++ linux基础

mysql - 无法在 OS X 上安装 mysql gem

c++ - 实现对象列表时如何处理动态分配?