Ovaj projekat analizira i verifikuje implementaciju igre The Legend of Zelda u programskom jeziku C++ sa projekta dostupnog na GitHub-u na sledećoj adresi: zelda.
Analiza je izvršena na grani: master
Heš kod commit-a: 73cf1f211b3a28f7a0cbdf429503f9396276cd3c
Cilj analize je poboljšanje stabilnosti i efikasnosti aplikacije korišćenjem statičkih i dinamičkih alata za analizu koda.
Pre pokretanja analiza, potrebno je da se projekat ispravno klonira, pripremi za build i da se generiše fajl compile_commands.json koji koriste alati poput Clang-Tidy.
- git submodule update --init --recursive
- cd zelda
- git apply ../custom.patch
- mkdir cmake-build-debug
- cd cmake-build-debug
- sudo apt install -y libgl1-mesa-dev libx11-dev libopenal-dev libsndfile1-dev libglew-dev freeglut3-dev libxrandr-dev libfreetype6-dev
libflac-dev libvorbis-dev libudev-dev
- cmake .. -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
- make
sudo apt install cppcheck
sudo apt install clang-tidy
sudo apt install doxygen
sudo apt install valgrind
sudo apt install kcachegrindPre pokretanja, pozicionirati se u direktorijum projekta:
cd cppcheckPokrenuti Cppcheck sledećom komandom:
chmod +x run_cppcheck.sh
./run_cppcheck.shPre pokretanja, pozicionirati se u direktorijum projekta:
cd clang-tidyPokrenuti Clang-Tidy sledećom komandom:
chmod +x run_clang_tidy.sh
./run_clang_tidy.shPre pokretanja, pozicionirati se u direktorijum projekta:
cd doxygenDati skripti odgovarajuće dozvole i pokrenuti je:
chmod +x generate_doxygen.sh
./generate_doxygen.shPre pokretanja, pozicionirati se u direktorijum projekta:
cd valgrind/memcheckDati skripti odgovarajuće dozvole i pokrenuti je:
chmod +x run_memcheck.sh
./run_memcheck.shPre pokretanja, pozicionirati se u direktorijum projekta:
cd valgrind/callgrindDati skripti odgovarajuće dozvole i pokrenuti je:
chmod +x run_callgrind.sh
./run_callgrind.shPrimena različitih alata za analizu koda omogućila je sveobuhvatnu proveru stabilnosti i efikasnosti aplikacije. Statičkom analizom pomoću Cppcheck i Clang-Tidy detektovane su sintaksičke greške, problemi sa memorijom i mogućnosti optimizacije koda. Doxygen je omogućio generisanje detaljne dokumentacije, olakšavajući razumevanje strukture projekta i njegovu dalju nadogradnju.
Dinamičkom analizom kroz Valgrind Memcheck identifikovani su problemi sa upravljanjem memorijom, poput curenja memorije i neoslobođenih alokacija, dok je Valgrind Callgrind omogućio uvid u performanse aplikacije, otkrivajući funkcije sa najvećim opterećenjem. Vizuelizacija podataka pomoću KCacheGrind pomogla je u identifikaciji uskih grla u izvršavanju koda.
Predložene optimizacije uključuju:
- Bolje upravljanje memorijom – smanjenje curenja i efikasnije oslobađanje resursa korišćenjem pametnih pokazivača (
std::unique_ptr,std::shared_ptr). - Poboljšanje performansi – optimizacija najčešće pozivanih funkcija, redukovanje broja realokacija memorije i efikasnije korišćenje STL kontejnera.
- Unapređenje kodnog stila – primena modernih C++ standarda, zamena zastarelih konstrukcija i optimizacija iteracija kroz strukture podataka.