【问题标题】:c: valgrind "Conditional jump or move depends on uninitialised value(s)"c: valgrind“条件跳转或移动取决于未初始化的值”
【发布时间】:2012-12-04 18:22:52
【问题描述】:

我在 valgrind 中遇到错误,不知道哪里出了问题。 错误是: valgrind 输出:

==1112== Conditional jump or move depends on uninitialised value(s)
==1112==    at 0x402BF0D: realloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)

它指出问题发生在第 226 行:

if(reallocate ==TRUE)
{
    char** temp_values = NULL;


    temp_values = (char**) realloc(theBoard->_values, theBoard->_size_r*sizeof(char*) );

    if(temp_values!=NULL)
    {
        theBoard->_values = temp_values;
    } else
    {
        reportError(MEM_OUT);
        return FALSE;
    }

    int i = 0;
    for (i=0; i<theBoard->_size_r; i++)
    {
        char* temp_values_c = NULL;
HERE( line 226)->   temp_values_c = realloc(theBoard->_values[i], theBoard->_size_c*sizeof(char) );

        if(temp_values_c != NULL)
        {
            theBoard->_values[i] = temp_values_c;
        } else
        {
            reportError(MEM_OUT);
            return FALSE;
        }
    }

    // initialize extra memory
    if(row_out_bound)
    {
        init(theBoard,prev_size_r,0);
    }

    if(col_out_bound)
    {
        init(theBoard,0, prev_size_c);
    }

}

为什么会发生这种情况,我该如何解决?

【问题讨论】:

  • 如果您使用 --track-origins=yes 运行 valgrind,它会告诉您冲突变量及其分配位置。
  • 这周有 Valgrind 更新吗?这是关于我在过去几天内遇到的同样问题的第三个左右的问题。

标签: c valgrind


【解决方案1】:

问题是theBoard-&gt;_values[i] 没有初始化,因为它直接来自realloc (temp_values = ...)。

编辑

你能详细说明一下吗?

我以为你永远不会问。函数realloc 返回一块指定大小的内存,不保证其内容。因此,出于所有实际目的,您应该假设realloc 返回的任何内容都包含垃圾。在您的代码中,您将那个(潜在的)垃圾和在线226 告诉realloc:

这是完全有效的指针。它是NULL 或者我之前从malloc 获得的。你能把它重新分配到这个大小吗? 这不是真的! theBoard-&gt;_values[i] 包含的实际值可以是任何值。

您想要的是一个执行 theBoard-&gt;_values[i] = NULL 的循环,或者在第 226 行使用 malloc 而不是 realloc

【讨论】:

  • 您能详细说明一下吗?我该如何解决这个问题?
  • 我不能使用 malloc,因为我想保留以前的值。我无法忍受你建议的第一个选项 - 在循环中做什么?
  • @Tom 好吧,在这种情况下,realloc 没有用,因为 theBoard->_values[i] 是垃圾。在循环中你可以说theBoard-&gt;_values[i] = NULL
  • @Tom 为你解决了吗?
猜你喜欢
  • 2019-08-14
  • 1970-01-01
  • 2011-04-18
  • 2016-07-24
  • 2014-11-30
  • 1970-01-01
  • 1970-01-01
  • 2017-01-11
相关资源
最近更新 更多