Какая самая старая версия gcc/glibc, которая поддерживает функции strerrorlen_s и strerror_s?
У меня проблемы с использованием strerrorlen_s в gcc 4.7.2, хотя я определил __STDC_WANT_LIB_EXT1__
1.
2 ответа
Это не в glib 2.13, по крайней мере, под Debian, но я не понимаю, почему это будет отличаться от любой другой системы. Поиск по strerrorlen_s
на весь диск ничего не возвращается.
Это также не перечислено ни в одном из замечаний к выпуску для 2.14 до текущего 2.17 (искали bounds
, tr24731
а также strerrorlen_s
). Это даже не упоминается на вики-странице 2.18.
Имейте в виду, что интерфейсы проверки границ являются дополнительной функцией C11. В Приложении K это подробно описано, и реализации вообще не обязаны его предоставлять .
K.2 Область применения:
1 / В этом приложении указан ряд необязательных расширений, которые могут быть полезны для уменьшения уязвимостей в программах и включают в себя новые функции, макросы и типы, объявленные или определенные в существующих стандартных заголовках.
2 / Реализация, которая определяет
__STDC_LIB_EXT1__
должны соответствовать спецификациям в этом приложении. Реализации, которые не определяют__STDC_LIB_EXT1__
не обязаны соответствовать этим спецификациям.
Похоже, что на самом деле нет планов поддерживать эту функцию в ядре glibc
совсем. Из комментария Ульриха Дреппера (предположительно, март 2012 г.) о том, будет ли оказана поддержка:
Даже люди, которые предложили их, предложили их для исправления старого кода, а не для продвижения вперед. Такой код принадлежит отдельным библиотекам, которые (а) предпринимают усилия для использования, чтобы функции стали неиспользованными, и (б) чтобы библиотека могла быть удалена, когда ушел последний нарушитель.
Точно так же из статьи 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 это есть... Так что мы не сумасшедшие...