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

选择安全的异常处理方式

1.14 ID_deprecatedErrno
目录 › next › previous

避免使用 errno 和与其相同的模式,应根据实际需求选择通过函数返回值或 C++ 异常机制来处理异常情况。

errno 被设定的位置和被读取的位置相距较远,不遵循固定的静态结构,极易误用,是不安全的异常处理方式,对异常情况的错误处理往往会成为业务漏洞,使攻击者轻易地实现其目的。

示例:

void foo() {
    if (somecall() == FAILED) {
        printf("somecall failed\n");
        if (errno == SOME_VALUE) {     // Non-compliant
            ....
        }
    }
}

例中 somecall 执行异常,通过 errno 获取异常信息,但 errno 的值会被 printf 修改,相应的异常处理也失去了意义。

又如:

void bar(const char* s) {
    int i = atoi(s);
    if (errno) {        // Non-compliant
        ....
    }
}

errno 并不能反映所有异常情况,atoi 等函数与 errno 无关,例中 errno 的值来自函数外部难以预料的位置,相应的异常处理也将是错误的。

参考

C++ Core Guidelines E.28 MISRA C 2004 20.5 MISRA C++ 2008 19-3-1
Copyright©2024 360 Security Technology Inc., Licensed under the Apache-2.0 license.