Static Analyses for C++ in the Presence of Separate Compilation
C++ programming language
static analysis
bug finding
lifetime
summary
symbolic execution
abstract interpretation
testing
Informatika D. I./Az informatika alapjai és módszerei.
C++ programozási nyelv
statikus elemzés
hibakeresés
élettartam
összegzés
szimbolikus végrehajtás
absztrakt interpretáció
tesztelés
Abstract:
Ez a disszertáció új elemzéseket és elemzési módszereket mutat be, melyek bizonyos programozási hibák megtalálására képesek. Az első tézis egy olyan megközelítést mutat be, ami képes megtalálni a C++ szabványkönyvtárának (STL) számos hibás használatát. Több kategóriában kerültek bevezetésre ellenőrzések: teljesítmény, hibás kód és modernizáció. Néhány ellenőrzés képes a kód automatikus javítására is. A legtöbbjük más eszközökben korábban nem volt megtalálható. Továbbá, leírtam egy módszert, amivel ezek az ellenőrzések általánosíthatóak idiomatikus nem STL kódra.
A következő tézis olyan elemzéseket definiál, amelyek bizonyos memória hibákat képesek megtalálni, úgymint felszabadítás utáni használat vagy nullpointer dereferálás. Ezek az elemzések egy Herb Sutter által definiált vezérlés érzékeny elemzésen alapulnak. Herb Sutter a C++ szabványbizottság elnöke. Bevezettem egy utasításokra lokális változatát az analízisnek, amely nem talál hamis hibákat. Ez az implementáció elég érett volt ahhoz, hogy a Clang fordítóban alapértelmezetten engedélyezésre kerüljön. Ezen felül, bemutattam számos technikát, amellyel csökkenthetőek a hamis találatok az eredeti vezérlés érzékeny algoritmusban.
A harmadik tézis a Clang Static Analyzer fordítási egységeken átívelő elemzéssel való kiegészítéséről szól. Megmértük, hogy hogyan változott a lefedettség, a teljesítmény, valamint a megtalált hibák száma. Ezen túl megvizsgáltuk a hamis hibák arányának változását. Azt találtuk, hogy az elemzés hatókörének kiterjesztésével javult a talált hibák minősége. Az eredmények nagyban függenek az analízishez választott bejárási stratégiától. A „lefedetlent-először” bejárási stratégia jól szerepelt, a módszer nem okozott nagy lefedettség romlást.
Az utolsó tézis olyan modellek (summary) bevezetését tárgyalja, amely egy középút a konzervatív kiértékelés és az inline elemzés között szimbolikus végrehajtásnál. A javasolt módszer fő alkalmazása a fordítási egységeken átívelő analízis megvalósítása. Bár a prototípus csak kézzel írt modelleket támogat, a tézisben javasoltam egy sémát ezeknek a modelleknek az automatikus generálására.
Az utolsó két tézis a szimbolikus végrehajtás hatókörének a kiterjesztéséről szól. Ez fontos a memória hibák megtalálásához, mivel számos probléma a heap használatához kapcsolható. A heap egy globális erőforrás, mely miatt kifejezetten nehéz lokálisan érvelni a helyes használatáról.
Minden bemutatott módszerhez tartozik prototípus. Sőt, néhány megoldás már olyan robusztus, hogy ipari alkalmazásai is vannak számos felhasználóval. A bemutatott elemzések közül néhány olyan hibákat is képes felfedni, ami tapasztalt fordító fejlesztőkön is kifogott. Az utasításokra lokális élettartam elemzés olyan népszerű nyílt forráskódú projektekben talált hibákat, mint OpenCV, Chromium és LLVM.