选择安全的异常处理方式
1.14 ID_deprecatedErrno
避免使用 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