【问题标题】:strstr valgrind errorstrstr valgrind 错误
【发布时间】:2011-09-04 19:12:45
【问题描述】:

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

我有一个函数func1

func1() func2();

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

我已经用随机字符串测试了我的程序,问题是 valgrind 将str 视为未初始化,但我只是不知道如何在不摆脱重新分配能力的情况下对其进行初始化。有什么建议么?

错误是:

==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 

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

【问题讨论】:

  • 你能告诉你调用 func1 和 func2 的参数是什么吗?
  • 信息不足。显示调用 func2 的代码。
  • 对不起,我更新了。 func1 中的最后一行应该是str = func2(path, str);。调用 func1 的代码是char* cmd = func1(&i, len, arr, path);,其中i 是有效整数,lenarr 的有效长度,arr 是字符串数组,path 是单个字符串。

标签: c valgrind strstr


【解决方案1】:

在您的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);

【讨论】:

  • 这是一个很好的建议,我已经实施了,所以谢谢你,但这不是我的问题。据我了解,问题在于 valgrind 认为 strstr() 正在传递未初始化的值,但我不知道为什么。
【解决方案2】:

我相信这是你的问题:

在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] 是未复制的第一个字节)。这意味着

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

顺便说一句,如果可以的话,使用asprintf 是执行许多字符串操作任务的安全、简单且万无一失的方法,尽管它可能不太有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多