Cyclomatic complexity exceeds threshold

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

Описание

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

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

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