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). Также см. «Уменьшение сложности программного обеспечения при помощи Polyspace Checkers».

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