Анализ Polyspace ® Code Prover™ позволяет оценить использование стека каждой функции в программе и рассчитать использование всего стека программы. Анализ использует иерархию вызовов функций программы для оценки использования стека. Использование стека функции - это сумма размеров локальных переменных в функции плюс максимальное использование стека вызываемыми функциями. Использование стека функции в верхней части иерархии вызовов является использованием стека программы.
Например, для этой иерархии вызовов использование стека func - размер локальных переменных в func плюс максимальное использование стека от func1 и func2(если только они не вызываются во взаимоисключающих ветвях условного оператора).

Для получения более подробной информации см.:
Метрики функций: Maximum Stack Usage и Minimum Stack Usage
Метрики проекта: Program Maximum Stack Usage и Program Minimum Stack Usage
Если использование стека превышает доступное пространство стека, можно определить, какая функция несет ответственность. Начать в main и перейдите к дереву вызовов программы. Во время навигации найдите функцию, которая имеет необоснованный размер локальных переменных. Если вы не можете идентифицировать такую функцию, ищите неоправданно длинную последовательность вызова. Подробные шаги для навигации:
На панели «Источник» выберите main функция. На панели «Иерархия вызовов» отображаются функции, вызываемые из main (вызываемые абоненты). Чтобы просмотреть полную иерархию, щелкните правой кнопкой мыши функцию и разверните все узлы.
Если панель «Иерархия вызовов» не открыта по умолчанию, выберите «Окно» > «Показать/скрыть представление» > «Иерархия вызовов».

Для перехода к определению вызываемого абонента в источнике на панели «Иерархия вызовов» дважды щелкните по имени вызываемого абонента. Затем щелкните имя вызываемого абонента на панели «Источник». Панель «Сведения о результате» показывает более высокую оценку размера локальной переменной и использования стека вызываемым абонентом.

Для вычисления использования стека функций анализ должен быть способен достичь конца функции. Следующее может предотвратить вычисление использования стека функций:
Красные чеки.
Если определенная ошибка времени выполнения возникает в функции или одном из вызывающих ее элементов, анализ не вычисляет использование стека. Причина в том, что код после проверки красным не анализируется. Если код без анализа содержит вызовы функции, любая оценка использования стека для функции вызывающего абонента является неточной.
В этом примере использование стека func не вычисляется, так как после красного переполнения оставшаяся часть функции не анализируется. Если использование стека было вычислено, вызов функции в неотредактированном коде, например, вызов func2, не будет частью вычислений.
#include <limits.h>
void func(void) {
int val=INT_MAX;
val++;
func2();
}Рекурсивные функции.
Если функция вызывает себя прямо или косвенно, ее использование стека и использование стека всех функций, которые вызывают эту функцию, не вычисляются.
Если программа содержит рекурсивные функции, минимальное использование стека программы может быть вычислено, даже если максимальное использование стека не является. В этом случае вычисление минимального использования стека программы использует путь выполнения, который обходит вызов рекурсивной функции, и может не быть точным представлением использования стека.
Если использование стека программ не вычислено, убедитесь, что использование стека всех функций вычислено. В столбце Информация (Information) на панели Список результатов (Results List) проверьте, показывает ли результат использования стека функций значение Not computed.
Если функция вызвана, но не определена в коде, предоставленном Polyspace, определение использования стека не учитывает вызов функции.
Это предположение относится к:
Неявные конструкторы C++.
Например, в этом примере func вызывает конструктор класса myClass когда myObj определяется. Определение использования стека не рассматривает конструктор как вызываемый func.
class myClass {std::string str;};
void func() {
myClass myObj;
}Стандартные библиотечные функции или другие функции, определения которых отсутствуют в коде в проекте Polyspace.
Например, в этом примере func вызывает функцию стандартной библиотеки cos. Если вы не предоставите определение cos, определение использования стека не рассматривает его как вызываемого func.
#include <math.h>
double func(double arg) {
return cos(arg);
}