valgrind:地址0x5111715

时间:2016-09-24 06:53:35

标签: c++ c++11 random memory-leaks valgrind

我的功能看起来像这样 -

std::string func()
{
    std::string result;

    ...

    auto seed = std::random_device()();
    std::mt19937 gen(seed);
    std::uniform_int_distribution<> dis(0, 61);

    ...
    return result;
}

在各种编译器及其版本中编译良好,但仍无法通过 Ubuntu 上的valgrind测试。我明确提到了ubuntu,因为它在我的安装了Arch Linux的机器上成功传递。

两个valgrind安装都将其版本报告为valgrind-3.11.0,唯一的区别是Arch Linux安装在我的机器上没有虚拟化,而Ubuntu测试已在DO / CI服务器上完成,可能属于某种虚拟化。但这有关系吗?

这是valgrind run的日志 -

 --- stderr ---
==13849== Memcheck, a memory error detector
==13849== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13849== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==13849== Command: file/path/here
==13849== 
vex amd64->IR: unhandled instruction bytes: 0xF 0xC7 0xF0 0x89 0x6 0xF 0x42 0xC1
vex amd64->IR:   REX=0 REX.W=0 REX.R=0 REX.X=0 REX.B=0
vex amd64->IR:   VEX=0 VEX.L=0 VEX.nVVVV=0x0 ESC=0F
vex amd64->IR:   PFX.66=0 PFX.F2=0 PFX.F3=0
==13849== valgrind: Unrecognised instruction at address 0x5111715.
==13849==    at 0x5111715: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==13849==    by 0x51118B1: std::random_device::_M_getval() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==13849==    by 0x4809FB: std::random_device::operator()() (random.h:1612)
==13849==    by 0x47F0C2: isaac::deviceList::genId[abi:cxx11](unsigned int) (deviceList.cpp:21)
==13849==    by 0x47F2A7: isaac::deviceList::place(isaac::deviceType, nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long, unsigned long, double, std::allocator>) (deviceList.cpp:38)
==13849==    by 0x40D06E: DeviceList_place_Test::TestBody() (test.cpp:194)
==13849==    by 0x45D5A7: void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2078)
==13849==    by 0x4588D2: void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2114)
==13849==    by 0x43EBB3: testing::Test::Run() (gtest.cc:2151)
==13849==    by 0x43F3F5: testing::TestInfo::Run() (gtest.cc:2326)
==13849==    by 0x43FA52: testing::TestCase::Run() (gtest.cc:2444)
==13849==    by 0x446911: testing::internal::UnitTestImpl::RunAllTests() (gtest.cc:4315)
==13849== Your program just tried to execute an instruction that Valgrind
==13849== did not recognise.  There are two possible reasons for this.
==13849== 1. Your program has a bug and erroneously jumped to a non-code
==13849==    location.  If you are running Memcheck and you just saw a
==13849==    warning about a bad jump, it's probably your program's fault.
==13849== 2. The instruction is legitimate but Valgrind doesn't handle it,
==13849==    i.e. it's Valgrind's fault.  If you think this is the case or
==13849==    you are not sure, please let us know and we'll try to fix it.
==13849== Either way, Valgrind will now raise a SIGILL signal which will
==13849== probably kill your program.
==13849== 
==13849== Process terminating with default action of signal 4 (SIGILL): dumping core
==13849==  Illegal opcode at address 0x5111715
==13849==    at 0x5111715: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==13849==    by 0x51118B1: std::random_device::_M_getval() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.22)
==13849==    by 0x4809FB: std::random_device::operator()() (random.h:1612)
==13849==    by 0x47F0C2: isaac::deviceList::genId[abi:cxx11](unsigned int) (deviceList.cpp:21)
==13849==    by 0x47F2A7: isaac::deviceList::place(isaac::deviceType, nlohmann::basic_json<std::map, std::vector, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, bool, long, unsigned long, double, std::allocator>) (deviceList.cpp:38)
==13849==    by 0x40D06E: DeviceList_place_Test::TestBody() (test.cpp:194)
==13849==    by 0x45D5A7: void testing::internal::HandleSehExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2078)
==13849==    by 0x4588D2: void testing::internal::HandleExceptionsInMethodIfSupported<testing::Test, void>(testing::Test*, void (testing::Test::*)(), char const*) (gtest.cc:2114)
==13849==    by 0x43EBB3: testing::Test::Run() (gtest.cc:2151)
==13849==    by 0x43F3F5: testing::TestInfo::Run() (gtest.cc:2326)
==13849==    by 0x43FA52: testing::TestCase::Run() (gtest.cc:2444)
==13849==    by 0x446911: testing::internal::UnitTestImpl::RunAllTests() (gtest.cc:4315)
==13849== 
==13849== HEAP SUMMARY:
==13849==     in use at exit: 84,300 bytes in 108 blocks
==13849==   total heap usage: 622 allocs, 514 frees, 530,112 bytes allocated
==13849== 
==13849== LEAK SUMMARY:
==13849==    definitely lost: 0 bytes in 0 blocks
==13849==    indirectly lost: 0 bytes in 0 blocks
==13849==      possibly lost: 0 bytes in 0 blocks
==13849==    still reachable: 84,300 bytes in 108 blocks
==13849==         suppressed: 0 bytes in 0 blocks
==13849== Rerun with --leak-check=full to see details of leaked memory
==13849== 
==13849== For counts of detected and suppressed errors, rerun with: -v
==13849== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
-------

编辑 - 我也尝试从官方来源手动构建valgrind并安装它,但仍会产生相同的错误。

2 个答案:

答案 0 :(得分:7)

请参阅https://bugs.kde.org/show_bug.cgi?id=353370

获取/编译最后一个svn版本应该可以解决这个问题。

如果没有,请在bugzilla上报告,因为3.12版本很快就会发布。 感谢

答案 1 :(得分:4)

看起来您的Ubuntu系统有一个随机数库,它使用您的Valgrind版本无法识别的RDRAND指令(操作码0x0f 0xc7)。您的Arch系统显然使用了不同的实现,但没有利用此指令。

您可以通过重新编译pre-Ivy Bridge CPU来解决这个问题。