关于 fscanf_s 的 bug
Posted 漂亮姐姐1
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于 fscanf_s 的 bug相关的知识,希望对你有一定的参考价值。
最近在写一个数据加密的软件程序,读取数据时使用的是 fscanf_s,一来用 fscanf 函数可能会报 warning,二来感觉 fscanf_s 比 fscanf 函数安全一点
但是读取大文件的时候出现了问题:
char buf[4096+1] = 0;
while (fscanf_s(file, "%s", buf,sizeof(buf)) != -1)
m_pw.Append(buf, strlen(buf));
read_cnt += strlen(buf);
当数据超出4096时,前几次读取的数据都为空,最后一次读取的数据才会放到buffer里面
网上查阅资料没有看到类似的问题,但是我发现了这样的写法
fscanf(file,"%4096s",buf);
突然就发现 fscanf_s 不香了
但是总觉得很奇怪,没有看到别人提到这个问题
所以我又到处搜了搜
发现了这个网站
https://sourceware.org/bugzilla/show_bug.cgi
这是一个项目bug提交网站,比方说,glibc函数有bug,那么可以提交到上面,以供相互交流
搜了一下scanf_s, fscanf_s, sscanf_s都没有相关的结果
然后我继续查,在https://code.fandom.com/wiki/Scanf_s下有这样的内容
似乎scanf_s, fscanf_s等都是Microsoft compilers特有的,不是标准库的内容
从代码移植性角度考虑也不应该使用这些函数
补充:
fscanf函数的两个特别参数
- %*s 表示跳过这个输入
- %[]s 表示只获取包含括号内字符的字符串
具体查看手册
总结:不要使用fscanf_s,scanf_s等函数,会导致兼容性问题,同时fscanf_s函数存在bug
思考:写程序还是要多加思考的,任何函数都可能有隐藏的bug,有时候封装出来的函数不一定好,不一定就弃旧换新
以上是关于关于 fscanf_s 的 bug的主要内容,如果未能解决你的问题,请参考以下文章