Условный переход или перемещение зависит от неинициализированных значений при проверке условия - PullRequest
0 голосов
/ 13 ноября 2018
int t_parse(char* target, FILE* fp) 
{   
char cuts = ':';
char * tok;
char ln[BUFF_SIZE];

if (lnCnt == 0) 
{
    lnCnt = 1;
}

while (!feof(fp)) 
{   
    int i = 0;
    int hop = 1;
    char c;
    while (hop) 
    {
        c = fgetc(fp);
        if (feof(fp)) 
        {
            if (i == 0) 
            {
                return 0;
            }
            ln[i] = '\0';
            hop = 0;
        }
        else if (c == '\n') 
        {
            ln[i] = '\0';
            hop = 0;
        }
        else if (i == BUFF_SIZE) 
        {
            fprintf(stderr, "%i: Error of long line\n", lnCnt);
            exit(1);
        }
        if (hop) 
        {
            ln[i] = c;
        }
        i++;
    }

    if (ln[0] != '#' && ln[0] != '\t' && ln[0] != '\0') 
    {   
        tok = strtok(ln, &cuts);
        if (tok == NULL) 
        {
            fprintf(stderr, "%d: Error of invalid target\n", lnCnt);
            exit(1);
        }
        else 
        {
            strcpy(target, tok);

            for (int j = 0; j < BUFF_SIZE; j++) 
            {
                if (target[j] == ' ') 
                {
                    target[j] = '\0';
                    return lnCnt++;
                }
            }
            return lnCnt++;
        }
    }
    lnCnt++;
}       
return 0;
}

После запуска Valgrind Условный переход или перемещение зависит от неинициализированных значений: == 2469 == при 0x10938F: t_parse (text_parsing.c: 81)

Что еще {strcpy (target,tok);

            for (int j = 0; j < BUFF_SIZE; j++) 
            {
                if (target[j] == ' ') 
                {
                    target[j] = '\0';
                    return lnCnt++;
                }

строка 81, если (target [j] == '') Я здесь проверяю, поэтому я не уверен, почему есть утечка памяти?я выполнил команду valgrind --leak-check = да --track-originins = да --read-var-info = да 537make

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

tok - строка, скопированная в target.Он будет оканчиваться символом '\ 0'.

Затем вы перебираете символы в target и заканчиваете на соответствующем символе пробела.Тем не менее, вы выходите за конец строки в target в том случае, если пробел не найден, который не инициализирован и может содержать что-либо - поэтому valgrind предупреждает вас об этом.

Еще одна проблема: char *strtok(char *str, const char *delim); В этом разделитель указывает на строку разделителей, а не на один символ.Так что char cuts = ':'; должно быть char *cuts = ":";

0 голосов
/ 13 ноября 2018

Вальгринд ничего не говорит об утечке. Он демонстрирует еще одну из своих особенностей. Он обнаружил, что вы тестируете содержимое памяти, которое вы не инициализировали. Это означает, что target содержит неопределенные данные. Если вы хотите более подробный ответ, вы должны показать, как вы настроили target

...