TT#3 Static Stack Analyzer
Analiza statyczna kodu to pierwszy etap wykrywania błędów w programie. Obejmuje takie obszary, jak analiza składni, jakość kodu czy zgodność z dobrymi praktykami. Pozwala także zwiększyć wydajność kodu oraz jego stabilność jeszcze przed uruchomieniem programu. Co w tym obszarze oferuje nam STM32CubeIDE?
Static Stack Analyzer to wbudowana funkcja dostępna w STM32CubeIDE. Wykorzystuje pliki „elf” oraz „su” i na ich podstawie w sposób graficzny prezentuje dane o używanej przez poszczególne funkcje pamięci, sposób ich wywoływania i powiązania między nimi. Po uruchomieniu IDE funkcja powinna się nam pojawić domyślnie w oknie (perspektywie) C/C++. Jeżeli jednak nie masz jej dostępnej, można ją włączyć wybierając w menu „Windows->Show View->Static Stack Analyzer”.
W przypadku, gdyby po skompilowaniu projektu w oknie nie pojawiły się informacje o strukturze kodu, należy sprawdzić, czy funkcja Enable stack usage analysis (flaga -fstack-usage) jest aktywowana w ustawieniach projektu w menu „Project->Properties->C/C++ Build->Settings->Tool Settings->MCU GCC Compiler->Miscellaneous”.
Okno analizatora stosu składa się z dwóch zakładek: List oraz Call graph.
Zakładka List zawiera listę funkcji wybranego programu.
Znajdziemy tam takie informacje, jak:
- Function – nazwa funkcji
- Local cost – ile bajtów na stosie zajmuje funkcja
- Type – rodzaj alokacji na stosie (statyczna, dynamiczna)
- Location – nazwa pliku, w którym się znajduje
- Info – informacje dodatkowe
Mamy też możliwość wyszukania po nazwie oraz ukrycie „martwych” funkcji dzięki „Hide dead code”. Podwójne kliknięcie na nią otwiera nam kod w oknie edytora, co znacznie ułatwia nawigację. Ciekawą funkcją okna jest możliwość kopiowania wraz z informacjami dodatkowymi(skróty Ctrl+C, Ctrl+V).
W zakładce Call Graph znajdziemy szczegóły w postaci drzewa. W pierwszej kolejności widoczne są funkcje, które nie są wywoływane przez inne, czyli głównie Handlery przerwań. Zagłębiając się w kolejne warstwy możemy sprawdzić, jaka zależność istnieje pomiędzy poszczególnymi funkcjami w programie. W tym oknie powinny być widoczne tylko funkcje, które są używane w naszym kodzie.
Ikona po lewej stronie nazwy funkcji informuje nas o sposobie alokacji na stosie:
- zielona kropka – funkcja używa statycznej alokacji
- niebieski kwadrat – funkcja używa dynamicznej alokacji
- ikona 010 – informacja o sposobie alokacji nie jest znana
- trzy strzałki – funkcja jest wywoływana rekurencyjne
W oknie Call Graph znajdziemy takie informacje, jak:
- Function – nazwa funkcji
- Depth – stopień zagnieżdżenia funkcji (0 – funkcja nie jest wywoływana przez inną, ? – wywoływana rekurencyjnie)
- Max cost – ilość bajtów używanych na stosie z uwzględnieniem stosu potrzebnego na jej wywołanie
- Local cost – ilość bajtów używanych na stosie przez samą funkcję
- Type – rodzaj alokacji (statyczna lub dynamiczna)
- Location – nazwa pliku, w którym się znajduje
- Info – informacje dodatkowe
Mamy też możliwość sortowania oraz wyszukania po nazwie. Podwójne kliknięcie na funkcję otwiera nam ją w oknie edytora, a zaznaczenie opcji „Case sensitive” włącza/wyłącza uwzględnianie wielkich liter w trakcie wyszukiwania.
Co daje nam właściwie narzędzie Stack Static Analyzer? Dzięki niemu możemy dokonać przeglądu naszych funkcji i wyłapać te, które są np. niepotrzebne, a zajmują miejsce w kodzie. Pozwala nam zoptymalizować rozmiar poszczególnych funkcji oraz przeanalizować ilość zużywanego stosu. Dzięki temu jesteśmy w stanie usprawnić działanie naszego programu jeszcze przed jego uruchomieniem, co pozwala zaoszczędzić czas na wczesnym etapie pisania oprogramowania.
Ciekawy artykuł. Nie wiedziałem o tej funkcji IDE, a teraz na pewno będę z niej korzystał. Dzięki!