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。