什么是Mac上最好的一站式"安全"C库解决方案?我使用"安全"/"不安全"的引用,因为关于某些标准库函数或其推定改进的替代品的好处存在很多争论.
vfprintf由于可能存在缓冲区溢出或其他安全问题,许多传统的标准C库函数(例如)被认为是不安全的.
在Windows上,Microsoft C/C++编译器提供 "_s"函数(例如vfprintf_s)作为标准库调用的更安全的替代方法.这些功能不是直接替换,因为它们具有提供附加安全信息(例如,缓冲区长度)所必需的不同签名.它们还提供其他功能,例如无效的格式字符串检测,不同的文件安全性等.据我所知,这种实现在Mac上不可用.
Apple(或第三方)是否在OSX上提供与GCC类似的任何内容?
特别是,我正在寻找至少以下功能的"安全"实现:
fopen vfprintf vsprintf sprintf strncpy strcpy strcat
请注意:这个问题与Mac有关.我不是要求你就微软的实现提出你的意见(除非它可以在Mac上使用.)虽然其中一些功能可能很容易自己编写,但并非所有功能都可以.我不是在问自己如何写这些.我不是要求提供有关如何使用STL类来做到这一点的技巧.我不是在问如何关闭警告.我的特殊需求非常具体.我正在尝试确定最佳实践Mac API,它与传统的C库调用尽可能相似,同时增加了安全性.当然,在Mac和Windows(以及其他操作系统)上运行的便携式实现会更好.
我目前正在将我们的一个Linux库的代码转换为Windows DLL.
在这个库中,我有一个函数,它以printf方式获取最后一个参数(格式字符串,然后是省略号).在这个函数中,我使用vsnprintf格式化提供的参数.因为我想知道我是否可以将最终字符串塞入一个小缓冲区,或者如果我必须为它分配内存,我有兴趣确定格式化字符串的"将是长度".
要做到这一点,我目前正在使用这样的vsnprintf(显然是组成示例代码):
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void foo(const char* fmt, ...)
{
int len = 0;
va_list ap;
va_start(ap, fmt);
len = vsnprintf(0, 0, fmt, ap);
printf("len = %d\n", len);
va_end(ap);
}
int main(void)
{
foo("12345%s", "67890");
exit(0);
}
Run Code Online (Sandbox Code Playgroud)
Open Group Base Specifications Issue 6涵盖了此用法:
vsnprintf(char*restrict s,size_t n,const char*restrict format,va_list ap)
[...] vsnprintf()[...]函数应等同于[...] snprintf().
snprintf(char*restrict s,size_t n,const char*restrict format,...)
如果在调用snprintf()时n的值为零,则不应写入任何内容,已写入的字节数n必须足够大,不包括终止空值,并且s可以是空指针.
当我使用/ analyze on在Windows系统(Visual Studio 2010)上编译此代码时出现问题.编译器/分析器给了我以下内容:
test.c(11):警告C6309:参数'1'为空:这不符合'vsnprintf'的函数规范
test.c(11):警告C6387:'参数1'可能是'0':这不符合函数'vsnprintf'的规范:行:7,8,10,11
如果buffer或 …