避免除 0 等计算异常
1.13 ID_divideByZero
除 0 等在数学上没有定义的运算、浮点异常、非法指令、段错误等问题称为“计算异常”,意味着严重的底层运行时错误,而且这种异常无法用语言层面的常规方法捕获。
示例:
int foo(int n) {
if (n) {
return 100 / n; // Compliant
}
return 200 / n; // Non-compliant, undefined behavior
}
整数除 0 往往会使程序崩溃,浮点数除 0 可以产生“Inf”或“NaN”等无效结果,在某些环境中也可以设置浮点异常使程序收到特定信号。
崩溃会使程序异常终止,无法或难以执行必要的善后工作。如果崩溃可由外部输入引起,会被攻击者利用从而迫使程序无法正常工作,具有高可靠性要求的服务类程序更应该注意这一点,可参见“拒绝服务攻击”。对于客户端程序,也要防止攻击者对崩溃产生的“core dump”进行恶意调试,避免泄露敏感数据,总之程序的健壮性与安全性是紧密相关的。
相关
依据
ISO/IEC 9899:1999 6.5.5(5)-undefined
ISO/IEC 9899:2011 6.5.5(5)-undefined
ISO/IEC 14882:2003 5.6(4)-undefined
ISO/IEC 14882:2011 5.6(4)-undefined
ISO/IEC 14882:2017 8.6(4)-undefined