使用C ++ 11 std :: condition_variable的Gtest意味着valgrind错误

时间:2014-02-10 09:52:37

标签: c++ c++11 valgrind googletest googlemock

如果我用这种方式用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。

其他人是否遇到过同样的问题?

1 个答案:

答案 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未定义时,你会看到效果,而现在它在你的环境中被定义。这意味着标头不提供类内初始化,并且使用库中的默认构造函数,从而导致未初始化的值。

来源参考,如果您想深入挖掘: