Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何使Xcode anaylzer对类方法报告“存储到‘self’中的对象的潜在泄漏”时保持沉默_Objective C_Xcode - Fatal编程技术网

Objective c 如何使Xcode anaylzer对类方法报告“存储到‘self’中的对象的潜在泄漏”时保持沉默

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报告了一个误报,我想弄清楚如

我几乎可以肯定这段代码中没有漏洞,但是Xcode分析器报告说Xcode 4.6.1存在潜在的漏洞

+ (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投诉保持沉默的最好方法是解决问题。嗯,这可能是真的。我想我是假设没有一个分析器是完美的。它抱怨可能是有原因的,很有可能它是正确的,就像在本例中一样,但我也假设静态分析器可能是不正确的。。。这可能会混淆分析仪,导致它报告一个不存在的泄漏,但根据我的经验,它们一直是真正的错误,只是不总是真正的泄漏。啊,这是有道理的。谢谢啊,这是有道理的。谢谢