即使我定义了__STDC_WANT_LIB_EXT1__
1,我也无法在gcc 4.7.2中使用strerrorlen_s。
答案 0 :(得分:3)
至少在Debian下,它不是在glib 2.13中,但我不明白为什么这会与其他系统不同。在整个磁盘上搜索strerrorlen_s
不返回任何内容。
它也没有在2.14的任何发行说明中列出当前的2.17(搜索bounds
,tr24731
和strerrorlen_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有它...... 所以我们都不是疯了......