UNREACH.GEN
无法访问的代码
UNREACH.GEN 检查器可以查找代码中无法访问的语句(所有不可执行的代码)。代码无法访问通常是逻辑错误造成的,一般是因为程序的生命周期发生变化或程序预期的运行时环境所致。
漏洞与风险
代码无法访问会导致意外的程序行为,这是因为编写的代码和设计预期不相符。死代码也会在代码维护或代码评审时引起混淆。在某些边界情况下,当死代码负责保护特定资源或代码分支时,出现无法访问的代码会导致代码漏洞。
对于修复标记有 UNREACH.GEN 实例的代码,很难给出建议,因为这种代码可能因错误而无法访问,也可能只是因为开发人员想尽可能安全地编写代码,从而添加了实际无法访问的额外代码。
漏洞代码示例 1
复制
extern void exit(int);
int stub();
int demo_return_or_exit(int t) {
if (t > 0) {
return t + 1;
} else {
exit(22);
}
stub();
return t + 3;
}
在该示例中,Klocwork 生成了关于无法访问的代码的报告,指出无法访问第 10 行对 stub() 函数的调用。前面 if/else 语句的所有路径都终止了该函数。如果无法访问的代码多余,可以将其安全移除。另外,如果前面的终止语句放错了位置,也可以将其移除或者将其放到条件语句中。
漏洞代码示例 2
复制
extern void exit(int);
int stub();
int demo_infeasible_if(int t) {
if (t > 0) {
if (t == 0) {
stub(); // <== unreachable
}
}
return t - 1;
}
在此情况下,Klocwork 报告无法访问的代码,表示无法访问第 7 行对 stub() 函数的调用,因为访问路径的条件不可行,即在大于 0 的路径上,t 永远不会等于 0。要修复此问题,可以移除多余的不可行检查和后面无法访问的代码。另外,也可以更改不正确的路径条件。
相关检查器
扩展
此检查器可进行扩展。有关详情,请参阅调整 C/C++ 分析。