安全字符串函数在Mac OS X和Linux中

时间:2010-12-31 12:43:35

标签: c++ windows linux security macos

Mac OSX和Linux中是否有与Windows中相同的安全字符串函数(strcpy_s,strncpy_s..etc)?

如何在多字节和宽字符之间进行转换?

5 个答案:

答案 0 :(得分:11)

安全字符串操作有两种策略。 Linux / glibc维护者拒绝添加安全功能,认为你应该保留字符串的长度并使用memcpy

另一方面,Mac OSX包含来自BSD的strlcpystrlcat。可以在两个平台上使用snprintfasprintf达到同样的效果:

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有strlcpystrlcat。据我所知,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()等等。