環境
valgrind 3.11, clang++ 5.0
問題
#include <iostream>
#include <random>
int main() {
std::random_device rd;
std::cout << rd() << std::endl;
return 0;
}
上記のコードはコンパイルすれば普通に実行できるが、 valgrind から実行すると valgrind が落ちる。
$ clang++ test.cpp -std=c++17
$ ./a.out
1240201163
$ /usr/bin/valgrind ./a.out
==13508== Memcheck, a memory error detector
==13508== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==13508== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==13508== Command: ./a.out
==13508==
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
==13508== valgrind: Unrecognised instruction at address 0x4ef67a5.
==13508== at 0x4EF67A5: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==13508== by 0x4EF6941: std::random_device::_M_getval() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25)
==13508== by 0x401AD4: std::random_device::operator()() (in /tmp/a.out)
==13508== by 0x4018A2: main (in /tmp/a.out)
...
illegal instruction (core dumped)
原因
解決法
valgrindを3.13に更新する。
参考
353370 – RDRAND amd64->IR: unhandled instruction bytes: 0x48 0xF 0xC7 0xF0 0x72 0x4 0xFF 0xC9