1. ホーム
  2. c++

[解決済み] なぜ、サイズ 8 の初期化されていない値を使用するのでしょうか?

2022-02-16 06:17:23

質問

私のコードでは membrane という名前の関数と exciteMod() という名前の関数は decide() という名前の変数と delta_U . の最初の行は exciteMod()this->delta_U = 0 . で decide() の指数を持っています。 -delta_U ( exp(-this->delta_U) というエラーが発生します。 サイズ8の初期化されていない値を使用しています。この原因は何でしょうか?についてのエラーはありません。 delta_U というのがありますが、これはvalgrindで生成されるものです。

編集してください。 以下は、コードの該当部分です。

void membrane::exciteMod(){
  this->delta_U = 0;
  /* Do some stuff which does not directly affect this->delta_U*/
  std::tr1::shared_ptr<bead> bit = this->beads.begin();
  while (bit != this->nead.end()){
    std::tr1::shared_ptr<bead> b = *bit++;
    //calculate the doubles U and nextU on b, nothing here gives a warning in valgrind,     anyhow U and nextU on b are always defined
   this->delta_U += (b->nextU - b->U);
  }
  decide();
}

void membrane::decide(){
  double r = P.r.ran3() // the random function from numerical recepies
  double f = - this->delta_U;
  if (r > exp(f)){ //this gives the warning even though delta_U is valid
    /*stuff*/
  }
}

これは警告です。

<ブロッククオート

==サイズ8の未初期化値の使用
==467== at 0x300B00D75D: __ieee754_exp (in /lib64/libm-2.5.so)
==0x300B022FA3: exp (/lib64/libm-2.5.so) による ==467= 。
==0x40BB9A: membrane::decide() (membrane.cpp:813) によるものです。
==467== by 0x40EBB1: membrane::exciteMod() (membrane.cpp:639)
0x413994 によって ==467==: membrane::MCstep(int) (membrane.cpp:486)
0x402767 による ==467==: メイン (main.cpp:14)

編集してください。
を呼んでいるところだけだと書いておけばよかった。 decide() の中にあります。 exciteMod() .

解決方法は?

初期化されない値の最も可能性の高い原因は、少なくとも1つの b->nextU または b->U に追加していること。 delta_U はそれ自体が初期化されていない。ということです。

foo = 0;
foo += some_uninitialized_value;
if (foo)  // Valgrind warns here

foo が初期化されなくなったとき、Valgrind が報告するようにしたい。残念ながら、そうすることは、実用的であるためにはあまりにも多くの "false positive" 警告を発生させます。

をループに挿入することができます。 VALGRIND_CHECK_MEM_IS_DEFINED (参照 Valgrindユーザーマニュアル が発生したときに、Valgrind はその瞬間を知らせます。 delta_U が未定義になります。