exponenta event banner

Область языка превышает пороговое значение

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

Описание

Область языка представляет затраты на обслуживание или обновление функции. Например, если операнд встречается много раз в функции, то изменение имени операнда является дорогостоящим. Языковой охват такой функции будет высоким. Этот дефект возникает, когда языковая область функции превышает определенный порог. Дополнительные сведения о том, как Polyspace вычисляет область языка, см. в разделе Language Scope.

Примечание

Область языка, вычисленная Polyspace ®, представляет собой число с плавающей запятой. В этой проверке область языка с плавающей запятой преобразуется в целое число, округляя его до второго десятичного знака, а затем умножая на 100.

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

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

Риск

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

  • Изменение операнда может потребовать многих изменений функции.

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

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

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

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

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

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

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

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

Примеры

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

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

В этом примере В этой функции операнд power многократно повторяется. Любое изменение power требует тщательного изучения функции, чтобы убедиться, что неожиданное поведение не введено. Языковой объем функции AppxIndex is700, что выше диапазона языка по умолчанию 400. Polyspace помечает функцию как несоответствующую

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

Одной из возможных корректировок является рефакторирование кода так, чтобы операнды не повторялись много раз. В этом примере функция AppxIndex рефакторизируется таким образом, что несвязанные задачи выполняются независимыми функциями. Эти функции совместимы.

// This code calculates effective index of materials  as decribed in
// the formula in 10.1364...
// power(x,n) returns the nth power of x (x^n)
// n is an integer
// x is a double
// return type is long long
long long power(double x, int n){//Compliant
	long long BN = 1;
	for(int i = 0; i<n;++i){
		BN*=x;
	}
	return BN;
}
// CalculateU(m) calculates the first intermediate variable
// required to calculate  polarization
// m is the relative refractive index
// return type is double;
double CalculateU(double m){//Compliant
	return (power(m,2) - 1)/(power(m,2)+2);
}
// CalculateV(m) calculates the second intermediate variable
// required to calculate  polarization
// m is the relative refractive index
// return type is double;
double CalculateV(double m){//Compliant
	return (power(m,4) + 27*power(m,2)+38)/(2*power(m,2)+3);
}
// CalculateMid(m,f) calculates the large term present in both numerator and denominator
// of the effective index calculation
// m is the relative refractive index
// f is the fillfactor 
// return type is double;
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)*U*V + power(m,3)/power(m,3)*(U-V));
}
//AppxIndex(m,f) calculates the approximate effective index
// m is the relative refractive index
// f is the fillfactor
//return type is double
double AppxIndex(double m, double f){//Compliant
	return (1+CalculateMid(m,f))/( (1-CalculateMid(m,f)));
}

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

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