赋值是垃圾或未定义

时间:2013-03-14 10:05:17

标签: ios objective-c memory-management undefined garbage

我发布了错误代码的屏幕截图。 enter image description here

heights输出

enter image description here

请任何人可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

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

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

float shortestHeight = FLT_MAX;
for (unsigned i = 0; i < _numberOfColumns; i++)
{
    // etc.
}

答案 1 :(得分:1)

分析仪是正确的。如果_numberOfColumns为0,您的代码将访问垃圾内存,从而为heights分配0个字节,使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)将完全告诉分析仪。