涉及未初始化字符串的 Valgrind 错误:错误标志?
Valgrind Error Involving Uninitialised String: False Flag?
当 运行 valgrind 检查用 C89/90 编写的程序中的错误时,它为我编写的 strToUpper()
函数提供了 Uninitialised value was created by a heap allocation
错误,尽管正在初始化的字符串。
我正在使用此函数来比较忽略大小写的字符串。不幸的是,C89 似乎没有在 <string.h>
中包含 strcasecmp()
函数,所以我自己写了一个函数,它调用了 strToUpper()
和 strcmp()
函数。
代码
char* strToUpper(char* inStr)
{
int i;
char *upperStr;
size_t strLen = strlen(inStr);
upperStr = (char*)malloc(sizeof(char) * (strLen + 1));
/* Does this for loop not initialise upperStr? */
for (i = 0; i < strLen; i++)
upperStr[i] = toupper(inStr[i]);
return upperStr;
}
VALGRIND 错误
==27== Conditional jump or move depends on uninitialised value(s)
==27== at 0x4C31FAA: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27== by 0x406649: strcasecmp (stringPlus.c:178)
==27== ...
==27== by 0x400FEB: main (main.c:58)
==27== Uninitialised value was created by a heap allocation
==27== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27== by 0x4062E4: strToUpper (stringPlus.c:58)
==27== by 0x406622: strcasecmp (stringPlus.c:175)
==27== ...
==27== by 0x400FEB: main (main.c:58)
有什么想法吗?
您没有终止复制的字符串。
添加类似内容
upperStr[i] = '[=10=]';
在你的 for 循环之后。
我总是使用 calloc(1,blah)
而不是 malloc(blah)
。后者将所有分配的内存设置为零。
当 运行 valgrind 检查用 C89/90 编写的程序中的错误时,它为我编写的 strToUpper()
函数提供了 Uninitialised value was created by a heap allocation
错误,尽管正在初始化的字符串。
我正在使用此函数来比较忽略大小写的字符串。不幸的是,C89 似乎没有在 <string.h>
中包含 strcasecmp()
函数,所以我自己写了一个函数,它调用了 strToUpper()
和 strcmp()
函数。
代码
char* strToUpper(char* inStr)
{
int i;
char *upperStr;
size_t strLen = strlen(inStr);
upperStr = (char*)malloc(sizeof(char) * (strLen + 1));
/* Does this for loop not initialise upperStr? */
for (i = 0; i < strLen; i++)
upperStr[i] = toupper(inStr[i]);
return upperStr;
}
VALGRIND 错误
==27== Conditional jump or move depends on uninitialised value(s)
==27== at 0x4C31FAA: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27== by 0x406649: strcasecmp (stringPlus.c:178)
==27== ...
==27== by 0x400FEB: main (main.c:58)
==27== Uninitialised value was created by a heap allocation
==27== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==27== by 0x4062E4: strToUpper (stringPlus.c:58)
==27== by 0x406622: strcasecmp (stringPlus.c:175)
==27== ...
==27== by 0x400FEB: main (main.c:58)
有什么想法吗?
您没有终止复制的字符串。
添加类似内容
upperStr[i] = '[=10=]';
在你的 for 循环之后。
我总是使用 calloc(1,blah)
而不是 malloc(blah)
。后者将所有分配的内存设置为零。