Clang Static Analyzer belülről

Hasonló dokumentumok
GPU Lab. 5. fejezet. A C++ fordítási modellje. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

1. Bevezetés szeptember 9. BME Fizika Intézet. Szám. szim. labor ea. Tőke Csaba. Tudnivalók. feladat. Tematika. Moodle Házi feladatok

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

C++ programozási nyelv

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Adatbázis Rendszerek II. 5. PLSQL Csomagok 16/1B IT MAN

1.1. A forrásprogramok felépítése Nevek és kulcsszavak Alapvető típusok. C programozás 3

GPU Lab. 4. fejezet. Fordítók felépítése. Grafikus Processzorok Tudományos Célú Programozása. Berényi Dániel Nagy-Egri Máté Ferenc

Több platform egy kódbázis Tanulságok a Tresorittól. Budai Péter, vezető fejlesztő

Mobil Informatikai Rendszerek

Bevezetés a Python programozási nyelvbe

OOP #14 (referencia-elv)

Java és web programozás

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Memóriagazdálkodás. Kódgenerálás. Kódoptimalizálás

Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Jelszavak helyes megválasztása, szótáras törés. Pánczél Zoltán

Már megismert fogalmak áttekintése

Fordítóprogramok. Aszalós László szeptember 7.

C++ programozási nyelv

Programozás alapjai gyakorlat. 2. gyakorlat C alapok

Bevezetés a Python programozási nyelvbe

Virtuális függvények (late binding)

Vizuális, eseményvezérelt programozás XI.

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

12. gyakorlat Enum; Tárolási osztályok Preprocesszor utasítások; Moduláris programozás

Kinek szól a könyv? A könyv témája A könyv felépítése Mire van szükség a könyv használatához? A könyvben használt jelölések. 1. Mi a programozás?

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Függvények. Dr. Bécsi Tamás 6. Előadás

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

Mintavételes szabályozás mikrovezérlő segítségével

Mobil Informatikai Rendszerek

Objektumorientált programozás C# nyelven

Programozás módszertan p.1/46

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozás C++ -ban 2007/7

C programozási nyelv

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós október 11. Széchenyi István Egyetem, Gy r

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

GráfRajz fejlesztői dokumentáció

A C programozási nyelv II. Utasítások. A függvény.

OOP és UML Áttekintés

Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe

Podoski Péter és Zabb László

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Pénzügyi algoritmusok

Java programozási nyelv 9. rész Kivételkezelés

Szkeleton beadása. 100 Generalis faliora. Csapattagok: Konzulens: Szabó András március 29.

Szoftvergyártás: gyártásvezérlés kód-figyeléssel

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

Java programozási nyelv 5. rész Osztályok III.

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

Rekurzió. Dr. Iványi Péter

Szoftver technológia. Build systems. Cserép Máté ELTE Informatikai Kar 2019.

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

A C programozási nyelv I. Bevezetés

Programozási nyelvek Java

A C programozási nyelv I. Bevezetés

Kiszolgálók üzemeltetése. Iványi Péter

Adatbázis és szoftverfejlesztés elmélet

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

C programozási nyelv Pointerek, tömbök, pointer aritmetika

(kernel3d vizualizáció: kernel245_graph.mpg)

OOP. Alapelvek Elek Tibor

Interfészek. PPT 2007/2008 tavasz.

Mérnöki programozás 7. Szerkesztette: dr. Vass Péter Tamás

Irányítástechnika Elıadás. PLC-k programozása

VIRTUÁLIS GRAFFITI ÜZENETHAGYÓ RENDSZER

3. Osztályok II. Programozás II

Bevezetés a programozásba Előadás: A const

Programozás C és C++ -ban

FPGA áramkörök alkalmazásainak vizsgálata Dinamikus adatfolyam gráf alapú algoritmus analízis

Java I. A Java programozási nyelv

Web-technológia PHP-vel

Digitális technika VIMIAA01 9. hét Fehér Béla BME MIT

Digitális technika VIMIAA01 9. hét

Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba

Python tanfolyam Python bevezető I. rész

C programozás. 1 óra Bevezetés

Alprogramok, paraméterátadás

Tartalomjegyzék. Előszó... 10

8. gyakorlat Pointerek, dinamikus memóriakezelés

Programozás I. gyakorlat

Bevezetés. Dr. Iványi Péter

OpenCL alapú eszközök verifikációja és validációja a gyakorlatban

OOP. #6 (VMT és DMT) v :33:00. Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj.

Dr. Schuster György október 14.

Programozási Nyelvek: C++

sallang avagy Fordítótervezés dióhéjban Sallai Gyula

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

Programozási alapismeretek 4.

Verifikáció és validáció Általános bevezető

Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java

A szerzõrõl... xi Bevezetés... xiii

Átírás:

Clang Static Analyzer belülről Nagy Donát 2015. október 6.

Áttekintés 1 Clang Static Analyzer kívülről 2 A statikus elemzés folyamata 3 Az eszköz felépítése 4 Egy checker felépítése

