使用fopen()
时,Microsoft Visual Studio会打印:
警告C4996:'fopen'已被声明为过时
给出的原因是:
此函数或变量可能不安全。考虑改用 fopen_s。
fopen()
有什么不安全的地方,而fopen_s()
更安全?
如果可能,如何以安全的方式使用fopen()
?
使用fopen()
时,Microsoft Visual Studio会打印:
警告C4996:'fopen'已被声明为过时
给出的原因是:
此函数或变量可能不安全。考虑改用 fopen_s。
fopen()
有什么不安全的地方,而fopen_s()
更安全?
如果可能,如何以安全的方式使用fopen()
?
Microsoft CRT实现了C11附录K中描述的安全库增强功能,这是规范但不是强制性的。fopen_s()在K.3.5.2.1节中有所描述。同时也被CERT研究所的rule FIO06-C所涵盖。
问题在于,fopen()来自于更简单的时代,当时程序员可以假设他们的程序是唯一操作文件的程序。这个假设从来没有真正成立过。它没有办法描述其他进程对文件访问的限制,CRT实现通常会打开文件而不拒绝任何访问。非标准的替代方案已经被用来解决这个问题,比如_fsopen()
。
如果文件被打开以进行写入,则另一个进程也可以打开该文件进行写入,文件内容将会被彻底破坏。如果文件被打开以进行读取,而另一个进程正在向其中写入,则文件内容的视图是不可预测的。
fopen_s()通过拒绝所有访问来解决这些问题,如果文件被打开以进行写入,则只允许读取访问。
fopen
只被微软弃用,而不是 C 标准。 - n. m.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