【问题标题】:Cyclomatic complexity when if conditions are combined组合条件时的圈复杂度
【发布时间】:2018-11-29 18:59:21
【问题描述】:

我想计算以下代码的圈复杂度。

    int test(int a, int b)
    {
          int result = 0;
          if (a == 0 && b == 0)
              result = -1;
          else
              result = a * b;

          return result;
    }

Mathwork 的 Polyspace 工具计算的值为 2。 Eclipse 的 Visual Studio 和 Metrics 插件显示 3。哪个是正确的?

【问题讨论】:

  • 答案是 2,像这样的例子可以在 wikipedia 中看到:“如果代码有一个单条件 IF 语句,那么将有两条路径通过代码:一个在IF 语句的计算结果为 TRUE,另一个计算结果为 FALSE,因此复杂度为 2"
  • 我想知道如果不是填充变量result,而是输入return -1return a*b,eclipse 和Visual Studio 会报告什么
  • @AnderBiguri 当我使用return -1return a*b 时,VS 和 Eclipse 都显示相同的值“3”。但是,如果我将第 4 行更改为 if (a == 0),它们会显示“2”。
  • 任何解释为什么 Visual Studio 和 Eclipse 报告“3”?

标签: java c# c visual-studio static-code-analysis


【解决方案1】:

圈复杂度 是一种软件度量,它提供了对 程序的逻辑复杂度。在基础路径测试的上下文中使用时 方法,计算的圈复杂度值定义了inde-的数量 程序基集中的悬垂路径,并为我们提供了一个上限 必须进行的测试次数,以确保所有语句都已 至少执行一次。

一个 独立路径 是通过程序的任何路径,它至少引入了一个 一组新的处理语句或一个新的条件。

您的代码中只有两条独立的路径,一条通过 if 分支,一条通过 else 分支。

【讨论】:

    【解决方案2】:

    您有 3 条路径通过程序,因为“&&”是一个捷径条件。 3 条路径/测试是:

        a=1 and b=7 (actually anything)  which short cuts and returns a*b or 7
        a=0 and b=7  which goes to else and returns a*b or 0
        a=0 and b=0  which goes to then and returns -1'
    

    b 在第一个条件下没有被评估的事实可能很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 2013-09-03
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      相关资源
      最近更新 更多