INFINITE_LOOP.LOCAL

使用局部变量的无限循环

INFINITE_LOOP 检查器可发现没有出口的循环实例。检查器可以跟踪控制循环退出的变量,并在条件不变时标记缺陷。如果条件的有效性不会在迭代间发生变化,则循环永远不会终止。INFINITE_LOOP.LOCAL 检查器可找到退出条件基于局部变量的无限循环。

漏洞与风险

无限循环会导致程序无限期挂断或崩溃,并可能会因过度使用 CPU 或内存资源而导致拒绝服务 (DoS) 攻击。

漏洞代码示例 1

复制
    void infinite_loop(int a)
      {
        int i=0;
        while (true) {
          if (i >= 10) {
            if (a == 11) { 
              break;
            }
          }
         i++;
       }
     }

Klocwork 将该情况标记为无限循环,除非 a 进入循环时等于 11,否则其永远达不到该值,因而循环将永远达不到有效退出条件。在这种情况下,INFINITE_LOOP.LOCAL 检查器找到了退出条件基于局部变量的典型无限循环。

修正代码示例 1

复制
    void infinite_loop(int a)
      {
        int i=0;
        while (true) {
          if (i >= 10) {
            if (a == 11) { 
              break;
            } else {
              a++;
            }
          }
         i++;
       }
     }

在该修正代码示例中,a 是递增的,因而函数会退出。

漏洞代码示例 2

复制
    void foo() {
      int i=get();
      int j=1;
      while(1) {
        if (i==1) {
          j++;
        } else {
          break;
        }
      }
    }

在该示例中,Klocwork 标记 INFINITE_LOOP 缺陷,因为 i 从不更改。因退出条件不变,因此函数不会退出。

修正代码示例 2

复制
    void foo() {
      int i=get();
      int j=1;
      while(1) {
        if (i==1) {
          i++;
        } else {
          break;
        }
      }
    }

在该修正代码示例中,变量 i 是递增的,并会更改函数的退出条件。