0

XCode3.2のXCode静的コードアナライザーで問題が発生しました。それは私が見つけた潜在的なリークが正当化されていないことを示しています。他の人に確認して、それが本当に誤検知であることを確認したいだけです。

メインコードは次のとおりです(一部の関数本体):

NSError *error = nil;
NSData *urlData = /* ... */;
NSXMLDocument *doc = [[NSXMLDocument alloc] initWithData:urlData options:0 error:&error];
if (![self validateObject:doc withError:error]) {
    return;
}
// ...
[doc release];

上記のvalidateメソッドは次のとおりです。

- (BOOL)validateObject:(id)object withError:(NSError *)error {
    if (!object) {
        // do something meaningful...
        return NO;
    } else {
        return YES;
    }
}

XCodeは、validateメソッドがNOを返す可能性があり、リリースがdocに送信されないため、docの割り当てがリークの可能性があることを示しています。しかし実際のところ、初期化が失敗した場合、initWithData:options:によってnilが返され、害は発生しません。ドキュメントにもこれが記載されています。

それで、専門家は何と言いますか?誤検知かどうか?

最高、ハラルド

4

3 に答える 3

2

正しいことをしているので、誤検知ではありません。しかし、実際には、実際に漏れることはありません。[doc release]ただし、早期リターンの前に a を配置するかautoreleaseNSXMLDocumentメソッドの最後で明示的に解放しないことで、分析を黙らせることができます。

誤検知ではない理由は、アナライザーが何を調べないかというvalidateObject:withError:ことです。アナライザーのポイントは、各メソッドを個別に分析し、それが呼び出すメソッドについて何も仮定しないことです (標準的な Cocoa の命名、つまりnew*alloc/init*copy*など - ARC でよく読まれるものは別として)。あなたがしたことを微妙に変えたと想像してくださいvalidateObject:withError:。その後、漏れが発生する可能性があります。安全になるようにコードを変更するよう警告しています。

@JeremyP が言うように (私よりもはるかに優れています):

「このコードはカプセル化を破っています。最上位のコード スニペットが壊れていないことを理解するには、-validateObject:withError: の内部構造を理解する必要があります。」

于 2012-03-12T16:17:39.727 に答える
1

YES静的アナライザーは、オブジェクトが ではない場合に検証メソッドが常に返されることを認識できるほど賢くありませんnil。そして、私もそれに頼るつもりはありません。将来、検証メソッドのロジックを拡張する可能性が非常に高く、そうでないオブジェクトでさえnil検証に合格するとは限りません。その場合、リークが発生します。へのメッセージの送信nilはノーオペレーションであるため、いずれにしても解放 (または自動解放)docします。

于 2012-03-12T16:18:12.083 に答える
1

Xcode の静的アナライザーは、異なるメソッド間ではなく、メソッド内の問題のみを検出できるため、これを認識しません。そのため、validateObject で何をするかはわかりません。

validateObject の実装を変更すると、リークが発生する可能性があります。validateObject の実装に依存しないでください。

NSXMLDocument を自動解放して、この潜在的なリークを修正する必要があります。

NSXMLDocument *doc = [[[NSXMLDocument alloc] initWithData:urlData options:0 error:&error] autorelease];
于 2012-03-12T16:16:19.993 に答える