dba*_*osa 5 c gets scanf buffer-overflow buffer-overrun
来自man gets:
永远不要使用gets().因为在不事先知道数据的情况下无法判断get()将读取多少个字符,并且因为gets()将继续存储超出缓冲区末尾的字符,所以使用它是非常危险的.它已被用来打破计算机安全.请改用fgets().
几乎无处不在我看到scanf的应该有同样的问题(一个方式使用缓冲区溢出/缓冲区溢出)scanf("%s",string).这种情况存在这个问题吗?为什么scanf手册页中没有关于它的引用?为什么gcc在编译时不会发出警告-Wall?
ps:我知道有一种方法可以在格式字符串中指定字符串的最大长度scanf:
char str[10];
scanf("%9s",str);
Run Code Online (Sandbox Code Playgroud)
编辑:我不是要求确定前面的代码是否正确.我的问题是:如果scanf("%s",string)总是错的,为什么没有警告,手册页中没有任何关于它的内容?
答案很简单,没有人在GCC编写代码来产生警告.
正如您所指出的,对特定情况"%s"(没有字段宽度)的警告是非常合适的.
但是,记住,这仅仅是对的情况下的情况下scanf(),vscanf(),fscanf()和vfscanf().这种格式符可以是具有完全安全的sscanf(),并vsscanf(),因此,警告不应该在这种情况下发行.这意味着您不能简单地将其添加到现有的"scanf-style-format-string"分析代码中; 你必须将它分成"fscanf-style-format-string"和"sscanf-style-format-string"选项.
我敢肯定,如果你为最新版本的GCC生成一个补丁,它很有可能被接受(当然,你也需要为glibc头文件提交补丁).