0

Crypto++ の zlib 関数を使用するプログラムで valgrind を使用すると、奇妙なエラーが発生します。

vex x86->IR: unhandled instruction bytes: 0xC5 0xF9 0x6E 0x45
==8605== valgrind: Unrecognised instruction at address 0x814c88b.
==8605==    at 0x814C88B: CryptoPP::ByteQueue::TransferTo2(CryptoPP::BufferedTransformation&, unsigned long long&, std::string const&, bool) (misc.h:189)
==8605==    by 0x814C3E6: CryptoPP::ByteQueue::Get(unsigned char*, unsigned int) (cryptlib.h:901)
==8605==    by 0x815DAAE: CryptoPP::ZlibDecompressor::ProcessPoststreamTail() (zlib.cpp:84)
==8605==    by 0x815B6EC: CryptoPP::Inflator::ProcessInput(bool) (zinflate.cpp:349)
==8605==    by 0x815BC25: CryptoPP::Inflator::Put2(unsigned char const*, unsigned int, int, bool) (zinflate.cpp:295)
==8605==    by 0x805E40C: CryptoPP::BufferedTransformation::Put(unsigned char const*, unsigned int, bool) (cryptlib.h:789)

Crypto++ は、特定の領域で手作業でコード化されたアセンブリを使用して速度を上げていることを知っています。0xC5 で始まる命令は、コンパイルされたコードには決して存在しないことを読みました。これは、手作業でコード化されたアセンブリからのアセンブリ命令によるものでしょうか? もしそうなら、valgrind でこのチェックを無効にして、プログラムのテストを続けることができますか?

4

1 に答える 1

1

これはAVX命令です。 Valgrind は現在 AVX 命令をサポートしていませんが、AVX サポートは開発中です。valgrind は各命令をエミュレートすることによって機能するため、実行の残りの部分で valgrind を完全に無効にする実際の命令に直接ジャンプする場合を除き、バイパスできるのは単なるチェックではありません。

于 2012-01-26T03:39:09.713 に答える