Читаешь errno
после вызова errno
-настройка функции в обработчике сигналов
Этот дефект возникает, когда вы вызываете одну из следующих функций в обработчике сигнала:
signal
: Вы вызываете signal
функция в обработчике сигналов и затем считывание значения errno
.
Например, функция обработчика сигналов handler
вызывает signal
а затем вызывает perror
, который читается errno
.
typedef void (*pfv)(int); void handler(int signum) { pfv old_handler = signal(signum, SIG_DFL); if (old_handler == SIG_ERR) { perror("SIGINT handler"); } }
errno
-настройка POSIX® функция: Вы вызываете errno
- установка функции POSIX в обработчике сигналов, но не восстановление errno
при возвращении с обработчика сигнала.
Например, функция обработчика сигналов handler
вызывает waitpid
, который изменяет errno
, но не восстанавливает errno
перед возвращением.
#include <stddef.h> #include <errno.h> #include <sys/wait.h> void handler(int signum) { int rc = waitpid(-1, NULL, WNOHANG); if (ECHILD != errno) { } }
В каждом случае, когда шашечные флаги, вы рискуете полагаться на неопределенное значение errno
.
signal
: Если вызов на signal
в обработчике сигналов происходит сбой, значение errno
является неопределенным (см. C11 стандарт, раздел 7.14.1.1). Если вы полагаетесь на определенное значение errno
можно увидеть неожиданные результаты.
errno
-настройка функции POSIX: An errno
-настройка наборов функций errno
при отказе. Если вы читаете errno
после того, как вызывается обработчик сигнала, и сам обработчик сигнала вызывает errno
-настройка функции, вы можете увидеть неожиданные результаты.
Избегайте ситуаций, когда вы рискуете полагаться на неопределенное значение errno
.
signal
: После вызова signal
не считывайте функцию в обработчике сигналов errno
или используйте функцию, которая читает errno
.
errno
-настройка функции POSIX: перед вызовом errno
-настройка функции в обработчике сигнала, сохранение errno
во временную переменную. Восстановление errno
от этой переменной до возврата с обработчика сигнала.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: On для рукописного кода, off для сгенерированного кода |
Синтаксис командной строки
: SIG_HANDLER_ERRNO_MISUSE |
Влияние: Средний |
Errno not checked
| Errno not reset
| Find defects (-checkers)
| Function called from signal handler not asynchronous-safe