C++ 警告--算术表达式与指针组合时出现可疑截断
我正在对我的源代码进行静态代码分析(使用Gimpel PC-Lint)。在代码分析中,我得到一个警告“算术表达式中的可疑截断与指针相结合” 以下是分析报告的内容: source\interp.cpp(142):错误679:(警告--算术表达式中与指针结合的可疑截断) 这里py,y是数据类型为double的动态数组,大小相同,但在代码分析中仍会出现警告 有人能帮我弄清楚吗C++ 警告--算术表达式与指针组合时出现可疑截断,c++,c,static-analysis,C++,C,Static Analysis,我正在对我的源代码进行静态代码分析(使用Gimpel PC-Lint)。在代码分析中,我得到一个警告“算术表达式中的可疑截断与指针相结合” 以下是分析报告的内容: source\interp.cpp(142):错误679:(警告--算术表达式中与指针结合的可疑截断) 这里py,y是数据类型为double的动态数组,大小相同,但在代码分析中仍会出现警告 有人能帮我弄清楚吗 提前感谢。这可能是因为您使用ulIndex+1将int添加到无符号long 试一试 或者,这可能取决于您如何定义py和y数组。
提前感谢。这可能是因为您使用
ulIndex+1将int添加到无符号long
试一试
或者,这可能取决于您如何定义py和y数组。这可能是因为您使用无符号表达式作为数组索引(或在生成的指针算术中),对于大多数C实现,哪个IIRC应该是有符号表达式
C标准没有定义索引表达式应该是有符号的还是无符号的,但当前大多数(全部?)C实现都使用有符号索引
编辑:
有一个供您的检查器使用的邮件参考。我认为检查器会警告从无符号int
到int
的隐式转换,这可能会导致信息丢失。尝试向int
添加显式强制转换,查看消息是否更改/消失。数组索引的类型为size\u t
。您收到警告是因为size\u t(ulIndex+1)
可能是零,而不是size\u t(ulIndex)+1
它可能来自ulIndex+1。您是否在循环中执行此操作?什么是ulIndex
?它是整数吗?系统是32位还是64位?如何定义py和y?ulIndex是无符号长整型(32位)变量。当然,它是一个循环。它是C++源文件(.cp),C++明确支持签名和无符号索引。您可以自由地混合它们,即使对于单个阵列也是如此。也就是说,a[int(5)]+a[unsigned(6)]
是有效的。@MSalters:有趣!在32位架构下,在代码< > [0x8000 0] 的情况下,C++实现会发生什么?嗯,因为这只是int型,文字有类型<代码> int <代码>。假设数组足够大,则只返回*(a+0x7fffffff)
。在16位系统上,0x7fffffff
的类型为long
,它仍然会返回*(a+0x7fffffff)
(假设16位系统支持这么大的数组)[在那里潜行编辑]当0x8000000大于INT\u MAX时,它是一个类型为无符号INT
的文本。没有任何区别,真的:您得到*(a+0x8000000)
,再次假设a
声明足够大,可以开始使用。@MSalters:a
不过是一个指针,不是吗?指针大小是固定的,并且指针算法在大多数当前系统上是有符号的。我相信它仍然会溢出,你会得到一些意想不到的东西:你会得到一个“before”,而不是“a
”之后的“内存位置”。
py[ulIndex] = y[ulIndex+1] - y[ulIndex];
py[ulIndex] = y[ulIndex+UL1]-y[ulIndex];