在检查 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 = ":";
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 = ":";