为什么静态分析器会在此代码中警告垃圾值?

时间:2013-01-29 12:23:25

标签: objective-c xcode static-analysis

使用Apple LLVM 4.2(XCode 4.6),静态分析器会警告“>”的左操作数是这个类'更新'方法中的垃圾值:

Test.h

#import <Foundation/Foundation.h>

typedef struct {
    float x;
} TestInnerStruct;

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

@interface Test : NSObject {
    TestOuterStruct outerStruct;
}

@end

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

即,如果两个元素互换,代码编译时没有错误。