【问题标题】:Valgrind says "stack allocation," I say "heap allocation"Valgrind 说“堆栈分配”,我说“堆分配”
【发布时间】:2011-02-10 15:29:53
【问题描述】:

我正在尝试使用 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、memcpy 或分配堆栈变量,然后希望它会持续存在,可以吗?

【问题讨论】:

  • 我们可以再看一些代码吗?也许是 age_dep.c

标签: c malloc valgrind calloc


【解决方案1】:

可能的原因:
您将age_dep_data-&gt;mtable 定义为double* 但它应该是double** 是一个数组数组

【讨论】:

  • 是我在做什么吗?我分配了一个大小为 n*(指向 double 的指针的大小)的数组,然后为该数组中的每个指针分配一个大小为 m*(double 的大小)的数组。我需要在调用 malloc() 时使用 sizeof(double **) 吗?
  • 不,你的代码没问题;我们看不到 age_dep_data->mtable 的声明 - 它应该声明为 double**
  • 在结构中被声明为双**(也是动态分配的)。
【解决方案2】:

我不知道是什么问题,但是

-track-origins=yes 

可能会帮助您获得有关它所抱怨内容的更多信息;有关详细信息,请参阅此博客文章: http://blog.mozilla.com/nnethercote/2009/02/27/eliminating-undefined-values-with-valgrind-the-easy-way/

【讨论】:

  • 我正在使用track-origins;我忘了提那个。会不会让我误入歧途?
【解决方案3】:

我后来发现这个 valgrind 错误

Conditional jump or move depends on uninitialised value(s)

一直发生,并不是错误的根源。自发布此问题以来,在我遇到的大多数情况下,这似乎是一个红鲱鱼。

【讨论】:

  • 乔尔,不,这绝不是红鲱鱼,你应该经常解决它。这可能是一个非常严重的错误(尽管偶尔无害)。