exponenta event banner

Цикломатическая сложность превышает пороговое значение

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

Описание

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

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

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