由 atexit、at_quick_exit 指定的处理函数应正常返回
8.36 ID_exitHandlerNoReturn
如果 atexit、at_quick_exit 指定的处理函数未正常返回,会导致标准未定义的行为。
示例:
void handler() {
exit(1); // Non-compliant
}
int main() {
atexit(handler);
}
例中程序在调用 exit 时会执行 handler,而 handler 又调用 exit,造成了无限递归,其后果在标准中是未定义的。
又如:
jmp_buf buf;
void handler() {
longjmp(buf, 1); // Non-compliant
}
int main() {
atexit(handler);
if (setjmp(buf) == 0) {
return 0;
}
return 1;
}
例中 main 返回后会调用 handler,而 handler 又调用 longjmp 跳回 main,造成了死循环。
依据
ISO/IEC 9899:1999 7.20.4.3(2 3)-undefined
ISO/IEC 9899:2011 7.22.4.4(2 3)-undefined