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

时间:2017-09-17 15:59:48

标签: c visual-studio fopen c11 tr24731

fopen fopen_s@Entity @Table(name="CATEGORIE") public class Categorie implements Serializable { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) private Long idCategorie; private String nomCategorie; private String description; private byte [] photoCat; @OneToMany(mappedBy="categorie") private Collection<Article> articles; 更安全的不安全因素是什么?

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

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

编辑:问题已被关闭为&#34;基于意见的&#34; (即使只有一个答案,我也没有看到太多的意见)。我试着改写一下:如果有人能够通过微软(不赞成使用该功能)来展示如何/在哪里找到文档来解释它被弃用的原因,那就太好了。

1 个答案:

答案 0 :(得分:7)

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

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

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

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