6

我在 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 未初始化的事实吗?

谢谢你的帮助。

4

3 回答 3

7

从 clang sanitizer 文档中可以清楚地看出,它只处理从动态分配的内存中读取的单元化内存。自动记忆不是消毒剂检查的一部分。

于 2015-12-07T19:13:34.263 回答
1

您不需要任何消毒剂来捕获此错误。编译器可以在编译时找出这个错误(消毒剂和 valgrind 在运行时工作)。事实上,如果您打开警告,所有 GCC Clang 和 ICC 都会对此代码发出警告。此特定警告由-Wuninitialized标志控制。通常,始终使用高警告级别是一种很好的做法。我会推荐以下警告标志组合,尤其是在学习语言时:

-Wall -Wextra -pedantic

如果你得到一些误报,只有在严格检查它们是否真的是假的之后,你才能禁用特定的警告。没有理由不使用警告标志。有些项目甚至使用-Werror标志,将所有的警告变成错误。

于 2015-12-08T01:14:31.317 回答
0

Valgrind memcheck 可能是检测未初始化堆栈值的选项。

Valgrind 文档:

对于源自堆块的未初始化值,Memcheck 显示块的分配位置。对于源自堆栈分配的未初始化值,Memcheck 可以告诉您哪个函数分配了该值,但仅此而已 - 通常它会向您显示函数左括号的源位置。因此,您应该仔细检查所有函数的局部变量是否已正确初始化。

参考:http: //valgrind.org/docs/manual/mc-manual.html

于 2015-12-07T19:31:13.173 回答