我正在用C(很少是C ++)编写一些程序。通常它们很简单,但通常它们会变大。
我希望了解有关使用功能的安全版本的更多信息,例如strcpy()
是不安全的,而strcpy_s()
是Microsoft对该功能的新安全版本。
在为Windows编码时,我通常使用Visual Studio2010。 *我删除了有关Linux的部分-仅关注Windows *
我的问题是,如果我使用较新的安全版本,是否仍可以在较旧版本的Windows(例如Windows 95)上执行程序?由于要求,我们只能有一个可执行文件。
谢谢。
编辑: 抱歉,这只是我现在想到的-忽略上面的Linux部分。如果我们为Windows编写代码,则不介意它是否不可移植到Linux,我只在乎它是否仍适用于旧版Windows。
答案 0 :(得分:8)
strcpy
是绝对安全的,请参阅this。
strcpy_s
直到2011年才在C11可选边界检查界面中进行了标准化。完全不受许多编译器支持-新库惨败。
Microsoft非标准库仅与标准化的边界检查接口部分兼容。在某些情况下,它们不遵循标准,但具有相同的功能名称。
因此,以_s
结尾的函数通常不安全,因为标准版本和非标准版本都存在并且不一定兼容。它们肯定不是便携式的。
我的建议是完全避免以下事情:
_s
结尾的函数。请使用安全且可移植的功能strcpy
,该功能已经标准化并记录了30多年。与此同时,您应该使用符合ISO C标准的编译器。
答案 1 :(得分:4)
如果要编写便携式 C(或C ++),因为它是非标准函数,请避免使用strcpy_s()
。
strncpy()
是最多复制一定数量字符的标准方法,可以帮助防止滥用“安全性”一词的缓冲区溢出。
使用strcpy
并没有错,只要您知道自己在做什么。通常,这种感觉在很大程度上适用于C:它的强大之处在于其简单性和最少的运行时检查。
答案 2 :(得分:3)
我的问题是,如果我使用更新的安全版本,我仍然可以 例如在较旧版本的Windows上执行我的程序 Windows 95?由于要求,我们只能有一个可执行文件 文件。
_s
版本不是“安全的”,无论您是在谈论Microsoft的实现还是符合实际标准的实现。它们确实结合了旨在帮助避免或减轻某些具有安全隐患的编程错误的机制,但是其有效性是有限的。
但是,关于非常老的Windows版本是否支持它们,默认情况下不。 _s函数在Windows 95的生存期内不存在,因此随该Windows版本一起分发的C运行时库版本不支持它们。但是,Windows应用程序与支持它们需求的MS C运行时库版本打包在一起是相对常见的。也许您可以走这条路,但是我不能说是否有任何版本的MS C运行时支持过去24年中的所有Windows版本并包含_s函数。
最好的选择是将自己限制在C90标准库中的功能,所有目标Windows版本支持的WinAPI函数以及应用程序本身以及与它一起分发的任何第三方库提供的功能(它们本身应符合相同的限制)。或者,您可以考虑将支持范围限制为更少的Windows版本。 Microsoft自身已经18年不支持Windows 95了。