Minimum Stack Usage

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

Описание

Об этой метрике сообщают в анализе Программы автоматического доказательства Кода только.

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

Метрика является суммой этих размеров в байтах:

  • Lower Estimate of Local Variable Size.

  • Максимальное значение от использований стека функциональных вызываемых. Расчет использует минимальное использование стека каждого вызываемого.

    Например, в этом примере, минимальном использовании стека func совпадает с минимальным использованием стека func1 или func2, какой бы ни больше.

    void func(void) {
        func1();
        func2();
    }

    Если вызовы функции находятся в различных ветвях условного оператора, эта метрика рассматривает ветвь с наименьшим количеством использования стека.

    Анализ делает оценку размера стека позже, когда это решило, какие вызовы функции на самом деле происходят. Например, если вызов функции происходит в недостижимом коде, размер стека не отвечает на звонок во внимание. Анализ может также учесть вызовы через указатели функции.

Ваше фактическое использование стека может отличаться от метрического значения.

  • Некоторые переменные хранятся в регистрах вместо на стеке.

  • Ваш компилятор выполняет переменный анализ живучести, чтобы включить определенную оптимизацию памяти. При оценке этой метрики Polyspace® не рассматривает эту оптимизацию.

  • Ваш компилятор использует дополнительную память во время вызова функции. Например, компиляторы хранят адрес, к которому выполнение возвращается после вызова функции. При оценке этой метрики Polyspace не рассматривает это скрытое использование памяти.

Однако метрика обеспечивает обоснованную оценку использования стека.

Чтобы определить размеры основных типов, программное обеспечение использует ваши технические требования для Target processor type (-target). Метрика учитывает #pragma pack директивы в вашем коде.

Примеры

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

double func2(int);

double func(int status) {
    double res = func2(status);
    return res;
}

double func2(int status) {
    double res;
    if(status == 0) {
      int temp;    
      res = 0.0;
    }
    else {
      double temp;
      res = 1.0;
    }
    return res;
}

В этом примере, принимая четыре байта для int и восемь байтов для double, максимальные использования стека:

  • func2: 28 байтов

    Это значение включает размеры своего параметра (4 байта), локальная переменная res (8 байтов), одна из этих двух локальных переменных temp (8 байтов), и возвращаемое значение (8 байтов).

    Метрика учитывает что первый temp более не не живо когда второй temp задан. Это использует переменную temp с типом данных double потому что его размер больше.

  • func: 48 байтов

    Это значение включает размеры своего параметра, локальная переменная res, и возвращаемое значение, в общей сложности 20 байтов. Это значение включает 28 байтов минимального использования стека его вызываемым, func2.

void func1(int);
void func2(void);


void func(int status) {
    func1(status);
    func2();
}

void func1(int status) {
    if(status == 0) {
      int val;
    }
    else {
      double val2;
    }
}

void func2(void) {
    double val;
}

В этом примере, принимая четыре байта для int и восемь байтов для double, максимальные использования стека:

  • func1: 12 байтов

    Это значение включает размеры своего параметра (4 байта) и одной из этих двух локальных переменных temp (8 байтов). Метрика учитывает что первый temp более не не живо когда второй temp задан.

  • func2: 8 байтов

  • func: 16 байтов

    Это значение включает размеры своего параметра (4 байта) и максимума использований стека func1 и func2 (12 байтов).

void func1(void);
void func2(void);


void func(int status) {
    if(status==0)
        func1();
    else
        func2();
}

void func1(void) {
    double val;
}

void func2(void) {
    int val;
}

В этом примере, принимая четыре байта для int и восемь байтов для double, максимальные использования стека:

  • func1: 8 байтов

  • func2: 4 байта

  • func: 8 байтов

    Это значение включает размеры своего параметра (4 байта) и минимального использования стека от двух ветвей (4 байта).

#include <stdarg.h>

void fun_vararg(int x, ...) {
  va_list ap;
  va_start(ap, x);
  int i;
  for (i=0; i<x; i++) {
    int j = va_arg(ap, int);
  }
  va_end(ap);
}


void call_fun_vararg1(void) {
  long long int l = 0;
  fun_vararg(3, 4, 5, 6, l);
}


void call_fun_vararg2(void) {
  fun_vararg(1,0);
}

В этой функции, fun_vararg функция с переменным количеством параметров. Минимальное использование стека fun_vararg учитывает вызов fun_vararg с минимальным количеством аргументов. Вызов с минимальным количеством аргументов является вызовом в call_fun_vararg2 с двумя аргументами (один для фиксированного параметра и один для переменного параметра). Минимальные использования стека:

  • fun_vararg: 20 байтов.

    Это значение учитывает:

    • Размер фиксированного параметра x (4 байта).

    • Размеры переменных параметров от вызова с минимальным количеством параметров. В том вызове существует только один аргумент переменной типа int (4 байта).

    • Размеры локальных переменных iJ и ap (12 байтов). Размер va_list переменная использует размер указателя, заданный в цели (в этом случае, 4 байта).

  • call_fun_vararg1: 44 байта.

    Это значение учитывает:

    • Использование размера стека fun_vararg с пятью аргументами (36 байтов, из которых 12 байтов для размеров локальной переменной и 20 байтов, для фиксированных и переменных параметров fun_vararg).

    • Размер локальной переменной l (8 байтов).

  • call_fun_vararg2: 20 байтов.

    Начиная с call_fun_vararg2 не имеет никаких локальных переменных, это значение совпадает с использованием размера стека fun_vararg с двумя аргументами (20 байтов).

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

Группа: Функция
Акроним: MIN_STACK
Метрика HIS: нет
Введенный в R2017b