exponenta event banner

Число путей превышает пороговое значение

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

Описание

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

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

При импорте комментариев из предыдущих анализов с помощью 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