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). Также см. «Уменьшение сложности программного обеспечения при помощи Polyspace Checkers».

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