在检查 if 条件时,条件跳转或移动取决于未初始化的值

Conditional jump or move depends on uninitialized value(s) when checking with if condition

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] = '[=10=]';
            hop = 0;
        }
        else if (c == '\n') 
        {
            ln[i] = '[=10=]';
            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] != '[=10=]') 
    {   
        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] = '[=10=]';
                    return lnCnt++;
                }
            }
            return lnCnt++;
        }
    }
    lnCnt++;
}       
return 0;
}

在 运行 之后 Valgrind 条件跳转或移动取决于未初始化的值 ==2469== 在 0x10938F:t_parse (text_parsing.c:81)

这是 别的 { strcpy(目标, tok);

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

第 81 行是 if (target[j] == ' ') 我在这里检查所以我不确定为什么会发生内存泄漏? i 运行 命令 valgrind --leak-check=yes --track-origins=yes --read-var-info=yes 537make

valgrind 没有说任何关于泄漏的事情。它展示了它的另一个特点。它检测到您正在测试未初始化的内存内容。这意味着 target 包含未定义的数据。如果你想要更详细的答案,你必须展示你是如何设置的 target

tok 是复制到 target 的字符串。它将以 '\0' 字符终止。

然后您将循环遍历 target 中的字符,并将在匹配的 space 字符处终止。但是,在未找到 space 字符的情况下,您将超出 target 中的字符串末尾,该字符未初始化并且可能包含任何内容——因此 valgrind 会警告您这一点。

另一个问题:char *strtok(char *str, const char *delim); 在这里,delim 指向一串分隔符,而不是单个字符。所以 char cuts = ':'; 应该是 char *cuts = ":";