Ошибка NETBSD 3.1 - в malloc(): предупреждение: рекурсивный вызов

Сценарий тестирования представляет собой пинг для получения IP-адреса, а ctr+C вызывается из сценария поочередно.

Похоже, что при вызове обработчика сигнала пинг был внутри malloc. Обработчик сигнала также вызвал malloc, и malloc возвратил предупреждение ниже. в malloc(): предупреждение: рекурсивный вызов

Но все же я не мог найти, как это может вызвать сбой, может кто-нибудь объяснить


person Twinkle    schedule 24.06.2016    source источник
comment
Если triptime является константой и в коде нет других FP (то есть triptime*1000.0 было выполнено во время компиляции), некоторые компиляции оптимизируют подпрограммы FP, а printf() со спецификатором FP ​​терпит неудачу - но это только предположение, поскольку контекста очень мало. здесь.   -  person chux - Reinstate Monica    schedule 24.06.2016
comment
Когда вы говорите о сбоях, вы имеете в виду двоичный файл ping, ОС или что-то еще? Это определенно похоже на строку из пинга 3.1 (в более поздних версиях NetBSD она отличается из-за 64-битных таймингов). Кроме того, какую командную строку вы используете и на какой архитектуре? Это может быть странная проблема с оборудованием/ОС, связанная с конкретным оборудованием.   -  person abs    schedule 24.06.2016
comment
Я обновил вопрос, не могли бы вы проверить сейчас   -  person Twinkle    schedule 29.06.2016


Ответы (1)


Ах, ужасный обработчик сигналов, использующий нереентерабельные функции.

Проблема в том, что специалисты по добавлению функций в *BSD ping с самого начала делали ставку на безопасность.

FreeBSD добавила эту проблему в 1994 году, заметила ее в 1996 году и начала то, что должно было быть гораздо более коротким путем решения проблемы, чем оказалось, с окончательным исправлением где-то в 1998 году.

OpenBSD добавила эту проблему в 1997 году, заметила ее в 2002 году, но полностью упустила суть проблемы и не исправила ее должным образом и полностью до 2015 года.

NetBSD добавила эту проблему в 1996 г., но, как вы обнаружили, до сих пор не исправлена. NetBSD, вероятно, следует импортировать пинг OpenBSD.

Проблема в том, что ни malloc(), ни какой-либо из STDIO (включая printf()) не являются реентерабельными, что необходимо для всего кода, используемого в обработчике сигналов.

Есть десятки лучших мест, где можно найти описания повторного входа, проблем с обработчиками сигналов и т. д., но, возможно, этот вопрос и его принятый ответ (и некоторые связанные с ним вопросы) были бы хорошим началом:

Почему malloc() и printf() называются нереентерабельными?

person Greg A. Woods    schedule 30.06.2016
comment
Спасибо, Грег. Ты прав. Это проблема. Но при нажатии ctr+c необходимо распечатать статистику пинга. Есть ли у вас какие-либо идеи о том, как я могу избежать printf здесь. - person Twinkle; 01.07.2016
comment
Я предложил портировать OpenBSD ping, но я попробовал это сделать, и это намного больше работы, чем я думал (хотя это стоило бы сделать). К сожалению, полные и правильные исправления, необходимые для предотвращения дампов ядра, вероятно, являются почти такой же длительной работой. (Я думаю, что портирование ping FreeBSD было бы еще более утомительным) - person Greg A. Woods; 01.07.2016