1

strerrorlen_s即使我定义了__STDC_WANT_LIB_EXT1__1 ,我也无法在 gcc 4.7.2 中使用。

4

2 回答 2

4

它不在 glib 2.13 中,至少在 Debian 下,但我不明白为什么这与任何其他系统都不同。strerrorlen_s在整个磁盘上搜索什么也不返回。

它也没有在 2.14 到当前 2.17 的任何发行说明中列出(搜索bounds和)。它甚至没有在2.18 wiki 页面上提及。tr24731strerrorlen_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 版本中。

于 2013-07-31T02:26:24.147 回答
1
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 有它......所以我们都不是疯了......

于 2013-07-31T02:21:32.723 回答