valgrind - 涉及未初始化字符串的 Valgrind 错误:错误标志?
问题描述
当运行 valgrind 以检查用 C89/90 编写的程序中的错误时,它会Uninitialised value was created by a heap allocation
为我编写的函数出现错误strToUpper()
,尽管字符串已初始化。
我正在使用这个函数来比较字符串忽略大小写。不幸的是,C89 中似乎没有包含该strcasecmp()
函数<string.h>
,所以我编写了自己的函数,它调用了strToUpper()
andstrcmp()
函数。
代码
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;
}
瓦尔格林错误
==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] = '\0';
在你的 for 循环之后。
推荐阅读
- r - 显示复杂热图中的数字
- firebase - Apple M1 API S 模拟器 FIREBASE 错误:java.io.IOException:java.util.concurrent.ExecutionException:java.io.IOException:SERVICE_NOT_AVAILABLE
- r - 理解 R 中的“cut”函数
- c# - 如何在异步方法中捕获异常?
- javascript - ES9 javascript从其他对象数组更新对象数组
- java - Java Stream - 基于子类的Groupby并从父类计算总和
- python - 如何将数据框中的每一行乘以不同数据框的不同列,并将所有行的总和作为 Python 中的新列?
- javascript - 如何解决 next.js api 部分中的“ENOENT”错误?
- python - CSV:如何读取(或创建解析器)在每个数据点索引的文件到熊猫数据帧中?
- steam - Steam API 获取游戏信息