Вызов прерванной функции вызывает неопределенное поведение программы
Этот дефект возникает, когда обработчик сигнала вызывает функцию, которая не является асинхронной-безопасной в соответствии со стандартом C. Асинхронно-безопасная функция может быть прервана в любой момент ее выполнения, затем вызвана снова, не вызывая несогласованного состояния. Он также может правильно обрабатывать глобальные данные, которые могут находиться в несогласованном состоянии.
При выборе проверки Function, вызываемой от обработчика сигнала, не асинхронно-безопасного, проверка обнаруживает вызовы функций, которые не являются асинхронно-безопасными в соответствии со стандартом POSIX. Функция, вызываемая от обработчика сигнала, не асинхронно-безопасного (строгого), не вызывает дефект для этих случаев. Функция, вызываемая от обработчика сигнала, не асинхронно-безопасного (строгого), вызывает дефект для функций, которые асинхронно-безопасны в соответствии со стандартом POSIX, но не согласно стандарту C.
Если обработчик сигнала вызывает другую функцию, которая вызывает асинхронно-небезопасную функцию, дефект появляется при вызове функции в обработчике сигнала. Трассировка дефекта показывает полный путь от обработчика сигнала до асинхронно-небезопасной функции.
Когда вызывается обработчик сигнала, выполнение программы прерывается. После завершения работы обработчика выполнение программы возобновляется в точке прерывания. Если функция выполняется во время прерывания, вызов ее из обработчика сигнала является неопределенным поведением, если только это не асинхронно-безопасно.
Стандарт C определяет следующие функции как асинхронно-безопасные. Можно вызвать эти функции из обработчика сигнала:
abort()
_Exit()
quick_exit()
signal()
Группа: Программирование |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: SIG_HANDLER_ASYNC_UNSAFE_STRICT
|
Влияние: Средний |
ИДЕНТИФИКАТОР CWE: 364, 387, 413, 479, 663, 828 |
Find defects (-checkers)
| Function called from signal handler not asynchronous-safe
| Shared data access within signal handler
| Signal call from within signal handler