Objective c “叮当作响的静态分析仪警告”;调用CFRelease时的Null指针参数;
在Xcode 4.6中,clang静态分析器警告我“调用CFRelease时出现空指针参数” 以下是analyzer警告的屏幕截图: 下面是代码,以备复制和粘贴:Objective c “叮当作响的静态分析仪警告”;调用CFRelease时的Null指针参数;,objective-c,c,xcode,memory-management,clang-static-analyzer,Objective C,C,Xcode,Memory Management,Clang Static Analyzer,在Xcode 4.6中,clang静态分析器警告我“调用CFRelease时出现空指针参数” 以下是analyzer警告的屏幕截图: 下面是代码,以备复制和粘贴: - (void)test { CFUUIDRef aUUID = CFUUIDCreate(kCFAllocatorDefault); [self setUUID:aUUID]; CFRelease(aUUID); } - (void)setUUID:(CFUUIDRef)uuid { _uuid
- (void)test
{
CFUUIDRef aUUID = CFUUIDCreate(kCFAllocatorDefault);
[self setUUID:aUUID];
CFRelease(aUUID);
}
- (void)setUUID:(CFUUIDRef)uuid
{
_uuid = uuid ? CFRetain(uuid) : CFUUIDCreate(kCFAllocatorDefault);
}
我不明白为什么它在警告我
aUUID
永远不能是空指针,是吗?我学会了不信任自己,而不是我正在使用的工具,所以我在这里问。如果有人向我解释我遗漏了什么,我会非常高兴。任何返回已分配值的内容在理论上都可能返回NULL
分析器遵循多个可能的执行路径。当遵循“aUUID为NULL”场景时,它最终会在NULL对象的CFRelease处结束
这并不是因为setUUID
是原因,这只是发现问题的路径,所以这就是所示的路径。CFUUIDCreate()
在分配失败的情况下可能返回NULL
,但analyzer警告的逻辑是错误的aUUID
在-setUUID:
中没有更改,因此无论uuid
是否为空,aUUID
仍然可以为空。