Довольно поздно, но для тех, кто смотрит на это, ответы, включающие объединение выходных данных инструментов fstack-using и графа вызовов, таких как cflow, могут оказаться в корне неверными для любого динамического распределения, даже ограниченного, потому что нет никакой информации о том, когдаэто динамическое распределение стека происходит.Поэтому невозможно узнать, к каким функциям следует применять значение.В качестве надуманного примера, если (упрощенный) результат использования fstack:
main 1024 dynamic,bounded
functionA 512 static
functionB 16 static
и очень простое дерево вызовов:
main
functionA
functionB
Наивный подход к их объединению может привести кmain -> functionA выбирается как путь максимального использования стека, в 1536 байтах.Но если наибольшее динамическое выделение стека в main () состоит в том, чтобы передать большой аргумент, такой как запись, в functionB () непосредственно в стек в условном блоке, который вызывает functionB (я уже говорил, что это было придумано), тогда действительно main ->functionB - путь максимального использования стека, в 1040 байтах.В зависимости от существующего программного обеспечения, а также от других более ограниченных целей, которые передают все в стек, накопительные ошибки могут быстро привести вас к поиску совершенно неправильных путей, требующих значительно завышенных максимальных размеров стека.
Кроме того, в зависимости от вашегоклассификация «реентерабельных», когда речь идет о прерываниях, можно полностью пропустить некоторые выделения стека.Например, прерывания уровня 7 многих процессоров Coldfire чувствительны к фронту и, следовательно, игнорируют маску блокировки прерываний, поэтому, если семафор используется для преждевременного выхода из инструкции, вы можете не считать ее повторной, но первоначальное выделение стека все же произойдет до того, каксемафор проверен.
Короче говоря, вы должны быть чрезвычайно осторожны при использовании этого подхода.