strstr valgrind错误

时间:2011-09-04 19:12:45

标签: c valgrind strstr

我需要一些关于char*初始化和C中strstr的帮助。这是一般问题:

我有一个函数func1

func1()func2();

问题是valgrind给出了一个错误,基本上说strstr可能正在使用未初始化的值。要纠正这个问题,我必须做char* str = "hello world";之类的事情,但我不能realloc,这是一个问题。

我用随机字符串测试了我的程序,问题是valgrind将str视为未初始化的事实,但我只是不知道如何初始化它而不去掉realloc的能力。有什么建议?

错误是:

==14356== Conditional jump or move depends on uninitialised value(s)
==14356==    at 0x4C29313: strstr (in path)
==14356==    by 0x401983: func2 (in path)
==14356==    by 0x401B06: func1 (in path)
==14356==    by 0x4013D7: main (in path)
==14356== 
==14358== Syscall param execve(argv[i]) points to uninitialised byte(s)
 at 0x4ECFCB7: execve (in path)
==14308==    by 0x4E6A76C: do_system (in path)
==14308==    by 0x4013ED: main 

编辑:在实际功能中添加,更改名称等。

2 个答案:

答案 0 :(得分:0)

func1中,您有以下内容:

        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        sprintf(str, "%s %s", str, currExp);

sprintf的两边使用相同的字符串可能是一个坏主意。当输出被写入时,它将破坏输入(str),这可能导致任何意外行为。 realloc负责处理可能需要的任何复制,因此您的sprintf可以被一些strcats取代:

        str = realloc(str, (stringLen + currExpLen) * sizeof(char)+2);
        strcat(str, " ");
        strcat(str, currExp);

答案 1 :(得分:0)

我相信这是你的问题:

在func2中:

    str = realloc(str, (stringLen + pathLen+1)*sizeof(char));

    memmove(&str[rplcIndx + pathLen], &str[rplcIndx+2], stringLen-rplcIndx-2);
    memcpy(&str[rplcIndx], path, pathLen);

memmove不复制空终止符(它位于stringLen位置,但复制的最后一个字节为rpcIndx+2+stringLen-rpcIndx-2-1 = stringLen-1(记住src[len]是第一个字节未复制)。这意味着

  • null终止符的位置未初始化
  • 字符串可能未正确终止

BTW,如果可以的话,使用asprintf是安全,简单和万无一失的方法来完成许多字符串操作任务,尽管它可能效果稍差。