bugprone-signal-handler¶
查找信号处理函数中可能导致未定义行为的特定结构。C++ 语言版本之间允许的内容规则不同。
针对 C 的已检查信号处理程序规则
不允许调用非异步安全函数。
针对 C++14 及更早版本的已检查信号处理程序规则
不允许调用非异步安全函数。
C++ 特定代码结构不允许在信号处理程序中使用。换句话说,只允许使用 C 和 C++ 的公共子集。
不允许调用具有非 C 连接的函数(包括信号处理程序本身)。
在 C++17 及更高版本中,此检查被禁用。
异步安全性是通过将函数的名称与已知函数集进行比较来确定的。此外,该函数必须来自系统头文件包含,并在全局命名空间中。传递给函数的(可能的)参数不会被检查。任何无法确定为异步安全的函数,都被检查认为是非异步安全的,包括只可见声明的用户函数。对具有可见定义的用户定义函数的调用会递归地进行检查。
此检查实现了 CERT C 编码标准规则 SIG30-C。在信号处理程序中仅调用异步安全函数 和规则 MSC54-CPP。信号处理程序必须是普通旧函数。它具有别名 cert-sig30-c
和 cert-msc54-cpp
。
选项¶
- AsyncSafeFunctionSet¶
选择哪些函数集被认为是异步安全的(因此允许在信号处理程序中使用)。它可以设置为以下值
minimal
选择在 CERT SIG30-C 规则中定义的最小集合。并且包括函数
abort()
、_Exit()
、quick_exit()
和signal()
。POSIX
选择一个更大的函数集,该函数集列在 POSIX.1-2017 中(有关详细信息,请参阅 此链接)。以下函数包括:
_Exit
,_exit
,abort
,accept
,access
,aio_error
,aio_return
,aio_suspend
,alarm
,bind
,cfgetispeed
,cfgetospeed
,cfsetispeed
,cfsetospeed
,chdir
,chmod
,chown
,clock_gettime
,close
,connect
,creat
,dup
,dup2
,execl
,execle
,execv
,execve
,faccessat
,fchdir
,fchmod
,fchmodat
,fchown
,fchownat
,fcntl
,fdatasync
,fexecve
,ffs
,fork
,fstat
,fstatat
,fsync
,ftruncate
,futimens
,getegid
,geteuid
,getgid
,getgroups
,getpeername
,getpgrp
,getpid
,getppid
,getsockname
,getsockopt
,getuid
,htonl
,htons
,kill
,link
,linkat
,listen
,longjmp
,lseek
,lstat
,memccpy
,memchr
,memcmp
,memcpy
,memmove
,memset
,mkdir
,mkdirat
,mkfifo
,mkfifoat
,mknod
,mknodat
,ntohl
,ntohs
,open
,openat
,pause
,pipe
,poll
,posix_trace_event
,pselect
,pthread_kill
,pthread_self
,pthread_sigmask
,quick_exit
,raise
,read
,readlink
,readlinkat
,recv
,recvfrom
,recvmsg
,rename
,renameat
,rmdir
,select
,sem_post
,send
,sendmsg
,sendto
,setgid
,setpgid
,setsid
,setsockopt
,setuid
,shutdown
,sigaction
,sigaddset
,sigdelset
,sigemptyset
,sigfillset
,sigismember
,siglongjmp
,signal
,sigpause
,sigpending
,sigprocmask
,sigqueue
,sigset
,sigsuspend
,sleep
,sockatmark
,socket
,socketpair
,stat
,stpcpy
,stpncpy
,strcat
,strchr
,strcmp
,strcpy
,strcspn
,strlen
,strncat
,strncmp
,strncpy
,strnlen
,strpbrk
,strrchr
,strspn
,strstr
,strtok_r
,symlink
,symlinkat
,tcdrain
,tcflow
,tcflush
,tcgetattr
,tcgetpgrp
,tcsendbreak
,tcsetattr
,tcsetpgrp
,time
,timer_getoverrun
,timer_gettime
,timer_settime
,times
,umask
,uname
,unlink
,unlinkat
,utime
,utimensat
,utimes
,wait
,waitpid
,wcpcpy
,wcpncpy
,wcscat
,wcschr
,wcscmp
,wcscpy
,wcscspn
,wcslen
,wcsncat
,wcsncmp
,wcsncpy
,wcsnlen
,wcspbrk
,wcsrchr
,wcsspn
,wcsstr
,wcstok
,wmemchr
,wmemcmp
,wmemcpy
,wmemmove
,wmemset
,write
函数
quick_exit
未包含在 POSIX 列表中,但包含在此安全函数集中。
默认值为
POSIX
。