Polyspace®Анализ Code Prover™ может оценить использование стека каждой функции в вашей программе и вычислить все использование стека программы. Анализ использует иерархию вызовов функций вашей программы для оценки использования стека. Использование стека функции является суммой локальных размеров переменной в функции плюс максимальное использование стека из функций callees. Использование стека функции в верхней части иерархии вызовов является использованием стека программ.
Например, для этой иерархии вызовов, использование стека func
- размер локальных переменных в func
плюс максимальное использование стека из func1
и func2
(если они не вызваны в взаимоисключающих ветвях условного оператора).
Для получения дополнительной информации смотрите:
Метрики функции: Maximum Stack Usage
и Minimum Stack Usage
Метрики проекта: Program Maximum Stack Usage
и Program Minimum Stack Usage
Если использование стека превышает доступное пространство стека, можно определить, какая функция является ответственной. Начните с main
и перемещайтесь по дереву вызовов программы. Во время навигации ищите функцию, которая имеет необоснованный размер локальных переменных. Если вы не можете идентифицировать такую функцию, проверьте последовательность вызовов, которая неоправданно длинна. Подробные шаги для навигации:
На панели Source выберите main
функция. На панели Call Hierarchy отображаются функции, вызываемые из main
(callees). Чтобы увидеть полную иерархию, щелкните правой кнопкой мыши функцию и разверните все узлы.
Если по умолчанию панель Call Hierarchy не открыта, выберите Window > Show/Hide View > Call Hierarchy.
Чтобы перейти к определению callee в вашем источнике, на панели Call Hierarchy, дважды кликните каждое имя callee. Затем щелкните имя callee на панели Source. Панель Result Details показывает более высокую оценку размера локальной переменной и использования стека callee.
Чтобы использование стека функций было вычислено, анализ должен быть в состоянии достичь конца функции. Следующее может предотвратить расчет использования стека функций:
Красные чеки.
Если в функции или одном из ее каллеев возникает определенная ошибка времени выполнения выполнения, анализ не вычисляет использование стека. Причина в том, что код, следующий за красной проверкой, не анализируется. Если неанализованный код содержит вызовы функций, любая оценка использования стека для функции вызывающего абонента неточна.
В этом примере использование стека 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
, определение использования стека не рассматривает его как callee of func
.
#include <math.h> double func(double arg) { return cos(arg); }