exponenta event banner

Количество вызывающих функций

Количество отдельных вызывающих абонентов функции

Описание

Эта метрика измеряет количество отдельных вызывающих абонентов функции.

В C++ Polyspace ® не вычисляет эту метрику для виртуальных функций и созданных компилятором неявных функций, таких как конструкторы по умолчанию и деструкторы. Метрика вычисляется для определяемых пользователем конструкторов и деструкторов. В иерархии классов, если базовый класс имеет определяемые пользователем конструкторы, Polyspace подсчитывает эту метрику для соответствующих конструкторов производных классов.

Рекомендуемый верхний предел для этой метрики равен 5. Для получения дополнительного автономного кода попробуйте установить верхний предел для этой метрики.

Для применения ограничений на метрики:

Сведения о вычислениях

Обратите внимание, что метрика:

  • Учитывает только непосредственных вызывающих абонентов.

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

  • Учитывает все вызовы функций, включая вызовы в недостижимом коде.

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

Примеры

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

#include <stdio.h>


    int getVal() {
    int myVal;
    printf("Enter a value:");
    scanf("%d", &myVal);
    return myVal;
}

int func() {
    int val=getVal();
    if(val<0)
        return 0;
    else
        return val;
}

int func2() {
    int val=getVal();
    while(val<0)
        val=getVal();
    return val;
}

В этом примере количество вызывающих функций для getVal равно 2. Функции вызова: func и func2.

#include <stdio.h>




    int fibonacci(int num)
{
   if ( num == 0 )
      return 0;
   else if ( num == 1 )
      return 1;
   else
      return ( fibonacci(num-1) + fibonacci(num-2) );
}

void main() {
 int count;
 printf("How many numbers ?");
 scanf("%d",&count);
 fibonacci(count);
}

В этом примере количество вызывающих функций для fibonacci равно 2. Функции вызова: main и fibonacci сам.

                #include<iostream>
class A{
    public:
    
	A(){
		std::cout<<"Create A\n";
	}
	~A() = default;
	A(const A&)=default;
	A(A&&) = default;
	virtual void bar(){ std::cout<<"A";}
};
class B: public A{
    public:
	B() = default;
	 void bar() override {std::cout<<"B";}
};

void func(A& a){
	a.bar();
}
int main(){
	A obj;
	A obj2 = obj;
	B objB;
	func(obj);
	return 0;
}

В этом примере:

  • Количество вызывающих функций для A::A это два. A::A вызывается один раз для создания obj и снова для создания objB. Аналогично, количество вызывающих функций для B:: это один.

  • Потому что оба A::bar и B::bar являются виртуальными функциями, Polyspace не вычисляет их количество вызывающих функций.

  • Количество вызывающих функций для func это один.

Метрическая информация

Группа: Функция
Акроним: CALLING
ЕГО метрика: Да