2013-07-13 6 views
7

「おそらく失われた」バングリーン・メモリ・リーク・レポートについて、この種のレポートが偽陽性の報告になる可能性は非常に低いと理解していました。私は、コードに非常に強い何かをすることなく、これが通常の状況でどうして起こるのか理解できませんでした。偽陽性valgrind「おそらく失われた」レポートの簡単な例はありますか?

だから、このオプションを理解するために、私が求めていますが、メモリリークレポートを「おそらく失われた」偽陽性valgrindのの簡単な例がありますか?ここで

答えて

1

は「おそらく失われた」の偽陽性の例です。ここで

class A { 
    int x; 
}; 
class B { 
    int y; 
}; 
class C : public A, B { 
    int z; 
}; 

int main() { 
    static B* notLost = new C(); //The upcast will change the pointer to point 4 bytes into the object, because that is the offset of the B subobject within the C object. 
    //Valgrind thinks, the new object may be possibly unreachable. 
    //But I can still do this: 
// delete (C*)notLost; //The downcast undoes the pointer modification by the upcast. 
} 

は、偽陽性のより一般的な例です。

//get asprintf 
#define _GNU_SOURCE 
#include <stdio.h> 
#include <assert.h> 

char* getFoo() { 
    static char* foo = NULL; 
    if(!foo && asprintf(&foo, "Hello World\n") < 0) assert(0); 
    return foo; 
} 

int main() { 
    printf("%s", getFoo()); 
} 

これは典型的なシングルトンideomです:特定のオブジェクト(ここでは "Hello World"文字列)へのアクセスを提供する関数が存在し、このようなオブジェクトが1つしか作成されていないことを保証します。オブジェクトは決して破壊/割り当て解除されないので、Valgrindはそれがメモリリークであると考える必要があります。通常、アクセス可能な静的変数が存在するため、これらは「まだ到達可能」としてリストされていますが、それにもかかわらず、偽陽性です。

+0

「紛失した可能性のある」レポートの場合は、その場合に偽陽性の報告がどのように発生する可能性があるかわからないため、良い例がありますか? – user2579277

+0

@ user2579277:申し訳ありませんが、私はすぐに応答できませんでした。私は今、より直接的な例を追加しました。 – cmaster

+0

申し訳ありませんが、失われた可能性のある新しい例がバグレポートに問題として表示されません。 2番目の例では、asprintはメモリをコアに割り当てているため、valgrindレポートは誤って陽性ではありません。 – user2579277

関連する問題