运行时错误:加载值127,这不是类型' bool'的有效值。

时间:2015-07-15 01:46:07

标签: c++ g++ ubsan

我在Debian 8,x86_64上使用g ++ 4.9.2。我正在捕捉Undefined Behavior sanitizer(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));

InversionIsFastbool,所以这不应该是个问题。但我添加了!!InversionIsFast()以防万一,问题仍然存在。

编辑:这是InversionIsFast的grep。它似乎已初始化。

$ 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;}

我还在ctor中初始化了m_negateNext

问题是什么,如何清除?

1 个答案:

答案 0 :(得分:3)

博文Testing libc++ with -fsanitize=undefined也提到了类似的错误:

  

运行时错误:加载值64,这不是类型的有效值   &#39;布尔&#39;

表明可能是由于未初始化的bool,请看最后的评论说:

  

我没有(在课堂上)初始化bool [...]

我所知道的是m_negateNext的情况,因为它没有在WindowSlider的构造函数中初始化,而其余的成员变量是。{/ p>

未初始化的bool将具有不确定的值using an indeterminate value is undefined behavior