获得圈复杂度

Obtaining Cyclomatic Complexity

我正在研究使用 Rascal 计算 java 方法的圈复杂度。

一种方法是:

另一个是使用图论并使用公式 e-n+2。 使用 rascal 功能可以很容易地获得 e 和 n。我的问题是如何构建控制流图,我发现了以下模块: analysis::flow::ControlFlow 这似乎是朝着正确方向迈出的一步,但我完全不知道从那里去哪里。

最简单的方法确实是计算 AST 上的分叉节点。

在我们发布的 explained SLOC and CC do not have a strong correlation to each other (preprint) 中,我们还分享了计算 CC 的流氓代码(见图 2)。

这里是从文章中摘录的代码,首先创建文件的AST with m3,然后在文件中搜索所有methods/code块。根据你调用这个访问 AST 并对某些节点进行计数的无赖函数的方法。

int calcCC(Statement impl) {
    int result = 1;
    visit (impl) {
        case \if(_,_) : result += 1;
        case \if(_,_,_) : result += 1;
        case \case(_) : result += 1;
        case \do(_,_) : result += 1;
        case \while(_,_) : result += 1;
        case \for(_,_,_) : result += 1;
        case \for(_,_,_,_) : result += 1;
        case \foreach(_,_,_) : result += 1;
        case \catch(_,_): result += 1;
        case \conditional(_,_,_): result += 1;
        case \infix(_,"&&",_) : result += 1;
        case \infix(_,"||",_) : result += 1;
    }
    return result;
}

对于在 Rascal 中构建控制流图,有一篇论文解释了如何在纯 Rascal 中进行构建以及如何使用称为 DCFlow 的声明性语言提高抽象级别:http://link.springer.com/chapter/10.1007%2F978-3-319-11245-9_18