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

jww*_*jww 6 c++ g++ ubsan

我在 Debian 8 x86_64 上使用 g++ 4.9.2。我发现未定义行为消毒剂 (UBsan) ( -fsanitize=undefined) 错误:

algebra.cpp:206:8: runtime error: load of value 127,
    which is not a valid value for type 'bool'
Run Code Online (Sandbox Code Playgroud)

代码来自 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     };
Run Code Online (Sandbox Code Playgroud)

它在几个地方被调用,例如:

$ 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));
Run Code Online (Sandbox Code Playgroud)

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

编辑:这是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;}
Run Code Online (Sandbox Code Playgroud)

我也在m_negateNextctor中初始化。

这是什么问题,我该如何清除它?

Sha*_*our 11

使用 -fsanitize=undefined 测试 libc++的博客文章也提到了类似的错误:

运行时错误:加载值 64,这不是“bool”类型的有效值

表明这可能是由于未初始化的 bool,请参阅最后的评论,其中说:

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

据我所知是这种情况,m_negateNext因为它没有在WindowSlider其余成员变量的构造函数中初始化。

未初始化的 bool 将具有不确定的值,使用不确定的值是未定义的行为