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
相关产品推荐
相关产品推荐

