我们正在Clang的边缘测试案件中遇到崩溃。边缘案例手动启用所有X86 cpu功能,因为Clang并不总是使用-march=native
启用它们。案件还包括地址清理工具:
$ CXX=clang++ make CXXFLAGS="-DDEBUG -g3 -O0 -std=c++03 -msse2 -msse3 -mssse3 -msse4.1 -msse4.2
-maes -mpclmul -mrdrnd -mrdseed -mavx -mavx2 -mbmi -mbmi2 -madx -march=native -fPIC -pipe
-fsanitize=address -fno-omit-frame-pointer"
make: Nothing to be done for `all'.
稍后,当我们在GDB下运行程序时,缺少变量和值:
$ gdb cryptest.exe
...
(gdb) r v
...
Testing RDRAND generator...
Program received signal SIGSEGV, Segmentation fault.
0x0000000001db20b4 in CryptoPP::GCC_RRA_GenerateBlock (output=<optimized out>,
size=<optimized out>, safety=<optimized out>) at rdrand.cpp:235
235 __asm__ volatile(
我们如何阻止Clang优化-O0
的变量?
我们已经多次重建了库和测试程序,以确保不会意外使用优化的东西。
$ clang --version
Ubuntu clang version 3.6.0-2ubuntu1~trusty1 (tags/RELEASE_360/final) (based on LLVM 3.6.0)