内存消毒器
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
标志,将所有警告转化为错误。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存