GCC 12.2.0与Clang 15.0.7是否有Sanitizer设置可检测堆分配未初始化内存?
检测堆分配未初始化内存的Sanitizer设置问题
未初始化内存的C/C++示例
C语言示例
#include <stdio.h> #include <stdlib.h> int main(void) { double* p = malloc(100*sizeof(double)); printf("%f\n", p[22]); free(p); }
C++语言示例
#include <iostream> int main() { double* p = new double[100]; std::cout << p[22] << '\n'; delete [] p; }
测试结果
使用GCC 12.2.0和Clang 15.0.7测试,尝试多种-fsanitize选项均未检测到未初始化内存错误:
C程序测试
$ gcc -fsanitize=address,undefined uninit.c && ./a.out -0.000002 $ clang -fsanitize=address,undefined uninit.c && ./a.out -0.000002 $ clang -fsanitize=memory uninit.c && ./a.out 0.000000
C++程序测试
$ g++ -fsanitize=address,undefined uninit.cpp && ./a.out -1.83255e-06 $ clang++ -fsanitize=address,undefined uninit.cpp && ./a.out -1.83255e-06 $ clang++ -fsanitize=memory uninit.cpp && ./a.out 0
问题
上述结果中,Clang的表现尤其意外,因为其文档中的类似示例显示该类情况应能被检测到。请问是否存在可检测上述示例中堆分配未初始化内存使用的Sanitizer设置?
编辑补充
如评论中ssbssa指出,该问题在Clang 16中已修复。
内容的提问来源于stack exchange,提问作者MWB
相关产品推荐
相关产品推荐

