什么是支持strerrorlen_s和strerror_s函数的最旧版本的gcc / glibc?

时间:2013-07-31 02:05:04

标签: c linux glibc c11 tr24731

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

2 个答案:

答案 0 :(得分:3)

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

它也没有在2.14的任何发行说明中列出当前的2.17(搜索boundstr24731strerrorlen_s)。它甚至没有在2.18 wiki page上提及。

请记住,边界检查接口是C11的可选功能。附件K对此进行了详细说明,并且根本不需要实现

  

K.2范围:

     

1 /本附件规定了一系列可选扩展,可用于缓解程序中的安全漏洞,并包含在现有标准头中声明或定义的新函数,宏和类型。

     

2 /定义__STDC_LIB_EXT1__的实现应符合本附件中的规范。未定义__STDC_LIB_EXT1__的实现不需要符合这些规范。

看起来实际上根本没有计划在核心glibc中支持此功能。来自Ulrich Drepper的评论(诚然是2012年3月)关于是否即将提供支持:

  

即使提出这些建议的人也建议他们修复旧代码而不是前进的方法。这些代码属于单独的库,它们(a)努力使用以使函数不被使用,以及(b)以便在最后一个违规者离开时删除库。

同样,在同一时间的LNW文章中:

  

没有计划从其中一个附件中添加C11字符串边界检查接口,因为即使在标准组中也存在有用的问题。这并不意味着这些接口无法在libc_ports树中结束,而libc_ports树为默认情况下未启用的可选加载项提供了一个位置。这将允许发行版或其他人将这些功能构建到他们的GLIBC版本中。

答案 1 :(得分: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有它...... 所以我们都不是疯了......