[英]Safe String Functions In Mac OS X and Linux
在Mac OSX和Linux中是否有与Windows中相同的安全字符串函数(strcpy_s,strncpy_s..etc)?
那些在多字节和宽字符之间转换的函数呢?
安全字符串操作有两种策略。 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实现。 如果您的代码将在多个平台上编译,您可以使用预定义的库宏测试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
界面可以轻松处理字符编码之间的转换。
OSX有strlcpy
和strlcat
。 据我所知,Linux目前没有它们,但是从OpenBSD中提取这些功能很容易。
您可以使用gcc的-D_FORTIFY_SOURCE=2
选项,对于Linux,您可以更高级,因为您应该阅读使用gcc和glibc的安全编程 。
如果必须使用char缓冲区(NTBS = Nul终止字节字符串),则没有本质安全的字符串函数。 strlen()甚至都不安全。
相反,存在本质上不安全的字符串函数,例如gets()和sprintf()的大多数用法。 这些是不安全的,因为您无法可靠地预测所需的缓冲区大小。
如果您正确跟踪所使用和要求的最大缓冲区大小,则可以安全地使用另一类字符串函数。
在C ++中帮助这样做的一种方法是在Google的RE2包中使用像StringPiece这样的好类,它是指针和长度,指针指向NTBS。 通过将正确的长度存储到StringPiece中一次,该类可以跟踪各种操作的长度。 你可以自己写这样一堂课。 这样做不会使你的代码正确,但它会隔离关键点(即,正确获取构造函数的参数)。
在这种情况下,封装是你的朋友。
可以使用标准C函数在多字节和宽字符之间进行转换: mbtowc()
, mbstowcs()
, wctomb()
, wcstombs()
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.