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).