Valgrind:大小为 1 的无效读取(strtok、atoi)
Valgrind: Invalid read of size 1 (strtok, atoi)
我在使用 valgrind 时遇到问题:这是我的程序(出现错误的主要部分):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
while (!strcmp(token, "c")) {
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
}
当我 运行 valgrind 它说:
Invalid read of size 1
at 0x4905E72: strtok_r (strtok_r.c:49)
Address 0x4a42b12 is 2 bytes inside a block of size 128 free'd
我不知道这个程序有什么问题。
您必须延迟释放内存,直到您不再使用内存。这包括调用 strtok
和令牌 returned。
你可以试试这个链接(未测试):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
while (!strcmp(token, "c")) {
free(linea);
linea = readline(file);
token = strtok(linea, " ");
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
free(linea);
}
注意:
此代码不包括对 return 值的任何检查,因为它只是演示如何修改问题中的代码。
在输入 atoi
或其他函数之前,应检查 strtok
的 return 值是否有 NULL
值,以避免未定义的行为
我在使用 valgrind 时遇到问题:这是我的程序(出现错误的主要部分):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
while (!strcmp(token, "c")) {
linea = readline(file);
token = strtok(linea, " ");
free(linea);
linea = NULL;
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
}
当我 运行 valgrind 它说:
Invalid read of size 1
at 0x4905E72: strtok_r (strtok_r.c:49)
Address 0x4a42b12 is 2 bytes inside a block of size 128 free'd
我不知道这个程序有什么问题。
您必须延迟释放内存,直到您不再使用内存。这包括调用 strtok
和令牌 returned。
你可以试试这个链接(未测试):
static void leerLinea(u32 *a, u32 *b, FILE *file) {
char *linea = NULL;
char *token = NULL;
linea = readline(file);
token = strtok(linea, " ");
while (!strcmp(token, "c")) {
free(linea);
linea = readline(file);
token = strtok(linea, " ");
}
if (!strcmp(token, "p")) {
token = strtok(NULL, " ");
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
} else if (!strcmp(token, "e")) {
token = strtok(NULL, " ");
*a = atoi(token);
token = strtok(NULL, " ");
*b = atoi(token);
}
free(linea);
}
注意: 此代码不包括对 return 值的任何检查,因为它只是演示如何修改问题中的代码。
在输入 atoi
或其他函数之前,应检查 strtok
的 return 值是否有 NULL
值,以避免未定义的行为