Количество путей

Предполагаемое статическое количество пути

Описание

Эта метрика измеряет количество путей в функции.

Рекомендуемый верхний предел для этой метрики равняется 80. Если количество путей высоко, код трудно считать и может вызвать больше оранжевых проверок. Попытайтесь ограничить значение этой метрики.

Чтобы осуществить пределы на метриках, смотрите, Вычисляют Метрики сложности кода.

Детали вычисления

Количество путей вычисляется согласно этим правилам:

  • Если операторы в функции не повреждают поток управления, количество путей является тем.

    Даже пустой оператор, такой как ; или пустой блок, такой как {} рассчитывает как один путь.

  • Количество путей для оператора управления вычисляется можно следующим образом:

    • если, elseif, еще: количество путей является суммой путей, вычисленных в блоке if, каждом блоке else if и заключительном блоке else. Когда заключительный блок else не использован, количество пути увеличено на 1.

      Например, оператор if(..) {} else if(..) {} else {} рассчитывает как три пути. Оператор if() {} рассчитывает как два пути, один для блока if и один для не использованного блока else.

    • switch-case: Каждый case с оператором break добавляет тот в количество пути. Оператор default рассчитывает как один путь, даже если это не использовано.

      Например, оператор switch (var) { case 1: .. break; case 2: .. break; default: .. } рассчитывает как три пути.

    • for, while и do-while: количество путей равно количеству путей в теле цикла + 1.

      Например, оператор while(0) {;} рассчитывает как два пути.

    • Тернарные операторы: оператор с тернарным оператором такой как

      result = a > b ? a : b;
      считается как один оператор, который не повреждает поток управления. Количество путей рассматривается как один.

  • Если больше чем один оператор управления присутствует в последовательности, количество путей является продуктом счета пути для каждого оператора управления.

    Например, если функция имеет три цикла for и два оператора if-else, количество путей является 2 × 2 × 2 × 2 × 2 = 32.

    Если много операторов управления присутствуют в функции, количество путей может быть большим. Вложенные операторы управления сокращают количество путей за счет увеличения глубины вложения. Для примера смотрите Функцию с Вложенными Операторами управления.

  • Программное обеспечение отображает определенные значения в случаях, где метрика не вычисляется:

    • Если операторы goto присутствуют в теле функции, Polyspace® не может вычислить количество путей. Программное обеспечение отображает метрическое значение-1.

    • Если количество путей достигает внутреннего предела, остановок вычисления. Программное обеспечение отображает этот предел как метрическое значение. Предел равняется 9223372036854775807 (указание на шестнадцатеричный номер 0x7fffffffffffffff).

Примеры

развернуть все

void func(int ch) {
    switch (ch)
    {
    case 1:
    case 2:
    case 3:
    case 4:
    default:
    }
}

В этом примере func имеет один путь.

void func(int ch) {
    switch (ch)
    {
    case 1:
        break;
    case 2:
        break;
    case 3:
        break;
    case 4:
        break;
    default:
    }
}

В этом примере func имеет пять путей. Кроме пути, который проходит case s и default, каждый break вызывает создание нового пути.

void func()
{
    int i = 0, j = 0, k = 0;
    for (i=0; i<10; i++)
    {
        for (j=0; j<10; j++)
        {
            for (k=0; k<10; k++)
            {
                if (i < 2 )
                    ;
                else
                {
                    if (i > 5)
                        ;
                    else
                        ;
                }
            }
        }
    }
}

В этом примере func имеет шесть путей. Номер вычисляется можно следующим образом:

  • Самый внутренний блок if-else рассчитывает как два пути.

  • Внешний блок if-else рассчитывает как три пути, один путь для блока if и предыдущие два пути для блока else.

  • Самый внутренний цикл for рассчитывает как четыре пути, один путь для цикла и предыдущие три пути для блоков if-else.

  • Следующие два внешних цикла добавляют один путь каждый.

Поэтому количество путей в func равняется шести.

Метрическая информация

Группа: Функция
Акроним: PATH
Метрика HIS: да

Смотрите также