Valgrind заявляет “выделение стека”, я говорю “выделение "кучи"”

Я пытаюсь проследить segfault с valgrind. Я получаю следующее сообщение от valgrind:

==3683== Conditional jump or move depends on uninitialised value(s)
==3683==    at 0x4C277C5: sparse_mat_mat_kron (sparse.c:165)
==3683==    by 0x4C2706E: rec_mating (rec.c:176)
==3683==    by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683==    by 0x4014CB: main (age_dep.c:92)
==3683==  Uninitialised value was created by a stack allocation
==3683==    at 0x401848: age_dep_init_params (age_dep.c:131)
==3683== 
==3683== Conditional jump or move depends on uninitialised value(s)
==3683==    at 0x4C277C7: sparse_mat_mat_kron (sparse.c:165)
==3683==    by 0x4C2706E: rec_mating (rec.c:176)
==3683==    by 0x401C1C: age_dep_iterate (age_dep.c:287)
==3683==    by 0x4014CB: main (age_dep.c:92)
==3683==  Uninitialised value was created by a stack allocation
==3683==    at 0x401848: age_dep_init_params (age_dep.c:131)

Однако вот незаконная строка:

 /* allocate mating table */
  age_dep_data->mtable = malloc (age_dep_data->geno * sizeof (double *));
  if (age_dep_data->mtable == NULL)
    error (ENOMEM, ENOMEM, nullmsg, __LINE__);
  for (int j = 0; j < age_dep_data->geno; j++)
    {      
 131=>     age_dep_data->mtable[j] = calloc (age_dep_data->geno, sizeof (double));
      if (age_dep_data->mtable[j] == NULL)
 error (ENOMEM, ENOMEM, nullmsg, __LINE__);
    }

Что дает? Я думал, любой вызов к malloc или calloc выделил пространство "кучи"; нет никакой другой переменной, выделенной здесь, правильно? Действительно ли возможно, что существует другое продолжение выделения (незаконное выделение стопки), что я не вижу?

Править: Мое текущее подозрение является выделенным стеку массивом: Я объявляю, что указатель для удвоения (складывает), затем присваивает ему результат функции, которая возвращается дважды *. Затем я memmove это к ранее выделенному месту.

Я не могу memmove, memcpy или присваиваться, переменная стека затем надеются, что он сохранится, не так ли?

7
задан Joel J. Adamson 22 April 2010 в 14:20
поделиться

3 ответа

С тех пор я обнаружил, что эта ошибка valgrind

Conditional jump or move depends on uninitialised value(s)

возникает постоянно и не является источником ошибки. В большинстве случаев, с которыми я сталкивался с момента публикации этого вопроса, это кажется отвлекающим маневром.

-1
ответ дан 7 December 2019 в 20:34
поделиться

Я не знаю, в чем проблема, но

-track-origins=yes 

может помочь вам получить больше информации о том, на что он жалуется; подробности см. в этом сообщении в блоге: http://blog.mozilla.com/nnethercote/2009/02/27/eliminating-undefined-values-with-valgrind-the-easy-way/

2
ответ дан 7 December 2019 в 20:34
поделиться

возможная причина:
вы определяете age_dep_data-> mtable как double * , но это должно быть double ** быть массивом массивов

0
ответ дан 7 December 2019 в 20:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: