C - 条件跳转(valgrind)

时间:2017-01-24 10:58:02

标签: c conditional valgrind

我不理解valgrind的跳跃,我做了这个小功能,但即使它很小,也有这种条件跳跃

这是功能:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char    *function(char *str)
{
  int   i = 0;
  int   a = 0;
  char  *cpy;

  cpy = malloc(100);
  while (str[i] != '\0')
    {
      if (str[i] == 'a')
        cpy[a++] = 'b';
      i++;
    }
  return (cpy);
}

int     main(int ac, char **av)
{
  char  *str;

  str = function(av[1]);
  printf("%s\n", str);
}

当我像这样使用valgrind时

valgrind ./a.out "aa aa aaaaaaaaaaa"

它给了我一个错误

==3397== Conditional jump or move depends on uninitialised value(s)
==3397==    at 0x4C2E4E8: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==3397==    by 0x4EA1531: puts (in /lib64/libc-2.24.so)
==3397==    by 0x400609: main (in /home/benoit.pingris/train/a.out)

这是什么意思? 感谢。

1 个答案:

答案 0 :(得分:2)

首先,使用调试符号编译程序是有帮助的(使用-g选项)。这样,Valgrind就能够产生更多有用的诊断信息。

条件跳转不会发生在您的代码中,而是在printf()结束时调用main()时发生。原因是您分配变量cpy,但这不会初始化其内存。然后,您要为'b'中看到的每个cpy将字符'a'复制到str。但是,您没有在cpy的末尾添加NUL终结符。当您尝试打印cpy时,C库中的某些内容将读取cpy的初始化部分,从Valgrind触发错误消息。

自己添加NUL终结符(cpy[a] = '\0';之前return),或使用calloc()代替malloc()