1

我曾经用这段代码让 fopen更安全

fin = fopen(ifp, "r");
fout = fopen(ofp, "w");
if ((fin == NULL)||(fout == NULL))
    printf ("Error opening files");
else {} //action

现在我搬到了 Microsoft Visual Studio 2013。它要求我使用 fopen_s 而不是 fopen。除了使用 _CRT_SECURE_NO_WARNINGS 之外,还有其他解决方案吗?我的意思是,文件路径输入(scanf)的事实是否与 fopen_s 兼容?或者干脆忘记它并禁用安全警告?

PS我知道文件路径输入可能不安全,但我必须这样做,因为在我的任务中是这样说明的。

4

1 回答 1

1

我不认为这使它更安全。这只是对条件的良好处理以及您应该做什么。可能也应该检查errno

话虽这么说,如果你有能力使用fopen_s,那么我会使用它。来自 MSDN 关于“安全性增强”:

  • 参数验证。传递给 CRT 函数的参数在安全函数和许多预先存在的函数版本中都经过验证。这些验证包括:

    • 检查传递给函数的 NULL 值。

    • 检查枚举值的有效性。

    • 检查整数值是否在有效范围内。

    有关详细信息,请参阅参数验证。

  • 开发人员也可以访问无效参数的处理程序。当遇到无效参数时,CRT 提供了一种使用 _set_invalid_parameter_handler 函数检查这些问题的方法,而不是断言和退出应用程序。

  • 大小缓冲区。安全函数要求将缓冲区大小传递给写入缓冲区的任何函数。安全版本在写入之前验证缓冲区是否足够大,有助于避免可能允许执行恶意代码的危险缓冲区溢出错误。如果缓冲区太小,这些函数通常会返回 errno 类型的错误代码并调用无效参数处理程序。从输入缓冲区读取的函数(例如gets)具有要求您指定最大大小的安全版本。

  • 空终止。一些留下潜在未终止字符串的函数具有安全版本,可确保字符串正确以空值终止。

  • 增强的错误报告。与先前存在的函数相比,安全函数返回的错误代码包含更多错误信息。安全函数和许多预先存在的函数现在设置 errno 并经常返回 errno 代码类型,以提供更好的错误报告。

  • 文件系统安全。安全文件 I/O API 在默认情况下支持安全文件访问。

  • 视窗安全。安全进程 API 强制执行安全策略并允许指定 ACL。

  • 格式字符串语法检查。检测到无效字符串,例如,在 printf 格式字符串中使用不正确的类型字段字符。

于 2014-03-20T12:45:39.820 回答