内存消毒器

Memory Sanitizer

本文关键字:内存      更新时间:2023-10-16

我在Ubuntu 14.04上玩Clang 3.7.0的Memory Sanitizer。以下代码确实可以完美工作:

#include <cstdio>
int main() {
  double ans;
  printf("Hello World: %fn", ans);
  return 0;
}

使用编译时

 clang++ -g -O1 -fsanitize=memory -fsanitize-memory-track-origins=2 -fomit-frame-pointer sanitize.cpp -o sanitize

我本来以为会出错。Memory Sanitizer没有发现ans没有初始化的事实吗?

谢谢你的帮助。

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

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

Valgrind文件:

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

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

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

-Wall -Wextra -pedantic

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