exponenta event banner

Определение использования стека программ

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

Например, для этой иерархии вызовов использование стека func - размер локальных переменных в func плюс максимальное использование стека от func1 и func2(если только они не вызываются во взаимоисключающих ветвях условного оператора).

Для получения более подробной информации см.:

Изучение возможного переполнения стека

Если использование стека превышает доступное пространство стека, можно определить, какая функция несет ответственность. Начать в main и перейдите к дереву вызовов программы. Во время навигации найдите функцию, которая имеет необоснованный размер локальных переменных. Если вы не можете идентифицировать такую функцию, ищите неоправданно длинную последовательность вызова. Подробные шаги для навигации:

  1. На панели «Источник» выберите main функция. На панели «Иерархия вызовов» отображаются функции, вызываемые из main (вызываемые абоненты). Чтобы просмотреть полную иерархию, щелкните правой кнопкой мыши функцию и разверните все узлы.

    Если панель «Иерархия вызовов» не открыта по умолчанию, выберите «Окно» > «Показать/скрыть представление» > «Иерархия вызовов».

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

Использование стека не вычислено

Для вычисления использования стека функций анализ должен быть способен достичь конца функции. Следующее может предотвратить вычисление использования стека функций:

  • Красные чеки.

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

    В этом примере использование стека 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);
    }