Вызов прерванной функции вызывает неопределенное поведение программы
Этот дефект возникает, когда обработчик сигнала вызывает функцию, которая не является асинхронной-безопасной в соответствии со стандартом POSIX. Асинхронно-безопасная функция может быть прервана в любой момент ее выполнения, затем вызвана снова, не вызывая несогласованного состояния. Он также может правильно обрабатывать глобальные данные, которые могут находиться в несогласованном состоянии.
Если обработчик сигнала вызывает другую функцию, которая вызывает асинхронно-небезопасную функцию, дефект появляется при вызове функции в обработчике сигнала. Трассировка дефекта показывает полный путь от обработчика сигнала до асинхронно-небезопасной функции.
Когда вызывается обработчик сигнала, выполнение программы прерывается. После завершения работы обработчика выполнение программы возобновляется в точке прерывания. Если функция выполняется во время прерывания, вызов ее из обработчика сигнала является неопределенным поведением, если только это не асинхронно-безопасно.
Стандарт POSIX определяет эти функции как асинхронно-безопасные. Можно вызвать эти функции из обработчика сигнала.
_exit() | getpgrp() | setsockopt() |
_Exit() | getpid() | setuid() |
abort() | getppid() | shutdown() |
accept() | getsockname() | sigaction() |
access() | getsockopt() | sigaddset() |
aio_error() | getuid() | sigdelset() |
aio_return() | kill() | sigemptyset() |
aio_suspend() | link() | sigfillset() |
alarm() | linkat() | sigismember() |
bind() | listen() | signal() |
cfgetispeed() | lseek() | sigpause() |
cfgetospeed() | lstat() | sigpending() |
cfsetispeed() | mkdir() | sigprocmask() |
cfsetospeed() | mkdirat() | sigqueue() |
chdir() | mkfifo() | sigset() |
chmod() | mkfifoat() | sigsuspend() |
chown() | mknod() | sleep() |
clock_gettime() | mknodat() | sockatmark() |
close() | open() | socket() |
connect() | openat() | socketpair() |
creat() | pathconf() | stat() |
dup() | pause() | symlink() |
dup2() | pipe() | symlinkat() |
execl() | poll() | sysconf() |
execle() | posix_trace_event() | tcdrain() |
execv() | pselect() | tcflow() |
execve() | pthread_kill() | tcflush() |
faccessat() | pthread_self() | tcgetattr() |
fchdir() | pthread_sigmask() | tcgetpgrp() |
fchmod() | quick_exit() | tcsendbreak() |
fchmodat() | raise() | tcsetattr() |
fchown() | read() | tcsetpgrp() |
fchownat() | readlink() | time() |
fcntl() | readlinkat() | timer_getoverrun() |
fdatasync() | recv() | timer_gettime() |
fexecve() | recvfrom() | timer_settime() |
fork() | recvmsg() | times() |
fpathconf() | rename() | umask() |
fstat() | renameat() | uname() |
fstatat() | rmdir() | unlink() |
fsync() | select() | unlinkat() |
ftruncate() | sem_post() | utime() |
futimens() | send() | utimensat() |
getegid() | sendmsg() | utimes() |
geteuid() | sendto() | wait() |
getgid() | setgid() | waitpid() |
getgroups() | setpgid() | write() |
getpeername() | setsid() |
Функции, не указанные в предыдущей таблице, не являются асинхронно-безопасными и не должны вызываться из сигнальной трубки.
Группа: Программирование |
Язык: C | C++ |
По умолчанию: Off |
Синтаксис командной строки
: SIG_HANDLER_ASYNC_UNSAFE
|
Влияние: Средний |
ИДЕНТИФИКАТОР CWE: 364, 387, 413, 479, 663, 828 |
Find defects (-checkers)
| Function called from signal handler not asynchronous-safe (strict)
| Return from computational exception signal handler
| Shared data access within signal handler
| Signal call from within signal handler