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

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

Описание

Сложность дерева вызовов файла представляет сложность между различными уровнями его дерева вызовов функций. 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