在Mac OSX和Linux中是否存在与Windows中类似的安全string函数(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()
等等。