INFINITE_LOOP.GLOBAL

使用全局变量的无限循环

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

INFINITE_LOOP.GLOBAL 检查器可发现退出条件基于在本地循环中不会发生变化的全局变量的无限循环。INFINITE_LOOP.GLOBAL 检查器的典型用法是将这类无限循环的检查与退出条件基于局部变量的无限循环的检查分离。当使用 INFINITE_LOOP.LOCAL 检查重要的无限循环时,关闭 INFINITE_LOOP.GLOBAL 检查器将有帮助。

漏洞与风险

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

漏洞代码示例

复制
    int global_var = 1;
    void infinite_loop() {
       while (1) {
          if (global_var==0)
            return;
       }
    
} 

Klocwork 标记了该无限循环示例,因为变量 global 永远不会等于 0,并且该函数永远不会退出。在这种情况下,退出基于变量 global_var,其被定义为函数 infinite_loop 之外的全局变量,并且在循环中永远不会发生变化。该示例说明的是在搜索无限循环时一般不想标记的情况,INFINITE_LOOP.GLOBAL 允许您将其与要标记的代码缺陷类型分离。