如何解决Polyspace警告“数组索引越界”

t40tm48m  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(368)

在对代码库进行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可能假设在某个时间点,指针可能指向无效内存,代码可能会崩溃,但如何更干净地编写代码以避免问题?我不能改变指针的用法,因为它对巨大的文件有影响。

eivgtgni

eivgtgni1#

“多边形空间”如何处理这一点取决于分析的上下文。如果你只运行这个函数,并依赖于Polyspace的主生成器,那么我希望它是第6行的橙子越界数组索引。
需要考虑的几件事:
1.这段代码至少违反了一些关于指针和数组使用的常见行业编码准则。
1.为了让Polyspace知道索引i将在常量指针x所指向的缓冲区的边界内,Polyspace需要能够知道x表示的缓冲区的大小。
1.如果没有任何调用上下文(使用主生成器并且没有显式调用该函数),Polyspace将陷入不知道x的边界或value的值的情况。这对于stackoverflow上的任何人来说都是如此,他们只是在没有上下文的情况下阅读代码。
1.如果分析具有调用上下文的函数,则该代码可能提供足够的信息。最终,Polyspace必须能够看到通过常量指针x传入的大小

相关问题