Number of Paths

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

Описание

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

Рекомендуемый верхний предел для этой метрики составляет 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 оператор явно ложен. Операторы написаны как 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
ЕГО Метрика: Да