std::random_device を使うと valgrind が落ちる

環境

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のバグ

解決法

valgrindを3.13に更新する。

参考

353370 – RDRAND amd64->IR: unhandled instruction bytes: 0x48 0xF 0xC7 0xF0 0x72 0x4 0xFF 0xC9

c++ - Valgrind Unrecognised instruction - Stack Overflow

The design and implementation of Valgrind