关于 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特有的,不是标准库的内容
从代码移植性角度考虑也不应该使用这些函数

补充:
格式化输入的两个特别参数

  • %*s 表示跳过这个输入
    printf("%.*f ",4,1.2); 表示将1.2输出为.4f格式
  • %[]s 表示只获取包含括号内字符的字符串
    具体查看手册

总结:不要使用fscanf_s,scanf_s等函数,会导致兼容性问题,同时fscanf_s函数存在bug

思考:写程序还是要多加思考的,任何函数都可能有隐藏的bug,有时候封装出来的函数不一定好,不一定就弃旧换新

以上是关于关于 fscanf_s 的 bug的主要内容,如果未能解决你的问题,请参考以下文章

关于 fscanf_s 的 bug

关于 fscanf_s 的 bug

关于项目中解决bug的心得

关于在taro使用wx.parse那些事

关于ScatterWebExtension停用

个人作业——软件产品案例分析