Programozás alapjai 2. Hibakeresés, tesztelés. Hibakeresés módszerei. Nyomkövető kiírások. madártávlatból

Hasonló dokumentumok
Programozás alapjai 2. Hibakeresés, tesztelés

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++

Programozás alapjai II. (3. ea) C++ Panaszok kezelése. Hol tartunk?

1. Alapok. Programozás II

Programozás II. 2. Dr. Iványi Péter

Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok. Tesztelési követelmények.

Programozás C és C++ -ban

Programozás alapjai II. (1. ea) C++

Programozás alapjai II. (1. ea) C++

Pénzügyi algoritmusok

Pénzügyi algoritmusok

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

Maximum kiválasztás tömbben

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

Programozás C++ -ban

Programozási Nyelvek: C++

Tartalomjegyzék. Általános Információ! 2. Felhasználói dokumentáció! 3. Feladat! 3. Környezet! 3. Használat! 3. Bemenet! 3. Példa!

C++ programok fordítása

Programozás alapjai II. (2. ea) C++

Programozás alapjai II. (2. ea) C++

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

3. Osztályok II. Programozás II

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás alapjai II. (1. ea) C++

ISA szimulátor objektum-orientált modell (C++)

Szövegek C++ -ban, a string osztály

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

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

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

Tesztelési követelmények. Programozás alapjai II. (12. ea) C++ gtest - tesztelést segítő csomag visszalépéses (backtrack) algoritmusok.

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

C programozási nyelv

Programozás C++ -ban

Programozás alapjai. 5. előadás

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

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

RPC Remote Procedure Call Távoli eljárás hívás

Java II. I A Java programozási nyelv alapelemei

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás alapjai II. (1. ea) C++

117. AA Megoldó Alfréd AA 117.

Cekla. Készítette Doxygen Tue Sep :13:44

Bevezetés a programozásba I.

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Mobil Informatikai Rendszerek

Programozás alapjai 2. (2. ea) C++

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Programozás II. 4. Dr. Iványi Péter

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Járműfedélzeti rendszerek II. 2. előadás Dr. Bécsi Tamás

Alprogramok, paraméterátadás

Programozási alapismeretek beadandó feladat: ProgAlap beadandó feladatok téma 99. feladat 1

Mobil Informatikai Rendszerek

Pénzügyi algoritmusok

7. fejezet: Mutatók és tömbök

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Előfeldolgozó rendszer Tömbök. Dr. Bécsi Tamás 4. Előadás

15. Programok fordítása és végrehajtása

Java II. I A Java programozási nyelv alapelemei

C vagy C++? Programozási Nyelvek és Fordítóprogramok Tanszék. Pataki Norbert. Programozási Nyelvek I.

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

Programozás I. gyakorlat

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Szerző Lővei Péter LOPSAAI.ELTE IP-08PAEG/25 Daiki Tennó

Programozás alapjai II. (4. ea) C++

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

C++ Gyakorlat jegyzet 7. óra

