Mac OSX和Linux中是否有与Windows中相同的安全字符串函数(strcpy_s,strncpy_s..etc)?
如何在多字节和宽字符之间进行转换?
答案 0 :(得分:11)
安全字符串操作有两种策略。 Linux / glibc维护者拒绝添加安全功能,认为你应该保留字符串的长度并使用memcpy
。
另一方面,Mac OSX包含来自BSD的strlcpy
和strlcat
。可以在两个平台上使用snprintf
和asprintf
达到同样的效果:
size_t strlcpy(char *d, char const *s, size_t n)
{
return snprintf(d, n, "%s", s);
}
size_t strlcat(char *d, char const *s, size_t n)
{
return snprintf(d, n, "%s%s", d, s);
}
您还可以考虑使用BSD实施found here。如果您的代码将在多个平台上编译,您可以使用pre-defined library macros测试glibc的存在:
#if defined __GNU_LIBRARY__ || defined __GLIBC__
size_t strlcpy(char *, char const *, size_t);
size_t strlcat(char *, char const *, size_t);
#endif
使用iconv
界面最容易处理字符编码之间的转换。
答案 1 :(得分:4)
OSX有strlcpy
和strlcat
。据我所知,Linux目前还没有它们,但是从OpenBSD中提取这些功能很容易。
答案 2 :(得分:3)
您可以使用gcc的-D_FORTIFY_SOURCE=2
选项,对于Linux,您可以更高级,因为您应该阅读Secure Programming with gcc & glibc。
答案 3 :(得分:2)
如果必须使用char缓冲区(NTBS = Nul终止字节字符串),则 no 具有本质安全的字符串函数。 strlen()甚至都不安全。
相反,存在本质上不安全字符串函数,例如gets()和sprintf()的大多数用法。这些是不安全的,因为您无法可靠地预测所需的缓冲区大小。
另一类字符串函数可以安全地使用,前提是您可以正确跟踪所需的最大缓冲区大小。
在C ++中帮助这样做的一种方法是在Google的RE2包中使用像StringPiece这样的好类,它是指针和长度,指针指向NTBS。通过将正确的长度存储到StringPiece中一次,该类可以跟踪各种操作的长度。你可以自己写这样一堂课。这样做不会使你的代码正确,但它会隔离关键点(即,正确获取构造函数的参数)。
在这种情况下,封装是你的朋友。
答案 4 :(得分:2)
可以使用标准C函数在多字节和宽字符之间进行转换:mbtowc()
,mbstowcs()
,wctomb()
,wcstombs()
等等。