exponenta event banner

Глубина вложенности вызовов превышает пороговое значение

Глубина вложенности управляющих структур в функции больше заданного порога глубины вложенности функции

Описание

Этот дефект поднимается, когда глубина вложения управляющих структур в функцию, такую как for, if-else, switch, или while, превышает заданный порог глубины вложения. Дополнительные сведения о том, как Polyspace ® вычисляет глубину вложения, см. в разделеNumber of Call Levels.

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

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

Риск

Нарушение этой проверки может указывать на то, что:

  • Эту функцию трудно прочитать и понять.

  • Функция выполняет слишком много задач одновременно.

  • Функция содержит непредвиденную или незапланированную разработку.

Эти факторы затрудняют обслуживание и отладку модуля.

Зафиксировать

Чтобы исправить эту проверку, выполните рефакторинг кода или измените порог проверки. При рефакторинге кода:

  • Создайте функцию для выполнения одной задачи.

  • Делегировать несвязанные задачи другим функциям.

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

Примеры

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

int foo(int i, int j, int k) //Noncompliant
{
	int m=0;
	for (i=0; i<10; i++)
	{
		for (j=0; j<10; j++)
		{
			for (k=0; k<10; k++)
			{
				if (i < 2 && j>5 && k<7 )
				m += 1;
				else
				{
					if (i > 5 && j<8 && k >8){
						m +=-1 ;	
					}
					
					else{
						m += 2;	
					}
				}
			}
		}
	}
	return m;
}

В этом примере глубина вложенности вызовов составляет 5, что превышает пороговое значение по умолчанию, равное 4. Функция выполняет итерацию над тремя целыми числами и изменяет целое число m условно. Высокая глубина вложенности затрудняет чтение и понимание функции.

Коррекция - рефакторирование функции

Одной из возможных корректировок является делегирование различных задач различным функциям. Например, делегировать условные действия в foo к другой функции bar.

int bar(int i, int j, int k){//Compliant
int m = 0;
	if (i < 2 && j>5 && k<7 ){
		m = 1;	
	}
	else
	{
		if (i > 5 && j<8 && k >8){
			m =-1 ;	
		}
		
		else{
			m = 2;	
		}
	}
return m;
}

int foo(int i, int j, int k) //Compliant
{
	int m=0;
	for (i=0; i<10; i++)
	{
		for (j=0; j<10; j++)
		{
			for (k=0; k<10; k++)
			{
				m += bar(i,j,k);	
			}
		}
	}
	return m;
}

Проверить информацию

Группа: Сложность программного обеспечения
Язык: C | C++
Акроним: SC14
Порог по умолчанию: 4
Представлен в R2021a