【发布时间】:2010-01-30 18:55:14
【问题描述】:
Mac 上最好的一站式“安全”C 库解决方案是什么?我在“安全”/“不安全”上使用引号,因为对于某些标准库函数的好处或其假定改进的替代方案存在很多争论。
由于潜在的缓冲区溢出或其他安全问题,许多传统的标准 C 库函数(例如,vfprintf)被认为是不安全的。
在 Windows 上,Microsoft C/C++ 编译器 provide 将“_s”函数(例如 vfprintf_s)作为标准库调用的更安全替代方案。这些功能不是直接替代品,因为它们具有提供额外安全信息(例如缓冲区长度)所需的不同签名。它们还提供其他功能,例如无效格式字符串检测、不同的文件安全性等。据我所知,此实现在 Mac 上不可用。
Apple(或第三方)是否提供任何类似的东西以在 OSX 上与 GCC 一起使用?
特别是,我正在寻找至少以下功能的“安全”实现:
fopen vfprintf vsprintf sprintf strncpy strcpy strcat
请注意:这个问题是关于 Mac 的。我不是在询问您对 Microsoft 的实现的意见(除非它在 Mac 上可用。)虽然其中一些功能可能很容易自己编写,但并非全部都是。我不是在问自己如何写这些。我不是在询问有关如何使用 STL 类来执行此操作的提示。我不是在问如何关闭警告。我的特殊需求非常具体。我试图找出一个与传统 C 库调用尽可能相似的最佳实践 Mac API,同时增加安全性。当然,在 Mac 和 Windows(以及其他操作系统)上运行的可移植实现会更好。
【问题讨论】:
-
使用这些所谓的“安全”功能并不是最佳实践。
-
为什么不能使用安全的 C++ 标准库等价物? (或者如果你拒绝使用C++标准库,为什么标题说C/C++标准库函数)
-
GCC 已经对常规 C 标准库函数进行了格式字符串验证。它是使用特殊关键字实现的,因此您甚至可以使用采用标准格式字符串的自己的函数来实现。
-
@Neil Butterworth:为什么“安全”函数不是最佳实践?也许您可以引用解释的链接? Mac 上的最佳做法是什么?
-
@Shteef:非常感谢您的评论。我会咬一口,在 GCC 中启用格式字符串验证的秘密关键字是什么?链接怎么样?