Purify 在类/结构填充上的 Uninit Memory Read (UMR)

Posted

技术标签:

【中文标题】Purify 在类/结构填充上的 Uninit Memory Read (UMR)【英文标题】:Purify's Uninit Memory Read (UMR) on class/structure padding 【发布时间】:2010-07-21 10:10:24 【问题描述】:

我遇到了使用Purify 填充类/结构的非常烦人的副作用。例如

struct something 
    int field1;
    char field2;
;

/* ... */

struct something smth, smth2;
smth.field1 = 1;
smth.field2 = 'A';

smth2 = smth;

最后一行很可能会触发 UMR 警告,指出已访问 3 个字节的初始化内存。这显然是一个误报:结构的最后三个字节中没有用户数据,它只是一个填充。

警告通常会很快填满日志文件,因此很难看到其他真正的问题。

有人知道抑制误报的方法吗?

【问题讨论】:

对于 C++,实际上我想出了另一种可能的解决方案:即使对于结构,也实现默认值和复制 c'tors。复制 c'tor 显然阻止了结构分配的编译器优化,而复制构造函数实现显然只复制真实字段,从不触及填充。 【参考方案1】:

我没有净化的经验,但也许显式初始化第一个结构会删除此警告:

struct something smth = 0;
struct something smth2;

我假设您的结构具有块范围(不是文件)。如果它们具有文件范围,则零初始化是隐式的。

【讨论】:

这是什么方言?它不能使用 gcc/g++ 4.1.2 编译无警告。 啊,我的 gcc 警告问题的答案在这个问题中(这也提供了对 OP 问题的提示):***.com/questions/894300/… @schot:这对于类似 C 的结构来说很好,但对于 C++ 结构(具有构造函数的结构)则不起作用。是的,这是一个块范围(堆栈上的变量)或堆。 @bstpierre:是的,这个问题可能很有用。我通常使用 '-std=c99 -pedantic -Wall -Wextra -Wwrite-strings' 进行编译,但有时会出现警告。顺便说一句,gcc 4.1.2 是一个相当旧的版本。 @Dummy0001:好的,我错过了 C++ 部分(不要关联 C++ 结构)。 @schot:顺便说一句,memset() 有助于 C 风格的结构。但是为完全正确的代码添加成堆的 memset() 是虚假的。

以上是关于Purify 在类/结构填充上的 Uninit Memory Read (UMR)的主要内容,如果未能解决你的问题,请参考以下文章

Valgrind vs Purify [关闭]

Rational 工具 Purify/Quantify 查找 pdb 文件

64位机器上的结构填充

C++ 在类构造函数中填充向量

是否可以在类初始化之前填充 const QHash (或类似的)?

在类内初始化数组会产生 std::bad_alloc 错误,但在外面不会?