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