You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SonarQube认知复杂度计算规则与示例函数复杂度核验

SonarQube sonarQuestion 函数认知复杂度核算结果

先明确官方计算规则

核算基于SonarQube正式版默认的认知复杂度规则,核心判定逻辑如下:

  • 基础分:每出现一个控制流结构(if/循环/catch/switch等)加1分,return、纯代码块、一元逻辑运算符(not/!)、括号分组不加分
  • 嵌套分:控制流结构每嵌套在另一层控制流内部,深度每加1层额外加1分,布尔表达式内的括号不算嵌套层级
  • 逻辑运算符分:控制流条件中每出现一个二元逻辑运算符(and/or),除了表达式里的第一个运算符不计分,其余每个运算符加1分(和运算符是and还是or无关)

逐段加分核算

bool sonarQuestion()
{
    // 第1个if:根层无嵌套
    if (not (1 and 0 and 1))  
    // 加分:基础分1 + 逻辑分1(2个and,第一个不计,加1)= 2分
    {
        return false;
    }

    // 第2个if:根层无嵌套
    if (1 and 1) 
    // 加分:基础分1 + 逻辑分0(1个and,第一个不计,加0)= 1分
    {
        // 第3个if:嵌套在1层if内,深度1
        if (not (1 and 2 and 3 and (1 or 0))) 
        // 加分:基础分1 + 嵌套分1 + 逻辑分3(4个运算符,第一个不计,加3)=5分
        {
            return false;
        }
    }

    // 第4个if:根层无嵌套
    if (2) 
    // 加分:基础分1 + 逻辑分0(无逻辑运算符)=1分
    {
        // 第5个if:嵌套在1层if内,深度1
        if (not (2 and 3 and 5)) 
        // 加分:基础分1 + 嵌套分1 + 逻辑分1(2个and,第一个不计,加1)=3分
        {
            return false;
        }
    }
    return true;
}

最终结果

所有分值累加总认知复杂度为 12分,并非你之前计算的16分。

原计算误差原因

你之前给每个布尔表达式里的所有逻辑运算符都全额计了分,没有扣除每个条件下第一个逻辑运算符的免计分额度,四个条件累计多算了4分,才得到16的错误结果。

未触发阈值告警的原因

SonarQube默认的函数认知复杂度告警阈值为15,该函数实际复杂度12低于阈值,因此不会触发告警,和你观察到的现象一致。

内容的提问来源于stack exchange,提问作者Karl D

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:51:23