C4996,fopen 弃用:为什么? (不是:如何抑制)

C4996, fopen deprecated: Why? (NOT: How to suppress)

什么是 fopen 不安全而 fopen_s 更安全?

如何安全地使用 fopen(如果可能)?

(我不想知道如何抑制警告 - 有足够多的 Whosebug 文章可以回答这个问题)

编辑:问题已关闭为 "opinion based"(尽管只有一个答案,而且我对此没有太多意见)。我会尝试改写一下:如果有人可以显示 how/where 找到 Microsoft(弃用该功能)的文档,解释为什么弃用它,那就太好了。

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

问题在于 fopen() 可以追溯到更简单的时代,那时程序员仍然可以假设他们的程序是唯一一个操作文件的程序。一个从未真正实现过的假设。它没有办法描述如何限制其他进程对文件的访问,CRT 实现传统上打开文件而不拒绝任何访问。已使用非标准替代方案来解决此问题,例如 _fsopen().

如果打开文件进行写入,这会产生后果,另一个进程也可以打开文件进行写入,文件内容将无可救药地损坏。如果在另一个进程正在写入文件时打开文件进行读取,则文件内容的视图是不可预测的。

fopen_s() 通过在文件打开进行写入时拒绝所有访问并在文件打开进行读取时仅允许读取访问来解决这些问题。