Вы читаете 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: errno
- установка функции устанавливает errno
onFailure. Если вы читаете errno
после того, как обработчик сигнала называется, и сам обработчик сигнала вызывает errno
- устанавливая функцию, вы видите неожиданные результаты.
Избегайте ситуаций, где вы рискуете использовать неопределенное значение errno
.
signal
: После вызова signal
функция в обработчике сигнала, не читайте errno
или используйте функцию, которая читает errno
.
errno
- функция установки POSIX: Прежде, чем вызвать errno
- установка функции в обработчике сигнала, сохраните errno
к временной переменной. Восстановите errno
от этой переменной прежде, чем возвратиться из обработчика сигнала.
Группа: Программирование |
Язык: C | C++ |
Значение по умолчанию: На для рукописного кода, прочь для сгенерированного кода |
Синтаксис командной строки:
SIG_HANDLER_ERRNO_MISUSE |
Удар: Средняя |
Errno not checked
| Errno not reset
| Find defects (-checkers)
| Function called from signal handler not asynchronous-safe