NUM.OVERFLOW.DF.UNBOUNDED
由不受约束的值引起的潜在数值溢出或回绕
NUM.OVERFLOW.DF.UNBOUNDED 检查器会检测算术运算中可能出现的数值溢出或环绕情况,其中被突破的边界仅通过无约束(不受信任)的值达到,例如回退到其类型完整范围的无约束函数参数。
此检查器使用与 NUM.OVERFLOW.DF 相同的底层溢出分析。这两个检查器报告了互不相交的缺陷集合:
-
NUM.OVERFLOW.DF 报告针对受信任边界的溢出,例如当具体的常量值导致越界时。
-
NUM.OVERFLOW.DF.UNBOUNDED 报告了这样一类溢出:导致溢出的那一侧仅由不受信任的值(例如未受约束的参数,或具有全类型范围回退特性的值)触发。
将这些情况分开后,您可以独立于由具体值产生的溢出,对来自不受信任来源的溢出进行分类或抑制。
漏洞与风险
数值溢出状况可能产生导致未定义行为的结果。此外,溢出会损害程序的可靠性和安全性。
漏洞代码示例
复制
unsigned char checkOverflowUnbounded(unsigned char c)
{
unsigned char r;
r = (unsigned char)(c + 1);
return r;
}
在此示例中,Klocwork 在第 4 行报告了 NUM.OVERFLOW.DF.UNBOUNDED 缺陷。由于 c 是一个无约束参数,其值可涵盖 unsigned char 类型的整个取值范围 [0, 255]。因此,表达式 c + 1 的结果可能达到 256,从而超出 unsigned char 的上限。由于这种越界情况仅发生在不受信任的一侧,因此该缺陷被报告为 NUM.OVERFLOW.DF.UNBOUNDED,而非 NUM.OVERFLOW.DF。
修正代码示例
复制
unsigned char checkOverflowUnbounded(unsigned char c)
{
unsigned char r;
if (c < 255U) {
r = (unsigned char)(c + 1);
} else {
r = c;
}
return r;
}
该合规方案对加法运算进行了保护,确保结果不会超出 unsigned char 的取值范围。
相关检查器
- NUM.OVERFLOW
- NUM.OVERFLOW.DF
-
MISRA.COMP.WRAPAROUND
扩展
此检查器无法扩展。