在这种s
情况下, 不代表“安全”,它代表“安全增强”。对于fopen_s
,在尝试打开文件之前检查参数的有效性。
使用fopen
,您可以为文件名传递一个 NULL 指针,并且所有内容很可能会分崩离析。fopen_s
没有这个问题(a)。
请记住,这些边界检查接口fopen_s
是 ISO 标准的可选部分,详见附录 K(无论如何都在 C11 中)。实现不需要提供它们,老实说,fopen
如果您知道自己作为编码人员在做什么,那么 和许多其他所谓的不安全功能是完全安全的。
有趣的是,它fopen_s
会为您捕获 NULL 指针,但不会捕获无效指针,因此它的安全性增强而不是安全 - 如果您传递无效但非 NULL 指针,您仍然会造成一些损害。
只要您传递正确的大小,其他强制您提供目标缓冲区大小的“安全”功能也是安全的。传递一些太大的东西,所有的赌注都被取消了。
(a)来自C11 K.3.5.2.1 The fopen_s function
:
errno_t fopen_s (
FILE * restrict * restrict streamptr,
const char * restrict filename,
const char * restrict mode);
运行时约束
streamptr、文件名或模式都不能是空指针。
如果存在运行时约束冲突,fopen_s 不会尝试打开文件。此外,如果 streamptr 不是空指针,则 fopen_s 将 *streamptr 设置为空指针。
相比之下,C11 7.20.5.3 The fopen function
文件名和模式必须都指向一个字符串,但没有指定如果提供 NULL 指针会发生什么(大多数实现可能会因空指针取消引用而崩溃)。