C 当我需要请求文件路径时,如何使用fopen_s?

C 当我需要请求文件路径时,如何使用fopen_s?,c,security-warning,C,Security Warning,我曾经使用此代码使fopen更安全 fin = fopen(ifp, "r"); fout = fopen(ofp, "w"); if ((fin == NULL)||(fout == NULL)) printf ("Error opening files"); else {} //action 现在我搬到了微软Visual Studio 2013。它要求我使用fopen_s而不是fopen。除了使用CRT安全警告之外,还有其他解决方案吗?我的意思是,文件路径输入(scanf)与fop

我曾经使用此代码使fopen更安全

fin = fopen(ifp, "r");
fout = fopen(ofp, "w");
if ((fin == NULL)||(fout == NULL))
    printf ("Error opening files");
else {} //action
现在我搬到了微软Visual Studio 2013。它要求我使用fopen_s而不是fopen。除了使用CRT安全警告之外,还有其他解决方案吗?我的意思是,文件路径输入(scanf)与fopen_兼容吗?还是忘记它,禁用安全警告


另外,我知道文件路径输入可能是不安全的,但我必须这样做,因为我的任务中已经说明了这一点。

我认为这样做并不安全。这只是对条件和你应该做的事情的良好处理。可能也应该检查
errno

也就是说,如果你有能力使用fopen_s,那么我会使用它。从“”上的MSDN:

  • 参数验证。传递给CRT函数的参数为 已在安全功能和许多先前存在的版本中验证 函数的定义。这些验证包括:

    • 检查传递给函数的空值

    • 检查枚举值的有效性

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

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

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

  • 缓冲区大小。安全函数要求将缓冲区大小传递给任何写入缓冲区的函数。安全版本 在写入缓冲区之前验证缓冲区是否足够大,以帮助 避免可能导致恶意攻击的危险缓冲区溢出错误 要执行的代码。这些函数通常返回errno类型的错误 如果 缓冲区太小。从输入缓冲区读取的函数,例如 获取,具有要求您指定最大大小的安全版本

  • 无效终止。某些保留可能未终止字符串的函数具有安全版本,可确保字符串 正确地以null结尾

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

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

  • Windows安全性。安全流程API强制执行安全策略并允许指定ACL

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


大多数情况下,他们更安全,因为他们(更好)验证他们的输入。要使用它们,您不需要更改文件路径的输入方式(因此,如果您使用了
scanf
,您可以继续使用,或者您可以切换到其安全版本
\u cscanf\u s
)。如何使用它们?继续检查返回值(如果
NULL
check
errno
),并准备捕获(结构化)异常。我可能说得不够清楚。我需要知道在我必须输入文件路径时是否可以使用fopen_s,而不知道它是否足够安全。@gi joe我检查了errno。这是一种错误处理类型,将输入的文件路径用作常量字符串有何帮助@阿德里亚诺事实上,我被迫使用scanf_s,我提到的基本scanf只是作为我已经习惯的一个例子。我如何检查甚至不接受我试图给出的参数的任何东西的返回值?(它不接受char,它要求const char)是的,您不需要更改读取路径的方式。它们都接受
char*
作为文件路径…要求您使用
fopen_s
完全是Visual Studio的愚蠢行为。它与fopen基本相同,根本不安全。如果传入空指针而不是segfaulting,它只返回EINVAL,但无论如何都不应该传入空指针。看见