【发布时间】:2014-05-25 17:28:52
【问题描述】:
作为问题的一部分,我有一个包含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';
}
此代码会导致错误,即名称大于 32 个字符的文件将始终返回“OK”,即使该文件包含字符串 I'm a virus。
为什么会这样?为什么更改 currentItem.filename 会更改 currentItem.isGood 的值?它似乎与 strncpy 有关,因为我必须回答的下一个问题是 “结束用 strncpy 复制的字符串的正确方法是什么?”
【问题讨论】:
-
@newboyhun:
sizeof(char)根据定义为 1。 -
上述片段中存在三个错误。唯一没有错误的行是
} -
最后一条语句写到缓冲区的末尾。
-
因为你写的超出了缓冲区的末尾。
-
1) strncpy() 总是错误的。 2)
>比较是错误的(减一),currentItem.filename[sizeof(currentItem.filename)] = '\0';也是错误的(减一)
标签: c buffer-overflow