Атексит считается вредным?

Существуют ли опасности при использовании atexit в больших проектах, таких как библиотеки?

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

2 ответа

Решение

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

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

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

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

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

Secure CERT имеет запись о atexit когда не используется правильно:

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

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

Другие вопросы по тегам