2015-07-16 2 views
0

Я компилирую библиотеку Crypto ++ по адресу -O3. В соответствии с Undefined Behavior Sanitizer (UBsan) и Address Sanitizer (Asan), это нормально. Программа работает нормально на -O2-O3 на многих платформах).Этот указатель 0xfffffffc, потенциальные причины?

Его также ОК в соответствии с Valgrind под -O2. В -O3, Valgrind умирает с «Ваша программа просто пыталась выполнить инструкцию, которую Valgrind не понимает». Я вполне уверен, что это из-за инструкций SSE4 и векторизации на -O3.

Однако, я ломаю крушение на некоторых платформах с -O3. Эта конкретная машина - Fedora 22 i686, и ее GCC 5.2.1. Рамка в вопросе показывает this=0xfffffffc:

Program received signal SIGSEGV, Segmentation fault. 
0x0807be29 in CryptoPP::DL_GroupParameters_IntegerBased::GetEncodedElementSize 
    (this=0xfffffffc, reversible=0x1) at gfpcrypt.h:55 
55  unsigned int GetEncodedElementSize(bool reversible) const {return GetModulus().ByteCount();} 

Лучшее, что я могу сказать, что нет ничего расположенных вокруг этого адреса:

(gdb) info shared 
From  To   Syms Read Shared Object Library 
0xb7fdd860 0xb7ff6b30 Yes (*)  /lib/ld-linux.so.2 
0xb7eb63d0 0xb7f7a344 Yes (*)  /lib/libstdc++.so.6 
0xb7e005f0 0xb7e32bd8 Yes (*)  /lib/libm.so.6 
0xb7951060 0xb7980cc4 Yes (*)  /lib/libubsan.so.0 
0xb7932090 0xb7948001 Yes (*)  /lib/libgcc_s.so.1 
0xb7916840 0xb79238d1 Yes (*)  /lib/libpthread.so.0 
0xb775d3f0 0xb78a0b6b Yes (*)  /lib/libc.so.6 
0xb7741a90 0xb7742a31 Yes (*)  /lib/libdl.so.2 

Я видел this=0x00000000если статический объект класса, объявленный в одном переводе единица используется в другом блоке перевода до завершения инициализации. Но я не помню, чтобы видел 0xfffffffc в прошлом.

Каковы возможные причины для this=0xfffffffc? Или как я могу их устранить?

ответ

5

Если у вас есть 32-битная машина 0xfffffffc is ((int*)nullptr)-1. Поэтому, возможно, вы принимаете предыдущий элемент нулевой указатель (например, неправильно используя некоторый обратный итератор, и т.д. и т.п. ...)

bt Используйте или backtrace команду gdb, чтобы понять, что произошло. Я думаю, что проблема в вызывающем абоненте (или его вызывающем абоненте и т. Д.)

Попробуйте также использовать другой компилятор (например, старую версию GCC и несколько версий Clang/LLVM ....). У вас может быть undefined behavior, что ваши другие инструменты не обнаружили как таковые. Вам нужно понять, есть ли ошибка внутри Crypto ++ (или, возможно, но очень маловероятна, она находится внутри самой GCC, а затем сообщите об ошибке на GCC bugzilla ....). Если вы подозреваете компилятор, перейдите -S -fverbose-asm -fdump-tree-all -O3 в g++, чтобы понять, что делает GCC .... (это позволит выгрузить сотни файлов, включая сгенерированный код ассемблера .s).

Спросить также на crypto++ lists; возможно, сообщите об ошибке в трекере Crypto ++. Тестирование с другими версиями или моментальными снимками этой библиотеки

BTW, я не уверен, что -fsanitize=undefined или -fsanitize=address следует использовать с -O3; Я думаю, что они больше подходят с -O0 -g или -Og -g

+0

Да, это 32-разрядная машина (x86_64 в порядке, кстати). Просить в списке рассылки, вероятно, не поможет. Подача отчета об ошибке, вероятно, не поможет. – jww

+0

Это должно помочь. Вы обнаружили ошибку (возможно, в самом Crypto ++, возможно, в GCC), и вы должны сообщить об этом. Это может не помочь сразу (некоторые ошибки требуют нескольких месяцев для исправления). И я считаю, что при поиске возможной ошибки в любом бесплатном программном обеспечении, сообщая, что это моральный долг. –

+0

Это не поможет, потому что я парень ...Вэй Дай (который написал библиотеку) занят другими вещами, поэтому горстка из нас поддерживает и добавляет функции. – jww

Смежные вопросы