如果我用这种方式用google测试框架编写测试:
TEST_F( TestFName, TestName )
{
std::condition_variable cv;
}
它会生成valgrind错误。我使用--leak-check=full --track-origins=yes
选项运行它。
Conditional jump or move depends on uninitialised value(s)
==17215== at 0x4E3DA82: pthread_cond_destroy@@GLIBC_2.3.2 (pthread_cond_destroy.c:35)
...
Uninitialised value was created by a stack allocation
==17215== at 0x4551D0: TestFName_TestName_test::TestBody()
很难意识到错误来自condition_variable cv
声明。当我宣布它是全局的时,错误消失了。
我在使用Ubuntu 3.8 x86_64的计算机上运行Valgrind-3.7.0。
其他人是否遇到过同样的问题?
答案 0 :(得分:3)
基于阅读源代码,我的猜测是,您的编译环境与用于编译您正在使用的libstdc ++二进制文件的环境不匹配。具体来说,libstdc ++是在没有_GTHREAD_USE_COND_INIT_FUNC
的情况下编译的,它是在您的环境中定义的。
原因如下:标题<condition_variable>
定义了一个解析为pthread_cond_t
的类型的数据成员。如果定义了宏__GTHREAD_COND_INIT
,则在头中指定此成员的默认初始化,并在实现文件中默认构造函数。如果不是,则在非默认构造函数的主体中使用函数调用初始化它。是否定义__GTHREAD_COND_INIT
由_GTHREAD_USE_COND_INIT_FUNC
宏控制。
如果在G ++中以我认为的方式实现类内成员初始化,例如在调用构造函数之前执行类内初始值设定项,然后当你的libstdc ++编译为_GTHREAD_USE_COND_INIT_FUNC
未定义时,你会看到效果,而现在它在你的环境中被定义。这意味着标头不提供类内初始化,并且使用库中的默认构造函数,从而导致未初始化的值。
来源参考,如果您想深入挖掘: