C++ 为什么文件作用域POD上的静态限定符会更改Valgrind查找?

C++ 为什么文件作用域POD上的静态限定符会更改Valgrind查找?,c++,static,initialization,valgrind,C++,Static,Initialization,Valgrind,我正在做一个使用一些文件范围变量的项目。它们是bool和unsigned int,初始化为false和标量,它们位于*.cpp文件中: 如果没有静态限定符,Valgrind将生成一个查找: 条件跳转或移动取决于未初始化的值 使用静态限定符时,查找结果不存在 据我所知,POD初始化,非静态0初始化和静态POD都在BSS中,因此它们都被有效地初始化。但在本例中,它们是显式初始化的,因此关于初始化内容的分歧应该是没有意义的。关于BSS的治疗方法,请参见维基百科 最后,我们没有在bss中使用初始化为-f

我正在做一个使用一些文件范围变量的项目。它们是bool和unsigned int,初始化为false和标量,它们位于*.cpp文件中:

如果没有静态限定符,Valgrind将生成一个查找:

条件跳转或移动取决于未初始化的值

使用静态限定符时,查找结果不存在

据我所知,POD初始化,非静态0初始化和静态POD都在BSS中,因此它们都被有效地初始化。但在本例中,它们是显式初始化的,因此关于初始化内容的分歧应该是没有意义的。关于BSS的治疗方法,请参见维基百科

最后,我们没有在bss中使用初始化为-fno zero这样的标志。标志和选项是保守的:-DNDEBUG-g3-O1-march=native-使用O1是因为

由于Valgrind产生了不同的结果,所以在使用和不使用静电的情况下,情况可能会发生变化。我试图理解什么变化以及变化之间的相互作用,而不是如何解决这个问题

为什么Valgrind在没有静态限定符的情况下生成查找


<实际的源文件可以是FUMD,第145, 146行和第147行。< /P>你的代码看起来是C++而不是C,或者你正在编译C代码作为C++?无论如何,这两种语言都不同,特别是在初始化策略上。POD也是C++术语,而不是C. Thanks Jens。这已经纠正了。我试图避免C++标签,因为一些巡逻的人是无法容忍的。我尽量远离他们。我希望他们也会这样做。根据SO指南,您想举一个最小的例子吗?我猜您在初始化其他全局变量时使用了这些全局变量,也称为静态初始化顺序失败。@UlrichEckhardt-如果我错了,请纠正我,但BSS初始化发生在任何构造函数运行之前。也就是说,当变量的页映射到内存中时,支持变量的内存被0-初始化。对不起,我没有一个最小的例子。我不知道如何提供一个简单的示例来测试链接加载器映射页面以及它与Valgrind交互的方式。这就是为什么我必须询问交互的原因。你可以把一个简化的测试用例程序做成一个c文件。然后您可以将标记更改回c
/* CPP implementation file */
bool g_b1 = false, bool g_b2 = false;
unsigned int g_n1 = 32;