Coverity中的溢流返回值警告

Overflowed return value warning in Coverity

本文关键字:返回值 警告 Coverity      更新时间:2023-10-16

我收到下面一段代码的coverity静态检查器工具警告。

   double value = 0;
   std::string origValue("0.50");
   value = 0.10 * boost::lexical_cast<double>(origValue);

警告为"溢流返回值(INTEGER_OVERFLOW)"。我无法理解上面的代码出了什么问题。当我使用双打时,整数溢出是如何发挥作用的?谢谢

这个特殊的Coverity静态分析检查器正在寻找两件事:可能在特定值上溢出的操作(它将在解释中给出示例)和潜在截断值的不安全使用。

UI向您显示"事件",这些事件解释了标记某些内容的原因。手册描述了每个事件的含义。在您的案例中,您要查找的两个事件是第一个事件的"截断"或"溢出",以及第二个事件的的"溢出接收器"。

代码片段显示,转换为double的字符串乘以一个常量,然后分配给另一个double。也许并没有问题,然而,缺陷的"溢出返回值"标题告诉我们,您有第二个事件,您从这个函数返回这个值。如果您从这个函数返回"value",并且返回类型不是双精度的(可能是32位类型吗),那么您的代码中就有一个潜在的错误(显然没有显示特定的值,但如果字符串可以是更大的值)。如果函数返回double,那么它在分析中是假阳性,您可以在UI中将其标记为假阳性,这样缺陷就不会再次显示给您。

如果看不到更多的代码,很难说是否存在真正的问题,但请记住,静态分析无法知道运行时值是什么(字符串真的是常量还是动态读取的?)但这就是为什么它会为您提供详细的事件,而不仅仅是一行摘要,这样您就可以评估此代码中出现真正问题的可能性。

说了这么多,检查器不应该跟踪浮动,所以这里的Coverity肯定有一个错误。由于我碰巧为他们工作,我已经将此作为一个问题提交,但也可以随时向Coverity支持部门报告。