1 Systemy Odporne na Błędy
Transkrypt
1 Systemy Odporne na Błędy
Systemy Odporne na Błędy 2015/2016 Instrukcja laboratoryjna 1 1/2 Systemy Odporne na Błędy Asercja w C/C++ Przygotowali: dr inż. Grzegorz Łukawski, mgr inż. Daniel Kaczmarski 1) Asercja Asercja (ang. assertion) to predykat – forma zdaniowa w danym języku programowania która zwraca prawdę lub fałsz, umieszczony w pewnym miejscu w kodzie programu. Asercja jest prostą formą testu akceptacyjnego, programista umieszczając ją w kodzie programu zakłada, że predykat ów jest (lub powinien być) prawdziwy. Gdy predykat jest fałszywy (nie spełnione są warunki postawione przez programistę) asercja powoduje przerwanie działania programu. Asercja ma szczególne zastosowanie w trakcie testowania tworzonego oprogramowania. Zaletą stosowania asercji jest możliwość sprawdzenia w którym konkretnie fragmencie kodu źródłowego programu nastąpił błąd. 2) Asercja w C / C++ W przypadku języka C i C++ podstawowa forma asercji składa się z makrodefinicji assert(), dostępnej po dołączeniu pliku nagłówkowego <assert.h>. void assert (int expression); Jeżeli argument tej makrodefinicji jest równy zero (fałsz), na standardowe wyjście błędów programu wyprowadzany jest komunikat o błędzie i program jest natychmiast przerywany. Treść komunikatu o błędzie zależy od konkretnej implementacji kompilatora, powinna zawierać wyrażenie które spowodowało błąd, nazwę pliku źródłowego i numer linii programu. Typowy format komunikatu: Assertion failed: expression, file filename, line line_number Wszystkie wywołania makra assert() w programie można zablokować definiując stałą NDEBUG przed dołączeniem pliku <assert.h>: #define NDEBUG Systemy Odporne na Błędy 2015/2016 2/2 3) Przykład Zabezpieczenie prostej funkcji kopiującej dane przed podaniem pustych wskaźników (NULL) i niepoprawnej (zero lub wartość ujemna) wielkości obszaru pamięci: void kopiuj_dane(char *b1, char *b2, int n) { assert(b1); assert(b2); assert(n > 0); for(int i=0;i < n;i++) b1[i] = b2[i]; } 4) Zadanie do wykonania Przygotować program w języku C lub C++, który odczyta dane liczbowe z podanego pliku (w formacie tekstowym lub binarnym) i umieści je w uporządkowanej liście jednokierunkowej. Format danych (liczby całkowite, zmiennoprzecinkowe, zakres) do własnego wyboru. Funkcje programu: • wskazanie pliku do otwarcia (np. przez argument programu); • dodawanie odczytanych liczb do dynamicznej listy jednokierunkowej uporządkowanej w kolejności rosnącej; • odczyt i dodawanie do listy tylko liczb dodatnich (lub zera); • wyświetlanie zawartości listy w konsoli; • usuwanie listy (przed zakończeniem programu). Program powinien być wyposażony w mechanizmy odporności na błędy, m.in.: • sprawdzanie efektów otwarcia (lub nie) wskazanego pliku; • sprawdzanie zakresów liczb odczytanych z pliku z pomocą asercji; • sprawdzanie wskaźników zwracanych przez funkcje przydzielające pamięć (malloc, new) z pomocą asercji; Sprawdzić działanie gotowego programu w sposób symulujący błędy (brak pliku, niepoprawne dane) z włączoną oraz wyłączoną asercją (symbol NDEBUG).