【问题标题】:C4996, fopen deprecated: Why? (NOT: How to suppress) [closed]C4996,不推荐使用 fopen:为什么? (不是:如何压制)[关闭]
【发布时间】:2018-02-26 05:01:18
【问题描述】:

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

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

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

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

【问题讨论】:

  • fopen deprecated warning的可能重复
  • @Jean-FrançoisFabre 我在您提出的重复链接的任何答案中都没有看到这个问题的答案。
  • @hvd;我认为“无论如何,如果您对使用他们调用的安全版本(如 fopen_s)不感兴趣,您需要在包含的头文件之前放置 _CRT_SECURE_NO_DEPRECATE 的定义”回答。
  • @Jean-FrançoisFabre 这就是如何抑制警告,这是这个问题明确没有问的。它没有解决基本原理,也没有说明如何使用fopen 来避免fopen_s 阻止的任何陷阱。

标签: c visual-studio fopen c11 tr24731


【解决方案1】:

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

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

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

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

【讨论】:

  • CERT 链接对我不起作用,但在其他方面令人信服的答案,谢谢
猜你喜欢
  • 2018-12-21
  • 2014-02-13
  • 2015-09-02
  • 2013-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2016-02-23
相关资源
最近更新 更多