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++ 分析。