在对代码库进行Polyspace分析时,我在下面的代码段上得到一个橙子检查警告,说指针可能超出了它的边界。
我试过在访问数组之前添加一个null检查,比如if( x[i] != NULL)
,但是没有用。作为参数传递给函数的指针也被声明为指针,所以我不能确定传递给函数的缓冲区的大小。
void foo(const int *x, unsigned int value)
{
int i, data;
for(i=0;i<value;i++)
{
data = x[i]; // pointer may be out of bounds here
}
sendToSomeOtherInterface(data);
}
我可以理解Polyspace可能假设在某个时间点,指针可能指向无效内存,代码可能会崩溃,但如何更干净地编写代码以避免问题?我不能改变指针的用法,因为它对巨大的文件有影响。
1条答案
按热度按时间eivgtgni1#
“多边形空间”如何处理这一点取决于分析的上下文。如果你只运行这个函数,并依赖于Polyspace的主生成器,那么我希望它是第6行的橙子越界数组索引。
需要考虑的几件事:
1.这段代码至少违反了一些关于指针和数组使用的常见行业编码准则。
1.为了让Polyspace知道索引
i
将在常量指针x
所指向的缓冲区的边界内,Polyspace需要能够知道x
表示的缓冲区的大小。1.如果没有任何调用上下文(使用主生成器并且没有显式调用该函数),Polyspace将陷入不知道
x
的边界或value
的值的情况。这对于stackoverflow上的任何人来说都是如此,他们只是在没有上下文的情况下阅读代码。1.如果分析具有调用上下文的函数,则该代码可能提供足够的信息。最终,Polyspace必须能够看到通过常量指针
x
传入的大小