我固守着一些遗留RAID代码(是的,我拔出了最短的吸管)。
这是我找到的一段代码。
#define FLAG_LENGTH 256
#code
char str[FLAG_LENGTH-1]
strlcat(&str,source_ptr,FLAG_LENGTH);
str声明的正上方有一条评论说,大小减少了1是有充分理由的,但是慷慨的评论作者没有提到“充分理由”。
如果我正确理解strlcat的实现,那么它NULL将终止所有字符串,不管是什么,并且作为size If 256将其添加到第256个字符(即索引255)中,即255大小的字符串(即最后一个索引254)中。我们不是把绳子溢出来了吗??或者做这件事有什么隐藏的天才(纯粹根据评论来提问)
最佳答案
是的,这个密码是危险的错误。真的没什么可说的了。我猜有人不小心写了-1而不是+1,但是数组的大小和传递给strlcat
的大小之间没有任何差异。
顺便说一句,我认为这种bug是一个很好的例子,说明为什么神奇的“安全”字符串接口不是万能的。编写可靠的代码不需要成为白痴。语言或图书馆的功能不会保护你免受自己的愚蠢。
关于c - 可怕的strlcat错误或隐藏的天才?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13264543/