4

什么是不安全fopenfopen_s

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

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

编辑:问题被关闭为“基于意见”(即使只有一个答案,我没有看到太多意见)。我会尝试改写一下:如果有人可以说明如何/在哪里可以找到 Microsoft (谁弃用该功能)解释为什么它被弃用的文档,那就太好了。

4

1 回答 1

8

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

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

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

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

于 2017-09-17T19:37:06.477 回答