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