Cyclomatic complexity exceeds threshold

Цикломатическая сложность функции больше заданного цикломатического порога сложности функции

Описание

Polyspace® вычисляет цикломатическую сложность функции путем добавления одной в количество моментов принятия решения. Момент принятия решения является оператором, который заставляет вашу программу переходить в два пути. Этот дефект повышен, когда цикломатическая сложность функции больше заданного цикломатического порога сложности. Для получения дополнительной информации о том, как Polyspace вычисляет цикломатическую сложность, смотрите Cyclomatic Complexity.

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

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

Риск

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

Фиксация

Зафиксировать эту проверку:

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

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

  • Измените XML-файл выбора средства проверки, чтобы повысить цикломатический порог сложности.

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

Примеры

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

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 имеет слишком много моментов принятия решения, приводящих к цикломатической сложности 11, который больше порога по умолчанию 10. Поскольку функция имеет много моментов принятия решения, тестирование функции затрудняет, и тестирование может не покрыть все пути к выполнению. 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++
Акроним: SC17
Порог по умолчанию: 10
Введенный в R2021a