exponenta event banner

Сложность дерева вызовов превышает пороговое значение

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

Описание

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

Сложность дерева вызовов = количество вхождений вызова - количество определений функций + 1(1)
Этот дефект возникает, когда вычисленная сложность дерева вызовов файла превышает определенный порог сложности дерева вызовов файла. Дополнительные сведения о том, как Polyspace вычисляет сложность дерева вызовов, см. в разделе Estimated Function Coupling

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

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