exponenta event banner

Depth of call nesting exceeds threshold

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

Описание

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

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

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