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

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

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


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

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

即,如果两个元素互换,则代码无误地编译。


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

链接地址: http://www.djcxy.com/p/43739.html

上一篇: Why does the static analyzer warn of a garbage value in this code?

下一篇: CGImageCreateWithImageInRect Static Analyze Warning