fopen有哪些不安全的地方?

7

使用fopen()时,Microsoft Visual Studio会打印:

警告C4996:'fopen'已被声明为过时

给出的原因是:

此函数或变量可能不安全。考虑改用 fopen_s。

fopen()有什么不安全的地方,而fopen_s()更安全?

如果可能,如何以安全的方式使用fopen()


3
fopen 只被微软弃用,而不是 C 标准。 - n. m.
1
请看这里:https://dev59.com/OWIk5IYBdhLWcg3wTcnp - Garf365
fopen()有什么不安全的地方?在遵循微软自我服务的“弃用”之前,请阅读Annex K-边界检查接口的现场经验的全部内容:https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm#impementations:“Microsoft Visual Studio实现了API的早期版本。但是,该实现是不完整的,既不符合C11标准,也不符合原始TR 24731-1标准。...由于与规范的多个偏差,Microsoft实现不能被认为是符合或可移植的。” - Andrew Henle
1个回答

11

Microsoft CRT实现了C11附录K中描述的安全库增强功能,这是规范但不是强制性的。fopen_s()在K.3.5.2.1节中有所描述。同时也被CERT研究所的rule FIO06-C所涵盖。

问题在于,fopen()来自于更简单的时代,当时程序员可以假设他们的程序是唯一操作文件的程序。这个假设从来没有真正成立过。它没有办法描述其他进程对文件访问的限制,CRT实现通常会打开文件而不拒绝任何访问。非标准的替代方案已经被用来解决这个问题,比如_fsopen()

如果文件被打开以进行写入,则另一个进程也可以打开该文件进行写入,文件内容将会被彻底破坏。如果文件被打开以进行读取,而另一个进程正在向其中写入,则文件内容的视图是不可预测的。

fopen_s()通过拒绝所有访问来解决这些问题,如果文件被打开以进行写入,则只允许读取访问。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接