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 的取值范围。

相关检查器

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。

扩展

此检查器无法扩展。