功能的向后兼容性和安全版本

Backwards compatibility and secure versions of functions

本文关键字:安全 版本 兼容性 功能      更新时间:2023-10-16

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

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

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

我的问题是,如果我使用较新的安全版本,我还能在较旧版本的Windows(例如Windows 95)上执行程序吗?由于需要,我们只能有一个可执行文件。

谢谢。

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

strcpy是完全安全的,请参阅此。

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

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

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

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

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

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

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

strncpy()是复制一定数量字符的标准方式,可以帮助防止缓冲区溢出,而"安全性"一词被滥用。

只要你知道自己在做什么,使用strcpy就没有错。这种观点在很大程度上适用于C:它的强大之处在于它的简单性和最少的运行时检查。

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

_s版本并不"安全",无论您谈论的是微软的实现还是符合实际标准的实现。它们确实包含了一些机制,旨在帮助避免或减轻某些具有安全影响的编程错误,但这些机制的有效性有限。

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

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