对于 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 的情况。我知道这是因为警告在注释掉更新方法的第一行时消失了。