Я компилирую библиотеку 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
? Или как я могу их устранить?
Да, это 32-разрядная машина (x86_64 в порядке, кстати). Просить в списке рассылки, вероятно, не поможет. Подача отчета об ошибке, вероятно, не поможет. – jww
Это должно помочь. Вы обнаружили ошибку (возможно, в самом Crypto ++, возможно, в GCC), и вы должны сообщить об этом. Это может не помочь сразу (некоторые ошибки требуют нескольких месяцев для исправления). И я считаю, что при поиске возможной ошибки в любом бесплатном программном обеспечении, сообщая, что это моральный долг. –
Это не поможет, потому что я парень ...Вэй Дай (который написал библиотеку) занят другими вещами, поэтому горстка из нас поддерживает и добавляет функции. – jww