功能的向后兼容性和安全版本
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。
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了。
- 从不同线程使用int64的不同字节安全吗
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 虚拟决赛作为安全
- 获取日期异步信号安全吗?如果在信号处理程序中使用,它会导致死锁吗
- 导入库可以跨dll版本工作吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 通过网络、跨平台传递std::变体是否安全
- 在clang++预处理器中确定gcc工具链版本
- 码头化的C++应用程序是否向后兼容早期的内核版本
- 在std::thread中,joinable()然后join()线程安全吗
- 使用std::istream::peek()总是安全的吗
- 从值小于256的uint16到uint8的Endian安全转换
- 功能的向后兼容性和安全版本
- 使用哪种版本的.NET Framework进行编码最安全
- 假设任何x86编译的应用程序总是在x64版本下运行是安全的吗?
- Microsoft的 C 库函数的C++安全版本如何知道静态缓冲区的大小?
- 有没有安全版本的斯特伦