5

我已经发布了我的错误代码的屏幕截图。 在此处输入图像描述

heights输出

在此处输入图像描述

请问有人可以帮助我吗?

4

2 回答 2

3

我认为静态分析器没有看到如何_numberOfColumns变为非零,因此它坚持分配垃圾。你需要检查你是否真的提供了一些方法_numberOfColumns来变得非零。

通常,当我编写想要找到最大或最小值的循环时,我会将size变量初始化为最大(如果我想要最小)或最小(如果我想要最大)量,我认为这将解决大多数问题你的问题:

float shortestHeight = FLT_MAX;
for (unsigned i = 0; i < _numberOfColumns; i++)
{
    // etc.
}
于 2013-03-14T10:47:09.080 回答
2

分析仪是正确的。如果为 0,您的代码将访问垃圾内存_numberOfColumns,从而为 分配 0 个字节heights,从而产生heights[0]垃圾。分析器不知道_numberOfColumns可以有什么值,但您可以使用assert(_numberOfColumns>0).

以这个 C 程序为例:

int main(int argc, const char * argv[])
{
    int n = argc-1;
    int *a = malloc(n*sizeof(int));
    for (int i=0; i<n; i++) {
        a[i] = i;
    }
    int foo = a[0];
    free(a);
    return foo;
}

的大小a由参数的数量决定。如果你没有论据n == 0。如果您确定您的程序(或只是程序的那一部分)将始终将大于 0 的值分配给a,则可以使用断言。添加assert(n>0)将准确地告诉分析器。

于 2013-03-14T10:32:57.660 回答