Я использую g ++ 4.9.2 на Debian 8, x86_64. Я ловя Неопределенное поведение дезинфицирующее (UBsan) (-fsanitize=undefined
) ошибки:Ошибка выполнения: загрузка значения 127, что недопустимо для типа 'bool'
algebra.cpp:206:8: runtime error: load of value 127,
which is not a valid value for type 'bool'
Код из библиотеки Crypto ++. Вот код на algebra.cpp:206
(и некоторые связанный код):
206 struct WindowSlider
207 {
208 WindowSlider(const Integer &expIn, bool fastNegate, unsigned int windowSizeIn=0)
209 : m_exp(expIn), m_windowModulus(Integer::One()), m_windowSize(windowSizeIn), m_windowBegin(0), m_fastNegate(fastNegate), m_firstTime(true), m_finished(false)
210 {
...
249 Integer m_exp, m_windowModulus;
250 unsigned int m_windowSize, m_windowBegin;
251 word32 m_expWindow;
252 bool m_fastNegate, m_negateNext, m_firstTime, m_finished;
253 };
Вызванный в нескольких местах, как:
$ grep -I WindowSlider *
...
algebra.cpp: std::vector<WindowSlider> exponents;
algebra.cpp: exponents.push_back(WindowSlider(*expBegin++, InversionIsFast(), 0));
ecp.cpp: std::vector<WindowSlider> exponents;
ecp.cpp: exponents.push_back(WindowSlider(*expBegin++, InversionIsFast(), 5));
InversionIsFast
является bool
, так что не должна быть проблемой. Но я добавил !!InversionIsFast()
на всякий случай, и проблема сохраняется.
EDIT: Вот grep для InversionIsFast
. Кажется, он инициализирован.
$ grep -I InversionIsFast *
algebra.cpp: exponents.push_back(WindowSlider(*expBegin++, !!InversionIsFast(), 0));
algebra.h: virtual bool InversionIsFast() const {return false;}
ec2n.h: bool InversionIsFast() const {return true;}
ecp.cpp: exponents.push_back(WindowSlider(*expBegin++, !!InversionIsFast(), 5));
ecp.h: bool InversionIsFast() const {return true;}
Я также инициализировал m_negateNext
в ctor.
В чем проблема и как ее очистить?
Does 'InversionIsFast()' возвращает логическое выражение или просто переводит его в 'bool'? Если это последний, я бы сказал, что изменился первый. Вероятно, исправит эту ошибку и станет лучшей практикой программирования, ИМО. –
Этот блог [post] (http://blog.llvm.org/2013/04/testing-libc-with-fsanitizeundefined.html) предполагает, что это может быть связано с unintialized bool, см. Комментарий в конце. Который из того, что я могу сказать, кажется, имеет место с 'm_negateNext'. –
@Red Alert - Я проверю это. Код C++ 03, поэтому не должно быть 'constexpr'. Shakif - Он пытался это после того, как я опубликовал. Никакой радости, той же проблемы. – jww