Number of call occurrences exceeds threshold

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

Описание

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

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

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