对于下面的一段代码,我收到了覆盖率静态检查器工具警告。
double value = 0;
std::string origValue("0.50");
value = 0.10 * boost::lexical_cast<double>(origValue);
警告是“溢出的返回值(INTEGER_OVERFLOW)”。我无法理解上面的代码有什么问题。当我使用双打时,整数溢出如何发挥作用?谢谢。
对于下面的一段代码,我收到了覆盖率静态检查器工具警告。
double value = 0;
std::string origValue("0.50");
value = 0.10 * boost::lexical_cast<double>(origValue);
警告是“溢出的返回值(INTEGER_OVERFLOW)”。我无法理解上面的代码有什么问题。当我使用双打时,整数溢出如何发挥作用?谢谢。
这个特殊的 Coverity 静态分析检查器正在寻找两件事:可能在特定值上溢出的操作(它将尝试在解释中给出的示例)和对可能被截断的值的不安全使用。
UI 会向您显示“事件”,这些“事件”解释了某些内容被标记的原因。该手册描述了每个事件的含义。在您的案例中,您要查找的两个事件是第一个事件的“截断”或“溢出”,以及第二个事件的“溢出接收器”。
代码片段显示转换为双精度的字符串乘以一个常量,然后分配给另一个双精度。也许那里没有问题,但是,缺陷的“溢出的返回值”标题告诉我们你有第二个事件,你从这个函数返回这个值。如果您要从此函数返回“值”并且返回类型不是双精度(可能是 32 位类型),那么您的代码中有一个潜在的错误(显然不是您显示的特定值,但如果字符串可以是一个更大的值)。如果函数返回 double,则在分析中是误报,您可以在 UI 中将其标记为这样,这样该缺陷就不会再次显示给您。
如果没有看到更多代码,很难说是否存在真正的问题,但请记住,静态分析无法知道运行时值是什么(字符串真的是常量还是动态读取的?)但这是为什么它会为您提供详细的事件,而不仅仅是一行摘要 - 这样您就可以评估此代码中出现实际问题的可能性。
说了这么多,检查器不应该跟踪浮动,所以这里的 Coverity 肯定存在错误。由于我碰巧为他们工作,我已将此作为问题提交,但也可以随时将其报告给 Coverity 支持。