【发布时间】:2014-09-04 22:26:14
【问题描述】:
关于缓冲区溢出,以下哪一项是安全的?
char buf[10] = {0};
scanf("%10s", buf);
或
char buf[10] = {0};
scanf("%9s", buf);
根据我所读到的内容,我将选择第二个(sizeof 减一),但问题非常微妙,我已经看到代码暗示了两者。有志愿者引用标准吗?
【问题讨论】:
关于缓冲区溢出,以下哪一项是安全的?
char buf[10] = {0};
scanf("%10s", buf);
或
char buf[10] = {0};
scanf("%9s", buf);
根据我所读到的内容,我将选择第二个(sizeof 减一),但问题非常微妙,我已经看到代码暗示了两者。有志愿者引用标准吗?
【问题讨论】:
C standard 声明:
输入项应定义为输入字节的最长序列(直到任何指定的最大字段宽度,可以根据转换说明符以字符或字节为单位测量),它是匹配序列的初始子序列。
也就是说,最大字段宽度表示输入中可以有多少个字符。末尾的额外零值不是输入的一部分,需要额外的空间。
GNU libc manual 明确说明了这一点:
字符串输入转换存储一个空字符来标记输入的结束;最大字段宽度不包括此终止符。
所以,唯一安全的版本是scanf("%9s", buf)。
【讨论】:
char buf[10] = {0};
scanf("%10s", buf);
不安全。您必须考虑字符串空终止符。
char buf[10] = {0};
scanf("%9s", buf);
是安全的。
【讨论】: