Вы читаете 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