Какая самая старая версия gcc/glibc поддерживает функции strerrorlen_s и strerror_s?

У меня проблемы с использованием strerrorlen_s в gcc 4.7.2, хотя я определил __STDC_WANT_LIB_EXT1__ 1.


person clockley1    schedule 31.07.2013    source источник
comment
Какая у тебя беда?   -  person jim mcnamara    schedule 31.07.2013
comment
предупреждение: неявное объявление функции ‘strerrorlen_s’ [-Wimplicit-function-declaration] /tmp/ccNK2h7T.o: в функции main': watchdogd.c:(.text+0xd7): undefined reference to strerrorlen_s’ collect2: error: ld вернул 1 статус выхода   -  person clockley1    schedule 31.07.2013
comment
gcc 4.7.3: cc t.c -std=c11 t.c: В функции 'main': t.c:8:5: предупреждение: неявное объявление функции 'strerrorlen_s' [-Wimplicit-function-declaration] /tmp/ccHzZVKk.o:t.c :(.text+0x68): неопределенная ссылка на `strerrorlen_s' collect2: error: ld вернул 1 статус выхода   -  person jim mcnamara    schedule 31.07.2013
comment
Я считаю, что это часть C11... кто-то, кто близко знаком с тем, что делает gcc, может знать больше.   -  person jim mcnamara    schedule 31.07.2013
comment
Это часть C11, но необязательная, она взята из технического отчета типа 2, TR24731. Моя собственная точка зрения состоит в том, что большинство этих функций безопасны, только если вы используете их правильно. Что, как ни странно, совпадает с небезопасными функциями. Возможно, люди, нуждающиеся в этом костыле, могут захотеть изучить BASIC :-)   -  person paxdiablo    schedule 31.07.2013
comment
Реализация, поддерживающая необязательные расширения библиотеки, будет определять __STDC_LIB_EXT1__.   -  person Casey    schedule 31.07.2013
comment
Спасибо, я проглядел это.   -  person clockley1    schedule 31.07.2013
comment
Разработчики библиотек, похоже, неохотно внедряют Приложение K, хотя большая часть этого может быть достигнута с помощью относительно простой оболочки для существующих функций. Я реализовал их в P99, p99.gforge.inria.fr, возможно, вам стоит взглянуть.   -  person Jens Gustedt    schedule 31.07.2013
comment
Обратите внимание на вопрос Используете ли вы безопасные функции TR 24731? - и особенно часть моего ответа, где отмечается, что есть шаг по удалению функций Приложения K из следующего пересмотр стандарта C (поскольку они повсеместно не реализованы - версия Microsoft отличается от стандарта, и других широко используемых основных реализаций нет).   -  person Jonathan Leffler    schedule 04.08.2017


Ответы (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.

person paxdiablo    schedule 31.07.2013

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 это есть... Так что мы оба не сумасшедшие....

person jim mcnamara    schedule 31.07.2013
comment
Приложение K, нормативное: В этом приложении указывается ряд факультативных расширений.... - person paxdiablo; 31.07.2013
comment
Спасибо, что нашли это. +1 - person jim mcnamara; 31.07.2013