strerrorlen_s
即使我定义了__STDC_WANT_LIB_EXT1__
1 ,我也无法在 gcc 4.7.2 中使用。
2 回答
它不在 glib 2.13 中,至少在 Debian 下,但我不明白为什么这与任何其他系统都不同。strerrorlen_s
在整个磁盘上搜索什么也不返回。
它也没有在 2.14 到当前 2.17 的任何发行说明中列出(搜索bounds
和)。它甚至没有在2.18 wiki 页面上提及。tr24731
strerrorlen_s
请记住,边界检查接口是 C11 的可选功能。附件 K 详细说明了这一点,实现根本不需要提供它。
K.2 范围:
1/ 本附件规定了一系列可用于缓解程序安全漏洞的可选扩展,包括在现有标准头文件中声明或定义的新函数、宏和类型。
2/ 定义的实现
__STDC_LIB_EXT1__
应符合本附件中的规范。未定义__STDC_LIB_EXT1__
的实现不需要符合这些规范。
看起来实际上根本没有计划在核心glibc
中支持此功能。来自 Ulrich Drepper 的评论(诚然,2012 年 3 月)关于是否会提供支持:
甚至提出他们的人也建议他们修复旧代码,而不是作为前进的方向。此类代码属于单独的库,它们 (a) 努力使用以使函数变得未使用,以及 (b) 以便在最后一个违规者离开时可以删除该库。
同样,大约在同一时间,来自 LNW 的一篇文章:
没有计划从其中一个附件中添加 C11 字符串边界检查接口,因为即使在标准组中也存在关于它们的有用性的问题。这并不意味着这些接口不能最终出现在 libc_ports 树中,它为默认情况下未启用的可选附加组件提供了一个位置。这将允许发行版或其他人将这些功能构建到他们的 GLIBC 版本中。
N1570 Committee Draft — April 12, 2011 ISO/IEC 9899:201x
errno_t strerror_s(char *s, rsize_t maxsize, errno_t errnum);
size_t strerrorlen_s(errno_t errnum);
size_t strnlen_s(const char *s, size_t maxsize);
那来自我的 C11 标准 - 草案 N1570。也许更高版本的 gcc 有它......所以我们都不是疯了......