exponenta event banner

Number of paths exceeds threshold

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

Описание

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

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

Когда вы импортируете комментарии из предыдущих исследований при помощи polyspace-comments-import, Polyspace копирует любую информацию об анализе о метрике кода 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