为什么静态分析器在此代码中警告垃圾值?
使用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?