Ошибка выполнения: загрузка значения 127, которое не является допустимым значением для типа ‘bool’

Я использую g ++ 4.9.2 на Debian 8, x86_64. Я ловлю дезинфицирующее средство Undefined Behavior (UBsan) (-fsanitize=undefined) ошибка:

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() на всякий случай и проблема сохраняется.

РЕДАКТИРОВАТЬ: Вот 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 в ктор.

В чем проблема, и как мне ее очистить?

3

Решение

Сообщение в блоге Тестирование libc ++ с -fsanitize = undefined который также упомянул похожую ошибку:

ошибка времени выполнения: загрузка значения 64, которое не является допустимым значением для типа
‘BOOL’

предполагает, что это может быть связано с неинициализированным bool, см. комментарий в конце, который говорит:

Я не (в классе) инициализировал bool […]

Что из того, что я могу сказать, в случае с m_negateNext так как он не инициализируется в конструкторе WindowSlider в то время как остальные переменные-члены.

Неинициализированный bool будет иметь неопределенное значение и использование неопределенного значения — неопределенное поведение.

3

Другие решения


По вопросам рекламы [email protected]