web-dev-qa-db-ja.com

valgrind条件付きジャンプまたは移動は初期化されていない値に依存しますが、これはメモリリークを示していますか?

コードでメモリリークの問題が発生しています。実行中、ヒープが最大に増加し続け、サービスを再起動する必要があります。topコマンドを実行すると、サービスでシナリオを呼び出すたびにヒープが増加していることがわかります。

Valgrindでサービスを実行しました、

valgrind  --log-file=log-feb19.txt --leak-check=full --show-reachable=yes --track-origins=yes myservice

Iamがシナリオを実行している間、確実に失われた、または失われた可能性のあるブロックは表示されませんが、初期化されていない値のエラーに依存する条件付きジャンプまたは移動が多数表示されます。

これらはメモリリークの対象になりますか?

私が得ているものの例:

==27278== Conditional jump or move depends on uninitialised value(s)

==27278==    at 0xC90D91E: xcsFreeMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

......。

==27278==  Uninitialised value was created by a heap allocation

==27278==    at 0x4A078B8: malloc (vg_replace_malloc.c:270)

==27278==    by 0xC90E32F: xcsGetMemFn (in /apps/opt/mqm/lib64/libmqmcs_r.so)

誰かが助けることができますか?.

7
user862833

いいえ、初期化されていないメモリにアクセスしていることを意味します。

int main()
{
     int unitialized;
     std::cout << unitialized << std::endl;
}

このエラーが発生します。

もう少し一般的なのは次のとおりです。

struct X 
{
     X() : i(42) { }
  private:
     int i;
     int* forgotten; // oops, not initialized
};

最後に、これは、memsetを使用してバッファー全体をクリアしない場合に、mallocベースのコードで頻繁に発生します。そう、

  1. mallocバッファサイズm
  2. 読み取り(ソケットからなど)nバイト
  3. mバイトをファイルに書き込みます。 (m-n)バイトは初期化されなかったでしょう
15
sehe

これは、Valgrindユーザーマニュアルのセクション 4.2.2。初期化されていない値の使用 で説明されています。

プログラムが初期化されていない値を使用している場合、つまり未定義の場合、初期化されていない値の使用エラーが報告されます。

.。

プログラムはジャンク(初期化されていない)データを好きなだけコピーできることを理解することが重要です。 Memcheckはこれを監視し、データを追跡しますが、文句は言いません。苦情は、プログラムが初期化されていないデータを、プログラムの外部から見える動作に影響を与える可能性のある方法で利用しようとした場合にのみ発行されます。

4
logoff

いいえ、これはメモリリークを直接示しているわけではありません。ただし、初期化されていない変数に依存する条件付きジャンプがあると、事実上何にでもつながる可能性があります。一般に、初期化されていない変数を使用すると、未定義の動作が発生します。

1