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

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

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

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

Исследуйте возможное переполнение стека

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

  1. На панели Source выберите main функция. На панели Call Hierarchy вы видите функции, вызванные от main (вызываемые). Чтобы видеть полную иерархию, щелкните правой кнопкой по функции и расширьте все узлы.

    Если панель Call Hierarchy не открыта по умолчанию, выберите Window> Show/Hide View> Call Hierarchy.

  2. Чтобы перейти к определению вызываемого в вашем источнике, на панели Call Hierarchy, дважды кликают каждое имя вызываемого. Затем кликните по имени вызываемого на панели Source. Панель Result Details показывает более высокую оценку размера локальной переменной и использования стека вызываемым.

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

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

  • Красные проверки.

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

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