Objective c 如何使Xcode anaylzer对类方法报告“存储到‘self’中的对象的潜在泄漏”时保持沉默
我几乎可以肯定这段代码中没有漏洞,但是Xcode分析器报告说Xcode 4.6.1存在潜在的漏洞Objective c 如何使Xcode anaylzer对类方法报告“存储到‘self’中的对象的潜在泄漏”时保持沉默,objective-c,xcode,Objective C,Xcode,我几乎可以肯定这段代码中没有漏洞,但是Xcode分析器报告说Xcode 4.6.1存在潜在的漏洞 + (MySHA1hash *)sha1HashWithHashBytes:(unsigned char *)hash length:(unsigned int)length; { return [[[MySHA1hash alloc] initWithHashBytes:hash length:length] autorelease]; } 如果问题是Xcode报告了一个误报,我想弄清楚如
+ (MySHA1hash *)sha1HashWithHashBytes:(unsigned char *)hash length:(unsigned int)length;
{
return [[[MySHA1hash alloc] initWithHashBytes:hash length:length] autorelease];
}
如果问题是Xcode报告了一个误报,我想弄清楚如何以一种使警告静音的方式构造代码
也有可能是我在以一种我不理解的方式泄露信息,但是如果有人能看到我实际上是如何泄露信息的,我也会很高兴得到反馈
这一定与我调用的init函数有关,因为如果我简单地用init替换initWithHashBytes,那么泄漏将不再报告。为此,我还包括initWithHashBytes的主体
- (id)initWithHashBytes:(unsigned char *)hash length:(unsigned int)length
{
if (hash != nil && length <= SHA_DIGEST_LENGTH) {
NSData *data = [NSData dataWithBytes:hash length:length];
self = [self initWithHash:data];
}
else {
self = nil;
}
return self;
}
- (id)initWithHash:(NSData *)hash
{
if ([hash length] <= SHA_DIGEST_LENGTH && (self = [super init]) != nil) {
finished = YES;
[hash getBytes:sha_Result];
hashValue = [NSNumber numberWithInt:[hash hash]];
}
else {
self = nil;
}
return self;
}
线路
self = nil;
initWithHashBytes:和initWithHash:是问题所在。您正在分配一个对象,但如果从initWithHashBytes:返回nil,该对象将被泄漏,因为您将对nil而不是对分配的对象调用autorelease
在返回nil之前释放self,一切都应该正常。行
self = nil;
initWithHashBytes:和initWithHash:是问题所在。您正在分配一个对象,但如果从initWithHashBytes:返回nil,该对象将被泄漏,因为您将对nil而不是对分配的对象调用autorelease
在返回nil之前释放self,一切都应该正常。在self=nil之前缺少一个[self Release]
从alloc获得的对象的引用计数为+1,需要通过调用release或autorelease来平衡该计数。对于从sha1HashWithHashBytes:length返回实际对象的情况:该类方法中的autorelease会处理所有事情
对于返回nil的情况,init方法是最后一个引用分配对象的方法,因此必须释放它。在self=nil之前缺少[self release]
从alloc获得的对象的引用计数为+1,需要通过调用release或autorelease来平衡该计数。对于从sha1HashWithHashBytes:length返回实际对象的情况:该类方法中的autorelease会处理所有事情
对于返回nil的情况,init方法是最后一个引用分配对象的方法,因此必须释放它。在这种特殊情况下,显然有一个错误需要修复,但我有时看到需要抑制完全被理解为无问题的警告,即报告的泄漏实际上不是泄漏 这是我期望在这里需要做的,但事实证明确实存在泄漏。所以我很高兴它被修好了。我立即发现了另一个问题,这是一个明显的误报,我知道错误被报告为潜在泄漏,所以实际上它不是误报,但这并不意味着我希望每次运行分析仪时都能在报告中看到它 因此,我仍然有一个问题,即如何抑制这些警告。事实证明,您可以轻松地包装您希望分析器在ifdef检查uu-clangg_分析器时绕过的代码
#ifndef __clang_analyzer__
... code you want to ignore ...
#endif
对此有一个非常好的评论。在这个特殊情况下,显然有一个错误需要修复,但我有时看到需要抑制完全理解为无问题的警告,即报告的泄漏实际上不是泄漏 这是我期望在这里需要做的,但事实证明确实存在泄漏。所以我很高兴它被修好了。我立即发现了另一个问题,这是一个明显的误报,我知道错误被报告为潜在泄漏,所以实际上它不是误报,但这并不意味着我希望每次运行分析仪时都能在报告中看到它 因此,我仍然有一个问题,即如何抑制这些警告。事实证明,您可以轻松地包装您希望分析器在ifdef检查uu-clangg_分析器时绕过的代码
#ifndef __clang_analyzer__
... code you want to ignore ...
#endif
这篇文章写得很好。这不是假阳性。提示:报告中包含了“潜力”一词。好吧,也许是因为问题的前一个标题,我的得票率下降了。我已经改变了。我仍然认为这个问题很合理。你如何使你认为不正确的错误/警告保持沉默。我通常发现,让analyzer投诉保持沉默的最好方法是解决问题。嗯,这可能是真的。我想我是假设没有一个分析器是完美的。它抱怨可能是有原因的,很有可能它是正确的,就像在本例中一样,但我也假设静态分析器可能是不正确的。。。这可能会混淆分析仪,并导致它报告一个不存在的泄漏,但他们一直在报告
根据我的经验,这是真正的错误,只是不总是真正的泄漏。这不是一个假阳性。提示:报告中包含了“潜力”一词。好吧,也许是因为问题的前一个标题,我的得票率下降了。我已经改变了。我仍然认为这个问题很合理。你如何使你认为不正确的错误/警告保持沉默。我通常发现,让analyzer投诉保持沉默的最好方法是解决问题。嗯,这可能是真的。我想我是假设没有一个分析器是完美的。它抱怨可能是有原因的,很有可能它是正确的,就像在本例中一样,但我也假设静态分析器可能是不正确的。。。这可能会混淆分析仪,导致它报告一个不存在的泄漏,但根据我的经验,它们一直是真正的错误,只是不总是真正的泄漏。啊,这是有道理的。谢谢啊,这是有道理的。谢谢