Number of paths exceeds threshold

Количество статических путей в функции больше заданного порога

Описание

Этот дефект возникает на функции, когда количество статических путей в функции больше заданного порога проверки. Для получения дополнительной информации о том, как Polyspace вычисляет количество статических путей в функции, см. Number of Paths

Polyspace® использует порог по умолчанию 80, если вы не задаете порог. Чтобы задать файл выбора, в котором можно задать порог, используйте Set checkers by file (-checkers-selection-file). Также см. «Уменьшение сложности программного обеспечения при помощи Polyspace Checkers».

Когда вы импортируете комментарии из предыдущих анализов при помощи polyspace-comments-importPolyspace копирует любую рецензирующую информацию о метрике кода Number of Paths в предыдущем результате этой проверки в текущем результате. Если текущий результат содержит ту же метрику кода, информация проверки также копируется в метрику кода.

Риск

Нарушение этой проверки может указать, что функция имеет слишком много возможных путей выполнения. Когда путей выполнения слишком много, может быть трудно проверить все пути исчерпывающе. Такие функции трудно отлаживать, тестировать и поддерживать.

Зафиксировать

Чтобы исправить эту проверку, либо измените код, либо измените порог проверки. При рефакторизации кода:

  • Избегайте вложенных структур управления.

  • Разделите сложную функцию на несколько функций, которые проще и легко протестировать.

Лучшая практика состоит в том, чтобы проверить сложность модуля на ранних стадиях разработки, чтобы избежать дорогостоящего рефакторинга после разработки.

Примеры

расширить все

int afunc (int x);
int foo(int x,int y) //Noncompliant
{
	int flag;
	if (x <= 0){
		if (x > 10 ) { return 0; }
	}
	if (x<-240) {
		if (x < -2565) { 
			return (x < -253 ? 0: afunc (x <22566 ? 1: afunc(x < -25103 ? 0: 6))); 
		}
	}
	for (int i = 0; i< 10; i++)
	{
		while (x < y ) flag = 1;
		do {++x;} while (i<7);
		flag = 0;
	}
	return flag;
}

В этом примере функция foo имеет много точек операторов ветвления, в результате чего число путей 45, что больше заданного порога 40. Поскольку функция имеет много путей выполнения, тестирование функции затруднено, и проверка может не охватить все пути выполнения. Polyspace помечает функцию как несовместимую.

Коррекция - Рефактор вашего кода

Одной из возможных коррекций является разделение функции на две функции.

int afunc (int x);
int foo2(int x,int y)//Compliant 
{
	
	if (x <= 0){
		if (x > 10 ) { return 0; }
	}
	if (x<-240) {
		if (x < -2565) { 
			return (x < -253 ? 0: afunc (x <22566 ? 1: afunc(x < -25103 ? 0: 6))); 
		}
	}
}

int bar(int x,int y){//Complaint
	int flag;
	for (int i = 0; i< 10; i++)
	{
		while (x < y ) flag = 1;
		do {++x;} while (i<7);
		flag = 0;
	}
	return flag;
}

Функции foo2 и bar иметь допустимое количество путей и легче протестировать по сравнению с foo.

Проверяйте информацию

Группа: Комплексность программного обеспечения
Язык: C | C++
Акроним: SC15
Порог по умолчанию: 80
Введенный в R2021a