我在Ubuntu 14.04上使用Clang 3.7.0玩Memory Sanitizer。以下代码可以完美地运行:
#include <cstdio>
int main() {
double ans;
printf("Hello World: %f\n", ans);
return 0;
}
用
编译时 clang++ -g -O1 -fsanitize=memory -fsanitize-memory-track-origins=2 -fomit-frame-pointer sanitize.cpp -o sanitize
我原以为是错误的。 Memory Sanitizer没有发现ans没有初始化的事实吗?
感谢您的帮助。
答案 0 :(得分:6)
从clang santitizer文档中可以清楚地看出它只处理来自动态分配内存的单元化内存读取。自动记忆不是消毒剂检查的一部分。
答案 1 :(得分:1)
您不需要任何Sanitizer来捕获此错误。编译器可以在编译时找出此错误(清理程序和valgrind在运行时工作)。事实上,如果您打开警告,所有GCC Clang和ICC都会对此代码发出警告。此特定警告由-Wuninitialized
标志控制。通常,始终使用高警告级别是一种好习惯。我建议使用以下警告标志组合,特别是在学习语言时:
-Wall -Wextra -pedantic
如果您得到一些误报,只有在严格检查它们确实是错误之后,您才能禁用特定警告。没有理由不使用警告标志。有些项目甚至使用-Werror
标志,将所有警告变为错误。
答案 2 :(得分:0)
Valgrind memcheck可以选择检测未初始化的堆栈值。
Valgrind文档:
对于源自堆块的未初始化值,Memcheck显示块的分配位置。对于源自堆栈分配的未初始化值,Memcheck可以告诉您哪个函数分配了值,但不超过该值 - 通常它会显示函数左括号的源位置。因此,您应该仔细检查所有函数的局部变量是否已正确初始化。