繁体   English   中英

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

[英]Safe String Functions In Mac OS X and Linux

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

那些在多字节和宽字符之间转换的函数呢?

安全字符串操作有两种策略。 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实现。 如果您的代码将在多个平台上编译,您可以使用预定义的库宏测试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有strlcpystrlcat 据我所知,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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM