clang的-fcatch-undefined-behavior不像宣传的那样工作

Ole*_*828 5 c c++ clang undefined-behavior

我构建了llvm/compiler-rt/clang的3.1版本,我试图看看-fcatch-undefined-behavior是否真的做了什么.到目前为止,没有运气.我编译并运行

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* x = malloc(sizeof(int) * 10);
    printf("%d\n", x[20]);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

$ /usr/local/bin/clang -fcatch-undefined-behavior undef_test.c && ./a.out
0
Run Code Online (Sandbox Code Playgroud)

我错过了一些非常简单的事吗?

Mat*_* M. 4

是的:x不是数组。

文档中:

-fcatch-undefined-behavior:打开运行时代码生成以检查未定义的行为。该选项默认为关闭,控制 Clang 是否为未定义的运行时行为添加运行时检查。如果检查失败,__builtin_trap()则用于指示失败。检查是:

  • 下标,其中一个操作数的静态类型是从数组类型衰减的变量,而另一个操作数大于数组的大小或小于零。
  • 移位运算符,其中移位量大于或等于左侧提升的位宽或小于零。
  • 如果控制流达到__builtin_unreachable。
  • 当 llvm 实现更多 __builtin_object_size 支持时,读取和写入 __builtin_object_size 指示我们没有访问有效内存的对象。位域和向量尚未检查。

我想您想测试下标检查,不幸的是您没有构建数组:您构建了一个内存区域(来自malloc),然后选择将其解释为数组;但从编译器的角度来看,它只是一块内存(记住mallocis的返回类型void*)。

您可能可以使用以下方法测试此行为:

int main() {
    int x[10] = {};
    printf("%d\n", x[20]);
}
Run Code Online (Sandbox Code Playgroud)

否则,对于特定的内存问题跟踪器,您应该查看 Address Sanitizer 插件。