Number of Paths

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

Описание

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

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

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

Детали расчета

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

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

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

  • Оператор управления вводит ветви и добавляет к исходному одному пути.

    • if-else if-else: Каждый if ключевое слово вводит новую ветвь. Вклад от if-else if-else блок является количеством ветвей плюс одна (исходный путь). Если всеобъемлющий else присутствует, все пути проходят блок; в противном случае один путь обходит блок.

      Например, функция с if(..) {} else if(..) {} else {} оператор имеет три пути. Функция с одним if() {} только имеет два пути, тот, который проходит if блокируйтесь и тот, который обходит блок.

    • switch-case: Каждый case метка вводит новую ветвь. Вклад от switch блок является количеством case метки плюс одна (исходный путь). Если всеобъемлющий default присутствует, все пути проходят блок; в противном случае один путь обходит блок.

      Например, функция с оператором switch (var) { case 1: .. break; case 2: .. break; default: .. } имеет три пути, все проходящие switch блок. Если вы не используете default, функция все еще имеет три пути, два прохождения через switch блокируйтесь и один обход блока.

    • for и while: Каждая инструкция циклов вводит новую ветвь. Вклад от цикла равняется двум - путь, который проходит цикл и путь, который обходит цикл.

    • do-while: Каждый do-while оператор вводит новую ветвь кроме тех случаев, когда условие while оператор является явным образом ложным. Операторы, записанные как do{/*..*/}while(0) не функционируйте как циклы. Такие операторы часто используются для включения нескольких линий макросов в фигурных скобках. Например, этот do-while оператор служит, чтобы инкапсулировать многострочный макрос, а не создать новый путь:

      #define myfunc(x) do{ ...\\
                            ...\\
                            ...}while(0);
      Polyspace® полагает, что такие операторы один путь.

    Обратите внимание на то, что оператор с тернарным оператором такой как

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

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

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

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

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

    • Если goto операторы присутствуют в теле функции, Polyspace не может вычислить количество путей и показывает количество путей как Not Computed вместо этого.

    • Если количество путей достигает верхнего предела 1,000,000,000, Polyspace останавливает вычисление и отображает только верхний предел. Фактическое значение может быть выше.

Примеры

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

int func(int ch) {
    return (ch * 2);
}

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

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

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

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 имеет шесть путей: три от for операторы, два от if операторы плюс исходный путь, который обходит все операторы управления.

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

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

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