我正在用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了。