5. Gyakorlat. struct diak {

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

Információs Technológia

500. AA Megoldó Alfréd AA 500.

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Pénzügyi algoritmusok

C++ programozási nyelv Konstruktorok-destruktorok

Programozás II gyakorlat. 6. Polimorfizmus

Függvények. Programozás alapjai C nyelv 7. gyakorlat. LNKO függvény. Függvények(2) LNKO függvény (2) LNKO függvény (3)

Programozás alapjai C nyelv 7. gyakorlat. Függvények. Függvények(2)

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

Programozás alapjai 9.Gy: Struktúra 2.

Programozás C nyelven (9. ELŐADÁS) Sapientia EMTE

PROGRAMOZÁSI NYELVEK - CPP. ELŐADÁS JEGYZET

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

503.AA Megoldo Arisztid 503.A

1. Jelölje meg az összes igaz állítást a következők közül!

128. AA Megoldó Alfréd AA 128.

C#, OOP. Osztályok tervezése C#-ban

Programozás I. 5. Előadás: Függvények

A PROGAMOZÁS ALAPJAI 1. Függvény mint függvény paramétere. Függvény mint függvény paramétere. Függvény mint függvény paramétere

A C++ Standard Template Library rövid összefoglalás

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Programozás 6. Dr. Iványi Péter

Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

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

Átírás:

Programozás alapjai 2. Hibakeresés, tesztelés madártávlatból Szeberényi Imre BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 1 - Hibakeresés módszerei Álmódszerek: Erősen nézzük a kódot Másokat hibáztatunk Jó ötletnek tűnt... Valódi módszerek: Nyomkövető kiíratások Debugger használata Trace generátor (automatikus) Kód analizátor használata C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 2 - Nyomkövető kiírások Tanuláskor, egyszerű programok estén: 1. Nyomkövető kiírások a kódban #ifdef DEBUG std::cout << Kakukk << std::endl; #endif 2. Saját eszközök, makrók, sablonok #ifdef DEBUG #define BAJ_VAN_HA_EZ_IGAZ(e) if ((e)) { \ std::cout << "'" << #e << "' Kifejezes IGAZ ebben a sorban: " \ << LINE << std::endl; #endif C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 3 -

Tanuláshoz Utasítások eredménye azonnal: C++ interpreter (pl. root, cling) https://root.cern.ch/cling-brief Pl: [cling]$ #include <iostream> [cling]$ std::cout << 100 << std::endl; 100 Trükkös makrók, sablonok, amikkel kiíratható az utasítás és az eredménye is C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 4 - _ makró és társai Nem kell megérteni. Szabad használni. #define _(...) \ std::cout<< # VA_ARGS ";"<< "// "; VA_ARGS (std::cout << 100 << std::endl); std::cout << 100 << std::endl; // 100 Ezt használjuk a mintapéldákban is. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 5 - Tesztelési követelmények Legyen független, és megismételhető Legyen áttekinthető és tükrözze a tesztelt kód struktúráját. Legyen hordozható és újrafelhasználható. Segítsen a teszt írójának a problémára koncentrálni. Legyen gyors és automatizálható. Gyakran a tárolóba (svn, git) való betétel feltétele az ún. unit teszt sikeressége. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 6 -

Google Test Kis méretű, forráskódban elérhető http://code.google.com/p/googletest/ Platformfüggetlen (WinX, MAC, LINUX, Windows Mobile, MinGW, ) Assertion alapú success, nonfatal, fatal Teszt program: teszt esetek tesztek C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 7 - Assertion Hasonlító függvényeket hívnak Hiba esetén kiírják a hiba helyét, kódját ASSERT_* fatális hiba a program megáll EXPECT_* nem fatális hiba tovább fut ASSERT_EQ(4, 2*2) << "2*2 hiba"; for (int i = 0; i < 10; i++) { EXPECT_LT(i-1, 2*i) << "i nem kisebb mint 2*i! i=" << i; C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 8 - Egyszerű feltételek Utasítás EXPECT_EQ(expected, actual) EXPECT_NE(val1, val2) EXPECT_LT(val1, val2) EXPECT_LE(val1, val2) EXPECT_GT(val1, val2) EXPECT_GE(val1, val2) EXPECT_STREQ(exp_str, act_str) EXPECT_STRNE(str1, str2); EXPECT_STRCASEEQ(exp, act); EXPECT_STRCASENE(str1, str2) Teljesülnie kell expected == actual val1!= val2 val1 < val2 val1 <= val2 val1 > val2 val1 >= val2 a két C string azonos a két C string nem azonos a két C string azonos (kis/nagy betű az.) a két C string nem azonos (kis/nagy b.) C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 9 -

Egyszerű példa #include "gtest/gtest.h" #include "sablonjaim.hpp" // mai ora sablonjai TEST(Sablonjaim, maxint) { EXPECT_EQ(20, max(3,20) << "maximum nem OK!"; TEST(Sablonjaim, maxdouble) { EXPECT_EQ(4.2, max(4.2, 3.1)); // A main automatikusan hozzáadódik C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 10 - Problémák a HSZK-ban VS ingyenes változatával nem fordul (tuple par.) CB-vel rendben, van de érzékeny a jó lib-re. include win32 gtest.lib, gtest_main-mdd.lib (Visual Studio-hoz) libgtestd.a, libgtest_maind.a (CodeBloks-hoz) További beállításokra lehet szükség: Projektfájlban a megfelelő útnév beállítása: CB: Project ->Build options ->Linker settings, Search directories VS: Project-> Properties -> C++ -> General (additional dir), Project-> Properties -> linker -> Input (Additional dep.) C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 11 - gtest_lite A prog2 tárgyhoz készült. Lényegében a gtest fontosabb lehetőségeit valósítja meg kompatibilis módon. Ronda makrókkal és statikus objektummal operál. HF-ben használható ill. használandó. Csak egyszerű teszteket és csak az EXPECT_* alakú ellenőrzéseket támogat. Kivételek ellenőrzését is lehetővé teszi. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 12 -

gtest_lite példa #include "gtest_lite.h" #include "sablonjaim.h" int main() { Ezekben tér el az eredetitől. TEST(Sablonjaim, maxint) { EXPECT_EQ(20, max(3,20) << "maximum nem OK!"; END TEST(Sablonjaim, maxdouble) { EXPECT_EQ(4.2, max(4.2, 3.1)) ; END C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 13 - További ellenőrzések Utasítás EXPECT_THROW(statement, excep_type) EXPECT_ANY_THROW(statement) EXPECT_NO_THROW(statement) EXPECT_PRED_FORMAT1(pred, val1) EXPECT_PRED_FORMAT2(pred, val1, val2) EXPECT_FLOAT_EQ(expected, actual) EXPECT_DOUBLE_EQ(expected, actual) EXPECT_NEAR(val1, val2, abs_error) SUCCEED() FAIL(); ADD_FAILURE() ADD_FAILURE_AT("file_path", line_number); Teljesülnie kell adott típust dobnia kell bármit kell dobnia nem dobhat pred(val1) == true pred(val1, val2) == true expected ~= actual expected ~= actual abs(val1-val2) <= abs_error siker végzetes; nem végzetes nem végzetes C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 14 - Memória kezelés problémái Ritkán futó programágakon gyakran: hibás pointer kezelés felszabadítatlan terület Hosszan futó program felzabálja a memóriát gép lelassul, mert a tárat diszkre írja (swap) Hibás inputra túlcímzés, buffer overflow hiba C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 15 -

Buffer overflow példa... char buff[6]; bool pass = false; int main(void) { cout << "Jelszo: "; cin >> buff; if (strcmp(buff, "titok")!= 0) { hosszabb inputra felülíródik cout << "*** Hibas jelszo ***" << endl; else { cout << "Helyes jelszo" << endl; pass = true; if (pass) { cout <<" >> Hozzaferhet a titokhoz:" << endl; printsecret(); // kiírja a titkot C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 16 - Buffer overflow példa futtatása $./buffover Jelszo: qwqw *** Hibas jelszo *** $./buffover Jelszo: wqwqwqwqww *** Hibas jelszo *** >> Hozzaferhet a titokhoz: 1. Mikor jelentkezik a buffer oveflow hiba? a) reggel b) aritmetikai túlcsorduláskor c) ha elfogy a memória d) egy változót (buffert) a program hosszabban ír, mint annak a mérete $ # https://svn.iit.bme.hu/proga2/ eloadas_peldak/ea_teszt/buffover/ C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 17 - Mem. kezelés ellenőrzése Profi eszközök Fejlesztő környezet által támogatott eszközök cppcheck http://cppcheck.sourceforge.net/ clang-tidy http://clang.llvm.org/extra/clang-tidy/ google sanitizers https://github.com/google/sanitizers/wiki Külső eszközök Valgrind http://valgrind.org/ Külső könyvtárak duma http://duma.sourceforge.net/ memtrace C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 18 -

Statikus analízis példa 1 // file: errors.cpp 2 #include <iostream> 3 const int L = 30; 4 char* fn1(int a, int) { 5 char *p = new char[l]; 6 #ifdef ALADAR 7 p[l] = 1; 8 delete p; 9 #else 10 delete[] p; 11 #endif 12 return p; 13 14 15 16 int main() { cppcheck errors.cpp [errors.cpp:12]: (error) Returning/dereferencing 'p' after it is deallocated / released Checking errors.cpp: ALADAR... [errors.cpp:7]: (error) Array 'p[30]' accessed at index 30, which is out of bounds. [errors.cpp:8]: (error) Mismatching allocation and deallocation: p 17 std::cout << *fn1(30, 4); << std::endl; 18 C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 19 - Futás közbeni analízis //file: errors.cpp g++ -ggdb -fsanitize=address -fno-omit-frame-pointer errors.cpp./a.out ==3884==ERROR: AddressSanitizer: heap-use-after-free... #0 0x7f13cd01ecaa in operator delete[](void*) errors.cpp:10... #0 0x7f13cd01e6b2 in operator new[](unsigned long) errors.cpp:5 SUMMARY: AddressSanitizer: heap-use-after-free errors.cpp:17 main C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 20 - Futás közbeni analízis /2 SUMMARY: AddressSanitizer: heap-use-after-free errors.cpp:17 main Shadow bytes around the buggy address: 0x0c067fff9da0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9db0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9dc0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9dd0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9de0: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa =>0x0c067fff9df0: fa fa fa fa fa fa fa fa fa fa fa fa[fd]fd fd fd 0x0c067fff9e00: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9e10: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9e20: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9e30: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa 0x0c067fff9e40: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes): Jelzi az illegális hozzáférés helyét a memóriában. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 21 -

memtrace Preprocesszor segítségével lecseréli a new, és delete hívásokat. Így ellenőrizni tudja azok használatát. Kanari byte-ok elhelyezésével felszabadításkor ellenőrzi a túlcímzést. Program megálláskor az ellenőrzi, hogy minden fel lett-e szabadítva. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 22 - memtrace és C++11 C++11-től a delete kulcsszó nem csak operátorként jelenik meg a nyelvben, hanem osztály deklarációkban a tagfüggvény törzse helyett is szerepelhet. Itt azonban nem szabad lecserélni... A standard header-ekben gyakran előfordul. Alkalmas include sorrenddel a probléma legtöbbször megkerülhető. C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 23 - memtrace::mem_dump Adott címtől kezdődően megadott hosszúsággal kiírja a memória tartalmét képernyőre. Pl: Dump: (addr: 0028FE7E) 0000:* 73 73 73 7a 69 61 20 43 2b 2b 2b 2b 2b 20 2b 20 ssszia C+++++ + C++ programozási nyelv BME-IIT Sz.I. 2018.02.13. - 24 -