Почему это даст использование неинициализированного значения размера 8? - PullRequest
6 голосов
/ 17 августа 2011

В моем коде у меня есть класс с именем membrane с функцией с именем exciteMod(), функцией с именем decide() и переменной с именем delta_U.Первая строка exciteMod() - this->delta_U = 0decide() у меня есть показатель степени -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*/
  }
}

Thisэто предупреждение:

== 467 == Использование неинициализированного значения размера 8
== 467 == при 0x300B00D75D: __ieee754_exp (в /lib64/libm-2.5.so)
== 467 == по 0x300B022FA3: exp (в /lib64/libm-2.5.so)
== 467 == по 0x40BB9A: мембрана :: решить () (membran.cpp: 813)
==467 == по 0x40EBB1: мембрана :: exciteMod () (memb.cpp: 639)
== 467 == по 0x413994: мембрана :: MCstep (int) (мембрана.cpp: 486)
== 467== 0x402767: main (main.cpp: 14)

Редактировать:
Я должен был упомянуть, что единственное место, где я звоню decide(), находится внутриexciteMod().

1 Ответ

9 голосов
/ 18 августа 2011

Наиболее вероятной причиной неинициализированного значения является то, что хотя бы один из b->nextU или b->U, который вы добавляете к delta_U, сам по себе неинициализирован.То есть:

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

Вы хотите, чтобы Valgrind сообщал, когда foo становится неинициализированным.К сожалению, из-за этого выдается слишком много предупреждений о ложных срабатываниях.

Вы можете вставить в свои циклы вызовы VALGRIND_CHECK_MEM_IS_DEFINED (см. Руководство пользователя Valgrind ), и Valgrind подаст сигналточный момент, когда delta_U становится неопределенным.

...