Language scope exceeds threshold

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

Описание

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

Примечание

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

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

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

// 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