Oracle Solaris Studio 12.2 Discover 和 Uncover 用户指南

部分初始化内存

以 C/C++ 语言编写的位字段可让您创建紧凑的数据类型。例如:


struct my_struct {
  unsigned int valid : 1;
  char         c;
};

在本例中,结构成员 my_struct.valid 在内存中仅占用一位。但是,在 SPARC 平台上,CPU 只能以字节为单位修改内存,因此,只有装入含有 struct.valid 的整个字节才能访问或修改该结构成员。此外,编译器有时会认为一次装入多个字节(例如,由四个字节构成的计算机字)会更高效。当 Discover 检测到此类装入操作时,如果没有更多信息,会假定使用了所有四个字节。例如,字段 my_struct.valid 已初始化,但字段 my_struct.c 未初始化,如果装入了包含这两个字段的计算机字,则 Discover 会标记部分初始化内存读取 (PIR) 错误。

误报的另一个原因是位字段初始化。要写入某个字节的一部分,编译器必须首先生成用于装入该字节的代码。如果该字节不是在读取之前写入的,将生成未初始化内存读取 (UMR) 错误。

要避免位字段误报,请在编译时使用 -g 选项或 -g0 选项。这些选项为 Discover 提供了额外的调试信息,可帮助 Discover 识别位字段装入和初始化,从而可以排除大多数误报。如果出于某种原因无法使用 -g 选项编译,请使用 memset() 等函数初始化结构。例如:


...
struct my_struct s;
/* Initialize structure prio to use */
memset(&sm 0, sizeof(struct my_struct));
...