exponenta event banner

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

Расчетное число статических путей

Описание

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

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

Сведения о наложении ограничений на метрики см. в разделе Метрики сложности вычислительного кода.

Сведения о вычислениях

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

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

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

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

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

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

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

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

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

    • do-while: Каждый do-while оператор вводит новую ветвь, за исключением случаев, когда состояние while явно имеет значение false. Заявления, написанные как 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, Полипространство останавливает вычисление и показывает просто верхний предел. Фактическое значение может быть выше.

Примеры

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

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
ЕГО метрика: Да