gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:46 25 4
gpt4 key购买 nike

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

有没有其他人遇到同样的问题?

最佳答案

根据阅读源代码,我的大胆猜测是您的编译环境与用于编译您正在使用的 libstdc++ 二进制文件的环境不匹配。具体来说,libstdc++ 是在没有 _GTHREAD_USE_COND_INIT_FUNC 的情况下编译的, 它是在您的环境中定义的。

原因如下: header <condition_variable>定义解析为 pthread_cond_t 类型的数据成员.如果宏__GTHREAD_COND_INIT定义时,在头文件中指定该成员的默认初始化,在实现文件中默认构造函数。如果不是,则在非默认构造函数的主体中使用函数调用对其进行初始化。是否__GTHREAD_COND_INIT定义由 _GTHREAD_USE_COND_INIT_FUNC 控制宏。

如果类内成员初始化按照我认为的方式在 G++ 中实现,例如类内初始值设定项在调用构造函数之前执行,那么当您使用 _GTHREAD_USE_COND_INIT_FUNC 编译 libstdc++ 时,就会出现您看到的效果。 undefed,而现在它已在您的环境中的某个地方定义。这意味着 header 不提供类内初始化,并且使用库中的默认构造函数,导致未初始化的值。

来源引用,以防您想深入挖掘:

关于c++ - 使用 C++11 std::condition_variable 的 Gtest 意味着 valgrind 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21673848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com