Есть ли неотъемлемая опасность при использовании atexit
в больших проектах, таких как библиотеки?atexit считается вредным?
Если да, то что это за технический характер за atexit
, что может привести к проблемам в крупных проектах?
Есть ли неотъемлемая опасность при использовании atexit
в больших проектах, таких как библиотеки?atexit считается вредным?
Если да, то что это за технический характер за atexit
, что может привести к проблемам в крупных проектах?
Основная причина, почему я хотел бы избежать использования atexit
в библиотеках, что любое использование этого включает в себя глобальное состояние. Хорошая библиотека должна избегать глобального состояния.
Однако, есть и другие технические причины:
Реализация требуется только поддерживать небольшое число (32, я думаю) из atexit
обработчиков. После этого возможно, что все вызовы atexit
завершатся неудачей, или что они преуспевают или терпят неудачу в зависимости от доступности ресурсов. Таким образом, вам нужно иметь дело с тем, что делать, если вы не можете зарегистрировать обработчик atexit
, и, возможно, не будет никакого хорошего способа продолжения.
Взаимодействие atexit
с dlopen
или другие способы загрузки библиотек динамически не определены. Библиотека, которая зарегистрировала обработчики atexit
, не может быть безопасно выгружена, и способы, которые различные реализации могут иметь дело с этой ситуацией, могут различаться.
Плохо написанные обработчики atexit
могут иметь взаимодействия друг с другом или просто плохое поведение, которые препятствуют правильной работе программы. Например, если обработчик atexit
пытается получить блокировку, которая хранится в другом потоке и которая не может быть освобождена из-за состояния во время вызова exit
.
Безопасный СЕРТ имеет запись о atexit
, когда не используется правильно:
ENV32-C. Все обработчики atexit должны возвращать нормально
Таким образом, проблемы обычно возникают, когда функция, переданная 'atexit', имеет возможность вызывать' exit' или иначе не возвращаться нормально? –
C++ эквивалент этой ошибки фактически существует где-то (я забываю, где) в кодовой базе LLVM. У них есть деструктор, который вызывает 'exit' ... –