【发布时间】:2015-05-27 17:57:34
【问题描述】:
我正在使用 boost::uuid 来生成唯一 ID:
string UUid()
{
boost::uuids::uuid uuid = boost::uuids::random_generator()();
return boost::lexical_cast<std::string>(uuid);
}
当我使用valgrind 来分析我的代码时,我得到以下注释:
Valgrind 日志
==47807== Conditional jump or move depends on uninitialised value(s)
==47807== at 0x441D19: void boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>::seed<boost::uuids::detail::generator_iterator<boost::uuids::detail::seed_rng> >(boost::uuids::detail::generator_iterator<boost::uuids::detail::seed_rng>&, boost::uuids::detail::generator_iterator<boost::uuids::detail::seed_rng>) (mersenne_twister.hpp:177)
==47807== by 0x4417EC: void boost::uuids::detail::seed<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> >(boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&) (seed_rng.hpp:249)
==47807== by 0x440EAA: boost::uuids::basic_random_generator<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> >::basic_random_generator() (random_generator.hpp:50)
==47807== by 0x43B4D5: ManageDb::randomid() (ManageDb.cpp:92)
==47807== by 0x43B57A: ManageDb::fillTables(std::vector<Entity, std::allocator<Entity> > const&) (ManageDb.cpp:103)
==47807== by 0x40BBF7: DataLoader::extractData() (DataLoader.cpp:78)
==47807== by 0x42EF26: main (main.cpp:30)
==47807== Uninitialised value was created by a heap allocation
==47807== at 0x4C2B0E0: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==47807== by 0x44042A: boost::uuids::detail::seed_rng::sha1_random_digest_() (seed_rng.hpp:167)
==47807== by 0x44025B: boost::uuids::detail::seed_rng::operator()() (seed_rng.hpp:103)
==47807== by 0x441C97: boost::uuids::detail::generator_iterator<boost::uuids::detail::seed_rng>::generator_iterator(boost::uuids::detail::seed_rng*) (seed_rng.hpp:218)
==47807== by 0x4417C5: void boost::uuids::detail::seed<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> >(boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u>&) (seed_rng.hpp:247)
==47807== by 0x440EAA: boost::uuids::basic_random_generator<boost::random::mersenne_twister_engine<unsigned int, 32ul, 624ul, 397ul, 31ul, 2567483615u, 11ul, 4294967295u, 7ul, 2636928640u, 15ul, 4022730752u, 18ul, 1812433253u> >::basic_random_generator() (random_generator.hpp:50)
==47807== by 0x43B4D5: ManageDb::randomid() (ManageDb.cpp:92)
==47807== by 0x43B57A: ManageDb::fillTables(std::vector<Entity, std::allocator<Entity> > const&) (ManageDb.cpp:103)
==47807== by 0x40BBF7: DataLoader::extractData() (DataLoader.cpp:78)
==47807== by 0x42EF26: main (main.cpp:30)
==47807==
问题
- 为什么
valgrind会为boost::uuid生成这些备注? - 如果是 boost 的问题,我可以忽略它吗?
可能的错误
- 根据此链接Ticket #7248 (reopened Bugs),这可能是一个错误。很好,如果是一个错误,我怎样才能让 valgrind 忽略它?
Valgrind 命令
valgrind --leak-check=full --track-origins=yes --suppressions=valgrind.supp ./MyProgram > valgrind-log.txt
valgrind.supp
# supression file for continuum with valgrind
# to generate each supression use: --gen-suppressions=yes option
# to use this supression file, use: --suppressions=<this filename>
{
Crypt_r
Memcheck:Cond
obj:/lib/libc-2.11.1.so
fun:__sha512_crypt_r
fun:crypt_r
}
{
Crypt_r use of uninitialised value of size 8
Memcheck:Value8
obj:/lib/libc-2.11.1.so
fun:__sha512_crypt_r
fun:crypt_r
}
{
String S_Create
Memcheck:Leak
fun:_Znwm
fun:_ZNSs4_Rep9_S_createEmmRKSaIcE
}
{
Mongo OID
Memcheck:Value8
fun:_ZN5mongo10toHexLowerEPKvi
fun:_ZNK5mongo3OID3strEv
}
【问题讨论】:
-
它是否会导致您的程序崩溃? valgrind 在 boost 和/或系统库中提取了很多东西。很多时候,它们是由您传递给这些构造的值引起的。很多时候,它们是无害的,无法帮助/可以安全地忽略。 Valgrind 不是为了让你的程序防弹,而是为了让它完成 90% 的工作。
-
@Qix 哦,不,它没有使我的程序崩溃。但是 valgrind 认为这是一个错误。使用 valgrind 时可以忽略它吗?
-
你运行 valgrind 的参数是什么?
-
我只是使用以下命令:valgrind --leak-check=full --track-origins=yes --suppressions=valgrind.supp ./MyProgram > valgrind-log.txt
-
--track-origins=yes是这里的罪魁祸首。它检查未初始化的数据,这(在我看来)是不可靠的。 Valgrind 创建了一个虚拟机,允许它查看程序何时不仅分配内存,而且读取/写入它。有很多启发式 valgrind 不能运行在肯定会导致这种误报的代码上。这个想法是过于冗长而不是冗长。
标签: c++ boost valgrind boost-uuid