函数的向后兼容性和安全版本

Backwards compatibility and secure versions of functions

我正在用 C(很少用 C++)编写一些程序。通常它们很简单,但通常它们可以变大。

我希望了解有关使用函数的安全版本的更多信息,例如,strcpy() 是不安全的,而 strcpy_s() 是该函数的 Microsoft 新安全版本。

我通常在编码 Windows 时使用 Visual Studio 2010 * 我删除了关于 Linux 的部分 - 仅关注 Windows*

我的问题是,如果我使用更新的安全版本,我是否仍然能够在旧版本的 Windows 上执行我的程序,例如 Windows 95?由于要求,我们只能有一个可执行文件。

谢谢。

编辑: 抱歉,我现在才想到这个 - 请忽略上面的 Linux 部分。如果我们为 Windows 编写代码,我不介意它是否不能移植到 Linux,我只关心它是否仍然适用于旧版本的 Windows。

如果您想编写 可移植 C(或 C++),请避免使用 strcpy_s(),因为它是一个非标准函数。

strncpy() 是复制特定数量字符的标准方法,可以帮助防止缓冲区溢出 运行 术语 "security" 被滥用。

只要您知道自己在做什么,使用 strcpy 就没有错。这种情绪大部分适用于一般的 C:它的力量在于其简单性和最少的 运行 时间检查。

strcpy 是绝对安全的,参见 this

strcpy_s 直到 2011 年才在 C11 可选边界检查接口中标准化。许多编译器根本不支持它 - 新库是一个惨败。

Microsoft 非标准库仅与标准化边界检查接口部分兼容。在某些情况下,它们不遵循标准但具有相同的函数名称。

因此以_s结尾的函数通常不安全,因为标准和非标准版本都存在并且不一定兼容。它们肯定是不可移植的。

我的建议是完全避免以下情况:

  • C11 边界检查接口。
  • 任何以 _s.
  • 结尾的函数
  • Visual Studio 用于编译C代码。

请改用安全且便携的功能 strcpy,该功能已经标准化并记录了 30 多年。与此同时,您应该使用符合 ISO C 标准的编译器。

My question is if I use the newer secure version will I still be able to execute my programs on older versions of Windows, for example Windows 95? Due to requirements we can only have a single executable file.

_s版本不是"secure",不管你是说微软的实现还是符合实际标准的实现。它们确实包含旨在帮助避免或减轻某些具有安全隐患的编程错误的机制,但这些机制的有效性是有限的。

但是关于它们是否会在非常旧的 Windows 版本上受支持,不,默认情况下不支持。 _s 函数在 Windows 95 的生命周期中不存在,因此与 Windows 版本一起分发的 C 运行时库版本不支持它们。然而,Windows 应用程序与支持其需求的 MS C 运行时库版本一起打包是相对常见的。也许你可以走那条路,但我不能说是否有任何版本的 MS C 运行时支持过去 24 年的所有 Windows 版本并包含 _s 函数。

您最好的选择是将自己限制在 C90 标准库中的函数、所有目标 Windows 版本中支持的 WinAPI 函数,以及您的应用程序本身和随它分发的任何第三方库提供的函数(它们本身应遵守相同的限制)。或者您可以考虑限制对 Windows 的较少版本的支持。微软自己不支持Windows95已经18年了