作为问题的一部分,我有一个包含char isGood
和char filename[32]
有一个函数可以检查文件是否包含字符串I'm a virus
并返回isGood
中的值。
然后是以下代码:
strncpy(currentItem.filename, argv[i], sizeof(currentItem.filename));
if (strlen(argv[i]) > sizeof(currentItem.filename)) {
currentItem.filename[sizeof(currentItem.filename)] = '\0';
}
此代码导致错误,即即使文件包含字符串I'm a virus
,名称大于32个字符的文件也将始终返回“OK”。
为什么会这样?为什么更改currentItem.filename会更改currentItem.isGood的值?它似乎与strncpy有关,因为我必须回答的下一个问题是“结束用strncpy复制的字符串的正确方法是什么?”
答案 0 :(得分:2)
这行代码就是你的缓冲区溢出:
currentItem.filename[sizeof(currentItem.filename)] = '\0';
sizeof(currentItem.filename)
的值是缓冲区的长度。如果你在那个索引处写字,你就会在数组末尾写一个点,导致溢出。
要解决此问题,请写
currentItem.filename[sizeof(currentItem.filename) - 1] = '\0';
更一般地说,您可能希望使用strncpy
,而不是使用strlcpy
,这是大多数编译器支持的编译器扩展。它与strncpy
类似,只是它总是放入一个空终止符。这意味着您永远不必担心添加自己的终结符。
希望这有帮助!