Ошибка Valgrind с использованием неинициализированной строки: False Flag? - PullRequest
0 голосов
/ 11 октября 2019

При запуске valgrind для проверки ошибок в программе, написанной на C89 / 90, возникает ошибка Uninitialised value was created by a heap allocation для написанной мной функции strToUpper(), несмотря на инициализацию строки.

IЯ использую эту функцию для сравнения строк без учета регистра. К сожалению, C89, похоже, не включает функцию strcasecmp() в <string.h>, поэтому я написал свою собственную, которая вызывает функции strToUpper() и strcmp().

CODE

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;
}

ОШИБКА ВАЛЬГРИНДА

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

Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 октября 2019

Вместо использования malloc(blah) я всегда использую calloc(1,blah). Последний устанавливает всю выделенную память на ноль.

1 голос
/ 11 октября 2019

Вы не завершаете свою скопированную строку.

Добавьте что-то вроде

upperStr[i] = '\0';

после цикла for.

...