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 是递增的,并会更改函数的退出条件。