☰
  • 首页
  • 规则分类
  • 项目介绍
search
•••

由 atexit、at_quick_exit 指定的处理函数应正常返回

8.36 ID_exitHandlerNoReturn
目录 › next › previous

如果 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

参考

SEI CERT ENV32-C
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.