2015-07-15 2 views
2

Я использую 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.

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

+0

Does 'InversionIsFast()' возвращает логическое выражение или просто переводит его в 'bool'? Если это последний, я бы сказал, что изменился первый. Вероятно, исправит эту ошибку и станет лучшей практикой программирования, ИМО. –

+2

Этот блог [post] (http://blog.llvm.org/2013/04/testing-libc-with-fsanitizeundefined.html) предполагает, что это может быть связано с unintialized bool, см. Комментарий в конце. Который из того, что я могу сказать, кажется, имеет место с 'm_negateNext'. –

+0

@Red Alert - Я проверю это. Код C++ 03, поэтому не должно быть 'constexpr'. Shakif - Он пытался это после того, как я опубликовал. Никакой радости, той же проблемы. – jww

ответ

3

В блоге пост Testing libc++ with -fsanitize=undefined, который также отметил, подобную ошибку:

runtime error: load of value 64, which is not a valid value for type 'bool'

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

I had not (in class) initialised the bool [...]

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

Неинициализированный bool будет иметь неопределенное значение и using an indeterminate value is undefined behavior.

+0

Я думаю, что ты был прав. В make-файле отсутствуют зависимости, поэтому 'make' не восстанавливал все необходимые файлы. После чистки я не могу воспроизвести. – jww