exponenta event banner

Число вызовов превышает пороговое значение

Число вызовов функции в функции превышает определенный порог появления вызова функции

Описание

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

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

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

Риск

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

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

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

  • Изменения в некоторых других функциях могут оказать неожиданное влияние на помеченную функцию.

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

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

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

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

  • Функции имеют минимальные побочные эффекты на другие функции.

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

Примеры

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

 long long power(double x, int n){
	 long long BN = 1;
	 for(int i = 0; i<n;++i){
		 BN*=x;
	 }
	 return BN;
 }
long long factorial(int n){
	 long long BN = 1;
	 for(int i = 1; i<=n;++i){
		 BN*=i;
	 }
	 return BN;
 }
 
 double AppxIndex(double m, double f){//Noncompliant
	 double U = (power(m,2) - 1)/(power(m,2)*factorial(2));
	 double V = (power(m,4) + 27*power(m,2)+38)/factorial(3)*(2*power(m,2)+3);
	 return (1+2*f*power(U,2)*(1+power(m,2)*factorial(static_cast<int>(U/V))
       + power(m,3)/power(m,3)*(U-V)))/( (1-2*f*power(U,2)*(1+power(m,2)*
        factorial(static_cast<int>(U/V)) + power(m,3)/power(m,3)*(U-V)))); }

Функция AppxIndex содержит 17 различных вызовов функции, что превышает указанный порог появления вызова, равный 10. Такой высокий уровень вызова указывает на то, что эта функция выполняет слишком много задач. Это также указывает на то, что функция имеет высокую взаимозависимость с другими функциями. Эти факторы составляют AppIndex трудно поддерживать, тестировать или отлаживать.

Исправление - код рефактора

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

  long long power(double x, int n){//Compliant
	long long BN = 1;
	for(int i = 0; i<n;++i){
		BN*=x;
	}
	return BN;
}
long long factorial(int n){//Compliant
	long long BN = 1;
	for(int i = 1; i<=n;++i){
		BN*=i;
	}
	return BN;
}

double CalculateU(double m){//Compliant
	return (power(m,2) - 1)/(power(m,2)*factorial(2));
}

double CalculateV(double m){//Compliant
	return (power(m,4) + 27*power(m,2)+38)/factorial(3)*(2*power(m,2)+3);
}

double CalculateMid(double m, double f){//Compliant
	double U = CalculateU(m);
	double V = CalculateU(m); 
	return (2*f*power(U,2)*(1+power(m,2)*factorial(static_cast<int>(U/V))
             + power(m,3)/power(m,3)*(U-V)));
}

double AppxIndex(double m, double f){//Compliant
	
	return (1+CalculateMid(m,f))/( (1-CalculateMid(m,f)));
}

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

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