我在 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'
代码来自 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
ctor中进行了初始化。
问题是什么,我该如何解决?