1

このコードにリークがないことはほぼ確実ですが、Xcode アナライザーは「潜在的な」リークがあると報告しています (Xcode 4.6.1)。

+ (MySHA1hash *)sha1HashWithHashBytes:(unsigned char *)hash length:(unsigned int)length;
{
   return [[[MySHA1hash alloc] initWithHashBytes:hash length:length] autorelease];
}

XCode アナライザー エラーのスクリーンショット

問題が Xcode が誤検知を報告することである場合、警告を黙らせる方法でコードを構造化する方法を見つけたいと思います。

私が理解できない方法で漏れている可能性もありますが、誰かが私が実際にどのように漏れているかを見ることができれば、そのフィードバックも喜んで受け取ります.

initWithHashBytes を単に init に置き換えると、リークが報告されなくなるため、これは私が呼び出す init 関数と何らかの関係があるに違いありません。そのために、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;
}
4

3 に答える 3

6

この線

self = nil;

initWithHashBytes:(および)でinitWithHash:問題です。nilオブジェクトを割り当てていますが、 from から戻ると、割り当てたオブジェクトではなくinitWithHashBytes:を呼び出すため、そのオブジェクトはリークされます。autoreleasenil

self戻る前にリリースすればnil、すべてがうまくいくはずです。

于 2013-03-27T19:45:16.137 に答える
3

この特定のケースでは、明らかに修正が必要なエラーがありましたが、問題ではないと完全に理解されている警告 (つまり、実際にはリークではないと報告されたリーク) を抑制する必要があることが時々見られました。

これは私がここで行う必要があると思っていたことですが、実際にリークがあったことが判明しました。なので直ってよかったです。私はすぐに、紛れもない「誤検知」である別の問題を見つけました (エラーが「潜在的なリーク」として報告されていることは知っているので、実際には誤検知ではありませんが、それは私が見たいという意味ではありませんアナライザーを実行するたびにレポートに表示されます)。

このため、これらの警告を抑制する方法についてはまだ疑問がありました。__clang_analyzer の ifdef チェックでアナライザーにバイパスさせたいコードを簡単にラップできることがわかりました。

#ifndef __clang_analyzer__
  ... code you want to ignore ...
#endif

これについては非常に良い記事がここにありました。

于 2013-03-27T20:45:15.427 に答える
1

[self release]前がありませんself = nil

取得するオブジェクトallocの参照カウントは +1 であり、releaseまたはを呼び出してバランスを取る必要がありますautorelease。そのクラス内のメソッドから実際のオブジェクトを返す場合、すべてが処理されsha1HashWithHashBytes:length:ます。autorelease

メソッドを返す場合は、その割り当てられたオブジェクトへの参照を持つ最後のメソッドであるため、解放する必要がありますnilinit

于 2013-03-27T19:51:38.607 に答える