Call tree complexity exceeds threshold

Сложность дерева вызова файла больше заданного порога

Описание

Сложность дерева вызова файла представляет сложность между разными уровнями ее дерева вызова функции. Polyspace® вычисляет сложность дерева вызова файла как:

Call tree Complexity = number of call occurrencesnumber of function definitions + 1(1)
Этот дефект повышен, когда расчетная сложность дерева вызова файла превышает заданный порог сложности дерева вызова файла. Для получения дополнительной информации о том, как Polyspace вычисляет сложность дерева вызова, смотрите Estimated Function Coupling

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

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

Риск

Нарушение этого средства проверки может указать что:

  • Взаимозависимость функций в файле неприемлемо высока.

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

  • Многократное использование одной функции файла может затруднить из-за взаимозависимостей с другими функциями.

Эти факторы делают файл трудным обеспечить, протестировать, и отладить.

Исправление

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

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

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

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

Примеры

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

//Noncompliant
 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){
	 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 много раз называется в функциональном AppIndex. Высокая взаимозависимость между этими двумя функциями приводит к сложности дерева вызова 12, который больше порога 10. Это высокое значение подразумевает что изменения в power может потребовать перезаписи или пересмотра AppIndex. Polyspace отмечает файл как несовместимый.

Коррекция — функции проекта, чтобы выполнить одну определенную задачу

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

//Compliant
 long long power(double x, int n){ 
	 long long BN = 1;
	 for(int i = 0; i<n;++i){
		 BN*=x;
	 }
	 return BN;
 }
 double CalculateU(double m){
	 return (power(m,2) - 1)/(power(m,2)+2);
 }
 double CalculateV(double m){//Compliant
	 return (power(m,4) + 27*power(m,2)+38)/(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)*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++
Акроним: SC03
Порог по умолчанию: 20
Введенный в R2021a