如何修复valgrind报告的“无效读取”?

时间:2019-05-07 03:44:26

标签: c valgrind

我正在运行一些旧代码,并且valgrind报告“无效的读取错误”。我无法发布这些旧代码,因此我将使用以下代码来描述问题。

我有一些类似下面的代码。 MY_MALLOC()和MY_FREE()分别是malloc()和free()的包装。

void func1()
{
  int i = 0, j = 0;
  int **ptr = NULL;

  MY_MALLOC(ptr, int *, 5);
  for (i = 0; i < 5; i++)
  {
    ptr[i] = NULL;
    MY_MALLOC(ptr[i], int, 4);
    for (j = 0; j < 4; j++)
    {
      ptr[i][j] = 0;
    }
  }
  ......

  for (i = 0; i < 5; i++)
  {
    MY_FREE(ptr[i]);   // Line 100 in test.c
    ptr[i] = NULL;
  }
  MY_FREE(ptr);
  ptr = NULL;
}

void func2()
{
  ......
  while (MY_CHECK(another_ptr->index))  // Line 200 in test.c
  {
     ......
     another_ptr++;
  }
}

并且valgrind报告错误:

==23912== Invalid read of size 4
==23912==    at 0x5094EE: func2 (test.c:200)
......
==23912==  Address 0x4d7b1d4 is 0 bytes after a block of size 4 free'd
==23912==    at 0x4A06430: free (vg_replace_malloc.c:446)
==23912==    by 0x498F4C: func1 (test.c:100)

func1中的双指针ptr是一个局部变量,看起来它已被适当地分配和释放。我不明白为什么它会影响另一个不相关的变量another_ptr(another_ptr是全局变量)。而且我真的不知道如何解决此错误。任何建议将不胜感激!

0 个答案:

没有答案