2013-06-27 2 views
3

Есть ли неотъемлемая опасность при использовании atexit в больших проектах, таких как библиотеки?atexit считается вредным?

Если да, то что это за технический характер за atexit, что может привести к проблемам в крупных проектах?

ответ

5

Основная причина, почему я хотел бы избежать использования atexit в библиотеках, что любое использование этого включает в себя глобальное состояние. Хорошая библиотека должна избегать глобального состояния.

Однако, есть и другие технические причины:

  1. Реализация требуется только поддерживать небольшое число (32, я думаю) из atexit обработчиков. После этого возможно, что все вызовы atexit завершатся неудачей, или что они преуспевают или терпят неудачу в зависимости от доступности ресурсов. Таким образом, вам нужно иметь дело с тем, что делать, если вы не можете зарегистрировать обработчик atexit, и, возможно, не будет никакого хорошего способа продолжения.

  2. Взаимодействие atexit с dlopen или другие способы загрузки библиотек динамически не определены. Библиотека, которая зарегистрировала обработчики atexit, не может быть безопасно выгружена, и способы, которые различные реализации могут иметь дело с этой ситуацией, могут различаться.

  3. Плохо написанные обработчики atexit могут иметь взаимодействия друг с другом или просто плохое поведение, которые препятствуют правильной работе программы. Например, если обработчик atexit пытается получить блокировку, которая хранится в другом потоке и которая не может быть освобождена из-за состояния во время вызова exit.

1

Безопасный СЕРТ имеет запись о atexit, когда не используется правильно:

ENV32-C. Все обработчики atexit должны возвращать нормально

https://www.securecoding.cert.org/confluence/display/seccode/ENV32-C.+All+atexit+handlers+must+return+normally

+0

Таким образом, проблемы обычно возникают, когда функция, переданная 'atexit', имеет возможность вызывать' exit' или иначе не возвращаться нормально? –

+0

C++ эквивалент этой ошибки фактически существует где-то (я забываю, где) в кодовой базе LLVM. У них есть деструктор, который вызывает 'exit' ... –