Читаешь 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