1

对于 Apple LLVM 4.2 (XCode 4.6),静态分析器在此类的“更新”方法中警告“'>' 的左操作数是垃圾值”:

测试.h

#import <Foundation/Foundation.h>

typedef struct {
    float x;
} TestInnerStruct;

typedef struct {
    TestInnerStruct innerStruct;
    int value;
} TestOuterStruct;

@interface Test : NSObject {
    TestOuterStruct outerStruct;
}

@end

测试.m

#import "Test.h"

@implementation Test

- (id) init {
    if (self = [super init]) {
        outerStruct.value = 1;
    }
    return self;
}

- (void) update {
    outerStruct.innerStruct = (TestInnerStruct){0.0f};
    if (outerStruct.value > 0) {
        NSLog(@"Value greater than zero");
    }
}

@end

这是一个人为的类,通过将真实类减少到重现此静态分析器警告所需的最低限度而制成。在真正的类中,使用嵌套结构是有充分理由的。

通过代码的哪条路径会导致该操作数成为垃圾值?还是静态分析器感到困惑?

编辑澄清:不仅仅是分析器在考虑 [super init] 返回 nil 的情况。我知道这是因为警告在注释掉更新方法的第一行时消失了。

4

2 回答 2

1

如果 self = [super init] 成功,则 outerStruct.value 仅设置为 1。如果不是(这当然是一个非常罕见的事件,但有可能,否则 if 将不是必需的),该值没有设置,而是垃圾。

于 2013-01-29T12:30:34.597 回答
1

Eric 是对的,这显然是一个编译器问题:如果将 TestOuterStruct 的定义更改为

typedef struct {
    int value;
    TestInnerStruct innerStruct;
} TestOuterStruct;

即,如果这两个元素互换,则代码编译不会出错。

于 2013-01-29T16:45:32.187 回答