【问题标题】:Valgrind Error Involving Uninitialised String: False Flag?涉及未初始化字符串的 Valgrind 错误:错误标志?
【发布时间】:2019-10-11 12:04:20
【问题描述】:

当运行 valgrind 以检查用 C89/90 编写的程序中的错误时,它会为我编写的 strToUpper() 函数出现 Uninitialised value was created by a heap allocation 错误,尽管字符串已被初始化。

我正在使用这个函数来比较字符串忽略大小写。不幸的是,C89 似乎没有在<string.h> 中包含strcasecmp() 函数,所以我编写了自己的函数,调用了strToUpper()strcmp() 函数。

代码

char* strToUpper(char* inStr)
{
    int i;
    char *upperStr;
    size_t strLen = strlen(inStr);
    upperStr = (char*)malloc(sizeof(char) * (strLen + 1));

    /* Does this for loop not initialise upperStr? */
    for (i = 0; i < strLen; i++)
        upperStr[i] = toupper(inStr[i]);

    return upperStr;
}

VALGRIND 错误

==27== Conditional jump or move depends on uninitialised value(s)
==27==    at 0x4C31FAA: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27==    by 0x406649: strcasecmp (stringPlus.c:178)
==27==    ...
==27==    by 0x400FEB: main (main.c:58)
==27==  Uninitialised value was created by a heap allocation
==27==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27==    by 0x4062E4: strToUpper (stringPlus.c:58)
==27==    by 0x406622: strcasecmp (stringPlus.c:175)
==27==    ...
==27==    by 0x400FEB: main (main.c:58)

有什么想法吗?

【问题讨论】:

    标签: valgrind c89


    【解决方案1】:

    您没有终止复制的字符串。

    添加类似的东西

    upperStr[i] = '\0';
    

    在你的 for 循环之后。

    【讨论】:

      【解决方案2】:

      我总是使用calloc(1,blah),而不是使用malloc(blah)。后者将所有分配的内存设置为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多