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

时间:2018-11-13 00:31:45

标签: c valgrind

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行是if(target [j] =='') 我在这里检查,所以我不确定为什么会有内存泄漏? 我运行了命令valgrind --leak-check = yes --track-origins = yes --read-var-info = yes 537make

2 个答案:

答案 0 :(得分:0)

valgrind没有透露任何有关泄漏的信息。它展示了它的另一个功能。它检测到您正在测试未初始化的内存的内容。这意味着target包含未定义的数据。如果您想获得更详细的答案,则必须说明如何设置target

答案 1 :(得分:0)

tok是字符串复制到target中。它将以“ \ 0”字符终止。

然后,您将遍历target中的字符,并将终止于匹配的空格字符。但是,如果找不到空格字符(未初始化并且可能包含任何内容),则您将移至target中字符串的结尾,因此valgrind会警告您。

另一个问题:char *strtok(char *str, const char *delim);在此,delim指向一串定界符,而不是单个字符。因此char cuts = ':';应该是char *cuts = ":";