У меня проблемы с использованием strerrorlen_s в gcc 4.7.2, хотя я определил __STDC_WANT_LIB_EXT1__
1.
Какая самая старая версия gcc/glibc поддерживает функции strerrorlen_s и strerror_s?
Ответы (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 это есть... Так что мы оба не сумасшедшие....
main': watchdogd.c:(.text+0xd7): undefined reference to
strerrorlen_s’ collect2: error: ld вернул 1 статус выхода - person clockley1   schedule 31.07.2013__STDC_LIB_EXT1__
. - person Casey   schedule 31.07.2013