Domanda

If I write a test with google test framework this way:

TEST_F( TestFName, TestName )
{
     std::condition_variable cv;
}

It generates a valgrind error. I run it with --leak-check=full --track-origins=yes options.

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()

It was weird to realise that the error was from the condition_variable cv declaration. When I declared it global, the error dissapeared.

I am running Valgrind-3.7.0 on a machine with Ubuntu 3.8 x86_64.

Did someone else encountered the same issue?

È stato utile?

Soluzione

My wild guess, based on reading the source, is that your compilation environment does not match the environment used to compile the libstdc++ binaries you're using. Specifically, libstdc++ was compiled without _GTHREAD_USE_COND_INIT_FUNC, and it is defined in your environment.

Here is the reason: the header <condition_variable> defines a data member of a type which resolves to pthread_cond_t. If the macro __GTHREAD_COND_INIT is defined, the default initialization for this member is specified in the header, and the constructor is defaulted in the implementation file. If it's not, it is initialized with a function call in the body of a non-default constructor. Whether __GTHREAD_COND_INIT is defined is controlled by the _GTHREAD_USE_COND_INIT_FUNC macro.

If in-class member initialization is implemented in G++ the way I think it is, e.g. the in-class initializers are executed before calling the constructor, then the effect you see would occur when your libstdc++ was compiled with _GTHREAD_USE_COND_INIT_FUNC undefed, while right now it is defined in your environment somewhere. This means that the header does not provide in-class initialization and the default constructor from the library is used, leading to an uninitialized value.

Source references, in case you want to dig deeper:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top