可怕的strlcat bug还是隐藏的天才?

可怕的strlcat bug还是隐藏的天才?,c,string,C,String,我一直在修复一些遗留的RAID代码(是的,我尽了最大努力) 这是我找到的一段代码 #define FLAG_LENGTH 256 #code char str[FLAG_LENGTH-1] strlcat(&str,source_ptr,FLAG_LENGTH); str声明上方有一条评论称,由于一个很好的原因,尺寸减少了1,但这位慷慨的评论作者并没有提到“很好的原因” 如果我正确理解strlcat的实现,则无论大小如何,它都会以NULL终止所有字符串,如果256将其添加到255大

我一直在修复一些遗留的RAID代码(是的,我尽了最大努力)

这是我找到的一段代码

#define FLAG_LENGTH 256

#code
char str[FLAG_LENGTH-1]

strlcat(&str,source_ptr,FLAG_LENGTH);
str声明上方有一条评论称,由于一个很好的原因,尺寸减少了1,但这位慷慨的评论作者并没有提到“很好的原因”


如果我正确理解strlcat的实现,则无论大小如何,它都会以NULL终止所有字符串,如果256将其添加到255大小的字符串(即最后一个索引254)的第256个字符(即索引255)中,则为size。我们不是把绳子弄得满满的吗??或者这样做有没有隐藏的天才(纯粹根据评论提问)

是的,这段代码错得很危险。真的没什么好说的了。我猜有人不小心写了-1而不是+1,但是数组的大小和传递给strlcat的大小之间没有任何差异


顺便说一句,我认为这种bug是一个很好的例子,说明了为什么神奇的“安全”字符串接口不是万能的。编写可靠的代码不需要成为一个白痴。语言或库功能无法保护您免受自身愚蠢行为的伤害。

是的,此代码错误严重。真的没什么好说的了。我猜有人不小心写了-1而不是+1,但是数组的大小和传递给strlcat的大小之间没有任何差异


顺便说一句,我认为这种bug是一个很好的例子,说明了为什么神奇的“安全”字符串接口不是万能的。编写可靠的代码不需要成为一个白痴。语言或库功能无法保护您免于自己的愚蠢行为。

天哪,人们为什么不费心阅读文档呢

如果您阅读Miller/de Raadt的原始论文,上面的代码应该是:

strlcat(src, source_ptr, sizeof(src));

天哪,为什么人们不费心阅读文档呢

如果您阅读Miller/de Raadt的原始论文,上面的代码应该是:

strlcat(src, source_ptr, sizeof(src));

在我看来,这可能是缓冲区溢出。除非在某处声明了另一个变量
str
?另外,我猜变量声明和strlcat调用之间有代码?是的,中间有大量代码,这是当前上下文中唯一的str。Bug:(谢谢你的回复!对我来说,这看起来像是一个可能的缓冲区溢出。除非在某个地方声明了另一个变量
str
?另外,我猜变量声明和
strlcat
调用之间有代码?是的,中间有大量代码,这是当前上下文中唯一的str。Bug:(谢谢你的回复!我想是的。我应该把这个帖子转发给/用我的键盘敲打原始的编码器!谢谢你的确认!不仅仅是“+-0”(而是-1)这样做,仅仅因为它是
strcat()
l
版本?
man-strlcat
摘录:“…它将最多追加大小-strlen(dst)-1字节,NUL终止结果…”空终止符不包括在附加的计数中。我想是的。我应该将此线程转发给/用键盘敲打原始编码器!感谢确认!不仅仅是“+-0”(而是-1)这样做,因为它是
strcat()
l
版本
man-strlcat
摘录:“…它将最多追加大小-strlen(dst)-1字节,NUL终止结果…”空终止符不包括在追加的计数中。