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)
我错过了一些非常简单的事吗?
是的: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 插件。