主要内容

圈复杂度

函数体中线性无关路径的数量

描述

此度量计算函数中的决策点数量,并在总数上加 1。决策点是使程序分支到两条路径的语句。

此度量的建议上限为 10。如果圈复杂度太高,则代码将难以阅读并且可能会导致更多橙色检查。因此,请尝试限制此度量的值。

要对度量强制应用某些限制,请参阅使用 Polyspace 计算代码复杂度度量

计算详细信息

此度量计算使用以下规则来标识决策点:

  • 一个 if 语句是一个决策点。

  • forwhile 语句视为一个决策点,即使没有条件评估(例如在无限循环中)也是如此。

  • 布尔合并 (&&, ||) 不被视为决策点。

  • case 语句不被视为决策点,除非后跟 break 语句。例如,以下代码的圈复杂度为 3:

    switch(num) {
    		case 0:
    		case 1:
    		    break;
    		case 2:
    		    break;
    		case 3:
    		case 4:
    	}
    	

    如果您指定 -consider-switch-as-single-decision 选项,Polyspace® 会将整个 switch-case 语句视为一个决策点,因此前面代码的圈复杂度将变为 2。

  • 在以下预处理后进行计算:

    • 展开宏。

    • 应用条件编译。将忽略预处理指令隐藏的块。

示例

全部展开

int foo(int x,int y)
{
    int flag;
    if (x <= 0)
        /* Decision point 1*/
        flag = 1;
    else
    {
        if (x < y )
            /* Decision point 2*/
            flag = 1;
        else if (x==y)
            /* Decision point 3*/
            flag = 0;
        else
            flag = -1;
    }
    return flag;
}

在此示例中,foo 的圈复杂度为 4。

int foo (int x, int y) {
    if((x <0) ||(y < 0))
        /* Decision point 1*/
        return 0;
    else
        return (x > y ? x: y);
        /* Decision point 2*/
}

在此示例中,foo 的圈复杂度为 3。? 运算符是第二个决策点。

#include <stdio.h>


int foo(int x,int y, int ch)
{
    int val = 0;
    switch(ch) {
    case 1:
        /* Decision point 1*/
        val = x + y;
        break;
    case 2:
        /* Decision point 2*/
        val = x - y;
        break;
    default:
        printf("Invalid choice.");
    }
    return val;
}

在此示例中,foo 的圈复杂度为 3。

int foo(int x,int y, int bound)
{
    int count = 0;
    if (x <= y)
        /* Decision point 1*/
        count = 1;
    else
        while(x>y) {
            /* Decision point 2*/
            x--;
            if(count< bound) {
                /* Decision point 3*/
                count++;
            }
        }
    return count;
}

在此示例中,foo 的圈复杂度为 4。

在此示例中,函数 factorial() 使用 switch-case 语句选择返回值。

int factorial(int in) {
	int val = -1;
	switch(in) {
		case 1:
			val = 1;
			break;
		case 2:
			val = 2;
			break;
		case 3:
			val = 6;
			break;
		default:
			break;
	}
	return val;
}
默认情况下,Polyspace 报告的圈复杂度值为 4。当您指定 -consider-switch-as-single-decision 选项时,Polyspace 会将整个 switch-case 语句视为一个决策点,因此圈复杂度为 2。

度量信息

:函数
缩写VG
HIS 度量:是