Rövid definíciók Clang Static Analyzer: statikus elemző eszköz, azaz a kód futtatása nélkül keres hibákat/gyanús dolgokat (C, C++, Objective-C) programokban A Clang Static Analyzer a Clang projekt része, a projekt többi részét alkotó függvénykönyvtárak alkalmazása Clang: modern C/C++/Objective-C fordító; moduláris felépítésének köszönhetően a forráskódot manipuláló függvénykönyvtárai külön is használhatóak A Clang projekt egy az LLVM projektbe tartozó számos eszköz közül LLVM: nyílt forrású eszköztár fordításhoz és egyéb kódmanipulációhoz

Az LLVM részei LLVM Core LLVM köztes reprezentációban lévő kód optimalizálása és gépi kóddá fordítása (backend) Clang frontend a C/C++/Objective-C nyelvekhez, ezen nyelvekbeli kód kezelése és köztes reprezentációra fordítása dragonegg LLVM backend összekapcsolása a GCC-nek az Ada, Fortran stb. frontendjeivel LLDB debugger libc++ C++ Standard Library implementáció és még 8 más projekt...

Hivatalos megoldás clang --analyze -Xanalyzer -arg... hívásokkal lehet manuálisan meghívni az elemzőt, de ez meglehetősen kellemetlen lenne egy nagy projektnél A scan-build eszköz megfigyeli a fordítás menetét és futtatja az elemzőt minden, a C/C++/Objective-C fordító által lefordított forrásfájlra Használatához meg kell adni a tényleges fordítást kiváltó parancsot (pl. scan-build make -j4) Primitív mechanizmus: a $CC és $CXX környezeti változókat felüĺırva beszúr egy szkriptet, ami minden fordítás előtt lefut... ha a build rendszer elviseli ezt a belepiszkálást

Ericssonos megoldás A CodeChecker alapvetően a scan-buildhez hasonló csak összetettebb Használata: CodeChecker check paraméterek -b make... miután a felhasználó beálĺıtotta a szükséges adatbázist és pythonos virtualenv-et Szofisztikáltabb mechanizmus: a $LD_PRELOAD környezeti változóba piszkál bele Továbbá dinamikus webes bugnézegetőt biztosít

Az elemzés menete A statikus elemzés során az elemző szimbolikusan futtat minden függvényt Azonos fordítási egységbeli függvényhívást követ, azon kívül technikai okokból nem A részben vagy teljesen ismeretlen értékek (pl. a függvény paraméterei, külső függvények által visszaadott érték, memória adott pozíciójából kiolvasható érték, stb.) helyett szimbólumokat vezet be A szimbólumokról különféle ismereteket tárol (pl. ez a szám nagyobb, mint 5; az a pointer nem lehet NULL)

Az ExplodedGraph A végrehajtás menetét egy irányított gráf, az ExplodedGraph követi Csúcsai egy hely a kódban, ismeretgyűjtemény a változókról párok Élei a végrehajtás elemi lépéseinek felelnek meg Legtöbb állapotnak egy őse és egy leszármazottja van, de lehet több ős, több leszármazott ill. nulla leszármazott is

A checkerek A tényleges munkát a checkerek végzik Egy checker egy hibatípusért/nyelvi elemért felel A checker megfelelő helyen csúcsokat szúrhat be az ExplodedGraph-ba; ezek gyakran nyelők (ha a hiba után nem definiált az állapot) Megfelelő helyen: pl. egy függvény meghívása előtt/után, egy változó deklarációjakor, amikor egy szimbólum elérhetetlenné válik, egy függvény elhagyásakor... A checkernek magának nincs állapota, de a definíciójakor lehet állapotot definiálni számára az ismeretgyűjtemény típusban (ami a gráf minden csúcsában szerepel)

Néhány példa checkerekre core.dividezero nullával osztás core.nulldereference NULL dereferencia cplusplus.newdelete new/delete nem szépen párban használata unix.malloc ugyanez malloc()/free()-re core.uninitialized.* inicializálatlan érték használata security.insecureapi.* a getpw, gets, mktemp, strcpy, vfork függvények használata alpha.unix.stream fájlműveletek (fopen() után fclose() kellene, nem nyitott fájlból olvasás) alpha.cplusplus.virtualcall konstruktorban/destruktorban virtuális függvény hívása alpha.core.pointersub pointerek különbségének képzése, ha nem egy blokkba mutatnak

A SimpleStreamChecker feladata és alaptulajdonságai Ez egy demo checker, az alpha.unix.stream checkernek egy egyszerűbb változata Feladata: Jelez, ha egy fájl nyitva marad Jelez, ha egy bezárt fáljból akar olvasni a programozó Ez egy viszonylag egyszerű checker, pl. a MallocChecker, ami kb. 6 checkert definiál dinamikus memóriakezelés hibáira, tízszer ekkora Nem lép sok interakcióba más checkerekkel ezek a függvények más checkert nem érdekelnek, és őt sem nagyon érdekli más checker adata