【问题标题】:scanf field width string overflowscanf 字段宽度字符串溢出
【发布时间】:2014-09-04 22:26:14
【问题描述】:

关于缓冲区溢出,以下哪一项是安全的?

char buf[10] = {0};
scanf("%10s", buf);

char buf[10] = {0};
scanf("%9s", buf);

根据我所读到的内容,我将选择第二个(sizeof 减一),但问题非常微妙,我已经看到代码暗示了两者。有志愿者引用标准吗?

【问题讨论】:

    标签: c input scanf


    【解决方案1】:

    C standard 声明:

    输入项应定义为输入字节的最长序列(直到任何指定的最大字段宽度,可以根据转换说明符以字符或字节为单位测量),它是匹配序列的初始子序列。

    也就是说,最大字段宽度表示输入中可以有多少个字符。末尾的额外零值不是输入的一部分,需要额外的空间。

    GNU libc manual 明确说明了这一点:

    字符串输入转换存储一个空字符来标记输入的结束;最大字段宽度不包括此终止符。

    所以,唯一安全的版本是scanf("%9s", buf)

    【讨论】:

    • 谢谢!我发现标准令人困惑,我不得不多次阅读您引用的部分,直到清楚为止......
    【解决方案2】:
    char buf[10] = {0};
    scanf("%10s", buf);
    

    不安全。您必须考虑字符串空终止符。

    char buf[10] = {0};
    scanf("%9s", buf);
    

    是安全的。

    【讨论】:

      猜你喜欢
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 2018-08-31
      相关资源
      最近更新 更多