Wykrywanie, ocena skutecznoĹłci i
Transkrypt
Wykrywanie, ocena skutecznoĹłci i
POLITECHNIKA WARSZAWSKA Wydział Elektroniki i Technik Informacyjnych ROZPRAWA DOKTORSKA mgr inż. Piotr Paweł Nazimek Wykrywanie, ocena skuteczności i optymalizacja wykorzystania asercji w programach Promotor prof. dr hab. inż. Janusz Sosnowski Warszawa, 2011 Streszczenie Asercje programowe sa˛ jednym z mechanizmów stosowanych w celu podniesienia wiarygodności systemów komputerowych. Moga˛ one zostać określone poprzez zastosowanie algorytmów dynamicznego wykrywania asercji, które umożliwiaja˛ wyznaczenie dużej liczby różnego rodzaju zależności wyłacznie ˛ na podstawie informacji zebranych podczas wykonania programu, bez statycznej analizy jego kodu źródłowego. Charakter tych algorytmów oraz ograniczona ilość informacji, jaka˛ maja˛ do dyspozycji, rodza˛ pytania dotyczace ˛ przydatności stosowania wykrytych asercji oraz sposobu wyboru ich podzbioru umożliwiajacego ˛ skuteczna˛ detekcj˛e bł˛edów. W rozprawie zdefiniowane zostały miary pozwalajace ˛ wyrazić skuteczność oraz nieskuteczność asercji w procesie detekcji bł˛edów zarówno w sposób bezwzgl˛edny jak i wzgl˛edem innych asercji w badanym programie. Wyróżniono także szereg innych wielkości charakteryzujacych ˛ asercje takich jak: koszt statyczny, koszt dynamiczny, czas wykrycia bł˛edu i inne. Zaproponowane zostały metody ich pomiaru. Omówiony został także ogólny model optymalizacyjny w formie zadania programowania całkowitoliczbowego, którego celem jest wybór najlepszego zestawu asercji o preferowanych właściwościach. Uwzgl˛ednia on funkcje celu takie jak: skuteczność, nieskuteczność, koszt, liczba asercji oraz pokrycie bł˛edów. Praca zawiera również analiz˛e metody podniesienia skuteczności wykrywanych asercji poprzez uzupełnienie ich o ślad opisujacy ˛ przebieg wykonania programu z jakim sa˛ zwiazane. ˛ Poza zdefiniowaniem poj˛ecia śladu, operacji na śladzie i asercji ze śladem zaproponowano algorytmy służace ˛ wykrywaniu asercji ze śladem, redukcji liczby śladów w zbiorze asercji ze śladem, skracania śladów w zbiorze asercji ze śladem oraz redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem. Omówiono również sposoby weryfikacji asercji ze śladem w programach. Do badania proponowanych algorytmów opracowano oryginalne metody przeprowadzania eksperymentów. W rozprawie zawarto opis wykonanych eksperymentów, przedstawiono otrzymane wyniki oraz wypływajace ˛ z nich wnioski. W eksperymentach wykorzystano rzeczywiste aplikacje takie jak: sterownik linii produkcyjnej, implementacj˛e algorytmu rozwiazywania ˛ układu równań liniowych metoda˛ eliminacji Gaussa czy różne implementacje algorytmu kompresji danych z rodziny ZIP. Słowa kluczowe: asercja, asercja ze śladem, wykrywanie asercji, optymalizacja, wiarygodność oprogramowania, testowanie oprogramowania, detekcja bł˛edów, lokalizacja bł˛edów, tolerowanie bł˛edów. 3 Abstract Discovering, efficiency measurement and usage optimization of software assertions Software assertions are used to improve software reliability. One way of determining them is to use algorithms for dynamic detection of assertions that serve to identify high number of different conditions, based only on informations collected during execution of the program, without the static analysis of its source code. The nature of these algorithms and the limited amount of information to analyze needs to investigate the usefulness of discovered assertions and method of selecting a subset of them to ensure efficient detection of errors. Assertions (also called invariants, properties or conditions) dynamic detection algorithms are designed to find different types of dependences in programs based only on informations collected during their execution without static analysis. Specificity of those algorithms and limited quantity of data to analyze needs to investigate the usage principle of discovered dependences for software dependability increase. This thesis defines different types of measures to express efficiency and inefficiency of discovered assertions during error tolerance inspection or fault detection process. Also other measures like static cost, dynamic cost, error detection latency were defined. The methods of measurement are described for proposed values. There were also presented general optimization models in the form of integer programming problems with goal functions like efficiency, inefficiency, cost, number of assertions or error coverage. This dissertation introduces techniques for increasing efficiency of detected assertions through using program execution trace. Conceptions of trace, assertion with trace and trace operations were defined. The work describes several algorithms that allow discovering assertions with trace, reducing number of traces in assertions with trace set, shortening traces in assertions with trace set and reducing number of observation point id’s for assertions with trace sets. Different ways of assertions with trace verification are presented. Presented algorithms were investigated using original experimental methods. For several applications, like manufacture line control driver or implementations of compressing algorithm from ZIP family, experiments description and results have been presented. Keywords: assertion, assertion with trace, discovering assertions, optimization, software dependability, software testing, software fault detection, software debugging, error tolerance inspection. 4 Podzi˛ekowania Pragnałbym ˛ podzi˛ekować profesorowi Januszowi Sosnowskiemu za opiek˛e przez cały okres studiów doktoranckich oraz pomoc podczas tworzenia niniejszej rozprawy. Dzi˛ekuj˛e Rodzicom, Rodzinie, Koleżankom i Kolegom z Wydziału za wsparcie i pomoc podczas pracy nad doktoratem. Spis treści 1. Wprowadzenie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.1. Tło badań i przeglad ˛ literatury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 1.2. Teza i cel rozprawy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 1.3. Struktura rozprawy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 2. Wykrywanie asercji w programach . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 2.1. Algorytmy dynamicznego wykrywania asercji . . . . . . . . . . . . . . . . . . . . . . 17 2.1.1. Instrumentacja programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18 2.1.2. Kolekcjonowanie danych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 2.1.3. Wykrywanie asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 2.1.4. Analiza asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 2.1.5. Prezentacja wyników . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 Schematy systemów dynamicznego wykrywania asercji . . . . . . . . . . . . . . . . . 24 2.2.1. Tryb odroczony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 2.2.2. Tryb ciagły ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 2.3. Wykrywane asercje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 2.4. Zastosowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3. Parametry asercji i metoda selekcji asercji . . . . . . . . . . . . . . . . . . . . . . . . . . 33 2.2. 3.1. Definicje podstawowych poj˛eć . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.2. Parametry asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.1. Aktywność asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.2. Liczba sprawdzeń asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.2.3. Koszt statyczny asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.2.4. Koszt dynamiczny asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.2.5. Koszt położenia asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.6. Czas detekcji bł˛edu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.2.7. Zaufanie do asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.8. Atrybuty asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.2.9. Charakterystyki i profile asercji . . . . . . . . . . . . . . . . . . . . . . . . . . 41 3.2.10. Skuteczność i nieskuteczność asercji . . . . . . . . . . . . . . . . . . . . . . . 43 Metoda selekcji asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.3.1. Obserwacja asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.3.2. Wybór asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.3. 7 3.3.3. Weryfikacja wyników . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 3.3.4. Przykłady zastosowania metody selekcji asercji . . . . . . . . . . . . . . . . . 55 Podsumowanie i wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4. Asercje ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 3.4. 4.1. Ślad wykonania programu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 4.1.1. Rejestracja śladu wykonania programu . . . . . . . . . . . . . . . . . . . . . . 62 4.2. Poj˛ecie asercji ze śladem wykonania . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.3. Parametry asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.4. Wykrywanie asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 4.4.1. Algorytm redukcji liczby śladów w zbiorze asercji ze śladem . . . . . . . . . . 66 4.4.2. Algorytm skracania śladów w zbiorze asercji ze śladem . . . . . . . . . . . . . 67 Weryfikacja asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.5. 4.5.1. Algorytm redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.6. Przykład działania zaproponowanych algorytmów . . . . . . . . . . . . . . . . . . . . 72 4.7. Prezentacja asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75 4.7.1. Wykaz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.7.2. Digraf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.7.3. Multigraf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.7.4. Kolorowany multigraf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 Podsumowanie i wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 5. Optymalizacja wykorzystania asercji w programach . . . . . . . . . . . . . . . . . . . . . 81 4.8. 5.1. 5.2. Redukcja liczby asercji w programie . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 5.1.1. Charakterystyka badanych programów . . . . . . . . . . . . . . . . . . . . . . 82 5.1.2. Wykrywanie asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1.3. Pomiar parametrów asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 5.1.4. Wybór zestawów asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 5.1.5. Eksperymenty weryfikujace ˛ . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94 5.1.6. Wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Asercje ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 5.2.1. Charakterystyka badanych bibliotek . . . . . . . . . . . . . . . . . . . . . . . 115 5.2.2. Wykrywanie asercji ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . . 115 5.2.3. Liczba wykrytych asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 5.2.4. Analiza procesu wykrywania asercji . . . . . . . . . . . . . . . . . . . . . . . 118 5.2.5. Analiza nieprawidłowych naruszeń asercji . . . . . . . . . . . . . . . . . . . . 127 5.2.6. Analiza wykrywania bł˛edów przez asercje . . . . . . . . . . . . . . . . . . . . 129 5.2.7. Operacje na asercjach ze śladem . . . . . . . . . . . . . . . . . . . . . . . . . 134 5.2.8. Wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 8 6. Zastosowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 6.1. 6.2. Wybrane obszary zastosowań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 6.1.1. Systemy wykrywania asercji . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 6.1.2. Detekcja bł˛edów w programach . . . . . . . . . . . . . . . . . . . . . . . . . . 140 6.1.3. Lokalizacja bł˛edów w programach . . . . . . . . . . . . . . . . . . . . . . . . 140 6.1.4. Detekcja anomalii w działaniu programów . . . . . . . . . . . . . . . . . . . . 141 6.1.5. Wspomaganie pracy programisty/analityka/użytkownika . . . . . . . . . . . . . 141 6.1.6. Systemy weryfikacji oprogramowania . . . . . . . . . . . . . . . . . . . . . . 142 6.1.7. Inne zastosowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 System nadzoru transportu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 7. Podsumowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 7.1. Spostrzeżenia i wnioski . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 7.2. Kierunki dalszych badań . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Bibliografia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 A. Zaimplementowane oprogramowanie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 A.1. Pakiet AEM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 A.1.1. Program aemshm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 A.1.2. Program aemtool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 A.1.3. Biblioteka aem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165 A.1.4. Skrypt aem2stats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 A.1.5. Skrypt aem2report . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 A.2. Pakiet FlowGraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 A.2.1. Skrypt invariant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 A.2.2. Skrypt analyze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 A.2.3. Skrypt injector . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 A.2.4. Skrypt transform . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 9 1. Wprowadzenie Zadania wykonywane przez współczesne systemy informatyczne staja˛ si˛e coraz bardziej krytyczne i cz˛esto bezpośrednio wpływaja˛ na jakość oraz bezpieczeństwo życia człowieka. Ich całościowa weryfikacja z użyciem metod formalnych lub wykorzystaniem wiedzy zespołu doświadczonych inżynierów jest w wi˛ekszości przypadków niewykonalna. to zarówno czynniki techniczne jak i ekonomiczne. Wpływaja˛ na Przykładem pierwszych moga˛ być czas i wiedza wymagana do efektywnego stosowania metod formalnych, do drugich można zaliczyć elementy takie jak zmniejszanie kosztów tworzenia oprogramowania czy też czas wprowadzania produktu na rynek. Ograniczenia jakie maja˛ współczesne metody weryfikacji poprawności systemów informatycznych oraz oczekiwania jakie si˛e przed nimi stawia wymuszaja˛ poszukiwanie nowych metod ułatwiajacych ˛ i zwi˛ekszajacych ˛ efektywność tych procesów. Szczególnie interesujace ˛ sa˛ te, w których minimalizuje si˛e zaangażowanie człowieka, a mimo to charakteryzuja˛ si˛e wysoka˛ skutecznościa˛ oraz pewnymi wartościami dodanymi. Jedna˛ z takich metod jest dynamiczna analiza programów w celu wykrycia w nich pewnych właściwości przydatnych mi˛edzy innymi w procesie testowania, weryfikacji, detekcji czy lokalizacji bł˛edów. 1.1. Tło badań i przeglad ˛ literatury Asercja˛ w dziedzinie inżynierii oprogramowania nazywamy formalna˛ zależność opisujac ˛ a˛ zachowanie systemu, które jest wymagane podczas jego działania [91]. Zależność ta może być określona w sposób bardzo zróżnicowany, na przykład poprzez wyrażenie algebraiczne, logiczne lub w sposób opisowy. Systemem zaś może być program [83] czy też układ elektroniczny [10, 34] realizujacy ˛ określone zadania. Asercje moga˛ być określane manualnie przez projektanta lub przy zastosowaniu jednej z automatycznych metod ich wykrywania. Wśród nich wyróżniamy metody statyczne, dynamiczne i mieszane. Metody statycznego wykrywania asercji [7, 80, 88, 94] bazuja˛ na algorytmach, które odkrywaja˛ je na podstawie statycznej analizy kodu źródłowego lub budowy układu. Metody dynamicznego wykrywania asercji wykorzystuja˛ proces dynamicznej analizy programu [6] w celu poszukiwania asercji w oparciu o dane, jakie można zebrać podczas jego wykonania lub działania badanego układu. Metody mieszane [90, 108] bazuja˛ na algorytmach zarówno statycznego jak i dynamicznego wykrywania asercji. 11 Wśród wymienionych metod wykrywania asercji na szczególna˛ uwag˛e zasługuja˛ metody dynamiczne i na nich skupiono si˛e w rozprawie. Pozwalaja˛ one odkrywać asercje w sposób automatyczny, bez lub z minimalnym udziałem projektanta lub programisty. Tak znalezione asercje prezentuja˛ zachowanie danego systemu podczas jego działania i pozwalaja˛ wyeliminować pewne ograniczenia metod statycznych, jak na przykład zbyt duża ogólność asercji czy niemożność zaawansowanej analizy programu wykorzystujacego ˛ dynamicznie tworzone struktury danych lub polimorfizm. Problematyka wykrywania asercji metodami dynamicznymi oraz ich wykorzystania jest tematem wielu prac badawczych, artykułów i rozpraw. Jednym z pierwszych i obecnie najbardziej zaawansowanych narz˛edzi w tej dziedzinie jest Daikon1 . Powstało ono jako efekt rozprawy [29] majacej ˛ na celu zbadanie możliwości wykrywania i zastosowania asercji (nazywanych tu prawdopodobnymi niezmiennikami) w programach. Wykrywa ono ponad siedemdziesiat ˛ typów różnych warunków arytmetycznych i logicznych opisujacych ˛ zwiazki ˛ pomi˛edzy zmiennymi w programie lub elementami struktur danych takich jak tablice czy listy dynamiczne. W pracach [21, 29, 30, 32, 79] zaprezentowano różnorodne metody oraz algorytmy stosowane na etapie pozyskiwania danych oraz dynamicznego wykrywania asercji w pakiecie Daikon [33, 66] oraz rozważono problemy takie jak określanie poziomu zaufania do znalezionych asercji czy też eliminacji nadmiarowych asercji, na przykład takich, których warunki si˛e pokrywaja˛ lub po przekształceniach wyrażaja˛ identyczna˛ zależność. Nieco mniej zaawansowanym narz˛edziem o podobnym działaniu jest DIDUCE2 [44]. Wykrywa on mniejsza˛ liczb˛e różnego rodzaju asercji. Narz˛edzie to posiada możliwość automatycznego wprowadzania, a tym samym weryfikacji wykrytych asercji w analizowanym programie. Upraszcza to praktyczne wykorzystanie znalezionych asercji. Jako przykład kolejnego narz˛edzia tego typu można podać pakiet Axiom Meister3 [16], który jest oprogramowaniem komercyjnym, w przeciwieństwie do Daikon i DIDUCE. Wymienione dotychczas narz˛edzia i prace skupiaja˛ si˛e na wykrywaniu asercji, które opieraja˛ swoje działanie na detekcji bł˛edów w danych, jakie przetwarza analizowany program. Innym rodzajem asercji sa˛ asercje badajace ˛ poprawność wykonania programu w odniesieniu do weryfikacji kolejności realizowanych przez niego operacji. Szereg prac poświ˛econych jest dynamicznemu wykrywaniu zależności temporalnych na podstawie obserwacji przebiegu wykonania programu. Do najważniejszych należy zaliczyć projekt Perracotta4 [111–115] oraz prace zwiazane ˛ z badaniem zależności pomi˛edzy wołanymi metodami (tak zwane wydobywanie specyfikacji) [3, 4]. W artykule [86] zaproponowano metod˛e monitorowania aplikacji polegajacego ˛ na wykonywaniu pomiarów czasu pomi˛edzy wybranymi jego punktami, a nast˛epnie wykorzystania zebranych danych do weryfikacji 1 2 3 4 http://pag.csail.mit.edu/daikon/ http://sourceforge.net/projects/diduce/ http://research.microsoft.com/projects/mutt/ http://www.cs.virginia.edu/perracotta/ 12 poprawności jego wykonania. Można uznać to za jedna˛ z metod wykrywania asercji badajacych ˛ poprawność przebiegu działania programu. Inne metody wykrywania asercji majacych ˛ na celu weryfikacj˛e poprawności przebiegu programu bazuja˛ na jego analizie podczas kompilacji lub przez programist˛e. Należy zakwalifikować je do rodziny metod statycznego wykrywania asercji w programie. Interesujace ˛ dla omawianego zagadnienia sa˛ w nich metody reprezentacji asercji bazujace ˛ na: wykorzystaniu kolejek w metodzie CCA [1], przyporzadkowaniu ˛ odpowiednich liczb pierwszych blokom programu i operacjach na nich w metodzie ECCA [2], wykorzystaniu sygnatur w metodzie CFCSS [75] i CEDA [104], wykorzystaniu zmiennej w programie, która jest w odpowiedni sposób modyfikowana w każdym jego bloku i pewne jej wartości reprezentuja˛ prawidłowy przebieg (metoda YACCA) [38] oraz użyciu mechanizmu wyrażeń regularnych do konstrukcji asercji [8]. Techniki umożliwiajace ˛ usuwanie lub łaczenie ˛ odpowiednich bloków w programie, dla których wyznaczane maja˛ być asercje badajace ˛ poprawność przebiegu jego wykonania, tak aby uwzgl˛edniony był założony koszt zwiazany ˛ z użyciem dodatkowych instrukcji w badanym programie zaproponowano w pracy [105]. Naturalnym, bezpośrednim sposobem zastosowania znalezionych warunków jest wykorzystanie ich w postaci asercji programowych. Pozwala to zaobserwować sytuacje, w której dojdzie do niespełnienia znalezionej asercji. Dzi˛eki temu mechanizmowi w wielu przypadkach możliwa jest szybka detekcja i lokalizacja bł˛edów. Sformalizowanie tej idei w postaci określania warunków poczatkowych, ˛ niezmienników oraz warunków końcowych przy wykonywaniu obliczeń przez programy [45] stało si˛e podstawa˛ do opracowania metodologii projektowania zwiazanego ˛ umowa˛ [61,100]. Jest ona wykorzystywana jako podstawa j˛ezyków programowania takich jak Eiffel5 oraz bibliotek [39,49] i narz˛edzi wspomagajacych ˛ projektowanie i weryfikacj˛e oprogramowania, wśród których można wymienić JML6 [12, 54, 55, 65] oraz ESC/Java27 [15, 52, 67, 73] dedykowane dla j˛ezyka Java8 , JACK9 [13] przeznaczone dla apletów dla kart inteligentnych Java Card10 [64, 71] czy Spec#11 dedykowane dla środowiska .NET12 . Moga˛ one wykorzystywać również asercje wykryte w sposób dynamiczny [20]. Do innych zastosowań efektów pracy narz˛edzi dynamicznie wykrywajacych ˛ asercje należy zaliczyć: automatyczna˛ generacj˛e przypadków testowych dla badanych programów [22, 76, 110, 116], wspomaganie procesu testowania [109] oraz integracji [59, 60] oprogramowania w złożonych środowiskach, profilowanie oprogramowania [28], wspomaganie lokalizacji lub automatyczne lokalizowanie różnego rodzaju bł˛edów [11, 57, 62, 84, 85], zautomatyzowane generowanie specyfikacji badanego oprogramowania [74] oraz jego refaktoryzacj˛e [50]. Metody te stosowane sa˛ również 5 http://www.eiffel.com http://www.cs.iastate.edu/ leavens/JML/ 7 http://sort.ucd.ie/projects/escjava/ 8 http://java.sun.com 9 http://www-sop.inria.fr/everest/soft/Jack/jack.html 10 http://java.sun.com/javacard/ 11 http://research.microsoft.com/projects/specsharp/ 12 http://www.microsoft.com/net/ 6 13 w obszarze zwiazanym ˛ z detekcja˛ bł˛edów sprz˛etowych [93]. Techniki sprz˛etowej implementacji wykrytych asercji zaproponowano w [78]. Znalezione asercje (niezmienniki) programu moga˛ również być użyte w procesie rozwoju i weryfikacji oprogramowania, które bazuja˛ na zastosowaniu metod formalnych [89, 101]. Podobne prace prowadzone były w Instytucie Informatyki Politechniki Warszawskiej [23, 53]. Niektóre z narz˛edzi, jak wspomniany już DIDUCE, posiadaja˛ możliwość automatycznego wprowadzania znalezionych już asercji do badanego programu w trakcie procesu jego dynamicznej analizy. W literaturze omawiana jest również problematyka określania i poprawy jakości wykrytych asercji oraz różnorodne sposoby ich oceny. Poza wymienionymi już metodami wyznaczania wartości wyrażajacej ˛ zaufanie do znalezionych asercji oraz eliminacji wybranych z nich rozważone zostały zagadnienia dotyczace ˛ uogólniania wykrytych asercji poprzez eliminacj˛e warunków wynikajacych ˛ z polimorfizmu w obiektowych j˛ezykach programowania, pomijania nadmiarowych asercji czy nieistotnych danych zebranych na etapie obserwacji programu [27, 29, 31]. Poruszone zostało również zagadnienie wykorzystania losowych oraz pseudolosowych danych wejściowych dla badanych programów [29], które uruchamiane sa˛ w celu obserwacji skutkujacej ˛ wyszukiwaniem asercji. Przedstawione zostały inne metody oceny asercji bazujace ˛ na analizie pokrycia strukturalnego badanego programu [42] przez wykryte asercje, zastosowaniu testowania strukturalnego w ocenie wykrytych asercji [87] oraz stosowaniu metody ograniczeń [25] w procesie analizy poprawności znalezionych asercji. Autorzy opracowań dotyczacych ˛ przedstawionych problemów skupili si˛e na realizacji postawionych zadań na etapie procesu wykrywania asercji. Należy zauważyć, że tematyka dynamicznego wykrywania asercji i ich późniejszego wykorzystania nie jest jedynie domena˛ akademickich projektów badawczych. Realizowane sa˛ również badania w prywatnych ośrodkach i powstaja˛ narz˛edzia komercyjne przeznaczone do tego celu. Przykładem takiego pakietu może być AgitarOne13 wspomagajacy ˛ testowanie oprogramowania w j˛ezyku Java, którego jednym z elementów jest moduł dynamicznie wykrywajacy ˛ mi˛edzy innymi szeroka˛ gam˛e prostych warunków arytmetycznych [95]. Wymienione prace skupiaja˛ si˛e głównie na problematyce wykrywania asercji oraz ich zastosowania do detekcji i lokalizacji bł˛edów na etapie testowania oraz weryfikacji oprogramowania. W marginalny sposób poruszane sa˛ problemy takie jak wykorzystanie asercji do detekcji bł˛edów podczas walidacji lub produkcyjnego działania systemu. Istotna staje si˛e wtedy redukcja liczby sprawdzanych asercji tak, aby zapewnić odpowiednia˛ wydajność systemu, co oznacza, że konieczne jest wybranie najskuteczniejszych z nich [68, 107]. Interesujace ˛ również jest zbadanie możliwości automatycznego wykrywania metodami dynamicznymi takich asercji, których manualne określenie jest trudne, ale sama ich interpretacja nie jest skomplikowana (nie opisuja˛ skomplikowanych zależności). Należa˛ do nich asercje zależne od przebiegu 13 http://www.agitar.com 14 wykonania programu, utworzone poprzez połaczenie ˛ asercji weryfikujacych ˛ poprawność danych przetwarzanych w programie oraz asercji badajacych ˛ poprawność przebiegu wykonania programu [69]. 1.2. Teza i cel rozprawy Teza rozprawy brzmi nast˛epujaco: ˛ Poprzez zastosowanie odpowiedniej strategii selekcji asercji w programie oraz uzależnienie ich od przebiegu wykonania programu możliwa jest redukcja liczby stosowanych asercji przy zachowaniu wysokiego poziomu detekcji bł˛edów. Celem rozprawy jest: Zaproponowanie zestawu parametrów umożliwiajacych ˛ ocen˛e asercji oraz metody ich selekcji dla programu pod wzgl˛edem zdefiniowanych kryteriów oraz opracowanie metody automatycznego wykrywania asercji zależnych od przebiegu (śladu) wykonania programu. Tak postawiony cel rozprawy osiagni˛ ˛ eto poprzez analiz˛e poniższych zagadnień oraz opracowanie ich rozwiazań, ˛ w których zawartych jest szereg oryginalnych koncepcji autora: — zaproponowanie miar pozwalajacych ˛ ocenić asercje stosowane w programie pod wzgl˛edem zróżnicowanych kryteriów takich jak koszt statyczny, dynamiczny, skuteczność oraz nieskuteczność w detekcji bł˛edów, — opracowanie metody pozwalajacej ˛ na optymalny wybór asercji pod wzgl˛edem zdefiniowanych kryteriów opisujacych ˛ ich właściwości i zachowanie z uwzgl˛ednieniem określonych ograniczeń, — zaproponowanie kryteriów i metody selekcji asercji, — eksperymentalna weryfikacja zaproponowanej metody selekcji asercji z wykorzystaniem symulatorów bł˛edów, — opracowanie algorytmu wyznaczania i eksperymentalne zbadanie asercji zależnych od przebiegu programu (asercji ze śladem), — zaproponowanie algorytmów zwiazanych ˛ z wydajnym stosowaniem asercji ze śladem umożliwiajacych ˛ eliminacj˛e nadmiarowych śladów, ich skracanie oraz redukcj˛e liczby identyfikatorów stosowanych w śladach. Istotnym elementem pracy jest również opracowanie metodyki badań eksperymentalnych oraz modułów programowych wspomagajacych ˛ przeprowadzenie testów i analiz˛e otrzymanych wyników. Wykorzystane zostały one w praktyce podczas analizy przykładowych programów w aspekcie omawianej tematyki. 15 1.3. Struktura rozprawy Rozprawa złożona jest z siedmiu rozdziałów, bibliografii oraz dodatku. Rozdział pierwszy poświ˛econo nakreśleniu tła tematu pracy, przegladu ˛ literatury oraz sformułowaniu tezy i celu rozprawy. W rozdziale drugim przedstawiono i usystematyzowano metody dynamicznego wykrywania asercji w programach, zaprezentowano ich zalety i wady, stosowane algorytmy i rodzaje wykrywanych asercji. Omówiono również wybrane zastosowania wykrytych asercji oraz ich wpływ na podnoszenie wiarygodności systemów w kontekście możliwych bł˛edów programowych, sprz˛etowych, środowiska i konfiguracji. Rozdział trzeci wprowadza definicje miar pozwalajacych ˛ na ocen˛e asercji stosowanych w oprogramowaniu. Zaprezentowano także metod˛e pozwalajac ˛ a˛ na wybór najlepszych asercji według kryteriów zwiazanych ˛ mi˛edzy innymi z ich skutecznościa,˛ nieskutecznościa,˛ kosztem stosowania wraz z uwzgl˛ednieniem narzuconych ograniczeń. W rozdziale czwartym zaproponowano oryginalna˛ metod˛e podniesienia wiarygodności wykrywanych asercji poprzez uzależnienie ich od przebiegu wykonania programu. Wprowadzono poj˛ecie śladu wykonania programu oraz asercji ze śladem. Przedstawione zostały metody pozwalajace ˛ na dynamiczne wykrywanie tego typu asercji oraz ich późniejsza,˛ praktyczna˛ weryfikacj˛e w badanym oprogramowaniu. Zaprezentowano również algorytmy przeznaczone do wydajnego stosowania asercji ze śladem. Rozdział piaty ˛ poświ˛econy jest badaniom metod zaprezentowanych w dwóch poprzednich rozdziałach. Dla wybranych programów takich jak sterownik linii produkcyjnej, implementacja algorytmu rozwiazywania ˛ układu równań liniowych metoda˛ eliminacji Gaussa czy różne implementacje algorytmu kompresji danych z rodziny ZIP zastosowane zostały zaproponowane algorytmy. W rozdziale przedstawiono opis przeprowadzonych eksperymentów, otrzymane wyniki oraz wypływajace ˛ z nich wnioski. Treść rozdziału jest potwierdzeniem możliwości oraz zasadności stosowania omówionych metod w praktyce inżynierskiej. Wybrane zastosowania opracowanych metod w szeroko poj˛etym procesie rozwoju oprogramowania zostały rozważone w rozdziale szóstym. Zaprezentowano w nim nie tylko możliwość użycia asercji do detekcji i lokalizacji bł˛edów programowych, które jest głównie omawiane w literaturze, ale również do wykrywania innego typu bł˛edów zwiazanych ˛ z konfiguracja˛ czy środowiskiem działania aplikacji. W rozdziale omówiono również wyniki wykorzystania asercji ze śladem dla aplikacji komercyjnej działajacej ˛ w środowisku produkcyjnym. Rozdział siódmy poświ˛econo na podsumowanie treści rozprawy, zaprezentowanie spostrzeżeń oraz wniosków i nakreślenie kierunków dalszych badań majacych ˛ na celu rozwój omawianej tematyki. W dodatku zamieszczono opis pakietów oprogramowania stworzonych w celu przeprowadzenia eksperymentów w ramach niniejszej rozprawy. 2. Wykrywanie asercji w programach Metody dynamicznego wykrywania asercji wykorzystuja˛ techniki dynamicznej analizy programu w celu poszukiwania asercji w oparciu o dane, jakie można zebrać podczas jego wykonania. Poniżej omówiono struktury algorytmów używanych w tym procesie wraz z wykorzystywanymi narz˛edziami i metodami. Zaprezentowano zalety i wady przedstawionych rozwiazań. ˛ Omówione zostały również wybrane zastosowania wykrytych asercji oraz ich wpływ na podnoszenie wiarygodności systemów. 2.1. Algorytmy dynamicznego wykrywania asercji Dynamiczne metody wykrywania asercji bazuja˛ wyłacznie ˛ na informacjach, które można zebrać podczas wykonania programu, bez statycznej analizy jego kodu źródłowego. W metodach tych można wyróżnić nast˛epujace ˛ kroki: 1. instrumentacja programu – wyposażenie badanego programu w mechanizmy umożliwiajace ˛ współprac˛e z systemem wykrywania asercji, które pozwola˛ na obserwacj˛e jego działania, 2. kolekcjonowanie danych – zebranie danych z uruchomienia (uruchomień) badanego programu, które poddane zostana˛ dalszej analizie w celu wykrycia asercji, 3. wykrywanie asercji – wykonanie algorytmu (algorytmów) wykrywania określonego rodzaju asercji na podstawie wcześniej zebranych danych, 4. analiza wykrytych asercji – etap ten ma na celu automatyczne usuni˛ecie nieodpowiednich asercji (na przykład nadmiarowych asercji, które zostały znalezione przez różne algorytmy wykrywania asercji, a weryfikuja˛ identyczne warunki), 5. prezentacja wyników – prezentacja wykrytych asercji użytkownikowi lub ich eksport w formie pozwalajacej ˛ na użycie w innych systemach (na przykład przeznaczonych do specyfikacji lub weryfikacji oprogramowania). Poniżej omówione zostały szczegóły dotyczace ˛ kolejnych etapów metod dynamicznego wykrywania asercji. 17 2.1.1. Instrumentacja programu Instrumentacja programu ma na celu wyposażenie go w mechanizmy, które pozwola˛ na zebranie niezb˛ednych informacji przeznaczonych dla przeprowadzenia procesu wykrywania asercji. Musza˛ być one przygotowane w takim formacie, aby były zrozumiałe dla systemu wykrywania asercji. Modyfikacja może być wykonana r˛ecznie, poprzez wstawienie odpowiednich instrukcji do kodu źródłowego programu i ponowna˛ jego kompilacj˛e, lub automatycznie, przy wykorzystaniu narz˛edzi modyfikujacych ˛ kod źródłowy lub wykonywalny badanej aplikacji. W celu odpowiedniej instrumentacji programu należy wybrać w nim pewne punkty, w których dokonywana b˛edzie obserwacja wybranych jego parametrów oraz zmiennych. Takie miejsca, nazywane punktami obserwacji w programie, zostaja˛ wybrane poprzez ich wskazanie lub ustalenie pewnego szablonu, na podstawie którego sa˛ określane. Sposób wyboru konkretnych typów punktów obserwacji zależy od możliwości stosowanych narz˛edzi. Przykładowymi punktami obserwacji moga˛ być: — wywołania metod (funkcji, procedur) – obserwowane moga˛ być parametry wejściowe wywoływanych metod, — wyjścia z metod (funkcji, procedur) – obserwowany może być efekt działania metod (na przykład wartość zwracana z funkcji), — miejsca b˛edace ˛ poczatkiem ˛ lub końcem wydzielonego bloku programu – obserwowane moga˛ być wartości zmiennych przed lub po wykonaniu określonego bloku programu (na przykład p˛etli czy instrukcji warunkowej), — miejsca, w których odczytywana lub modyfikowana jest wartość określonej zmiennej, — miejsca wybranie na podstawie odpowiedniej strategii, w których umieszczenie wykrytych asercji może być najbardziej korzystne z uwagi na detekcj˛e bł˛edów [77]. Wprowadzane do programu modyfikacje musza˛ mieć charakter pasywny, co oznacza, że nie moga˛ one zmieniać rejestrowanych wartości lub przebiegu wykonania programu. Mogłoby mieć to wpływ na działanie całej aplikacji. Najcz˛eściej w punktach obserwacji dokonuje si˛e zebrania dost˛epnych informacji takich jak wartości wybranych zmiennych lokalnych i globalnych. Narz˛edzia wykrywajace ˛ asercje posiadaja˛ wbudowane mechanizmy pozwalajace ˛ na odpowiednia˛ instrumentacj˛e programu lub korzystaja˛ z zewn˛etrznych aplikacji umożliwiaja˛ cych zebranie danych do dalszej analizy. Przykładem realizacji pierwszego podejścia jest analizator kodu bajtowego dla j˛ezyka Java wbudowany bezpośrednio w pakiet DIDUCE [44]. Umożliwia on obserwacj˛e wybranych klas, metod lub zmiennych globalnych bez dost˛epu do kodu źródłowego badanego programu. Rozwiazania ˛ tego typu stosowane sa˛ również w oprogramowaniu komercyjnym, takim jak AgitarOne [95]. Wada˛ tak realizowanej instrumentacji programów jest brak praktycznej możliwości wykorzystania wymienionych narz˛edzi wykry18 wajacych ˛ asercje dla innych j˛ezyków programowania niż te, dla których je przygotowano. Odmienne podejście zastosowane zostało w pakiecie Daikon [29]. Posiada on budow˛e modułowa.˛ Podsystem wykrywajacy ˛ asercje oczekuje na odpowiednio przygotowane dane, które zebrane zostaja˛ w pliku podczas uruchomienia badanego programu. Moga˛ one zostać przygotowane dzi˛eki użyciu narz˛edzi opracowanych dla wybranych j˛ezyków programowania. Narz˛edzia te przeprowadzaja˛ proces instrumentacji i obserwacji programu. Wybierajac ˛ jako kryterium form˛e analizowanych aplikacji można wyróżnić dwa typy tego rodzaju oprogramowania: pracujace ˛ bezpośrednio z użyciem plików wykonywalnych (programy skompilowane dla określonej platformy sprz˛etowej i systemu operacyjnego) oraz modyfikujace ˛ kod źródłowy. Dla j˛ezyków C/C++, na bazie oprogramowania Valgrind1 [72] przeznaczonego do analizy plików wykonywalnych o formatach obejmujacych ˛ różne platformy sprz˛etowe, systemy operacyjne oraz kompilatory, przygotowane zostało rozszerzenie Fjalar2 [40], które stanowi baz˛e do realizacji procesu kolekcjonowania danych niezb˛ednych do wykrywania asercji. Sa˛ one realizowane przez narz˛edzie Kvasir3 [26], które umożliwia śledzenie wartości zmiennych w programie oraz DynComp4 [41], które pozwala na obserwacj˛e obiektów tworzonych dynamicznie podczas działania badanej aplikacji. Narz˛edzia te dodaja˛ w odpowiednich miejscach plików wykonywalnych dodatkowy kod maszynowy rejestrujacy ˛ wybrane zdarzenia takie jak zmiana wartości obserwowanej zmiennej lub wywołanie metody. Kod bajtowy j˛ezyka Java analizowany jest z użyciem Chicory [26], który posiada podobne możliwości jak analizator wbudowany w pakiet DIDUCE. Oprogramowaniem, którego możliwości pozwalaja˛ na zastosowanie w procesie instrumentacji plików wykonywalnych jest również pakiet Pin5 [58] udost˛epniony przez firm˛e Intel. Jednak obecnie nie jest on bezpośrednio wykorzystywany przez żadne z narz˛edzi wykrywajacych ˛ asercje. Inne aplikacje przeznaczone do instrumentacji programu wymagaja˛ dost˛epu do jego kodu źródłowego, ponieważ bezpośrednio w nim wprowadzane sa˛ odpowiednie zmiany. Nast˛epnie badana aplikacja musi zostać ponownie skompilowana, jeśli stworzona jest w j˛ezyku, który tego wymaga. Po wykonaniu tych operacji może zostać poddana obserwacji. W pakiecie Daikon przygotowane zostało rozszerzenie Mangel-Wurzel dla j˛ezyków C/C++ współpracujace ˛ z komercyjnym narz˛edziem Rational Purify6 . Modyfikuje ono bezpośrednio kod źródłowy badanej aplikacji. Analogiczne narz˛edzia umożliwiaja˛ instrumentacj˛e programów w innych j˛ezykach programowania. W ramach projektu CITADEL7 [81, 82] przygotowany został analizator dla programów zaimplementowanych w j˛ezyku Eiffel. Możliwe 1 2 3 4 5 6 7 http://valgrind.org/ http://groups.csail.mit.edu/pag/fjalar/ http://groups.csail.mit.edu/pag/daikon/ http://groups.csail.mit.edu/pag/daikon/ http://www.pintool.org/ http://www-01.ibm.com/software/awdtools/purify/ http://se.inf.ethz.ch/people/polikarpova/citadel.html 19 jest także wykrywanie asercji dla programów stworzonych w IOA8 [24,35] oraz instrumentacja skryptów w j˛ezyku Perl9 za pomoca˛ narz˛edzia dfepl [26]. Wynikiem działania wymienionych narz˛edzi sa˛ programy w formie wykonywalnej lub ich kody źródłowe przygotowane do przeprowadzenia kolejnego kroku dynamicznego wykrywania asercji jakim jest proces kolekcjonowania danych. Zebrane w ten sposób informacje zostaja˛ nast˛epnie poddane dalszej analizie na etapie wykrywania asercji. Otwarta specyfikacja budowy plików przetwarzanych przez systemy wykrywania asercji takie jak Daikon pozwala na ich integracj˛e z każdym j˛ezykiem programowania. Inne narz˛edzia zwiazane ˛ z wykrywaniem asercji w programach, jak na przykład Perracotta [115], pomijaja˛ problematyk˛e instrumentacji badanych programów oczekujac ˛ jedynie odpowiednio przygotowanego pliku opisujacego ˛ przebieg jego wykonania. Podczas przeprowadzania eksperymentów w ramach niniejszej rozprawy dla j˛ezyków Java oraz C/C++ zastosowano z sukcesem technik˛e programowania aspektowego [14]. Wśród dost˛epnych narz˛edzi oraz w literaturze niespotykane sa˛ przykłady stosowania tej metody. Umożliwia ona obserwacj˛e wybranych punktów programu poprzez implementacj˛e aspektów rejestrujacych ˛ stan wybranych zmiennych programu. Aspekty te zostana˛ wykonane w wyznaczonych miejscach takich jak na przykład przed lub po uruchomieniu metody. Należy jednak zwrócić uwag˛e, że niektóre z implementacji idei programowania aspektowego moga˛ wymagać dost˛epu do kodu źródłowego programu. Zaleta˛ rozwiazań ˛ bazujacych ˛ na bezpośredniej instrumentacji plików wykonywalnych jest brak konieczności posiadania kodów źródłowych badanych programów. Jednak rozwiazania ˛ te sa˛ trudniejsze do praktycznej realizacji i cz˛esto niemożliwe jest zaawansowane śledzenie programu z uwagi na brak wbudowanych w plik wykonywalny dodatkowych informacji kompilatora oraz wykonana˛ przez niego optymalizacj˛e. Narz˛edzia przeprowadzajace ˛ instrumentacj˛e bezpośrednio z użyciem kodów źródłowych sa˛ łatwiejsze w implementacji, a wykryte w ten sposób asercje powiazane ˛ sa˛ z konkretnymi miejscami w źródłach badanych aplikacji. Pozwala to na łatwiejsza˛ lokalizacj˛e bł˛edów wykrytych za pomoca˛ znalezionych asercji. 2.1.2. Kolekcjonowanie danych Etap ten służy wydobyciu z informacji uzyskiwanych podczas uruchomienia programu danych, które w nast˛epnym kroku b˛eda˛ analizowane w celu wykrycia asercji. Dane zbierane sa˛ w sposób zależny od wcześniejszej modyfikacji badanej aplikacji. W momencie osiagni˛ ˛ ecia określonego miejsca w programie, który został wybrany jako punkt obserwacji, informacje takie jak identyfikator danego punktu w programie oraz wartości obserwowanych zmiennych gromadzone sa˛ na potrzeby dalszej analizy na etapie wykrywania asercji. Istniejace ˛ rozwiazania ˛ 8 9 http://groups.csail.mit.edu/tds/ioa/ http://www.perl.org/ 20 zapisuja˛ je do pliku tekstowego (Daikon), przechowuja˛ w pami˛eci operacyjnej (DIDUCE) lub bazie danych (AgitarOne). Dane nie musza˛ być kolekcjonowane na tej samej maszynie, na której uruchamiany jest badany program. Takie rozwiazanie ˛ zastosowano w AgitarOne. Polega ono na użyciu zewn˛etrznej bazy danych w celu zwi˛ekszenia wydajności działania systemu wykrywajacego ˛ asercje i odcia˛żenia maszyny, na której uruchamiana jest aplikacja. Uruchomienie badanego programu może wiazać ˛ si˛e z potrzeba˛ przygotowania zestawu (zestawów) danych wejściowych, jeśli sa˛ konieczne do jego działania. Od nich zależne sa˛ informacje zebrane podczas obserwacji programu, a w efekcie liczba i jakość wykrytych asercji. Dane te moga˛ być przygotowane manualnie lub w sposób automatyczny. Manualne opracowanie danych wejściowych może zostać zrealizowane na przykład poprzez implementacj˛e zróżnicowanych scenariuszy testowych dla badanej aplikacji, w których bada si˛e jej zachowanie i ocenia jego poprawność przy wyznaczonych warunkach wst˛epnych. Z uwagi na zaangażowanie człowieka jest to proces czasochłonny i kosztowny. Tej wady moga˛ być pozbawione metody automatycznej generacji danych wejściowych. Przy zastosowaniu generatorów losowych dla określonych typów danych wejściowych jakie oczekiwane sa˛ przez program możliwe jest wytworzenie dużej ich liczby niewielkim kosztem [43]. Sposób ten może jednak prowadzić do niezadowalajacego ˛ pokrycia kodu badanej aplikacji, a w efekcie do wykrycia asercji o niskiej jakości lub dla mniejszej liczby punktów obserwacji. Jest to metoda, która nie powinna być stosowania do wszystkich typów aplikacji, w szczególności, kiedy aplikacja stworzona jest do przetwarzania jedynie pewnego zakresu danych lub pomi˛edzy danymi wejściowymi musza˛ wyst˛epować określone wst˛epne zależności, aby wygenerowane wyniki miały praktyczna˛ wartość. Losowe generowanie danych wejściowych może być przydatne dla aplikacji bez ściśle określonych warunków, jakie musza˛ one spełniać. Przykładami takich programów moga˛ być aplikacje obliczeniowe rozwiazuj ˛ ace ˛ układy równań lub realizujace ˛ algorytmy kompresji danych. Technika losowego generowania danych wejściowych została wykorzystana w pracy dla konkretnych implementacji wymienionych klas aplikacji, których użyto podczas przeprowadzania eksperymentów. Bardziej zaawansowane metody, tworzace ˛ dane wejściowe w sposób pseudolosowy, polegaja˛ na wykorzystaniu algorytmów generujacych ˛ dane wejściowe z uwzgl˛ednieniem ich odpowiedniej jakości odzwierciedlajacej ˛ si˛e na przykład w zapewnieniu wysokiego poziomu pokrycia kodu lub uwzgl˛ednieniu specyfiki działania badanego programu [29]. Najcz˛eściej wymagaja˛ one stworzenia dedykowanego generatora danych wejściowych dla badanej aplikacji, który b˛edzie uwzgl˛edniał sposób jej implementacji i działania. Do ich oceny można stosować różne miary pokrycia wykorzystywane w procesie testowania oprogramowania [96]. Proces kolekcjonowania danych może również zostać zrealizowany przy wykorzystaniu istniejacych ˛ już dzienników działania aplikacji, które opisuja˛ przebieg jej wykonania i zawieraja˛ informacje, takie jak wartości zmiennych programu, potrzebne do wykrycia żadanych ˛ asercji. 21 W takim przypadku konieczne jest jedynie odpowiednie przetworzenie posiadanych informacji na potrzeby dalszej analizy. Oznacza to, że nie zawsze na etapie kolekcjonowania danych musi zachodzić konieczność uruchamiania i obserwowania badanego programu. 2.1.3. Wykrywanie asercji Asercje wykrywane sa˛ z użyciem dedykowanych algorytmów zależnych od rodzaju wyst˛epujacego ˛ w nich warunku. Każde z narz˛edzi implementuje pewien skończony zbiór typów wykrywanych asercji. Jest to najcz˛eściej realizowane poprzez implementacj˛e odr˛ebnych modułów, które analizuja˛ zebrane dane w celu znalezienia warunku określonego rodzaju. Otwarte narz˛edzia, na przykład Daikon, umożliwiaja˛ dodanie nowych typów poszukiwanych warunków poprzez implementacj˛e dodatkowego modułu przeznaczonego do analizy zebranych danych w sposób umożliwiajacy ˛ wykrycie asercji określonego rodzaju. Podczas procesu wykrywania asercji analizowane sa˛ dane zebrane w trakcie obserwacji programu. Niektóre rodzaje warunków, w szczególności opisujace ˛ właściwości tylko jednej zmiennej, moga˛ być wykrywane równolegle z etapem kolekcjonowania danych. Sa˛ to asercje, do których wykrycia nie jest potrzebny pełny zbiór danych do analizy. Przykładem takiej asercji może być asercja sprawdzajaca ˛ czy wybrana zmienna przyjmuje wartości wi˛eksze od zera. W takim przypadku dane przetwarzane sa˛ na bieżaco ˛ przez algorytmy wykrywajace ˛ określone asercje. Główna˛ zaleta˛ takiego rozwiazania ˛ jest brak konieczności przechowywania zebranych danych, których ilość może być znaczna. Do wad należy zaliczyć brak możliwości wykrywania niektórych typów asercji, szczególnie bardziej złożonych lub wykrywajacych ˛ zależności pomi˛edzy wieloma zmiennymi programu. Asercje tego typu wymagaja˛ zbiorczej analizy wszystkich zebranych danych. Ponadto, w zależności od sposobu implementacji systemu wykrywajacego ˛ asercje, możliwe jest wydłużenie czasu działania badanego programu z uwagi na konieczność dodatkowej, równoległej analizy dużej ilości danych. Może to prowadzić do istotnych zakłóceń w jego działaniu jeśli wyst˛epuja˛ w nim elementy zależne od czasu wykonania, jak na przykład określony czas oczekiwania na zakończenie wybranych operacji takich jak proces komunikacji z serwerem czy przeprowadzenie wymaganych obliczeń. DIDUCE wykrywa asercje podczas uruchomienia badanego programu, dane nie sa˛ kolekcjonowane do oddzielnego zbioru w celu ich późniejszego wykorzystania. Daikon, z uwagi na modularna˛ budow˛e, przetwarza zebrane dane w odr˛ebnym procesie po zakończeniu działania badanej aplikacji. AgitarOne potrafi działać w obu opisanych trybach, a ponadto proces wykrywania asercji może być przeprowadzany na innej maszynie niż ta, na której działa obserwowana aplikacja. Pozwala to zminimalizować wpływ obcia˛żenia spowodowanego duża˛ ilościa˛ przeprowadzanych obliczeń zwiazanych ˛ z procesem wykrywania asercji w badanym programie. Rodzaje wykrywanych asercji przez istniejace ˛ narz˛edzia, przykłady algorytmów oraz ich 22 parametrów omówiono w dalszej cz˛eści rozdziału. W ramach rozprawy zaproponowano rozszerzenie wykrywanych asercji o dodatkowy element wia˛żacy ˛ dana˛ asercj˛e ze śladem przebiegu programu opisujacym ˛ odwiedzone punkty programu. Technika ta omówiona jest szczegółowo w rozdziale 4. 2.1.4. Analiza asercji Celem procesu analizy zbioru wykrytych asercji jest wybranie spośród wszystkich znalezionych asercji tych, które maja˛ być ostatecznie zaprezentowane użytkownikowi. Jest to krok opcjonalny, który może obejmować na przykład procedur˛e usuwania redundantnych asercji, jakie moga˛ zostać wykryte w wyniku stosowania algorytmów wykrywajacych ˛ asercje różnych rodzajów. Przykładowo, jeżeli wykryte zostana˛ asercje: x 6= 0, x > 0, x ⊆ {4, 6, 8}, x jest parzyste to moga˛ one zostać zastapione ˛ jedna˛ asercja˛ x ⊆ {4, 6, 8}. Na tym etapie moga˛ być podejmowane również inne czynności, których końcowym efektem jest wybór najlepszych z wykrytych asercji. Pakiet Daikon dodatkowo wyznacza dla każdej asercji parametr wyrażajacy ˛ zaufanie. Użytkownikowi zaprezentowane zostana˛ jedynie te asercje, dla których parametr ten przekroczył określona˛ wartość. Sposób obliczania zaufania przez pakiet Daikon dla wybranych rodzajów asercji zostanie omówiony w dalszej cz˛eści rozdziału. W ramach rozprawy opracowana została nowa metoda analizy i selekcji asercji. Umożliwia ona wybór tych spośród nich, które spełniaja˛ wybrane kryteria zwiazane ˛ mi˛edzy innymi ze skutecznościa˛ detekcji bł˛edów. Metoda została szczegółowo przedstawiona w rozdziale 3. 2.1.5. Prezentacja wyników W ostatnim kroku asercje oraz opisujace ˛ je parametry prezentowane sa˛ użytkownikowi. Niektóre z narz˛edzi posiadaja˛ możliwość zapisu asercji w różnych popularnych notacjach z myśla˛ o aplikacjach, które moga˛ je wykorzystać do dalszych celów jakimi sa˛ na przykład specyfikacja czy weryfikacja oprogramowania. Umożliwia to mi˛edzy innymi system Daikon, który potrafi uzupełnić kody źródłowe badanych aplikacji o odpowiednie adnotacje opisujace ˛ wykryte asercje. Zaimplementowano w nim kilka popularnych formatów wyjściowych obejmujacych ˛ mi˛edzy innymi notacje takie jak JML czy ESC/Java2. Możliwa jest również integracja prezentacji wyników ze środowiskami do rozwoju aplikacji. Znalezione asercje wyświetlane sa˛ na przykład jako pomoc kontekstowa dla danej klasy lub metody. Rozwiazanie ˛ to zostało zaimplementowane w pakiecie AgitarOne. DIDUCE prezentuje wykryte asercje w trakcie przegladania ˛ kolejnych linii kodu źródłowego. Daikon umożliwia stworzenie adnotacji JML w kodzie źródłowym, które moga˛ zostać zintegrowane z dokumentacja˛ badanego programu. 23 2.2. Schematy systemów dynamicznego wykrywania asercji W zależności od metody powiazania ˛ procesów wyst˛epujacych ˛ w systemach wykrywajacych ˛ asercje w sposób dynamiczny można wyróżnić różne schematy ich działania. Omówione wcześniej etapy moga˛ być wykonywane niezależnie lub moga˛ si˛e wzajemnie przeplatać. Cz˛esto, z uwagi na konieczność zaawansowanej analizy struktury badanego programu, docelowa implementacja i sposób działania silnie zależa˛ od możliwości oferowanych przez stosowana˛ technologi˛e, jak na przykład system operacyjny, na którym przeprowadzany jest proces wykrywania asercji czy kompilator, z użyciem którego został przygotowany badany program. Można wskazać dwa ogólne schematy działania systemów dynamicznego wykrywania asercji: — działajace ˛ w trybie odroczonym – etapy kolekcjonowania danych oraz wykrywania asercji sa˛ rozdzielone, — działajace ˛ w trybie ciagłym ˛ – etap kolekcjonowania danych oraz wykrywania asercji (a cz˛esto również ich prezentacji oraz weryfikacji) przeplataja˛ si˛e. Systemy działajace ˛ w trybie odroczonym kolekcjonuja˛ całość danych przechowujac ˛ je do dalszej analizy na etapie wykrywania asercji. Dane te analizowane sa˛ całościowo. Systemy działajace ˛ w trybie ciagłym ˛ sa˛ pewnego rodzaju monitorami aplikacji. W poczatkowym ˛ etapie działania kolekcjonuja˛ one dane i w wybranym momencie moga˛ zostać dodatkowo przełaczone ˛ w tryb weryfikacji znalezionych warunków. System Daikon jest przedstawicielem systemu działajacego ˛ w trybie odroczonym. Przykładem systemu działajacego ˛ w trybie ciagłym ˛ jest pakiet DIDUCE. 2.2.1. Tryb odroczony Ogólny schemat systemu wykrywajacego ˛ asercje działajacego ˛ w trybie odroczonym pokazano na rysunku 2.1. Oryginalny program, w wersji źródłowej lub wykonywalnej, po procesie instrumentacji (krok pierwszy), poddawany jest obserwacji z użyciem przygotowanych danych wejściowych (krok drugi). Na podstawie zebranych informacji wykrywane sa˛ w nim asercje (krok trzeci), które moga˛ zostać wprowadzone do aplikacji poddanej badaniu (krok czwarty). Każdy z tych kroków wykonywany jest niezależnie i najcz˛eściej odpowiada za niego odr˛ebny moduł systemu. Modułowa budowa systemów dynamicznego wykrywania asercji działajacych ˛ w trybie odroczonym jest ich podstawowa˛ zaleta.˛ Taka architektura umożliwia łatwa˛ implementacj˛e procesu instrumentacji dla wielu j˛ezyków programowania lub stosowania kilku modułów wykrywajacych ˛ różnorodne asercje. Utrudniona jest jednak obserwacja programów działaja˛ cych bardzo długo lub w sposób ciagły. ˛ Jest to spowodowane koniecznościa˛ tymczasowego 24 program przystosowany do obserwacji 2 1 oryginalny program instrumentacja programu SRC BIN LOG DAT dane wejściowe dane zebrane na podstawie obserwacji programu 3 4 integracja asercji program z asercjami obserwacja działania programu (kolekcjonowanie danych) SRC BIN SRC BIN wykrywanie asercji TXT wykryte asercje Rysunek 2.1. Schemat systemu wykrywajacego ˛ asercja w trybie odroczonym przechowania dużej ilości danych otrzymanych w wyniku obserwacji takich aplikacji. Przechowywanie tych danych, a przez to możliwość ich całościowej analizy, jest zaleta˛ w przypadku, kiedy algorytmy wykrywajace ˛ asercje wykrywaja˛ warunki możliwe do wyznaczenia jedynie poprzez dost˛ep do pełnego zbioru danych. 2.2.2. Tryb ciagły ˛ Schemat systemu wykrywajacego ˛ asercje działajacego ˛ w trybie ciagłym ˛ jest analogiczny do przedstawionego na rysunku 2.1, z ta˛ różnica,˛ że procesy obserwacji programu (krok drugi) oraz wykrywania asercji (krok trzeci) sa˛ połaczone. ˛ Oryginalny program, w wersji źródłowej lub wykonywalnej, po procesie instrumentacji, poddawany jest obserwacji z użyciem pewnych danych wejściowych, która połaczona ˛ jest z wykrywaniem asercji. Oznacza to, że zebrane dane analizowane sa˛ na bieżaco ˛ i nie musza˛ być przechowywane. Nast˛epnie wykryte asercje moga˛ zostać wprowadzone do badanego programu. Dodatkowo w systemach działajacych ˛ w trybie ciagłym ˛ proces integracji asercji z aplikacja˛ może odbywać si˛e łacznie ˛ z procesem kolekcjonowania danych i wykrywania asercji. Takie rozwiazanie ˛ jest najcz˛eściej stosowane dla aplikacji działajacych ˛ bez określonego momentu zakończenia. Przykładami moga˛ być systemy operacyjne, serwery transakcyjne lub programy dla mikrokontrolerów. Aplikacje takie moga˛ być obserwowane przez pewien okres czasu i w momencie wykrycia odpowiednich warunków moga˛ być one wprowadzone do nich w trakcie ich działania. 25 Systemy dynamicznego wykrywania asercji działajace ˛ w trybie ciagłym ˛ sa˛ najcz˛eściej monolitycznymi aplikacjami, jak na przykład DIDUCE, w których wszystkie procesy sa˛ zintegrowane. Wada˛ takiego rozwiazania ˛ jest utrudniona rozbudowa tych systemów o nowe funkcje takie jak obsługiwane j˛ezyki programowania, platformy sprz˛etowe czy rodzaje wykrywanych asercji. Ponadto, z uwagi na brak przechowywania danych z obserwacji aplikacji, istnieje możliwość wykrywania jedynie zaw˛eżonego zbioru typów asercji. Zaleta˛ systemów o omawianym schemacie jest możliwość obserwacji aplikacji działajacych ˛ długo lub nieprzerwanie. Ponieważ systemy te zazwyczaj przetwarzaja˛ dane na bieżaco ˛ nie jest konieczne przechowywanie dużej ilości informacji zwiazanych ˛ z obserwacja˛ aplikacji. 2.3. Wykrywane asercje Na podstawie analizy narz˛edzi wykrywajacych ˛ asercje można określić różne klasy wykrywanych warunków. W ich poniższym wykazie x, y, z oznaczaja˛ dowolne zmienne programu typu liczbowego, obiekty lub literały (jeśli nie zaznaczono inaczej). Stałe wartości wyznaczone przez algorytmy wykrywajace ˛ asercje oznaczono a, b, c. Dla asercji badajacych ˛ zależności pomi˛edzy różnymi zmiennymi przyj˛eto, że sa˛ one tego samego typu oraz zdefiniowany jest dla nich określony operator lub określona funkcja wyst˛epujaca ˛ w warunku. Wśród wykrywanych asercji zaimplementowanych w dost˛epnych narz˛edziach wyróżnić można klasy wykrywanych warunków określajace: ˛ — x 6= null – czy zmienna została zainicjalizowana, — x = a – stała wartość zmiennej, — x 6= 0 – zmienna typu liczbowego nie przyjmuje wartości zero, — x ⊆ {a, b, c} – wartości zmiennej pochodza˛ z określonego, niewielkiego zbioru wartości o mocy zazwyczaj nie przekraczajacej ˛ 10 elementów, — x ≥ a, x ≤ b, a ≤ x ≤ b – określenie zakresu zmiennej, — x = a mod b, x 6= a mod b – stała wartość zmiennej wyznaczona modulo wzgl˛edem innej stałej wartości w relacji równości badź ˛ nierówności, — wymienione dotychczas typy asercji dla zmiennych typu liczbowego wykrywane sa˛ również dla sumy lub różnicy dwóch zmiennych (za x należy przyjać ˛ odpowiednio y + z lub y − z), — x > y, x < y, x ≥ y, x ≤ y, x = y, x 6= y – relacje pomi˛edzy zmiennymi, — y = ax + b, z = ax + by + c – zależność liniowa pomi˛edzy dwoma lub trzema zmiennymi liczbowymi (wi˛eksza liczba zmiennych liczbowych nie jest implementowana w dost˛epnych narz˛edziach), — zależności logiczne dla wybranych bitów lub pomi˛edzy wybranymi pojedynczymi bitami w obr˛ebie jednej zmiennej, — y = f (x) – zależności funkcyjne pomi˛edzy dwiema zmiennymi typu liczbowego takie jak 26 wartość bezwzgl˛edna, wartość przeciwna, negacja bitowa, — z = f (x, y) – zależności funkcyjne pomi˛edzy trzema zmiennymi typu liczbowego takie jak wi˛eksza wartość, mniejsza wartość, mnożenie, dzielenie, najwi˛ekszy wspólny dzielnik, dzielenie modulo, przesuni˛ecie bitowe w lewo, przesuni˛ecie bitowe w prawo, koniunkcja bitowa, alternatywa bitowa, różnica symetryczna, — zależności dla kolekcji zmiennych określajace ˛ najwi˛eksza,˛ najmniejsza˛ wartość w kolekcji, sposób uporzadkowania ˛ kolekcji (rosnacy, ˛ malejacy, ˛ wszystkie elementy maja˛ t˛e sama˛ wartość), zależności pomi˛edzy konkretnymi dwoma lub trzema elementami w kolekcji traktowanymi jako niezależne zmienne (wcześniej wymienione rodzaje warunków dla dwóch lub trzech zmiennych), — zależności dla dwóch kolekcji zmiennych określajace ˛ zależność pomi˛edzy wszystkimi elementami kolekcji o tym samym indeksie lub odpowiadajacych ˛ indeksach w odwrotnej kolejności (wcześniej wymienione rodzaje zależności dla dwóch zmiennych), zawieranie si˛e jednej kolekcji w drugiej, — zależności pomi˛edzy wartościami wybranych zmiennych i wołanymi metodami, — zależności pomi˛edzy kolejnościa˛ wołanych metod lub wykonywanych bloków programu, asercje opisujace ˛ poprawny przebieg działania programu w odniesieniu do kolejności wykonywania określonych operacji. Przy wyborze klas wykrywanych warunków twórcy systemów kierowali si˛e głównie łatwościa˛ interpretacji znaczenia asercji przez programist˛e oraz możliwościa˛ ich weryfikacji w badanym programowaniu. Najcz˛eściej algorytmy wykrywajace ˛ asercje badaja˛ statystyczne własności dla danego warunku. System Daikon wykrywajac ˛ asercj˛e x 6= 0 bada czy x przyjmuje wartość 0. Jeśli taka sytuacja zaistnieje asercja tego typu jest odrzucana (nie zostanie wykryta). W przeciwnym wypadku asercja zostanie zaprezentowana użytkownikowi, jeżeli zaufanie do niej przekroczy pewna˛ określona˛ wartość. Twórcy Daikon zdefiniowali ten parametr jako liczb˛e z zakresu < 0, 1 > określajac ˛ sposób jej obliczania odr˛ebnie dla każdej z klas wykrywanych warunków. Dla opisywanej asercji jest ona definiowana jako prawdopodobieństwo pojawienia si˛e wartości różnej od 0 dla danej zmiennej. W pojedynczym pomiarze, zakładajac ˛ jednostajny rozkład przyjmowanych wartości przez zmienna˛ x, jest ona określona jako 1 − 1r , gdzie r określa liczb˛e różnych wartości, jakie może przyjać ˛ zmienna x. Dla n pomiarów prawdopodobieństwo wystapienia ˛ wartości różnej od zera wynosi (1 − 1r )n . Jeśli wartość tego wyrażenia b˛edzie mniejsza niż określona przez użytkownika asercja nie zostanie zaraportowana z uwagi na zbyt małe zaufanie. Celem wprowadzenia tego parametru było usuni˛ecie wykrytych asercji, dla których ilość danych, na podstawie jakich zostały wykryte, była niewielka [29], a tym samym prawdopodobieństwo ich naruszenia przy braku wystapienia ˛ bł˛edu mogło być znaczne. Innym przykładem może być moduł wykrywajacy ˛ asercj˛e x ⊆ {4, 6, 8}, który analizujac ˛ 27 dane z obserwacji sprawdza, czy x przyjmuje pewne określone powtarzajace ˛ si˛e wartości. Jeżeli liczba różnych wartości przyjmowanych przez x jest niewielka (na przykład od jednej do pi˛eciu) i wyst˛epuja˛ one z cz˛estotliwościa,˛ która gwarantuje odpowiedni stopień zaufania, to na ich podstawie asercja zostanie zaprezentowana użytkownikowi w zbiorze wykrytych asercji. Nie zawsze systemy dynamicznie wykrywajace ˛ asercje wykrywaja˛ warunki, które operuja˛ bezpośrednio na zmiennych i obiektach w badanym programie. W pakiecie DIDUCE zastosowano rozwiazanie ˛ polegajace ˛ na konwersji wszystkich obserwowanych obiektów do zmiennej całkowitoliczbowej. DIDUCE obserwuje punkty programu, w których modyfikowana jest wartość określonego obiektu, konwertuje go do literału opisujacego ˛ jego referencj˛e i wartość, a nast˛epnie oblicza dla niego wartość typu całkowitoliczbowego na podstawie funkcji mieszajacej ˛ wykorzystujac ˛ standardowy algorytm zaimplementowany w j˛ezyku Java dla obiektów reprezentujacych ˛ ciagi ˛ znakowe. Dopiero jej wartości sa˛ analizowane celem wykrycia różnych zależności logicznych dla wybranych bitów lub pomi˛edzy wybranymi pojedynczymi bitami i generowane sa˛ odpowiednie asercje opisujace ˛ zmiany poszczególnych bitów w powiazaniu ˛ z ich wcześniej obserwowanymi wartościami. Jeżeli podczas wykonania programu zaobserwowane zostana˛ inne modyfikacje bitów, niż wcześniej wykryte, pakiet DIDUCE zgłosi wystapienie ˛ bł˛edu w punkcie wykrycia takiej sytuacji [44]. Wykrywanie asercji zwiazanych ˛ z zależnościami pomi˛edzy wołanymi metodami w systemie Perracotta polega na wykrywaniu wszystkich powtarzajacych ˛ si˛e sekwencji wykonywanych metod a nast˛epnie na wybieraniu tych z nich, które moga˛ okazać si˛e interesujace ˛ dla programisty. Stosowane sa˛ w tym celu różne heurystyki. Jedna z nich polega na badaniu podobieństwa w nazwach wołanych metod wyrażanego na przykład poprzez wykrycie w nich identycznego prefiksu lub znalezienie wspólnego podciagu ˛ znaków o pewnej długości, przy czym im długość wspólnego podciagu ˛ znaków jest wi˛eksza, tym nazwy metod przyjmuje si˛e za bardziej podobne. Zakłada si˛e, że im wi˛eksze podobieństwo nazw metod tym bardziej wykryta sekwencja może okazać si˛e interesujaca. ˛ Na etapie analizy wykrytych zależności dokonuje si˛e również połaczenia ˛ odr˛ebnych sekwencji wywołań jeśli istnieje taka możliwość [115]. W innych narz˛edziach wykrywajacych ˛ tego typu asercje stosowano również algorytmy systemów uczacych ˛ si˛e [18] przekazujac ˛ im jako dane wejściowe nazwy wołanych metod [3]. Trzeba wyraźnie zaznaczyć, że narz˛edzia wykrywajace ˛ asercje w sposób dynamiczny nie sa˛ nieomylne i nie wykrywaja˛ wszystkich klas możliwych warunków. Nie istnieja˛ również uniwersalne algorytmy wykrywania asercji. W praktyce optymalny algorytm zależy od rodzaju poszukiwanego warunku. Ostateczna decyzja czy wykryta asercja jest spełniona dla całej dziedziny wartości, z którymi jest powiazana ˛ należy do narz˛edzia formalnie dowodzacego ˛ poprawność asercji wprowadzonej do programu lub człowieka. 28 2.4. Zastosowania Znalezione asercje w różnej formie moga˛ być wprowadzane podczas etapu projektowania, implementacji oraz testowania oprogramowania. Ich umiej˛etne zastosowanie przyczynia si˛e do zwi˛ekszenia wiarygodności [96] badanego oprogramowania poprzez eliminacj˛e, we wczesnym etapie jego tworzenia, bł˛edów projektowych i implementacji. Asercje zabezpieczaja˛ również oprogramowanie przed skutkami wystapienia ˛ bł˛edów w trakcie działania. Jednym z przykładów jest wykorzystanie asercji w ochronie systemu wykorzystujacego ˛ techniki kryptograficzne przedstawione w [70], gdzie w badaniu eksperymentalnym autor zastosował asercje do ochrony systemu przed wyciekiem tekstu jawnego w wyniku bł˛edu działania oprogramowania na skutek zakłóceń w obszarze sprz˛etowym. Taka metoda zastosowania asercji może chronić systemy wykorzystujace ˛ na przykład oprogramowanie działajace ˛ w kartach inteligentnych. Przy zapewnieniu bezpieczeństwa istotniejsze może okazać si˛e odmówienie wykonania danej usługi na skutek wykrytego naruszenia asercji niż jej wykonanie, które może prowadzić do kompromitacji całego systemu lub jego cz˛eści. Bezpośrednim sposobem wykorzystania znalezionych warunków jest wykorzystanie ich w postaci asercji programowych. Pozwala to zaobserwować sytuacj˛e w której dojdzie do naruszenia asercji ze wzgl˛edu na nieprawidłowe dane, jakie pojawia˛ si˛e w programie, wadliwa˛ implementacj˛e przetwarzajacego ˛ je algorytmu lub niepoprawny przebieg wykonania programu. Wprowadzenie asercji do aplikacji może być wykonane r˛ecznie, z użyciem mechanizmów zaimplementowanych w bibliotekach danego j˛ezyka (na przykład funkcja assert z nagłówka assert.h w j˛ezyku C) lub w samym j˛ezyku (na przykład słowo kluczowe assert w j˛ezyku Java). Można skorzystać również z jednego z narz˛edzi, które automatycznie wprowadza asercje do badanej aplikacji lub oprogramowania wykrywajacego ˛ asercje zintegrowanego z modułem do ich późniejszej weryfikacji. Bardziej zaawansowane asercje, których wyrażenie lub sprawdzenie nie jest możliwe bezpośrednio przez stosowany j˛ezyk programowania, moga˛ być weryfikowane przez specjalizowane mechanizmy służace ˛ na przykład kontroli czasu wykonania funkcji programu (procesy monitorujace ˛ działanie aplikacji), kontroli przepływu [1, 38, 104, 106] lub kontroli dost˛epu do zasobów [46]. Istnieja˛ również dedykowane j˛ezyki, których przeznaczeniem jest opisywanie warunków asercji. Przykładem może być Schematron10 , który przeznaczony jest do tworzenia asercji dla dokumentów XML opisujacych ˛ ich budow˛e oraz zawartość. J˛ezyk ten opisany jest w normie mi˛edzynarodowej ISO 19757-3:2006 [47]. Dost˛epne sa˛ również biblioteki, które pozwalaja˛ rozszerzyć i zoptymalizować mechanizm wykorzystania asercji w określonym j˛ezyku. Za przykład może służyć GNU Nana11 przeznaczona dla j˛ezyków C/C++. Pozwala ona na wyrażenie wielu złożonych warunków (na przykład opisujacych ˛ struktury danych), pełna˛ implementacj˛e programowania zwiazanego ˛ umowa˛ w tworzonych 10 11 http://www.schematron.com/ http://savannah.gnu.org/projects/nana 29 aplikacjach oraz zaawansowanego raportowania wykrytych bł˛edów. Asercje moga˛ być również wyrażone i weryfikowane poprzez analiz˛e wystapień ˛ i treści wpisów do dziennika badanej aplikacji. W [29] wskazane zostały inne aspekty wykorzystania asercji wykrytych automatycznie. Moga˛ stać si˛e one elementem dokumentacji programu, który b˛edzie umożliwiał łatwiejsze zrozumienie działania fragmentów kodu, który jest, nie jest lub jest niedostatecznie udokumentowany. Takie zastosowanie wykrytych asercji może uprościć analiz˛e budowy nieznanego programu oraz pomóc zrozumieć specyfik˛e jego działania przez programist˛e. Znalezione asercje moga˛ zostać skonfrontowane z formalna˛ specyfikacja,˛ jeśli została ona wcześniej stworzona przez programist˛e. Może to być szczególnie użyteczne w przypadku, gdy wykorzystano metodologi˛e projektowania zwiazanego ˛ umowa,˛ z uwagi na to, że systemy wykrywania asercji prezentuja˛ je w podobnej formie. Wykryte asercje moga˛ zostać wykorzystane również w procesie modyfikacji oraz rozbudowy programu. Moga˛ one nakierować programist˛e na lepszy kierunek zmian. Dzi˛eki znalezionym asercjom, które na przykład opisuja˛ zależności pomi˛edzy elementami w złożonych strukturach danych, programista może wprowadzać takie modyfikacje, które doprowadza˛ do wydajniejszego działania lub lepszego wykorzystania odpowiednio dobranych struktur danych. Ponadto analiza asercji znalezionych przed i po wprowadzeniu modyfikacji do programu umożliwia wczesne wykrycie takich zmian w specyfice jego działania, które moga˛ różnić si˛e od oczekiwanych przez użytkownika. Kolejny obszar wykorzystania asercji to automatyzacja generowania testów oraz możliwość sprawdzenia istniejacych ˛ przypadków testowych dla programu. Może to zostać zrealizowanie poprzez przygotowanie danych wejściowych dla programu lub przypadku testowego, który b˛eda˛ prowadziły do naruszenia znalezionych asercji. Wykorzystujac ˛ specjalistyczne narz˛edzia, takie jak DIDUCE, możliwa jest lokalizacja prawdopodobnych bł˛edów oraz odkrywania potencjalnie niezamierzonych efektów działania badanego oprogramowania. Autor [29] zwraca również uwag˛e na walor edukacyjny i poznawczy asercji wykrytych automatycznie. Moga˛ one być pouczajace ˛ dla programistów i pozwolić im spojrzeć z innej perspektywy i bardziej krytycznie na tworzony kod. Stosowanie asercji jest jedna˛ z najstarszych technik ułatwiajacych ˛ proces rozwoju oprogramowania. Nie jest to jednak metoda idealna. Wśród wad asercji oraz problemów zwiazanych ˛ z ich stosowaniem można wymienić brak metod służacych ˛ ocenie wprowadzonych do programu asercji pod wzgl˛edem ich poprawności oraz użyteczności w odniesieniu do wymienionych wcześniej obszarów zastosowań. Autor ksia˛żki [98] zwraca uwag˛e na problem trudności oceny jakie asercje powinny zostać wprowadzone, aby efektywnie wykorzystać ich możliwości w detekcji bł˛edów. Zagadnienia te rozważono w niniejszej pracy proponujac ˛ metody oraz miary dla oceny asercji. Do wad stosowania asercji należy również zaliczyć spowalnianie działania oprogramowania, w szczególności jeśli opisuja˛ rozbudowane warunki, na przykład dla kolekcji 30 danych, oraz czynnik ludzki ich stosowania. Wielu projektantów i programistów nie chce stosować asercji w tworzonym oprogramowaniu uznajac ˛ ich wprowadzanie za niepotrzebna˛ strat˛e czasu. Asercje programowe sa˛ nadal aktywnie używana˛ i rozwijana˛ technika˛ w inżynierii oprogramowania. Dowodem na to jest mi˛edzy innymi wprowadzenie słowa kluczowego assert do wersji 1.4 j˛ezyka Java oraz rozwijanie metod efektywnego wykorzystania tych konstrukcji w nowoczesnych środowiskach takich jak platforma .NET. W celu zminimalizowania wpływu asercji na czas wykonania programu oraz zmniejszenia wykorzystywanych przez nie zasobów systemowych moga˛ być one poddawane przez kompilatory zaawansowanej optymalizacji [103]. Poza asercjami programowymi stosowane sa˛ również asercje sprz˛etowe, które umożliwiaja˛ wczesna˛ reakcj˛e na bł˛edy mogace ˛ zakłócić prac˛e układu elektronicznego, a w konsekwencji wykonywanych programów. Do bł˛edów takich zaliczyć można polecenie wykonania nieprawidłowej instrukcji, dzielenia przez zero lub też żadania ˛ dost˛epu do nieprawidłowego obszaru pami˛eci. Niektóre z asercji moga˛ być zaimplementowane zarówno w sposób programowy jak i sprz˛etowy. Przykładem moga˛ być asercje chroniace ˛ dost˛ep do stosu wykonywanego programu lub jego obszaru danych, które zapobiegaja˛ efektom bł˛edów takich jak przepełnienie bufora prowadzace ˛ w konsekwencji do wykonania poleceń przekazanych w danych dla aplikacji. Mechanizmy takiej ochrony realizowane sa˛ sprz˛etowo przez niektóre z procesorów jak również zaimplementowane w sposób programowy w systemach z rodziny Microsoft Windows. 31 3. Parametry asercji i metoda selekcji asercji W poprzednim rozdziale przedstawione zostały metody automatycznego wykrywania asercji na podstawie analizy wykonania programu. Sprowadzaja˛ si˛e one do opracowania algorytmu, który na podstawie dost˛epnych informacji zebranych podczas wykonania aplikacji wygeneruje asercj˛e danego rodzaju lub zaniecha jej poszukiwania. Problemem może być znaczaca ˛ liczba znalezionych asercji. Może ona być trudna lub wr˛ecz niemożliwa do zinterpretowania, a przez to również do wykorzystania przez programist˛e. Tylko niektóre z asercji sa˛ usuwane automatycznie, jeśli istnieja˛ ku temu odpowiednie przesłanki, najcz˛eściej zwiazane ˛ z pokrywaniem si˛e tego samego warunku logicznego w wielu asercjach lub możliwościa˛ połaczenia ˛ kilku asercji w jedna˛ [31]. Narz˛edzia wykrywajace ˛ asercje w programach nie posiadaja˛ mechanizmów, które pozwoliłyby ocenić ich praktyczna˛ przydatność w procesie wykrywania bł˛edów. Wykorzystanie wszystkich znalezionych warunków może doprowadzić do sytuacji, w której wielkość wygenerowanego kodu wykonywalnego programu wielokrotnie przekroczy jego wielkość poczatkow ˛ a,˛ a czas wykonania istotnie wzrośnie. Brak dodatkowych metod eliminacji nieefektywnych asercji powoduje, że otrzymany zysk (wykrycie bł˛edu) w stosunku do kosztu (zwi˛ekszenie rozmiaru aplikacji oraz czasu wykonania) jest nieakceptowalny. Poniżej zaproponowano oryginalna˛ metod˛e, w której poprzez pomiar określonych parametrów i obserwacj˛e zachowania asercji dla pewnego zestawu testów, dokonywana jest ich ocena oraz wybór takiego podzbioru, który w optymalny sposób spełni określone kryteria. Dla potrzeb metody zaproponowane zostały różne miary oceny asercji, które uwzgl˛edniaja˛ mi˛edzy innymi ich koszt statyczny, dynamiczny, skuteczność oraz nieskuteczność. Przedstawiony został ogólny sposób formułowania zadania programowania liniowego, którego rozwiazanie ˛ wyznacza podzbiór asercji najlepiej spełniajacy ˛ wyznaczone wymagania. Zaprezentowane zostały również charakterystyki miar pozwalajacych ˛ w intuicyjny sposób określić skuteczności oraz nieskuteczności asercji. 3.1. Definicje podstawowych poj˛eć Poniżej określone zostało znaczenie podstawowych poj˛eć używanych w niniejszym rozdziale. Programem nazywamy całość systemu (na przykład wiele współdziałajacych ˛ aplikacji), samodzielny program jak i również jego fragment, którym może być wydzielony moduł, klasa 33 czy kilka wybranych metod lub funkcji. Programem może być zarówno sam algorytm jak i jego konkretna implementacja. W szczególności, w badanym systemie można wyznaczyć wiele programów, które b˛eda˛ analizowane niezależnie od siebie. Badany program zawiera pewien zbiór składajacy ˛ si˛e z n asercji. W dalszej cz˛eści rozdziału dla oznaczenia konkretnej i-tej asercji ze zbioru n asercji stosowany b˛edzie identyfikator i, i = 1 . . . n. Pod poj˛eciem asercji rozumie si˛e predykat zwiazany ˛ z programem dzi˛eki któremu możliwe jest sprawdzenie stanu wybranych zmiennych i wywołanie określonej reakcji w przypadku jego niespełnienia. Zmiennymi moga˛ być zarówno zmienne wyst˛epujace ˛ w programie jak i parametry środowiska, w którym jest on wykonywany. Predykat ten nie wpływa na inne asercje oraz na działanie programu. Reakcja˛ w przypadku niespełnienia asercji może być na przykład natychmiastowe przerwanie działania programu, wyświetlenie komunikatu na ekranie informujacego ˛ o jej naruszeniu, zgłoszenie wyjatku ˛ lub wywołanie akcji naprawczej. Intencja˛ powyższej definicji poj˛ecia asercji jest możliwe szerokie obj˛ecie nia˛ wszelkich struktur programowych, które sprawdzaja˛ stan programu i środowisko jego wykonania za pomoca˛ określonego predykatu. Celem takiego sprawdzenia jest podniesienie wiarygodności oprogramowania wskutek możliwości mi˛edzy innymi detekcji, raportowania i lokalizacji bł˛edów przez takie struktury. Proces, który podczas działania programu określa, czy asercja jest prawdziwa lub fałszywa przy pewnym stanie zmiennych nazywamy sprawdzeniem asercji. Jego efektem może być naruszenie lub spełnienie sprawdzanej asercji. Naruszeniem asercji lub inaczej niespełnieniem asercji określamy sytuacj˛e, w której sprawdzony predykat jest fałszywy. Spełnieniem asercji lub inaczej nienaruszeniem asercji określamy sytuacj˛e, w której sprawdzony predykat jest prawdziwy. Zakłada si˛e, że spełnienie asercji nie ma wpływu na działanie programu oraz na proces sprawdzania innych asercji. Skutkiem działania asercji nazywamy akcje podj˛ete wskutek naruszenia asercji. Akcjami podj˛etymi wskutek naruszenia asercji sa˛ na przykład: natychmiastowe przerwanie programu, podj˛ecie działań przywracajacych ˛ jego poprawne działanie lub wygenerowanie raportu o detekcji bł˛edu. Naruszenie asercji może wpływać na działanie programu oraz działanie innych asercji. Testem nazywamy wykonanie programu, któremu przyporzadkowujemy ˛ wynik testu. Wynik testu opisuje status wykonania programu (na przykład poprawny, niepoprawny, przerwany przez asercj˛e, przerwany przez system operacyjny) określony przez niezależna˛ metod˛e oceny przebiegu i efektu jego wykonania. Każdemu z możliwych statusów wykonania programu przyporzadkowujemy ˛ pewna˛ wartość e z określonego dla programu zbioru E = {e1 , e2 , . . . , ek }, która˛ nazywamy wynikiem testu. Zbiór testów nazywamy eksperymentem. 34 3.2. Parametry asercji Podczas każdego z przeprowadzanych testów możliwe jest przyporzadkowanie ˛ asercjom w programie pewnych ich własności, które można określić w wymierny i jednoznaczny sposób. Nazywane b˛eda˛ one parametrami asercji. Umożliwia˛ porównanie asercji pomi˛edzy soba˛ z uwzgl˛ednieniem wybranych kryteriów, które b˛eda˛ charakteryzowały dany parametr asercji. Poniżej zdefiniowane zostały parametry dla asercji jakie moga˛ zostać wykorzystane w trakcie procesu selekcji asercji, którego algorytm omówiono w dalszej cz˛eści rozdziału. Przedstawiony został sposób wyznaczania proponowanych parametrów oraz możliwe ich zastosowania. Kluczowymi parametrami dla metody selekcji asercji sa˛ ich charakterystyki oraz profile omówione w punkcie 3.2.9, a także wielkości wyrażajace ˛ skuteczność oraz nieskuteczność asercji dla danego eksperymentu przedstawione w punkcie 3.2.10. 3.2.1. Aktywność asercji Metoda selekcji asercji służy do wyznaczenia pewnego podzbioru asercji spośród wszystkich wyst˛epujacych ˛ w programie, których wybrane parametry b˛eda˛ spełniać określone wymagania. Konieczne jest wi˛ec zdefiniowanie parametru, który b˛edzie określał czy asercja należy do wyznaczonego podzbioru czy znajduje si˛e poza nim. Taki parametr nazwiemy aktywnościa˛ asercji. Definicja 3.2.1. Parametr vi określa aktywność i-tej asercji. Jeżeli nie jest dopuszczone sprawdzenie asercji podczas działania programu to vi = 0 i asercj˛e taka˛ nazywamy nieaktywna.˛ Jeżeli dopuszczone jest sprawdzanie asercji podczas wykonywania programu i podejmowane jest adekwatne działanie w przypadku jej naruszenia to vi = 1 i asercj˛e taka˛ nazywamy aktywna.˛ Parametr określajacy ˛ aktywność asercji może zostać wyznaczony manualnie przez programist˛e, który arbitralnie zdecyduje o aktywności lub nieaktywności wybranej asercji. Wartość tego parametru jest również wyznaczana jako wynik działania algorytmu selekcji asercji. Wartość aktywności asercji nie jest wyznaczana na podstawie lub dla konkretnego testu programu, dlatego przyjmuje si˛e, że obowiazuje ˛ ona dla całego przeprowadzanego eksperymentu. Aktywność asercji nie jest bezpośrednio zwiazana ˛ z faktem sprawdzenia tej asercji w danym teście programu. W szczególności może zaistnieć sytuacja, kiedy wybrana asercja jest aktywna, ale nie jest sprawdzona podczas pewnego testu programu, ponieważ nie została wykonana funkcja w programie, gdzie dana asercja zostałaby sprawdzona. 3.2.2. Liczba sprawdzeń asercji Podczas wykonania programu zawarte w nim asercje moga˛ nie zostać sprawdzone, być sprawdzone jednokrotnie lub wielokrotnie, jeśli znajduja˛ si˛e w p˛etli lub gdy pewna funkcja 35 programu jest wykonywana wiele razy. Parametr, który opisuje t˛e ich własność nazwiemy liczba˛ sprawdzeń asercji. Definicja 3.2.2. Liczba sprawdzeń i-tej asercji oznaczona symbolem qi,t określa jak wiele razy asercja w programie była sprawdzana w danym teście t. Wartość tego parametru może być wyznaczona automatycznie dla każdego z przeprowadzanych testów poprzez zastosowanie odpowiedniej aplikacji monitorujacej ˛ wykonanie programu i zliczajacej ˛ liczb˛e wykonań instrukcji realizujacych ˛ konkretne asercje. Jeśli każda z asercji rejestruje fakt swojego sprawdzenia poprzez odpowiedni wpis w dzienniku aplikacji liczb˛e sprawdzeń można wyznaczyć poprzez zliczenie liczby wpisów charakterystycznych dla każdej z asercji po zakończeniu wykonania programu. Wyznaczenie wartości tego parametru w sposób manualny wia˛że si˛e ze zliczeniem przez programist˛e w trakcie śledzenia aplikacji liczby sprawdzeń danej asercji. Jest to proces czasochłonny i z uwagi na możliwość popełnienia licznych bł˛edów nie powinien być stosowany. Liczba sprawdzeń danej asercji jest wyznaczana dla konkretnego testu programu i może być różna w zależności od sposobu zachowania aplikacji w ich trakcie. Jeżeli parametr ten ma być wykorzystany do obliczeń w algorytmie selekcji asercji należy wybrać konkretna˛ jego wartość. W szczególności może to być wartość wyznaczona podczas wybranego testu programu b˛edacego ˛ testem wzorcowym. Dla zbioru wartości tego parametru wyznaczonych poprzez przeprowadzenie serii testów możliwe jest również wyznaczenie wybranej statystycznej własności takiej jak: — wartość maksymalna – wybrana zostaje maksymalna wartość liczby sprawdzeń asercji, — wartość minimalna – wybrana zostaje minimalna wartość liczby sprawdzeń asercji, — wartość skumulowana – obliczona zostaje wartość b˛edaca ˛ suma˛ liczby sprawdzeń asercji, — wartość średnia – obliczona zostaje średnia wartość liczby sprawdzeń asercji, — mediana – obliczona zostaje wartość środkowa liczby sprawdzeń asercji. 3.2.3. Koszt statyczny asercji Każda z asercji wprowadzonych do programu wpływa na wielkość jego kodu źródłowego lub wynikowego otrzymanego w procesie kompilacji. Przyrost rozmiaru aplikacji na skutek wprowadzenia danej asercji nazwiemy jej kosztem statycznym. Definicja 3.2.3. Koszt statyczny i-tej asercji oznaczony symbolem si,t określa przyrost wielkości kodu statycznego programu w danym teście t na skutek wprowadzenia do niego asercji. Koszt statyczny asercji wyznacza narzut statyczny kodu powstały w wyniku wprowadzenia asercji do programu. Może być wyrażony na przykład poprzez liczb˛e instrukcji maszynowych, liczb˛e dodatkowych bajtów kodu wynikowego programu, liczb˛e użytych operatorów relacji 36 oraz logicznych w asercji czy też liczb˛e różnych zmiennych oraz stałych wyst˛epujacych ˛ w danej asercji. Porównanie konkretnych wartości kosztu statycznego różnych asercji w danym programie możliwe jest w przypadku, kiedy do ich wyrażenia użyto tej samej miary, która może być jedna˛ z wyżej zaproponowanych. Koszt statyczny asercji jest wyznaczany dla konkretnego testu programu i może być inny w zależności od mi˛edzy innymi zastosowanego kompilatora lub opcji kompilacji użytych podczas przygotowania aplikacji dla danego testu. Jako wartość wykorzystywana˛ na etapie selekcji asercji można przyjać ˛ wartość otrzymana˛ na podstawie testu wzorcowego lub wyznaczona˛ jako jedna˛ z jego statystycznych własności, podobnie jak dla parametru określajacego ˛ liczb˛e sprawdzeń asercji (punkt 3.2.2). Wartość kosztu statycznego asercji może być określana manualnie przez programist˛e lub wyliczana automatycznie przez preprocesor lub kompilator czy inne przygotowane do tego celu narz˛edzie. Jego sposób działania uzależniony jest od wybranej miary wartości kosztu statycznego, która wpływa na stosowana˛ metod˛e pomiaru. Przykładowo, jeśli przyjać ˛ za miar˛e liczb˛e użytych operatorów relacji lub logicznych w asercji, zastosować można oprogramowanie operujace ˛ na wyrażeniach regularnych. 3.2.4. Koszt dynamiczny asercji Podczas wykonania programu każda ze sprawdzanych w nim asercji wpływa na czas jego wykonania lub na podniesienie zużycia innych zasobów przydzielanych w trakcie działania aplikacji. Przyrost zużycia tych zasobów na skutek wprowadzenia danej asercji do programu nazwiemy kosztem dynamicznym asercji. Definicja 3.2.4. Koszt dynamiczny i-tej asercji oznaczony symbolem di,t określa ilość zasobów jakie zostały poświ˛econe na jednostkowe sprawdzenie asercji w programie w danym teście t. Celem kosztu dynamicznego jest wyrażenie narzutu dynamicznego kodu, który powstaje w wyniku wprowadzenia asercji do programu. Jeżeli dana asercja wyst˛epuje w p˛etli programu lub funkcja w jakiej została użyta wywoływana jest wielokrotnie to celowe jest wprowadzenie całkowitego kosztu dynamicznego asercji. B˛edzie on odzwierciedlał sumaryczny koszt jaki został poświ˛econy na jej sprawdzanie podczas całego testu. Definicja 3.2.5. Całkowity koszt dynamiczny i-tej asercji w programie dla danego testu t jest wyznaczony jako Di,t = qi,t ∗ di,t . Miara˛ kosztu dynamicznego asercji i całkowitego kosztu dynamicznego asercji może być na przykład liczba wykonanych instrukcji maszynowych podczas sprawdzenia asercji, czas poświ˛econy na sprawdzenie asercji lub rozmiar pami˛eci jaka˛ należy przydzielić by zrealizować t˛e operacj˛e. Jako wartość wykorzystywana˛ na etapie selekcji asercji można przyjać ˛ wartość otrzymana˛ na podstawie wybranego testu programu lub wyznaczona˛ jako jedna˛ 37 z jego statystycznych wielkości, podobnie jak dla parametru określajacego ˛ liczb˛e sprawdzeń asercji. Może zostać ona wyznaczona manualnie przez programist˛e lub zmierzona przez oprogramowanie monitorujace ˛ wykonanie aplikacji i dokonujace ˛ pomiaru na przykład czasu poświ˛econego na sprawdzenie danego warunku. 3.2.5. Koszt położenia asercji Od momentu uruchomienia programu do pierwszego sprawdzenia wybranej asercji upływa pewien czas lub wykonywana jest pewna liczba instrukcji. Wartość ta określa koszt położenia asercji w programie. Definicja 3.2.6. Koszt położenia i-tej asercji oznaczony symbolem zi,t określa ilość zasobów jaka zostaje wykorzystana do momentu pierwszego sprawdzenia tej asercji w programie dla danego testu t. Miara˛ dla położenia asercji może być na przykład liczba wykonanych instrukcji lub czas od poczatku ˛ działania programu do pierwszego sprawdzenia asercji lub narzut zwiazany ˛ z położeniem asercji w określonym module programu. Sposób wyznaczenia i wykorzystania tego parametru jest analogiczny do omówionego w punkcie 3.2.4 kosztu dynamicznego asercji. 3.2.6. Czas detekcji bł˛edu Od chwili wprowadzenia lub wystapienia ˛ bł˛edu w programie do momentu jego wykrycia przez asercj˛e upływa pewien czas, który nazywany jest czasem detekcji bł˛edu. Jego wartość może być istotnym kryterium w metodzie selekcji asercji kiedy ważne b˛edzie wybranie takich asercji, dla których czas detekcji bł˛edu b˛edzie jak najmniejszy. Definicja 3.2.7. Czas detekcji bł˛edu dla i-tej asercji oznaczony symbolem hi,t określa okres jaki upłynał ˛ od uaktywnienia bł˛edu w programie do momentu wykrycia go przez asercj˛e w danym teście t. Miara˛ czasu detekcji bł˛edu może być na przykład liczba wykonanych instrukcji lub czas jaki upłynał ˛ pomi˛edzy momentem wystapienia ˛ bł˛edu i jego wykryciem przez asercj˛e. Jeżeli w danym teście nie wystapił ˛ żaden bład ˛ lub asercja go nie wykryła wartość tego parametru pozostaje dla niej nieokreślona. Ponieważ parametr ten jest wyznaczany dla wielu testów programu to jako wartość wykorzystywana˛ na etapie selekcji asercji należy przyjać ˛ jedna˛ z jego statystycznych wielkości, podobnie jak dla parametru określajacego ˛ liczb˛e sprawdzeń asercji. Wartość tego parametru powinna zostać wyznaczona automatycznie przez system wprowadzania bł˛edów do badanego programu. Manualna metoda wyznaczania tej wartości może być bardzo pracochłonna dla dużej liczby przeprowadzanych testów ponieważ wia˛że si˛e ze żmudnym procesem śledzenia wykonania programu. 38 3.2.7. Zaufanie do asercji Niektóre z systemów dynamicznego wykrywania asercji, na przykład Daikon [29], wyznaczaja˛ dla znalezionych warunków pewna˛ wartość określajac ˛ a˛ zaufanie do asercji. Parametr ten jest propozycja˛ określenia w wymierny sposób stopnia poprawności znalezionego warunku, przy czym pod poj˛eciem poprawności rozumie si˛e tu najcz˛eściej prawdopodobieństwo braku detekcji bł˛edu przez asercj˛e, jeśli on nie wystapił ˛ (prawdopodobieństwo braku fałszywego alarmu) albo prawdopodobieństwo detekcji bł˛edu przez asercj˛e, jeśli on wystapił ˛ (prawdopodobieństwo prawidłowego alarmu). Innymi słowy im wi˛eksze zaufanie do asercji tym mniejsze prawdopodobieństwo, że zostanie ona naruszona nie z powodu zaistniałego bł˛edu w programie, ale z powodu jej niedoskonałości b˛edacej ˛ skutkiem stosowanej metody wykrywania asercji (brak fałszywego alarmu) albo tym wi˛eksze prawdopodobieństwo, że zostanie ona naruszona z powodu zaistniałego bł˛edu w programie (prawidłowy alarm). Definicja 3.2.8. Zaufanie do i-tej asercji oznaczone jest symbolem ci i wyraża stopień poprawności wykrytej asercji. Przykładowe metody wyznaczania wartości zaufania do asercji zostały przedstawione w punkcie 2.3. Na etapie realizacji algorytmu selekcji asercji parametr ten może być wykorzystany poprzez zdefiniowanie ograniczenia dla minimalnego zaufania jakim maja˛ charakteryzować si˛e wybrane asercje. 3.2.8. Atrybuty asercji Dla asercji w badanej aplikacji może zajść konieczność przyporzadkowania ˛ pewnych własności, które moga˛ wyrażać ich interesujace ˛ cechy. Ten ogólny parametr nazwiemy atrybutami asercji. Określone cechy moga˛ zostać wyrażone na różne sposoby (opis, konkretne wartości). Zakłada si˛e, że ich liczba jest skończona. Aby zapewnić uniwersalne znaczenie tego parametru zdefiniowany on zostanie w uogólniony sposób pozwalajacy ˛ na późniejsze doprecyzowanie. Definicja 3.2.9. Atrybutami i-tej asercji nazywamy podzbiór elementów z określonego dla programu zbioru R = {r1 , r2 , . . . , rm } zawierajacego ˛ wszystkie możliwe atrybuty jakie można przyporzadkować ˛ asercjom. W zależności od wybranych cech asercji, jakie maja˛ zostać uwzgl˛ednione, ich atrybuty moga˛ być zwiazane ˛ z: — możliwościa˛ poprawienia bł˛edu przez asercj˛e – elementy zbioru R moga˛ określać czy wskutek naruszenia danej asercji istnieje możliwość przywrócenia poprawnego stanu programu (poprawienia bł˛edu przez asercj˛e) czy też takiej możliwości nie ma; każdej 39 asercji w programie, w zależności od cechy jaka˛ si˛e charakteryzuje, zwiazanej ˛ z możliwościa˛ poprawienia zaistniałego bł˛edu, przyporzadkowany ˛ zostaje podzbiór zawierajacy ˛ adekwatny element ze zbioru R, — budowa˛ asercji – elementy zbioru R moga˛ na przykład określać czy jest to asercja, której warunek wyrażony jest z użyciem określonych operacji arytmetycznych na zmiennych programu (dodawanie, odejmowanie, mnożenie, dzielenie zmiennych), — sposobem wprowadzenia asercji do programu – elementy zbioru R moga˛ określać czy jest to asercja wykryta automatycznie lub zaimplementowana w programie przez programist˛e, — efektami działania asercji – elementy zbioru R moga˛ określać czy wskutek naruszenia danej asercji program zostanie przerwany, zaraportuje informacj˛e o bł˛edzie czy też podejmie prób˛e jego naprawy, — przynależnościa˛ asercji do danej metody lub modułu w programie – elementy zbioru R zwiazane ˛ sa˛ z położeniem asercji w programie, może to być na przykład wykaz jego modułów, — rodzajem wykrywanego bł˛edu przez asercj˛e – elementami zbioru R moga˛ być różne klasy bł˛edów, na przykład obliczeniowe, logiczne, mutacyjne, funkcjonalne, czasowe, wydajnościowe, bł˛edy w danych lub sprz˛etowe, — stopniem dotkliwości wykrywanego bł˛edu przez asercj˛e – elementami zbioru R moga˛ być różne stopnie dotkliwości wykrytego bł˛edu, na przykład pomijalny, łagodny, krytyczny, katastroficzny, — innymi cechami asercji takimi jak jej niski lub wysoki koszt statyczny czy też niski lub wysoki koszt dynamiczny. Atrybuty asercji moga˛ być określone manualnie przez eksperta lub automatycznie przez system wykrywania asercji lub na etapie przeprowadzania testów w metodzie selekcji asercji (na przykład rodzaj wykrytego bł˛edu przez asercj˛e lub stopień jego dotkliwości). W programie można zdefiniować kilka niezależnych zbiorów atrybutów asercji (różnych zbiorów R) zwiazanych ˛ z różnymi cechami asercji. Idea˛ tego parametru jest umożliwienie wyrażenia pewnych specyficznych własności asercji, w szczególności charakterystycznych jedynie dla badanej aplikacji. Atrybuty asercji moga˛ być użyte jako jedna ze strategii selekcji asercji. Przykładowo, zbiór wybieranych asercji może zostać zaw˛eżony jedynie do asercji, które po wykryciu bł˛edu moga˛ przywrócić poprawny stan wykonywanego programu, przynależa˛ do określonego jego modułu lub stopień dotkliwości bł˛edów przez nie wykrywanych jest co najmniej krytyczny. 40 3.2.9. Charakterystyki i profile asercji Po każdym teście badanego programu dla każdej z asercji można określić właściwości, które opisuja˛ jej zachowanie. Zostały one przedstawione w tabeli 3.1. Właściwości asercji określane sa˛ przy założeniu, że jej naruszenie nie powoduje żadnych skutków działania, które wpływaja˛ na przebieg wykonania programu. Należa˛ do nich na przykład zatrzymanie programu, podj˛ecie działań naprawczych lub maskujacych ˛ zaistniały bład. ˛ Oznacza to, że wszystkie asercje sa˛ sprawdzane, ale bez wzgl˛edu na to czy zostały naruszone czy spełnione nie podejmuje si˛e żadnych dodatkowych działań wpływajacych ˛ na przebieg działania aplikacji. Celem takiego post˛epowania jest rejestracja właściwości dla wszystkich asercji bez ewentualnego wpływu ich skutków działania na inne asercje. Przykładowo, w przypadku poprawnego wykonania programu, sprawdzane asercje w badanym programie powinny zachowywać si˛e zgodnie z właściwościa˛ przedstawiona˛ w wierszu oznaczonym identyfikatorem b w tabeli 3.1. Wynika to z faktu, iż żadna z asercji nie powinna zostać naruszona podczas przeprowadzania tego rodzaju testu. a Asercja jako pierwsza, w zbiorze wszystkich asercji w programie, została naruszona podczas wykonania danego testu. Oznacza to, że dana asercja jako pierwsza w określonym teście została naruszona bez wzgl˛edu na to jak wiele razy ta lub inne asercje zostały wcześniej sprawdzone bez naruszenia oraz jakie sa˛ wyniki sprawdzeń tej lub innej asercji po jej pierwszym naruszeniu. Asercja, która jako pierwsza została naruszona podczas danego testu, potencjalnie jako pierwsza wykryła wprowadzony w nim bład. ˛ b Asercja została sprawdzona i jest spełniona przy założeniu, że żadna ze sprawdzonych dotychczas asercji nie została naruszona podczas wykonania danego testu. Oznacza to, że żadna z dotychczas sprawdzonych asercji w określonym teście nie została naruszona. Jeśli w danym teście został wprowadzony bład ˛ to nie został on wykryty przez żadna˛ z asercji. c Asercja została sprawdzona i naruszona przy założeniu, że co najmniej jedna z asercji została już naruszona podczas wykonania testu. Oznacza to, że sprawdzona asercja jest kolejna˛ z asercji, których sprawdzenie skończyło si˛e naruszeniem. Zakłada si˛e, że mogła być to również ta sama asercja przy jej kolejnym sprawdzeniu podczas wykonywania danego testu. Asercja, która jako kolejna została naruszona podczas danego testu, potencjalnie wykrywa wprowadzony w nim bład, ˛ który został już wykryty przez nia˛ sama˛ albo inna˛ z asercji. d Asercja została sprawdzona i nie została naruszona przy założeniu, że co najmniej jedna z asercji została już naruszona podczas wykonania testu. Zakłada si˛e, że mogła być to również ta sama asercja przy jej kolejnym sprawdzeniu podczas wykonywania danego testu. Taka asercja potencjalnie nie wykrywa w danym teście bł˛edu, jeśli został on wprowadzony. Tabela 3.1. Właściwości asercji określane dla danego testu programu 41 Przy tak zdefiniowanych właściwościach możliwe jest przyporzadkowanie ˛ do każdej asercji w programie dowolnego ich podzbioru. Podzbiór ten nazwiemy charakterystyka˛ asercji. W szczególności, jeśli asercja nie zostanie sprawdzona podczas testu programu, żadna z przedstawionych właściwości nie b˛edzie jej przyporzadkowana. ˛ Oznacza to, że zbiór właściwości tej asercji b˛edzie zbiorem pustym. Definicja 3.2.10. Charakterystyka˛ asercji dla wykonanego testu programu nazywamy określona˛ na jego podstawie przynależność asercji do pewnego podzbioru jej właściwości. Możliwe charakterystyki asercji zebrano w tabeli 3.2. Wyznaczone one zostały jako wszystkie n-elementowe kombinacje bez powtórzeń zbioru {a, b, c, d} złożonego z czterech P właściwości asercji, gdzie n = 0 . . . 4. Ich liczba jest równa 4n=0 n4 = 24 = 16. Oznaczenia właściwości w tabeli 3.2 dla danych charakterystyk sa˛ zgodne z przyj˛etymi w tabeli 3.1. Kropka˛ oznaczono przynależność danej właściwości do asercji. Po każdym teście programu dla każdej z asercji można jednoznacznie przyporzadkować ˛ jedna˛ z możliwych szesnastu charakterystyk. Podczas przeprowadzania eksperymentu wykonywanych może być wiele testów. Dla każdego z nich przyporzadkowywane ˛ sa˛ pewne charakterystyki dla wszystkich asercji w programie. Interesujac ˛ a˛ informacja˛ może być przynależność nie jednej wybranej charakterystyki do asercji, ale pewnego ich podzbioru, które można zaobserwować dla danej asercji w trakcie przeprowadzania eksperymentu. Podzbiór taki nazwiemy profilem asercji. Charakterystyki k 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Właściwości (tabela 3.1) a b c d • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • A B • • • • • • • • • • • • • • • • • • • C Profile (tabela 3.3) D E F • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • I • • • Tabela 3.2. Charakterystyki i wybrane profile asercji 42 H • • • • • • • • G • • • • • • • • Definicja 3.2.11. Profilem asercji nazywamy określony zbiór wybranych charakterystyk asercji. Poj˛ecie profilu asercji umożliwia uproszczenie sposobu opisu zbioru charakterystyk danej asercji. Dzi˛eki niemu można uniknać ˛ konieczności ciagłego ˛ przedstawiania jej wszystkich interesujacych ˛ charakterystyk, które moga˛ pojawić si˛e w eksperymencie. W kolumnach tabeli 3.2 oznaczonych literami od A do I wyróżniono dziewi˛eć przykładowych profili asercji poprzez oznaczenie znakiem • przynależności danej charakterystyki asercji do określonego profilu. Przedstawione profile opisuja˛ najcz˛eściej spotykany lub pożadany ˛ charakter danej asercji. Ich znaczenie zostało opisane w tabeli 3.3. Zastosowano w niej oznaczenia profili odpowiadajace ˛ identyfikatorom użytym w tabeli 3.2. Liczba wszystkich możliwych profili asercji odpowiada liczbie wszystkich n-elementowych kombinacji bez powtórzeń zbioru złożonego z szesnastu charakterystyk asercji, gdzie n = 0 . . . 16. Jest ona P 16 16 = 65536. równa 16 n=0 n = 2 Poj˛ecie profilu asercji umożliwia określenie sposobu jej zachowania w przeprowadzonym teście. Po wybraniu pewnego profilu i przeprowadzeniu testu programu możliwe jest określenie dla każdej z asercji czy spełniła lub nie spełniła ona jego warunki to jest czy jej charakterystyka w danym teście należała do wybranych, oznaczonych znakiem • w tabeli 3.2, charakterystyk dla danego profilu. Przyporzadkowanie ˛ to nazwiemy przynależnościa˛ asercji do wybranego profilu w teście. Definicja 3.2.12. Przynależność i-tej asercji w danym teście t do wybranego profilu określa funkcja p(i, t). Przyjmuje ona wartość 1 jeżeli asercja programu należy do wybranego profilu. W przeciwnym wypadku wartość tej funkcji wynosi 0. Powyższa definicja funkcji określajacej ˛ przynależność asercji do wybranego profilu umożliwi zdefiniowanie poj˛eć skuteczności i nieskuteczności asercji. 3.2.10. Skuteczność i nieskuteczność asercji Po wprowadzeniu asercji do programu może zajść konieczność selekcji tych z nich, które charakteryzuja˛ si˛e najwyższym lub najniższym poziomem detekcji bł˛edów wprowadzanych do programu w przygotowanym zestawie testów. Zasadne jest zaproponowanie miar, które pozwoliłyby wartościować asercje wzgl˛edem opisanego kryterium. Skuteczność i nieskuteczność asercji dla wykonanej serii uruchomień programu (testów) T opisuja˛ w wymierny sposób zachowania asercji według wybranego profilu. Intuicyjnie celem tych miar jest wyrażenie efektywności w detekcji nieprawidłowego zachowania programu przez asercje. Skuteczność i nieskuteczność asercji sa˛ parametrami wyznaczanymi dla danego eksperymentu i moga˛ różnić si˛e dla różnych eksperymentów. 43 A Asercja została sprawdzona. W trakcie wykonania programu osiagni˛ ˛ eto takie jego miejsce, w którym doszło do określenia czy dana asercja została spełniona lub naruszona (doszło do sprawdzenia danej asercji). Profil ten opisuje asercje, które zostały użyte podczas uruchomienia programu. B Asercja została sprawdzona przed pierwszym naruszeniem innej lub tej samej asercji. Profil ten opisuje asercje, które nie wykryły wprowadzonego bł˛edu, jeśli został on wprowadzony do badanego programu przed ich sprawdzeniem. C Asercja została sprawdzona po pierwszym naruszeniu innej lub tej samej asercji. Profil ten opisuje asercje, które zostały użyte po wykryciu bł˛edu przez dowolna˛ z asercji programu bez wzgl˛edu na to, jakim wynikiem skończyło si˛e ich sprawdzenie. D Asercja została sprawdzona i została naruszona jako pierwsza asercja. Podczas wykonania programu osiagni˛ ˛ eto takie jego miejsce, w którym doszło do sprawdzenia danej asercji i została ona naruszona jako pierwsza asercja. Asercja ta mogła być już wcześniej sprawdzana, jednak nie była naruszona. Profil ten opisuje asercje, które potencjalnie jako pierwsze wykryły bład ˛ w badanym programie. E Asercja została sprawdzona i została naruszona. Podczas wykonania programu osiagni˛ ˛ eto takie jego miejsce, w którym doszło do sprawdzenia danej asercji i nie została ona spełniona bez wzgl˛edu na to, jakim wynikiem kończyły si˛e sprawdzenia tej lub innych asercji w badanym programie. Profil ten opisuje asercje, które potencjalnie wykrywaja˛ bład ˛ w badanym programie. F Asercja została sprawdzona, została naruszona i nie zaobserwowano innych jej sprawdzeń bez naruszenia. Profil ten opisuje asercje, które stale sa˛ naruszane podczas wykonania badanego programu. G Asercja została sprawdzona i nie została naruszona. W trakcie wykonania programu osiagni˛ ˛ eto takie jego miejsce, w którym doszło do sprawdzenia danej asercji i nie została ona naruszona bez wzgl˛edu na to, jakim wynikiem kończyły si˛e sprawdzenia tej lub innych asercji w badanym programie. Profil ten opisuje asercje, których co najmniej jedno sprawdzenie nie skończyło si˛e naruszeniem podczas wykonania badanego programu. H Asercja została sprawdzona przed i po pierwszym naruszeniu innej lub tej samej asercji. Podczas wykonania programu osiagni˛ ˛ eto takie jego miejsce, w którym doszło do sprawdzenia wybranej asercji zarówno przed jak i po pierwszym naruszeniu dowolnej z asercji programu. I Asercja została sprawdzona i po pierwszym naruszeniu innej lub tej samej asercji zgłasza wyłacznie ˛ naruszenia. W trakcie wykonania programu dana asercja zgłasza wyłacznie ˛ naruszenia pod warunkiem, że doszło do pierwszego naruszenia tej lub innej asercji w badanym programie. Profil ten opisuje asercje, które po potencjalnym wykryciu bł˛edu przez dowolna˛ z asercji badanego programu stale zgłaszaja˛ naruszenie. Tabela 3.3. Opis wybranych profili asercji 44 Uwzgl˛ednienie wybranych testów przy wyliczaniu wartości skuteczności lub nieskuteczności asercji dla danego eksperymentu dla każdego ze zdefiniowanych wyników testu programu b˛edzie możliwe po przyporzadkowaniu ˛ liczby określajacej ˛ jego wag˛e. Umożliwia ona wartościowanie zebranych informacji o asercjach otrzymanych w skutek testu t programu zakończonego z wynikiem e. Definicja 3.2.13. Waga˛ dla danego wyniku testu e nazywamy wartość funkcji w(e) ∈ R, e ∈ E. Konkretna postać funkcji w(e) powinna zostać zdefiniowana przez eksperta. Dodatnie wartości funkcji wag b˛eda˛ wpływać na wzrost wartości danej miary, wartości ujemne b˛eda˛ powodować jej spadek. W szczególności umożliwiaja˛ pomini˛ecie testów o danym wyniku e jeśli w(e) = 0. Skuteczność bezwzgl˛edna i wzgl˛edna asercji Miara skuteczności bezwzgl˛ednej wartościuje przynależność asercji do wybranego profilu dla zbioru testów według określonej funkcji wag. Jest ona wyliczana jedynie z uwzgl˛ednieniem wyników otrzymanych dla danej asercji. Definicja 3.2.14. Skuteczność bezwzgl˛edna i-tej asercji w programie jest określana jako: X w(et ) ∗ p(i, t) (3.1) t∈T gdzie T jest zbiorem przeprowadzanych testów, et wynikiem testu t, w(et ) określa wartość wagi dla wyniku testu et , a p(i, t) jest wartościa˛ funkcji przynależności i-tej asercji do wybranego profilu w teście t. Miara skuteczności wzgl˛ednej wartościuje przynależność asercji do wybranego profilu dla zbioru testów według określonej funkcji wag w uzależnieniu od liczby innych aktywnych asercji przynależacych ˛ do tego samego profilu. Definicja 3.2.15. Jeżeli ∃t ∈ T dla którego p(i, t) 6= 0 to skuteczność wzgl˛edna i-tej asercji w programie jest określana jako: X w(et ) ∗ t∈T,p(i,t)6=0 p(i, t) n X (3.2) vk ∗ p(k, t) k=1 gdzie T jest zbiorem przeprowadzanych testów, n liczba˛ asercji w programie, et wynikiem testu t, w(et ) określa wartość wagi dla wyniku testu et , p(i, t) jest wartościa˛ funkcji przynależności i-tej asercji do wybranego profilu w teście t, vk określa aktywność k-tej asercji, a p(k, t) jest wartościa˛ funkcji przynależności k-tej asercji do wybranego profilu w teście t. Jeżeli ∼ ∃t ∈ T dla którego p(i, t) 6= 0 to skuteczność wzgl˛edna i-tej asercji w programie jest nieokreślona. 45 W szczególności wartości skuteczności wzgl˛ednej i skuteczności bezwzgl˛ednej b˛eda˛ równe, jeśli dana asercja jest jedyna˛ asercja˛ przynależac ˛ a˛ do wybranego profilu dla całego zbioru testów o wynikach e dla których w(e) 6= 0. Nieskuteczność bezwzgl˛edna i wzgl˛edna asercji Miary nieskuteczności asercji, w przeciwieństwie do miar ich skuteczności, uwzgl˛edniaja˛ brak przynależności asercji do wybranego profilu w teście. Miara nieskuteczności bezwzgl˛ednej wartościuje brak przynależność asercji do wybranego profilu dla zbioru testów według określonej funkcji wag. Jest ona wyliczana jedynie z uwzgl˛ednieniem wyników otrzymanych dla danej asercji. Definicja 3.2.16. Nieskuteczność bezwzgl˛edna i-tej asercji w programie jest określana jako: X w(et ) ∗ (1 − p(i, t)) (3.3) t∈T gdzie T jest zbiorem przeprowadzanych testów, et wynikiem testu t, w(et ) określa wartość wagi dla wyniku testu et , a p(i, t) jest wartościa˛ funkcji przynależności i-tej asercji do wybranego profilu w teście t. Miara nieskuteczności wzgl˛ednej wartościuje brak przynależność asercji do wybranego profilu dla zbioru testów według określonej funkcji wag w uzależnieniu od liczby innych aktywnych asercji nieprzynależacych ˛ do tego samego profilu. Definicja 3.2.17. Jeżeli ∃t ∈ T dla którego p(i, t) 6= 1 to nieskuteczność wzgl˛edna i-tej asercji w programie jest określana jako: X t∈T,p(i,t)6=1 w(et ) ∗ 1 − p(i, t) n X (3.4) vk ∗ (1 − p(k, t)) k=1 gdzie T jest zbiorem przeprowadzanych testów, n liczba˛ asercji w programie, et wynikiem testu t, w(et ) określa wartość wagi dla wyniku testu et , p(i, t) jest wartościa˛ funkcji przynależności i-tej asercji do wybranego profilu w teście t, vk określa aktywność k-tej asercji, a p(k, t) jest wartościa˛ funkcji przynależności k-tej asercji do wybranego profilu w teście t. Jeżeli ∼ ∃t ∈ T dla którego p(i, t) 6= 1 to nieskuteczność wzgl˛edna i-tej asercji w programie jest nieokreślona. Wartości nieskuteczności bezwzgl˛ednej i nieskuteczności wzgl˛ednej b˛eda˛ równe, jeśli dana asercja jest jedyna˛ asercja˛ nieprzynależac ˛ a˛ do wybranego profilu dla całego zbioru testów o wynikach e dla których w(e) 6= 0. 46 Charakterystyka miar skuteczności i nieskuteczności Z zaproponowanych miar służacych ˛ parametryzacji asercji miary skuteczności i nieskuteczności sa˛ nowatorskimi sposobami ich wartościowania. Dlatego też niezb˛edne jest przedstawienie charakterystyk tych miar. Pozostałe z nich, takie jak koszt statyczny, dynamiczny sa˛ intuicyjne i stosowane sa˛ również w innych dziedzinach zwiazanych ˛ z inżynieria˛ oprogramowania. Rysunek 3.1(a) przedstawia wartość skuteczności bezwzgl˛ednej asercji w zależności od liczby testów w eksperymencie o pewnym wyniku testu e, dla którego wybrana asercja należy do określonego profilu. Sporzadzono ˛ go dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość skuteczności bezwzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza wartość funkcji wag dla wyniku testu e tym wi˛eksza jest wartość skuteczności bezwzgl˛ednej asercji. Przykładowo, przyporzadkowanie ˛ dużej wartości wagi dla wyniku testu wyrażajacego ˛ nieprawidłowe zachowanie badanego programu pozwala promować te asercje, które zostały naruszone, jeśli założony profil asercji obejmuje taki przypadek. Na rysunku 3.1(b) przedstawiono wartość skuteczności wzgl˛ednej asercji w zależności od liczby testów w eksperymencie o pewnym wyniku testu e, dla którego wybrana asercja należała do określonego profilu. Charakterystyki zakładaja˛ stała˛ liczb˛e innych asercji, które dla testów o wyniku e należały do tego samego profilu co badana asercja. Wykres sporzadzono ˛ dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość skuteczności wzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza wartość funkcji wag dla pewnego wyniku testu tym wi˛eksza jest wartość skuteczności wzgl˛ednej. Podobnie jak w przypadku skuteczności bezwzgl˛ednej przyporzadkowanie ˛ dużej wartości wag umożliwia promowanie naruszanych asercji dla danego wyniku testu programu. Rysunek 3.1(c) przedstawia charakterystyk˛e skuteczności wzgl˛ednej asercji w zależności od liczby testów w eksperymencie o ustalonym wyniku testu e, dla którego wybrana asercja należała do określonego profilu. Sporzadzony ˛ został dla trzech różnych liczb innych asercji, które dla testów o wyniku e należa˛ do tego samego profilu co wybrana asercja, dla której wyznaczamy wartość skuteczności wzgl˛ednej, przy czym dla każdego z testów spełniony jest P Pn Pn warunek nk=1 vk ∗ p1 (k, t) < k=1 vk ∗ p2 (k, t) < k=1 vk ∗ p3 (k, t), gdzie n oznacza liczb˛e wszystkich asercji. Wszystkie charakterystyki zostały sporzadzone ˛ dla tej samej funkcji w(e). Wartość skuteczności wzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza liczba innych asercji, które należa˛ do tego samego profilu, tym mniejsza jest wartość skuteczności wzgl˛ednej. Takie zachowanie wartości skuteczności wzgl˛ednej umożliwia promowanie asercji, które na przykład jako jedyne lub jedne 47 (a) skuteczność bezwzgl˛edna (dla różnych funkcji w(e)) (b) skuteczność wzgl˛edna (dla różnych funkcji w(e)) (c) skuteczność wzgl˛edna (dla różnych liczb innych asercji, które należały do tego samego profilu co badana asercja) (d) skuteczność wzgl˛edna (dla różnych funkcji w(e)) (e) skuteczność wzgl˛edna (dla różnych liczb innych asercji, które należały do tego samego profilu co badana asercja) Rysunek 3.1. Charakterystyki skuteczności 48 z niewielu sa˛ naruszane w testach o wyniku opisujacym ˛ nieprawidłowe zachowanie programu. Przedstawiaja˛ to również kolejne dwie charakterystyki. Na rysunku 3.1(d) przedstawiono wartość skuteczności wzgl˛ednej asercji w zależności od liczby innych asercji p, które w danej serii testów o pewnym wyniku testu e, należały do tego samego profilu co badana asercja. Sporzadzono ˛ go dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość skuteczności wzgl˛ednej jest odwrotnie proporcjonalna do liczby asercji, które należa˛ do tego samego profilu w danym teście co badana asercja. Im wi˛eksza wartość funkcji wag dla pewnego wyniku testu tym wi˛eksza jest wartość skuteczności wzgl˛ednej. Rysunek 3.1(e) przedstawia charakterystyk˛e skuteczności wzgl˛ednej asercji w zależności od liczby innych asercji p, które w danej serii testów o pewnym wyniku testu e, należały do tego samego profilu co badana asercja. Wszystkie charakterystyki zostały sporzadzone ˛ dla tej samej funkcji w(e). Wykres przygotowano dla trzech różnych eksperymentów o rosnacej ˛ liczbie testów o wyniku e. Wartość skuteczności wzgl˛ednej jest odwrotnie proporcjonalna do liczby asercji, które należa˛ do tego samego profilu w danym teście co badana asercja. Im wi˛eksza liczba testów w eksperymencie, w których badana asercja należała do wybranego profilu tym wi˛eksza jest wartość skuteczności wzgl˛ednej. Rysunek 3.2(a) przedstawia wartość nieskuteczności bezwzgl˛ednej asercji w zależności od liczby testów w eksperymencie o pewnym wyniku testu e, dla którego wybrana asercja należy do określonego profilu. Sporzadzony ˛ został dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość nieskuteczności bezwzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza wartość funkcji wag dla pewnego wyniku testu tym wi˛eksza jest wartość nieskuteczności bezwzgl˛ednej. Na rysunku 3.2(b) przedstawiono wartość nieskuteczności wzgl˛ednej asercji w zależności od liczby testów w eksperymencie o pewnym wyniku testu e, dla którego wybrana asercja należała do określonego profilu. Charakterystyki zakładaja˛ stała˛ liczb˛e innych asercji, które dla testów o wyniku e należały do tego samego profilu co badana asercja. Wykres sporzadzono ˛ dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość nieskuteczności wzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza wartość funkcji wag dla pewnego wyniku testu tym wi˛eksza jest wartość nieskuteczności wzgl˛ednej. Rysunek 3.2(c) przedstawia charakterystyk˛e nieskuteczności wzgl˛ednej asercji w zależności od liczby testów w eksperymencie o ustalonym wyniku testu e, dla którego wybrana asercja należała do określonego profilu. Sporzadzono ˛ go dla trzech różnych liczb innych asercji, które dla testów o wyniku e należa˛ do tego samego profilu co wybrana asercja, przy czym Pn Pn Pn k=1 vk ∗ (1 − p1 (k, t)) < k=1 vk ∗ (1 − p2 (k, t)) < k=1 vk ∗ (1 − p3 (k, t)), gdzie n 49 (a) nieskuteczność bezwzgl˛edna (dla różnych funkcji w(e)) (b) nieskuteczność wzgl˛edna (dla różnych funkcji w(e)) (c) nieskuteczność wzgl˛edna (dla różnych liczb innych asercji, które należały do tego samego profilu co badana asercja) (d) nieskuteczność wzgl˛edna (dla różnych funkcji w(e)) (e) nieskuteczność wzgl˛edna (dla różnych liczb innych asercji, które należały do tego samego profilu co badana asercja) Rysunek 3.2. Charakterystyki nieskuteczności 50 oznacza liczb˛e wszystkich asercji. Wszystkie charakterystyki zostały sporzadzone ˛ dla tej samej funkcji w(e). Wartość nieskuteczności wzgl˛ednej jest wprost proporcjonalna do liczby testów, w których asercja należy do określonego profilu. Im wi˛eksza liczba innych asercji, które należa˛ do tego samego profilu, tym mniejsza jest wartość nieskuteczności wzgl˛ednej. Na rysunku 3.2(d) przedstawiono wartość nieskuteczności wzgl˛ednej asercji w zależności od liczby innych asercji p, które w danej serii testów o pewnym wyniku testu e, należały do tego samego profilu co badana asercja. Sporzadzony ˛ został dla trzech funkcji określajacych ˛ wag˛e danego wyniku testu w obserwowanym profilu, przy czym w1 (e) < w2 (e) < w3 (e), e ∈ E. Wartość nieskuteczności wzgl˛ednej jest odwrotnie proporcjonalna do liczby asercji, które należa˛ do tego samego profilu w danym teście co badana asercja. Im wi˛eksza wartość funkcji wag dla pewnego wyniku testu tym wi˛eksza jest wartość nieskuteczności wzgl˛ednej. Rysunek 3.2(e) przedstawia charakterystyk˛e nieskuteczności wzgl˛ednej asercji w zależności od liczby innych asercji p, które w danej serii testów o wyniku testu e, należały do tego samego profilu co badana asercja. Wszystkie charakterystyki zostały sporzadzone ˛ dla tej samej funkcji w(e). Wykres został przygotowany dla trzech różnych eksperymentów o rosnacej ˛ liczbie testów o wyniku e. Wartość nieskuteczności wzgl˛ednej jest odwrotnie proporcjonalna do liczby asercji, które należa˛ do tego samego profilu w danym teście co badana asercja. Im wi˛eksza liczba testów w eksperymencie, w których badana asercja należała do wybranego profilu tym wi˛eksza jest wartość nieskuteczności wzgl˛ednej. 3.3. Metoda selekcji asercji Metoda selekcji asercji, których parametry b˛eda˛ spełniały w optymalny sposób pewne wybrane kryteria wyrażone z użyciem zaprezentowanych wcześniej miar, składa si˛e z nast˛epujacych ˛ kroków: — obserwacja asercji w badanym programie — wyznaczenie parametrów asercji, — wybór asercji według wybranej strategii, — weryfikacja otrzymanych wyników poprzez eksperyment z rejestracja˛ naruszeń wybranych asercji w programie, — analiza otrzymanych rezultatów. Powiazania ˛ pomi˛edzy poszczególnymi krokami metody selekcji asercji przedstawiono na rysunku 3.3. Na podstawie przygotowanego zestawu testów o pewnych parametrach oraz przygotowanych danych wejściowych dla programu (jeśli sa˛ konieczne) dokonywana jest seria jego uruchomień, w czasie której przeprowadzana jest obserwacja zachowania asercji (krok pierwszy). Zebrane wyniki testów pozwalaja˛ na wyznaczenie wybranych parametrów asercji (krok drugi). Sa˛ one nast˛epnie użyte do przeprowadzenia procesu selekcji 51 asercji z uwzgl˛ednieniem wymaganych kryteriów (krok trzeci). Program z wybranymi asercjami poddawany jest analogicznemu zestawowi testów do użytego na potrzeby obserwacji asercji (krok czwarty). Zebrane informacje o naruszeniach wybranych asercji i liczbie wykrytych bł˛edów moga˛ zostać porównane z wynikami jakie otrzymano, gdy wszystkie asercje w programie były aktywne lub odnieść do rezultatów jakie otrzymano dla programu z wybranymi asercjami na podstawie innych kryteriów (krok piaty). ˛ wyniki testów 1 parametry przeprowadzanych DAT testów 4 wyniki testów LOG 2 obserwacja asercji w badanym programie DAT rejestracja naruszeń wybranych asercji w badanym programie LOG wyznaczenie parametrów asercji dane wejściowe badanego programu TXT 3 TXT selekcja asercji wybrane asercje 5 analiza wyników parametry asercji TXT TXT strategie selekcji asercji wnioski z analizy wyników Rysunek 3.3. Przebieg procesu selekcji asercji 3.3.1. Obserwacja asercji Na etapie obserwacji asercji wykonywana jest seria uruchomień programu zgodnie z zakładanym scenariuszem testowym T zawierajacym ˛ określony zbiór testów. Może on zostać wygenerowany automatycznie na przykład z wykorzystaniem narz˛edzi, takich jak FITS [9, 37] czy FERRARI [48], przeznaczonych do zakłócania wykonania aplikacji i obserwacji jej zachowania w celu analizy wiarygodności. Pojedynczy test t polega na jednokrotnym wykonaniu programu w ustalonym, najcz˛eściej zakłóconym w pewien sposób, środowisku. Podczas testów asercje sa˛ aktywne, ale ich skutki działania nie moga˛ wpływać na przebieg wykonania programu i na inne asercje. Oznacza to, że potencjalne naruszenie jest rejestrowane lecz nie powoduje 52 przerwania programu. Na tym etapie same asercje nie moga˛ być zakłócane ponieważ w sposób wiarygodny musza˛ być rejestrowane ich właściwości. Dla każdego testu zapisywany jest kod zakończenia programu oraz charakterystyki wszystkich asercji w badanym programie. Proces obserwacji asercji może być operacja˛ czasochłonna.˛ Jej czas jest wprost proporcjonalny do liczby przeprowadzanych testów oraz średniego czasu wykonania pojedynczego testu. Ponieważ do obserwowanego programu wprowadzona jest zazwyczaj duża liczba asercji może ona istotnie wpłynać ˛ na czas jego wykonania. Średni czas wykonania pojedynczego testu może zostać oszacowany na podstawie pomiaru czasu działania programu zawierajacego ˛ wszystkie asercje. W tym kroku należy również określić pożadany ˛ profil asercji oraz wagi dla wyników testu. Sa˛ one wyznaczane przez eksperta, który uwzgl˛ednia oczekiwany sposób zachowania asercji podczas testów zakończonych danym wynikiem. Wybrane parametry asercji, w zależności od ich charakteru, moga˛ zostać określone dla każdego z testów, na podstawie testu wzorcowego lub poprzez wyznaczenie parametrów statystycznych, a także wyznaczone przez eksperta. W szczególności parametr określajacy ˛ aktywność asercji b˛edzie wynikiem działania omawianego algorytmu selekcji asercji. 3.3.2. Wybór asercji W kolejnym kroku na podstawie ustalonych oraz zmierzonych parametrów asercji można utworzyć model matematyczny b˛edacy ˛ zadaniem programowania liniowego [99] o rozwiaza˛ niach w zbiorze liczb całkowitych. Jego rozwiazanie ˛ da odpowiedź na pytanie, które z asercji powinny być aktywne (parametr vi ), aby określony, wybrany profil zachowania asercji w programie był optymalny według wyznaczonej funkcji celu i narzuconych ograniczeń. Ze wzgl˛edu na przyj˛ete ograniczenia dotyczace ˛ zmiennych, które sa˛ rozwiazaniem ˛ tak sformułowanego zadania programowania liniowego może być rozwiazywane ˛ za pomoca˛ algorytmu sympleksowego [99] wraz z metoda˛ rozgał˛ezień i ograniczeń lub, z uwagi na binarny charakter wartości rozwiazań ˛ poszukiwanej zmiennej, specjalizowanym algorytmem rozgał˛ezień i ograniczeń dla zadań binarnego programowania całkowitoliczbowego [17]. Funkcja celu zadania programowania liniowego Celem sformułowanego zadania programowania liniowego jest znalezienie takiego zestawu aktywnych asercji, dla którego wybrane parametry, w zależności od potrzeb, b˛eda˛ osiagały ˛ wartość minimalna˛ lub maksymalna.˛ W szczególności funkcjami celu zadania programowania liniowego moga˛ być: — maksymalizacja wartości sumy skuteczności bezwzgl˛ednej lub wzgl˛ednej wszystkich aktywnych asercji w programie wpływajaca ˛ na liczb˛e wykrywanych zakłóceń w działaniu badanego programu, 53 — minimalizacja wartości sumy nieskuteczności bezwzgl˛ednej lub wzgl˛ednej wszystkich aktywnych asercji w programie wpływajaca ˛ na liczb˛e niewykrywanych zakłóceń w działaniu badanego programu, — minimalizacja wartości sumy średniego całkowitego kosztu dynamicznego wszystkich aktywnych asercji w programie wpływajaca ˛ na czas działania badanego programu, — minimalizacja wartości sumy średniego kosztu statycznego wszystkich aktywnych asercji w programie wpływajaca ˛ na rozmiar badanego programu, — maksymalizacja lub minimalizacja wartości sumy średniej wartości parametrów położenia wszystkich aktywnych asercji w programie wpływajaca ˛ na przykład na moment wykrycia zakłóceń w działaniu badanego programu. Ograniczenia Narzucone ograniczenia w omawianym zadaniu programowania liniowego obejmuja: ˛ — ograniczenie na dopuszczalny zbiór wartości zmiennej vi : ∀i=1...n vi = 0 ∨ vi = 1 (3.5) — dolne lub górne ograniczenie na wartość jednej lub wielu sum wartości parametrów charakteryzujacych ˛ aktywne asercje badanego programu; konkretne wartości wybranego ograniczenia wybierane sa˛ przez eksperta, — ograniczenia zwiazane ˛ z innymi parametrami asercjami takimi jak wybór asercji określonego rodzaju lub z określonych grup asercji. 3.3.3. Weryfikacja wyników Ostatnim, opcjonalnym krokiem metody selekcji asercji jest weryfikacja teoretycznie osiaganych ˛ wyników oszacowanych na podstawie obserwacji asercji. Polega ona na ponownym wykonaniu testów dla programu, w którym aktywne sa˛ wyłacznie ˛ wybrane asercje. Na tym etapie dopuszcza si˛e możliwość zakłócania działania samych asercji, aby w możliwie jak najlepszym stopniu odzwierciedlić rzeczywiste zakłócenia, jakim poddana może być aplikacja. Stosowany zbiór testów nie musi być identycznym zbiorem stosowanym na etapie obserwacji asercji. Celem weryfikacji jest zbadanie zachowania wybranych asercji w pewnych określonych warunkach, które w szczególności moga˛ pokrywać si˛e z testami stosowanymi na etapie obserwacji asercji. Wyniki weryfikacji można porównać z wynikami testów podczas obserwacji asercji określajac ˛ na przykład ile bł˛edów zostało w praktyce przez nie wykrytych. Podczas eksperymentu majacego ˛ na celu weryfikacj˛e wyników rejestrowane sa˛ wyniki testów (w szczególności program zakończony naruszeniem asercji) oraz ewentualnie szczegółowe informacje o asercjach, które zostały naruszone. 54 3.3.4. Przykłady zastosowania metody selekcji asercji Poniżej zaprezentowano przykładowe sformułowania zadań programowania liniowego majacych ˛ na celu redukcj˛e liczby stosowanych asercji w programie z uwzgl˛ednieniem kryteriów maksymalizacji całkowitej wartości ich skuteczności bezwzgl˛ednej i wzgl˛ednej. Do przeprowadzenia obliczeń wykorzystano dane zebrane podczas eksperymentu z wykorzystaniem aplikacji symulujacej ˛ działanie sterownika produkcyjnego, który szczegółowo został opisany w punkcie 5.1 rozdziału piatego. ˛ W aplikacji użytych zostało 1851 asercji, co wpłyn˛eło na duża˛ liczb˛e składników wyst˛epujacych ˛ w funkcjach celu oraz ograniczeniach. Z tego powodu, tam gdzie było to konieczne, zaprezentowano jedynie ich wybrana˛ cz˛eść, zast˛epujac ˛ wielokropkiem pomini˛ete składniki. Parametry asercji określajace ˛ ich skuteczność i nieskuteczność zostały wyznaczone na podstawie eksperymentu, na który składało si˛e 5087 testów. Czas jednokrotnego wykonania programu zawierajacego ˛ wszystkie asercje wynosił około 380 sekund, co oznacza, że obserwacja programu trwała około 22 dni. Dla maksymalizacji wartości sumy skuteczności bezwzgl˛ednej wszystkich n asercji przy wybranym profilu oraz wagach wyników testu funkcja celu dla zadania programowania liniowego przyjmuje ogólna˛ postać: n X i=1 (vi ∗ X w(et ) ∗ p(i, t)) → max t∈T Po przeprowadzeniu podczas eksperymentu pomiarów dla badanego programu określone zostały wartości skuteczności bezwzgl˛ednej, wzgl˛ednej oraz całkowitego kosztu dynamicznego dla każdej z asercji. Wyznaczono je z wykorzystaniem oprogramowania z pakietu AEM przedstawionego w dodatku A.1, służacego ˛ do automatyzacji pomiarów parametrów asercji takich jak ich skuteczność, nieskuteczność oraz liczba sprawdzeń asercji. Dla przyj˛etej funkcji w(e) w postaci 5.1 (strona 86) określaja˛ one liczb˛e testów, dla których dana asercja wykryła wprowadzony bład ˛ skutkujacy ˛ nieprawidłowym działaniem programu pomniejszona˛ o liczb˛e testów, dla których dana asercja wykryła wprowadzony bład, ˛ mimo iż nie miał on wpływu na wynik działania programu. Dla 915 asercji wartość skuteczności bezwzgl˛ednej wynosi 0, dla 166 asercji jest dodatnia i mniejsza niż 10, dla 23 kształtuje si˛e pomi˛edzy wartościa˛ 10 a 100, dla pozostałych zawiera si˛e pomi˛edzy 260 a 390. Funkcja celu dla zadania programowania liniowego przyj˛eła nast˛epujac ˛ a˛ postać: 5v1 + 3v2 + v3 + 2v4 + 2v5 + 3v6 + v7 + v8 + v9 + 311v10 + . . . . . . + 298v1842 + 301v1843 + 298v1844 + 288v1845 + 298v1846 + +284v1847 + 300v1848 + 302v1849 + 299v1850 + 301v1851 → max Ogólna formuła funkcji celu zadania programowania liniowego dla maksymalizacji wartości 55 skuteczności wzgl˛ednej n asercji w programie przy wybranym profilu oraz wagach wyników testu jest nast˛epujaca: ˛ n X i=1 (vi ∗ X w(et ) ∗ t∈T,p(i,t)6=0 p(i, t) n X ) → max vk ∗ p(k, t) k=1 W trakcie przeprowadzania testów określane zostały również wartości skuteczności wzgl˛ednej dla wszystkich asercji w programie. Stosowana była funkcja w(e) w postaci 5.1. Podczas obliczania wartości skuteczności wzgl˛ednej przyj˛eto, że wszystkie asercje w programie sa˛ aktywne. Dla 19 asercji wartość skuteczności wzgl˛ednej jest ujemna, dla 869 przyjmuje wartości dodatnie pomi˛edzy 0 a 1, dla 48 jest wi˛eksza niż 1 przyjmujac ˛ dla jednej z asercji najwi˛eksza˛ obserwowana˛ wartość wynoszac ˛ a˛ 6,317, dla pozostałych wartość ta wynosi 0. Funkcja celu zadania programowania liniowego dla omawianego programu przyj˛eła postać: 0, 02v1 + 0, 12v2 + 0, 003v3 + 0, 005v4 − 0, 057v5 + 0, 005v6 + v7 + . . . . . . + 0, 435v1842 + 0, 452v1843 + 0, 458v1844 + 0, 429v1845 + 0, 457v1846 + +0, 418v1847 + 0, 436v1848 + 0, 507v1849 + 0, 432v1850 + 0, 464v1851 → max Wartość przedstawionych powyżej funkcji celu zostały zoptymalizowane przy nast˛epuja˛ cych ograniczeniach: — na górna˛ wartość Uv liczby asercji, jakie moga˛ zostać użyte w programie; może zostać ona wyznaczona z użyciem parametru opisujacego ˛ aktywność asercji (suma aktywnych asercji): n X vi ≤ Uv i=1 — na górna˛ wartość UD całkowitego kosztu dynamicznego (definicja 3.2.5) wszystkich asercji określonego na podstawie niezakłóconego wykonania programu (test gr): n X vi ∗ Di,gr ≤ UD i=1 — na dopuszczalny zbiór wartości zmiennej vi w postaci 3.5. Dla pierwszego z ograniczeń określajacego ˛ liczb˛e użytych asercji przyj˛eto górna˛ wartość wynoszac ˛ a˛ do 10 wybranych asercji: 1851 X vi ≤ 10 i=1 Ponieważ każda z asercji wyst˛epujacych ˛ w badanym programie zawierała dokładnie 56 jeden operator badajacy ˛ zależność pomi˛edzy wartościami dwóch zmiennych lub zmiennej i pewnej stałej liczbowej przyj˛eto jednostkowy koszt dla operacji sprawdzenia warunku w asercji. Wartość kosztu dynamicznego określonego w teście wzorcowym określała zatem ile razy asercja została podczas tego testu sprawdzona. Wartość t˛e wyznaczono automatycznie korzystajac ˛ z możliwości pakietu AEM. Najniższy uzyskany koszt dynamiczny pojedynczej asercji wynosi 300 i 906 asercji przyj˛eło taka˛ wartość kosztu, dla 227 wynosi on 600, dla 240 został określony na 5400, dla kolejnych 240 przyjmuje wartość 58800, dla 238 osiaga ˛ wartość 59400. Górna˛ wartość sumarycznego całkowitego kosztu dynamicznego asercji określono na dziesi˛eciokrotna˛ wielokrotność najmniejszego kosztu dynamicznego pojedynczej asercji, to jest UD = 3000: 300v1 + 300v2 + 300v3 + 300v4 + 300v5 + . . . . . . + 5400v250 + 5400v251 + . . . + 58800v750 + 58800v751 + . . . . . . + 59400v1000 + . . . + 600v1200 + . . . + 300v1850 + 300v1851 ≤ 3000 Ostatnie z wymienionych ograniczeń dla omawianego zadania programowania całkowitoliczbowego przyj˛eło nast˛epujac ˛ a˛ postać: ∀i=1...1851 vi = 0 ∨ vi = 1 Tak przygotowane dwa zadania programowania liniowego zostały rozwiazane ˛ za pomoca˛ pakietu AEM, który wykorzystuje do tego celu algorytm sympleksowy [99]. i P skuteczność całkowity koszt bezwzgl˛edna dynamiczny 32 91 589 601 648 660 834 846 892 906 327 327 330 329 329 329 329 329 329 329 300 300 300 300 300 300 300 300 300 300 10 3287 3000 Tabela 3.4. Rozwiazanie ˛ zadania maksymalizacji całkowitej wartości skuteczności bezwzgl˛ednej asercji Rozwiazanie ˛ zadania majacego ˛ na celu maksymalizacj˛e funkcji określajacej ˛ całkowita˛ wartość skuteczności bezwzgl˛ednej asercji w programie zaprezentowano w tabeli 3.4. W ko57 skuteczność całkowity koszt wzgl˛edna dynamiczny i P 7 65 223 281 282 601 691 1,000 2,006 1,524 2,200 4,940 0,652 1,000 300 300 600 600 600 300 300 7 13,322 3000 Tabela 3.5. Rozwiazanie ˛ zadania maksymalizacji całkowitej wartości skuteczności wzgl˛ednej asercji lejnych kolumnach podano indeksy wybranych asercji, wartości ich skuteczności bezwzgl˛ednej oraz kosztu dynamicznego. W ostatnim wierszu podano liczb˛e wybranych asercji, znaleziona˛ maksymalna˛ wartość funkcji celu przy narzuconych ograniczeniach i sumaryczna˛ wartość kosztu dynamicznego wybranych asercji. Analogiczne wyniki dla zadania majacego ˛ na celu maksymalizacj˛e funkcji określajacej ˛ całkowita˛ wartość skuteczności wzgl˛ednej asercji w programie zaprezentowano w tabeli 3.5. 3.4. Podsumowanie i wnioski W rozdziale zaprezentowana została metoda umożliwiajaca ˛ wybór podzbioru asercji, które w optymalny sposób b˛eda˛ spełniać założone kryteria. Metoda została sformułowana w sposób uniwersalny, który pozwala na jej dostosowanie do specyficznych wymagań oraz dopuszcza ewentualne rozszerzenia. Zdefiniowano również szereg miar, które moga˛ posłużyć do wymiernej oceny asercji. Należy jednak zwrócić uwag˛e na aspekty, które stanowia˛ ograniczenie proponowanej metody. W ramach niniejszej rozprawy zakłada si˛e, że stosowany zbiór testów jest reprezentatywny, to jest uwzgl˛ednia szeroki zakres przypadków modyfikacji i zakłóceń środowiska, danych wejściowych oraz samej badanej aplikacji. Użycie niewielkiego lub nieadekwatnego zbioru testów może skutkować otrzymaniem wyników, które moga˛ nie mieć praktycznego zastosowania. Ze wzgl˛edu na konieczność przeprowadzenia dużej liczby testów i pomiarów stosowanie proponowanej metody może być pracochłonne i czasochłonne. Istnieje konieczność opracowania testów oraz przygotowania środowiska do przeprowadzenia badań. Niekiedy dostosowanie samej badanej aplikacji może okazać si˛e skomplikowanym zadaniem. Duża liczba asercji w programie, których zachowanie jest obserwowane, może skutkować długim czasem wykonania każdego z testów. Może on przekraczać czas wykonania programu bez wprowadzonych 58 asercji. Proponowana metoda pozostawia konieczność podj˛ecia pewnych założeń w r˛ekach eksperta. Osoba taka musi zdecydować o stosowanym zbiorze testów oraz strategii optymalizacji określajac ˛ funkcje celu oraz ograniczeń. Podejmowane decyzje zależa˛ od badanego oprogramowania oraz docelowych jego parametrów jakie musza˛ być osiagni˛ ˛ ete. Podejmowanie tych decyzji wymaga pewnego doświadczenia w stosowaniu metody. Uwzgl˛edniajac ˛ powyższe uwagi konieczne jest eksperymentalne zweryfikowanie praktycznego zastosowania opisanej metody. Uczyniono to w dalszej cz˛eści pracy poświ˛econej przeprowadzonym doświadczeniom (rozdział piaty). ˛ Zaproponowane miary dla oceny asercji wzgl˛edem zróżnicowanych kryteriów moga˛ być wykorzystane nie tylko dla celów opisanej metody selekcji asercji. Możliwe jest ich stosowanie podczas innych procedur majacych ˛ na celu profilowanie programu (na przykład z uwzgl˛ednieniem różnego rodzaju kosztów użycia asercji w programie) oraz do tworzenia jego zaawansowanej dokumentacji (na przykład załaczenie ˛ informacji o rodzajach bł˛edów oraz ich dotkliwości wykrywanych przez dane asercje). 59 4. Asercje ze śladem Algorytmy wykrywajace ˛ asercje w programach bazuja˛ na analizie danych zgromadzonych w jego wybranych punktach. Można zaproponować dodatkowa˛ klasyfikacj˛e tych danych z uwzgl˛ednieniem wcześniejszego przebiegu programu czyli osiagni˛ ˛ etych punktów w programie (śladu wykonania). Asercje wykrywane byłyby nie z całego zbioru zgromadzonych danych dla punktu programu, ale jedynie z określonych jego elementów wybranych na podstawie wcześniejszego przebiegu programu. Wykryte w ten sposób asercje b˛eda˛ od niego zależne, a przez to bardziej wyspecjalizowane. Konstrukcje programowe umożliwiajace ˛ praktycznie zastosowanie asercji zależnych od przebiegu programu nazwiemy asercja˛ ze śladem. Jest to połaczenie ˛ asercji weryfikujacej ˛ prawidłowość przetwarzanych danych z asercja˛ sprawdzajac ˛ a˛ poprawność przebiegu wykonania programu. 4.1. Ślad wykonania programu Dany jest program, w którym wyznaczono n punktów mp , p = 1 . . . n. Funkcja ID(mp ) = idp , której dziedzina˛ jest zbiór wszystkich punktów programu, przyporzadkowuje ˛ każdemu punktowi unikalny identyfikator idp . Definicja 4.1.1. Śladem wykonania programu w punkcie mp , p = 1 . . . n nazywamy skończony ciag ˛ (tl ), którego kolejnymi wyrazami ti , i = 1 . . . l sa˛ wartości funkcji ID(mk ) dla wartości k określajacych ˛ kolejno odwiedzone punkty programu uporzadkowane ˛ według kolejności wizyt od ostatnio odwiedzonego punktu. Ślad wykonania jest również nazywany śladem. Definicja 4.1.2. Liczb˛e wyrazów ciagu ˛ (tl ) oznaczamy l i nazywamy długościa˛ śladu wykonania. Definicja 4.1.3. Pustym śladem wykonania nazywamy ślad dla którego l = 0. Dla dwóch śladów wykonania w danym punkcie programu możemy określić relacj˛e zawierania si˛e śladów oraz równości śladów. Definicja 4.1.4. Ślad (tl ) zawiera si˛e w śladzie (ul0 ) wtedy i tylko wtedy jeżeli 1 ≤ l ≤ l0 ∧ ∀i=1...l ti = ui albo l = 0 albo l = 0 ∧ l0 = 0. Relacj˛e zawierania si˛e śladu (tl ) w śladzie (ul0 ) oznaczamy (tl ) ∈ (ul0 ). 61 Definicja 4.1.5. Ślad (tl ) jest równy śladowi (ul0 ) wtedy i tylko wtedy jeżeli l = l0 ∧(tl ) ∈ (ul0 ). Relacj˛e równości śladów (tl ) i (ul0 ) oznaczamy (tl ) = (ul0 ). C A B E D Rysunek 4.1. Fragment schematu blokowego programu Na rysunku 4.1 przedstawiono fragment schematu blokowego pewnego programu. Jeżeli za punkty w tym programie uznać miejsca b˛edace ˛ poczatkiem ˛ wydzielonego bloku to przykładowymi możliwymi śladami wykonania programu w punkcie E sa: ˛ — ślady o długości jeden: (C), (D), — ślady o długości dwa: (C, B), (D, B), — ślady o długości trzy: (C, B, A), (C, B, C), (D, B, A), (D, B, C), — ślady o długości cztery: (C, B, A, E), (C, B, C, B), (D, B, A, E), (D, B, C, B). Podana definicja śladu wykonania programu uniezależnia go od dodatkowych wymagań jakie spotykane sa˛ w metodach sprawdzania poprawności wykonania programu. Należa˛ do nich na przykład konieczność podziału programu na odr˛ebne bloki z wymaganiem jednej ścieżki wejścia i wyjścia zwiazanej ˛ z danym fragmentem kodu [2]. Do decyzji eksperta należy odpowiedni dobór punktów programu. B˛edzie on miał wpływ na charakter otrzymanego śladu zwiazany ˛ z jego ziarnistościa˛ (punkty programu na poziomie modułów, poszczególnych funkcji, czy poszczególnych instrukcji). 4.1.1. Rejestracja śladu wykonania programu W uruchamianym programie obserwacja śladu wykonania może odbywać si˛e poprzez implementacj˛e struktury danych w rodzaju kolejki FIFO o nast˛epujacych ˛ własnościach: — jej elementami sa˛ identyfikatory punktów w programie, — określona jest liczba elementów w kolejce; wartość ta odpowiada poj˛eciu długości śladu, — osiagni˛ ˛ ecie obserwowanego punktu w programie powoduje umieszczenie nowego elementu w kolejce (identyfikatora osiagni˛ ˛ etego punktu). Aktualny stan kolejki w danym punkcie wyrażony w postaci skończonego ciagu ˛ jej elementów b˛edzie odzwierciedlał aktualny ślad wykonania programu. 62 Na rysunku 4.2 przedstawiono fragment schematu blokowego pewnego programu wraz ze stanami kolejki FIFO o długości do trzech elementów dla jego przykładowego przebiegu. Punktami w tym programie sa˛ miejsca b˛edace ˛ poczatkiem ˛ wydzielonego bloku. Kolejne stany kolejki oznaczono rosnaco ˛ wartościami od 1 do 13 z założeniem, że poczatkowo ˛ w punkcie A kolejka jest pusta. Zawartość kolejki została umieszczona obok punktów programu. 2 BA 10 B A E 12 B C B 1 5 9 11 4 ECB 8 EDB A A AEC AED CBA C B 3 CBA 7 DBA 13 C B C E D 6 BAC Rysunek 4.2. Fragment schematu blokowego programu wraz z kolejnymi stanami kolejki FIFO przechowujacej ˛ aktualny ślad jego wykonania Metody implementacji W zależności od liczby obserwowanych punktów w programie (liczby identyfikatorów), wymaganej długości kolejki (długości śladu), zastosowanego j˛ezyka oraz metody programowania możliwych jest wiele metod implementacji struktury danych przechowujacej ˛ ślad wykonania. Poza zastosowaniem dost˛epnych implementacji kolejek (na przykład z biblioteki STL j˛ezyka C++ lub standardowego pakietu j˛ezyka Java) w niektórych przypadkach istotne może być uproszczenie tej struktury, aby operacje z jej udziałem nie wpływały w istotny sposób na czas działania aplikacji. Jeżeli możliwe jest zakodowanie poszczególnych identyfikatorów punktów na k bitach, a dost˛epny system pozwala na użycie zmiennych o długości równej co najmniej pewnej wielokrotności k bitów (długość śladu) to możliwe jest jego przechowywanie w postaci zmiennej liczbowej. Operacj˛e aktualizacji śladu s w danym punkcie programu o identyfikatorze i można wtedy ogólnie zapisać wyrażeniem (stosujac ˛ konwencj˛e notacji j˛ezyka C) (s << k)|i, gdzie << jest operatorem przesuni˛ecia bitowego, a | to operator sumy bitowej. Poza zastosowaniem kolejki FIFO w formie jawnej implementacji struktury danych przechowujacej ˛ ślad wykonania programu możliwe jest również zaadoptowanie wybranych technik stosowanych dla asercji weryfikujacych ˛ poprawność przebiegu programu. Koncepcja kolejek stosowana jest w metodzie CCA [1]. Innym sposobem implementacji jest przy- porzadkowanie ˛ odpowiednich liczb pierwszych punktom programu, a poprzez operacje na nich odzwierciedlenie przebiegu wykonania programu (metoda ECCA [2]). Podobna do proponowanej implementacji kolejki na zmiennej w programie jest metoda YACCA [38], 63 w której poprzez odpowiednie modyfikowanie zmiennej liczbowej otrzymywane sa˛ wartości reprezentujace ˛ poprawny przebieg działania programu. Inne metody polegaja˛ na stosowaniu sygnatur [75, 104] oraz użyciu mechanizmu wyrażeń regularnych do konstrukcji warunków asercji [8], które porównywane sa˛ z aktualnym śladem programu. Stosowanie w warunkach asercji oraz przechowywanie śladu wykonania programu w formacie kolejki przechowujacej ˛ kolejno odwiedzone punkty jest metoda,˛ która dodatkowo pozwala na łatwa˛ interpretacj˛e przez programist˛e, w przeciwieństwie do algorytmów stosujacych ˛ inne sposoby kodowania, z reguły zorientowane na skrócenie czasu sprawdzania asercji. 4.2. Poj˛ecie asercji ze śladem wykonania Zaproponowany powyżej ślad wykonania programu może zostać skojarzony z odpowiednimi asercjami. Otrzymana konstrukcja b˛edzie wyrażała asercj˛e, która spełniona jest pod warunkiem określonego przebiegu programu. Dzi˛eki temu, w danym punkcie programu lub pomi˛edzy dwoma kolejnymi punktami programu, w których rejestrowany jest ślad b˛eda˛ mogły być weryfikowane różne zestawy asercji zależne od przebiegu programu. W wielu przypadkach może pozwolić to na ich lepsza˛ specjalizacj˛e i, co si˛e z tym wia˛że, na lepsza˛ efektywność w detekcji bł˛edów. Definicja 4.2.1. Asercja˛ ze śladem S nazywamy par˛e uporzadkowan ˛ a˛ (a, (tl )), gdzie a jest asercja,˛ a (tl ) śladem. Podczas wykonania programu w danym jego punkcie sprawdzenie asercji a zawartej w pewnej asercji ze śladem S nast˛epuje jedynie w sytuacji gdy (tl ) ∈ (sl0 ), gdzie (sl0 ) oznacza bieżacy ˛ ślad wykonania programu. W przeciwnym przypadku asercja a nie powinna zostać sprawdzona, ponieważ nie obowiazuje ˛ ona dla aktualnego przebiegu programu. Oznacza to, że w danym punkcie programu lub pomi˛edzy jego dwoma kolejnymi punktami sprawdzane sa˛ jedynie te asercje, które odzwierciedlaja˛ żadany ˛ stan zmiennych aplikacji dla aktualnego jego przebiegu. 4.3. Parametry asercji ze śladem Dla asercji ze śladem możliwe jest określenie wszystkich parametrów zaproponowanych w rozdziale 3.2. Na koszt asercji ze śladem składa si˛e koszt śladu oraz koszt zwiazanej ˛ z nia˛ asercji. Określenie kosztu asercji ze śladem, zarówno statycznego jak i dynamicznego, jest zależne od stosowanej implementacji, a w szczególności od sposobu przechowywania i kodowania śladów wykonania programu. Należy zauważyć, że całkowity koszt dynamiczny wszystkich asercji ze 64 śladem w danym punkcie programu, może być zależny od jego przebiegu, ze wzgl˛edu na brak konieczności weryfikacji wszystkich asercji. Dodatkowym elementem, który powinien zostać uwzgl˛edniony w koszcie statycznym i dynamicznym asercji ze śladem jest konieczność zastosowania dodatkowego modułu programu, którego celem jest obserwacja i przechowywanie aktualnego śladu badanej aplikacji. Statyczny koszt tego modułu jest stały i nie zależy od liczby stosowanych w programie asercji ze śladem oraz liczby obserwowanych punktów. Obie wymienione wielkości maja˛ jednak wpływ na koszt dynamiczny sprawdzenia asercji ze śladem. 4.4. Wykrywanie asercji ze śladem Wykrywanie asercji ze śladem wia˛że si˛e ze wst˛epnym pogrupowaniem danych wejściowych dla algorytmów wykrywania asercji według aktualnego stanu śladu wykonania w danym punkcie. Po zebraniu danych asercje wykrywane sa˛ niezależnie dla każdego ze śladów z wykorzystaniem znanych algorytmów wykrywajacych ˛ asercje w programach. W ten sposób w danym punkcie programu otrzymuje si˛e tyle asercji danego typu ile różnych śladów wykonania prowadzi do tego punktu. Połaczenie ˛ wykrytych asercji ze śladami, wzgl˛edem których dokonano klasyfikacji zebranych danych tworzy odpowiednia˛ asercj˛e ze śladem. W aplikacjach wielowatkowych, ˛ w zależności od pożadanego ˛ efektu, możliwych jest kilka scenariuszy post˛epowania. Pierwszy z nich polega na globalnej obserwacji programu, to jest wspólnej dla wszystkich watków. ˛ Takie zachowanie umożliwia rejestracj˛e ewentualnych zależności czasowych pomi˛edzy osiaganymi ˛ punktami programu w różnych watkach. ˛ Jego wada˛ jest rejestrowanie jako różnych śladów wyścigów mi˛edzy watkami, ˛ co może prowadzić do wykrycia niepełnych lub nieprawidłowych asercji. Z tego powodu może być konieczny dodatkowy wst˛epny krok polegajacy ˛ na rozdzieleniu danych pochodzacych ˛ od różnych watków. ˛ Każdy z watków ˛ traktowany jest w takim przypadku jak oddzielny program co oznacza, że ślad obserwowany jest oddzielnie dla każdego z nich. Kolekcjonowane dane moga˛ być łaczone ˛ dla danych punktów w programie lub przechowywane oddzielnie z uwzgl˛ednieniem identyfikatora watku. ˛ W zależności od wybranego sposobu post˛epowania znalezione zestawy asercji b˛eda˛ określały ogólne zachowanie wszystkich watków ˛ lub każdego z nich osobno. Należy zauważyć, że rozdzielenie danych ze wzgl˛edu na identyfikator watku ˛ może być konieczne dla niektórych typów asercji, na przykład narzucajacych ˛ ograniczenia na zmienne lokalne lub tworzone dynamicznie w danym watku. ˛ Istotnym elementem algorytmów wykrywajacych ˛ asercje w programach jest wst˛epna redukcja ich liczby uwzgl˛edniajaca ˛ na przykład pokrycie przez różne asercje tych samych bł˛edów lub możliwość łaczenia ˛ kilku asercji w jedna,˛ tak jak to ma miejsce w systemie Daikon [29]. Podobne algorytmy można zaproponować dla wykrytych zbiorów asercji ze 65 śladem. W dalszej cz˛eści rozdziału przedstawione zostały algorytmy umożliwiajace ˛ realizacj˛e operacji takich jak redukcja liczby śladów oraz ich skracanie dla zbioru asercji ze śladem w danym punkcie programu. Przykład działania tych algorytmów został zaprezentowany w końcowej cz˛eści rozdziału. 4.4.1. Algorytm redukcji liczby śladów w zbiorze asercji ze śladem Celem algorytmu 4.1 redukcji liczby śladów w zbiorze asercji ze śladem jest zmniejszenie liczby asercji ze śladem poprzez połaczenie ˛ asercji o zawierajacych ˛ si˛e śladach. Pod poj˛eciem zbioru asercji ze śladem rozumie si˛e tu zbiór asercji w danym punkcie programu. Algorytm przeszukuje zbiór asercji ze śladem i łaczy ˛ sprawdzane asercje w przypadku, gdy zachodzi relacja zawierania si˛e śladów. Po wykonaniu tej operacji asercja z krótszym śladem jest usuwana ze zbioru asercji ze śladem. Przykładowo, jeżeli w danym punkcie programu istnieja˛ trzy asercje ze śladem o takich samych śladach to dwie z nich moga˛ zostać usuni˛ete, a asercje w nich stosowane skonkatentowane z asercja˛ w trzeciej. Jeżeli ślad pewnej asercji ze śladem zawiera si˛e w kilku innych śladach to asercja z tej asercji ze śladem zostanie połaczona ˛ ze wszystkimi asercjami z pozostałych asercji ze śladem. W takim przypadku, mimo zmniejszenia liczby asercji ze śladem, zwi˛ekszona zostanie liczba przechowywanych asercji w pozostałych asercjach ze śladem, gdyż niektóre z nich b˛eda˛ zduplikowane. wejście: zbiór A asercji ze śladem wyjście: zbiór A asercji ze śladem ze zredukowana˛ liczba˛ śladów begin foreach S ∈ A do c ← f alse foreach S 0 ∈ A\S do if (tl )S ∈ (tl )S 0 then aS 0 ← aS 0 ∧ aS c ← true if c then A ← A\S Algorytm 4.1. Algorytm redukcji liczby śladów w zbiorze asercji ze śladem Efektem działania algorytmu redukcji liczby śladów może być utrata informacji. Dzieje si˛e tak w przypadku wyst˛epowania w zbiorze asercji ze śladem śladów o różnych długościach przy założeniu, że wyst˛epujace ˛ dłuższe ślady, do których dołaczane ˛ sa˛ asercje z asercji ze śladem o krótszych śladach nie wyczerpuja˛ wszystkich możliwych śladów, jakie moga˛ pojawić si˛e w danym punkcie programu czyli innych śladów, w których może zawierać si˛e krótszy 66 ze śladów. Utrata informacji w takim przypadku zajdzie na etapie sprawdzenia asercji. W momencie pojawienia si˛e śladu, w którym zawierałby si˛e ślad asercji wchłoni˛etej poprzez algorytm redukcji liczby śladów do innej asercji, nie zostanie ona sprawdzona. Po wykonaniu algorytmu dla poszczególnych zestawów asercji zawartych we wszystkich asercjach ze śladem powinny zostać wykonane algorytmy optymalizujace ˛ ich liczb˛e (dokonujace ˛ usuni˛ecia lub połaczenia ˛ odpowiednich asercji w powstałej koniunkcji). Dla asercji bez śladu algorytmy takie zaimplementowane sa˛ w pakiecie Daikon [29]. 4.4.2. Algorytm skracania śladów w zbiorze asercji ze śladem Przeznaczeniem algorytmu 4.2 skracania śladów w zbiorze asercji ze śladem jest zmniejszenie długości istniejacych ˛ śladów na tyle, aby zachować ich rozróżnienie. Oznacza to, że nie zajdzie sytuacja, w której skracany ślad, który przed operacja˛ skrócenia nie zawierał si˛e w innym śladzie, po jej wykonaniu wejdzie w taka˛ relacj˛e z dowolnym śladem z badanego zbioru. Przykładowo, jeżeli w danym punkcie programu istnieja˛ dwie asercje ze śladem, których pierwszy element śladu jest identyczny i drugi element śladu różny to kolejne elementy ich śladów moga˛ zostać usuni˛ete, gdyż nie wpływaja˛ one na rozróżnienie tych dwóch śladów. Skrócenie śladów tych asercji nie doprowadzi do sytuacji wyboru nieprawidłowego zestawu asercji do sprawdzenia podczas wykonania programu. Usuni˛ecie drugiego elementu śladów tych asercji spowodowałoby sprawdzenie wszystkich asercji, co byłoby bł˛edne. wejście: zbiór A asercji ze śladem wyjście: zbiór A asercji ze śladem ze skróconymi śladami begin c ← true while c do foreach S ∈ A ∧ lS > 1 do c ← true Q←S lQ ← lQ − 1 foreach S 0 ∈ A\S do if (tl )Q ∈ (tl )S 0 then c ← f alse break if c then S←Q break Algorytm 4.2. Algorytm skracania śladów w zbiorze asercji ze śladem Algorytm zakłada, że w badanym zbiorze asercji ze śladem istniejace ˛ ślady wyczerpuja˛ 67 wszystkie możliwości pojawienia si˛e śladów o określonych długościach. W przeciwnym wypadku wynik działania algorytmu b˛edzie bł˛edny. Podczas wykonania programu b˛edzie mogła zaistnieć sytuacja sprawdzenia asercji, które w przypadku zastosowania oryginalnego zbioru nie byłyby sprawdzone. 4.5. Weryfikacja asercji ze śladem Można wyszczególnić nast˛epujace ˛ metody weryfikacji zbioru asercji ze śladem w określonym punkcie programu: — weryfikacja całkowita – sprawdzenie wykrytych asercji oraz poprawności aktualnego śladu wykonania, — weryfikacja cz˛eściowa – sprawdzenie wykrytych asercji bez sprawdzania poprawności aktualnego śladu wykonania. Jeżeli zbiór sprawdzanych śladów wyczerpuje wszystkie prawidłowe ślady jakie moga˛ pojawić si˛e w danym punkcie programu to weryfikacja całkowita pozwala na wykrycie niedozwolonego przejścia pomi˛edzy punktami w programie. Weryfikacja całkowita musi uwzgl˛edniać sprawdzenie wszystkich możliwych śladów, nawet tych, dla których nie znaleziono asercji. Dla takich śladów należy wprowadzić asercj˛e ze śladem, w której asercj˛e zastapiono ˛ zawsze spełniona˛ asercja.˛ Tego typu asercja bada jedynie poprawność przepływu sterowania w programie. Dla danego punktu programu, w którym określono zbiór A zawierajacy ˛ k asercji ze śladem, przy czym żaden ze śladów w tym zbiorze nie zawiera si˛e w innym ze śladów, schemat weryfikacji całkowitej można przedstawić w nast˛epujacy ˛ sposób: begin if (tl )1 ∈ (sl0 ) then assert (a1 ) else if (tl )2 ∈ (sl0 ) then assert (a2 ) ... else if (tl )k ∈ (sl0 ) then assert (ak ) else obsługa niedozwolonego przebiegu programu ... Struktura weryfikacji całkowitej umożliwia wykluczenie konieczności sprawdzania wszyst68 kich możliwych śladów przy każdym osiagni˛ ˛ eciu danego punktu w programie, co przekłada si˛e na skrócenie czasu potrzebnego na wykonanie tej procedury. Zastosowanie tego schematu dla zbioru A asercji ze śladem jest możliwe, jeśli wykonany zostanie algorytm 4.1 redukcji liczby śladów w zbiorze asercji ze śladem. W przypadku, gdy zachodzi sytuacja zawierania si˛e śladów wybranych asercji ze śladem ze zbioru A sprawdzone musza˛ zostać wszystkie asercje z tego zbioru. Schemat weryfikacji całkowitej b˛edzie miał nast˛epujacy ˛ przebieg: begin c ← true foreach S ∈ A do if (tl )S ∈ (sl0 ) then assert (aS ) c ← f alse if c then obsługa niedozwolonego przebiegu programu ... Ten schemat weryfikacji jest mniej wydajny z uwagi na konieczność sprawdzenia wszystkich możliwych śladów ze zbioru A oraz konieczność wprowadzenia dodatkowej zmiennej c, która przechowuje informacj˛e o sprawdzeniu co najmniej jednej asercji ze śladem. Analogiczne procedury weryfikacji asercji ze śladem jakie przedstawiono dla weryfikacji całkowitej można zaproponować w schemacie weryfikacji cz˛eściowej, która nie obejmuje sprawdzenia poprawności śladu wykonania programu w danym punkcie. Dla danego punktu programu, w którym określono zbiór A zawierajacy ˛ k asercji ze śladem, przy czym żaden ze śladów w tym zbiorze nie zawiera si˛e w innym ze śladów schemat weryfikacji cz˛eściowej można przedstawić w nast˛epujacy ˛ sposób: begin if (tl )1 ∈ (sl0 ) then assert (a1 ) else if (tl )2 ∈ (sl0 ) then assert (a2 ) ... else if (tl )k ∈ (sl0 ) then assert (ak ) ... 69 W przypadku, gdy zachodzi sytuacja zawierania si˛e śladów wybranych asercji ze śladem ze zbioru A sprawdzone musza˛ zostać wszystkie asercje z tego zbioru. Schemat weryfikacji cz˛eściowej b˛edzie miał nast˛epujacy ˛ przebieg: begin foreach S ∈ A do if (tl )S ∈ (sl0 ) then assert (aS ) ... Weryfikacja cz˛eściowa obejmuje sprawdzenie wybranych śladów. Dopuszcza ona sytuacj˛e, w której żaden ze śladów w zbiorze asercji ze śladem nie zawiera si˛e w aktualnym śladzie wykonania. Uniemożliwia ona jednak wykrycie sytuacji, gdy aktualny ślad wykonania nie był nigdy wcześniej obserwowany czyli zachodzi podejrzenie nieprawidłowego przebiegu programu. Przy zastosowaniu metody weryfikacji całkowitej asercja ze śladem staje si˛e konstrukcja˛ analogiczna˛ do asercji sprawdzajacej ˛ poprawność wykonania programu. Szczególnym przypadkiem może być taka asercja ze śladem, w której asercja jest zawsze spełniona. Tego typu asercja ze śladem przy zastosowaniu metody weryfikacji całkowitej odpowiada asercji sprawdzajacej ˛ poprawność przebiegu programu. 4.5.1. Algorytm redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem Algorytm 4.3 redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem ma na celu rozwiazanie ˛ problemu odpowiedniego przydziału nowych identyfikatorów, tak aby ich liczba była możliwie minimalna, ale zachowana była możliwość rozróżniania śladów w poszczególnych punktach programu. Algorytm korzysta z faktu, że istnieje możliwość zastosowania tego samego identyfikatora dla dwóch różnych punktów programu, jeżeli liczba innych punktów osiaganych ˛ w programie pomi˛edzy nimi przekracza najwi˛eksza˛ z długości obserwowanych śladów. Zaproponowany algorytm działa w sposób zachłanny. Dla wszystkich aktualnych identyfikatorów przeszukuje on ślady w dost˛epnych asercjach sprawdzajac ˛ możliwość przyporzad˛ kowania nowych kolejnych wartości dla badanego identyfikatora tak, aby zachować rozróżnialność śladu definiowana˛ jako rozróżnienie wszystkich identyfikatorów w wyst˛epujacych ˛ poszczególnych śladach. Każda konieczność przydziału innej wartości skutkuje koniecznościa˛ ponownego przeszukania zbioru śladów w celu sprawdzenia czy warunek rozróżnialności nie został naruszony. Wynikiem działania algorytmu jest funkcja przyporzadkowuj ˛ aca ˛ nowe wartości poprzednim 70 wejście: uporzadkowany ˛ zbiór DID bieżacych ˛ identyfikatorów dla punktów programu, zbiór PA wszystkich zbiorów asercji ze śladem w punktach programu wyjście: funkcja ID(id), id ∈ DID przyporzadkowuj ˛ aca ˛ nowe wartości dla identyfikatorów punktów programu begin foreach id ∈ DID do ID(id) ← 1 begin check foreach A ∈ PA do foreach S ∈ A do (tl ) ← (tl )S for i ← 1 to l do if exists ID(ti ) ∧ ID(ti ) = ID(id) then ID(id) ← ID(id) + 1 goto check Algorytm 4.3. Algorytm redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem wartościom identyfikatorów. Jest to jedno z możliwych przyporzadkowań. ˛ Ponieważ algorytm działa w sposób zachłanny, nie analizujac ˛ wszystkich możliwych kombinacji przyporzadkowań, ˛ otrzymany wynik zależy od kolejności analizowanych asercji ze śladem we wszystkich zbiorach. Algorytm nie uwzgl˛ednia nieistotnych cz˛eści śladów, które nie maja˛ wpływu na rozróżnienie pomi˛edzy śladami w zbiorze asercji ze śladem dla danego punktu. Może to wpłynać ˛ na użycie wi˛ekszej liczby nowych identyfikatorów. Z tego powodu przed wykonaniem omawianego algorytmu wskazane jest uruchomienie dla wszystkich zbiorów asercji ze śladem ze zbioru PA algorytmu skracania śladów w zbiorze asercji ze śladem omówionego w punkcie 4.4.2. Dzi˛eki temu liczba nowych identyfikatorów może okazać si˛e mniejsza przy zapewnieniu warunku rozróżniania śladów. Nowe identyfikatory można zastosować na zbiorze śladów sprzed operacji ich skracania. Istotne jest uruchomienie algorytmu z uwzgl˛ednieniem w zbiorze wejściowym wszystkich asercji ze śladem jakie maja˛ być sprawdzane w programie. Późniejsze usuni˛ecie z programu asercji ze śladem może spowodować jedynie użycie zbyt dużej liczby identyfikatorów niż byłoby to możliwe po powtórnym zastosowaniu algorytmu. Po dodaniu asercji konieczne jest powtórne uruchomienie algorytmu, ponieważ zastosowane dodatkowe identyfikatory moga˛ prowadzić do sytuacji braku rozróżnienia nowego śladu w zbiorze śladów już istniejacych, ˛ co może skutkować ich bł˛edna˛ weryfikacja.˛ Ze wzgl˛edu na redukcj˛e liczby identyfikatorów zastosowanie omawianego algorytmu prowadzi do utraty informacji. Może zaistnieć sytuacja braku wykrycia bł˛edu nieprawidłowego 71 przejścia w programie lub sprawdzenia nieodpowiednich asercji, w przypadku gdy dla dwóch punktów programu, do których przejścia sa˛ odpowiednio poprawne i niepoprawne, został przyporzadkowany ˛ ten sam identyfikator. 4.6. Przykład działania zaproponowanych algorytmów Poniżej przedstawiono rezultaty działania zaprezentowanych algorytmów otrzymane poprzez użycie skryptu z pakietu FlowGraph omówionego w dodatku A.2. Przykładowe dane wejściowe przygotowano na cele prezentacji, bez odniesienia do rzeczywistego programu. Założono, że w pewnym programie wyznaczono dziesi˛eć punktów obserwacji. Asercje ze śladem zostały przygotowane dla trzech punktów programu o identyfikatorach 1, 2, 3. W każdym z tych punktów programu przygotowano pi˛eć asercji ze śladem. Poczatkowa ˛ zawartość zbiorów asercji ze śladem jest nast˛epujaca: ˛ A1 = { ( a1,1 , (9) ), ( a1,2 , (10, 9) ), ( a1,3 , (9, 8, 10) ), ( a1,4 , (10, 10, 5) ), ( a1,5 , (9, 5, 10, 9) ) A2 = { ( a2,4 , (7) ), ( a2,2 , (9, 5) ), ( a2,3 , (10, 9) ), ( a2,1 , (7, 9, 7, 5) ), ( a2,5 , (5, 5, 5, 10) ) A3 = { ( a3,5 , (3, 3) ), ( a3,1 , (2, 2, 2) ), ( a3,2 , (2, 3, 4) ), ( a3,4 , (3, 4, 3) ), ( a3,3 , (2, 2, 4, 4) ) } } } Łaczna ˛ liczba znalezionych śladów wynosi 15, a suma ich długości 41. W asercjach ze śladem sprawdzanych jest łacznie ˛ 15 różnych asercji (oznaczonych identyfikatorami ai,j , gdzie i jest identyfikatorem punktu programu, j numerem porzadkowym ˛ asercji w zbiorze asercji ze śladem). W śladach użytych zostało 8 z 10 różnych identyfikatorów punktów programu. Algorytm 4.1 redukcji liczby śladów wykonany dla zbioru A1 asercji ze śladem dołaczy ˛ do asercji z warunkiem a1,3 oraz a1,5 warunek a1,1 z uwagi na zawieranie si˛e śladów. W drugim zbiorze połaczone ˛ zostana˛ asercje z warunkami a2,1 oraz a2,4 . Trzeci zbiór asercji pozostanie bez zmian. 72 Jeżeli asercje ze śladem o dłuższych śladach, do których zostały dołaczone ˛ asercje z asercji ze śladem o krótszym śladzie, nie wyczerpuja˛ wszystkich możliwości pojawienia si˛e krótszego śladu to w wyniku wykonania algorytmu dojdzie do opisywanej wcześniej utraty informacji na etapie weryfikacji. Przykładowo, gdyby w pierwszym z punktów programu pojawił si˛e ślad (9, 2) to dla zbioru przed wykonaniem algorytmu redukcji liczby śladów sprawdzona zostanie asercja a1,1 , dla zbioru po wykonaniu algorytmu – żadna z asercji. Po wykonaniu algorytmu 4.1 redukcji liczby śladów dla kolejnych zbiorów asercji ze śladem ich zawartość b˛edzie nast˛epujaca: ˛ A1 = { ( a1,2 , (10, 9) ), ( a1,3 ∧ a1,1 , (9, 8, 10) ), ( a1,4 , (10, 10, 5) ), ( a1,5 ∧ a1,1 , (9, 5, 10, 9) ) A2 = { ( a2,2 , (9, 5) ), ( a2,3 , (10, 9) ), ( a2,1 ∧ a2,4 , (7, 9, 7, 5) ), ( a2,5 , (5, 5, 5, 10) ) A3 = { ( a3,5 , (3, 3) ), ( a3,1 , (2, 2, 2) ), ( a3,2 , (2, 3, 4) ), ( a3,4 , (3, 4, 3) ), ( a3,3 , (2, 2, 4, 4) ) } } } Ogólna liczba śladów w nowych zbiorach wynosi 13, a suma ich długości 39. W asercjach ze śladem sprawdzanych jest łacznie ˛ 16 asercji. Liczba sprawdzeń wzrosła, ponieważ jedna z asercji sprawdzana jest w dwóch różnych asercjach ze śladem. W śladach użytych zostało 8 różnych identyfikatorów punktów programu. Algorytm 4.2 skracania śladów wykonany dla pierwszego ze zbiorów asercji ze śladem zmodyfikuje wszystkie ślady dłuższe niż dwa identyfikatory skracajac ˛ je do długości dwóch identyfikatorów. W zbiorze drugim wszystkie ślady moga˛ zostać skrócone do długości jednego identyfikatora. W zbiorze trzecim asercje z warunkami a3,2 , a3,4 oraz a3,5 po wykonaniu algorytmu b˛eda˛ miały długość dwóch identyfikatorów, a pozostałe – trzech identyfikatorów. Jeżeli w punkcie programu, dla którego stosowany jest zbiór A1 asercji ze śladem podczas wykonania pojawiłby si˛e aktualny ślad o długości 4 w postaci (9, 5, 10, 1) to po zastosowaniu zbioru ze skróconymi śladami doszłoby do weryfikacji warunku a1,5 ∧ a1,1 , ponieważ skrócony ślad zawierałby si˛e w aktualnym śladzie. Sprawdzana asercja mogłaby okazać si˛e bł˛edna. Z tego powodu istotne jest zbadanie, czy istniejace ˛ ślady wyczerpuja˛ wszystkie możliwe ślady o danych długościach przed zastosowaniem algorytmu. 73 Wynik działania algorytmu 4.2 skracania śladów dla zbiorów asercji ze śladem powstałych w wyniku zastosowania algorytmu 4.1 redukcji liczby śladów jest nast˛epujacy: ˛ A1 = { ( a1,2 , (10, 9) ), ( a1,3 ∧ a1,1 , (9, 8) ), ( a1,4 , (10, 10) ), ( a1,5 ∧ a1,1 , (9, 5) ) A2 = { ( a2,2 , (9) ), ( a2,3 , (10) ), ( a2,1 ∧ a2,4 , (7) ), ( a2,5 , (5) ) A3 = { ( a3,5 , (3, 3) ), ( a3,1 , (2, 2, 2) ), ( a3,2 , (2, 3) ), ( a3,4 , (3, 4) ), ( a3,3 , (2, 2, 4) ) } } } Ogólna liczba śladów po wykonaniu algorytmu skracania śladów pozostała bez zmian i wynosiła 13, a suma ich długości 24. W asercjach ze śladem jest 16 asercji. Do konstrukcji śladów użyto 8 różnych identyfikatorów. Algorytm 4.3 redukcji liczby identyfikatorów znajduje jedna˛ z możliwości przyporzad˛ kowania nowych identyfikatorów dla zbiorów ze skróconymi śladami tak, aby na etapie weryfikacji były one nadal jednoznaczne we wszystkich punktach weryfikacji asercji ze śladem. W wyniku działania tego algorytmu dla prezentowanych przykładowych zbiorów znalezione zostało przyporzadkowanie: ˛ ID(1) = 10 , ID(2) = 10 , ID(3) = 20 , ID(4) = 30 , ID(5) = 10 , ID(6) = 10 , ID(7) = 20 , ID(8) = 20 , ID(9) = 30 , ID(10) = 40 . Do zakodowania poprzednio wykorzystanych ośmiu identyfikatorów konieczne było zastosowanie co najmniej trzech bitów. Po redukcji można zastosować dwa bity do zakodowania identyfikatorów punktów programu tak, aby stosowane ślady pozostały jednoznaczne. Poczatkowe ˛ zbiory asercji ze śladem po zastosowaniu nowych identyfikatorów b˛eda˛ miały nast˛epujac ˛ a˛ postać: A1 = { ( a1,1 , (30 ) ( a1,2 , (40 , 30 ) 0 ), 0 ), 0 ( a1,3 , (3 , 2 , 4 ) ), ( a1,4 , (40 , 40 , 10 ) ), ( a1,5 , (30 , 10 , 40 , 30 ) ) } 74 A2 = { ( A3 = { a2,4 , (20 ) 0 ), 0 ( a2,2 , (3 , 1 ) ), ( a2,3 , (40 , 30 ) ), ( a2,1 , (20 , 30 , 20 , 10 ) 0 0 0 0 ), ( a2,5 , (1 , 1 , 1 , 4 ) ) ( a3,5 , (20 , 20 ) ), ( a3,1 , (10 , 10 , 10 ) ), ( a3,2 , (10 , 20 , 30 ) ), 0 0 0 ( a3,4 , (2 , 3 , 2 ) ), ( a3,3 , (10 , 10 , 30 , 30 ) ) } } 4.7. Prezentacja asercji ze śladem Jednym z zastosowań asercji ze śladem jest możliwość wykorzystania ich do dokumentowania programu oraz podczas jego analizy przez człowieka. W takich zastosowaniach asercje ze śladem moga˛ być szczególnie przydatne, gdyż wia˛ża˛ przebieg wykonania programu z jego właściwościami. Tego typu asercje przedstawione w formie rysunków cz˛esto sa˛ bardziej zrozumiałe i przydatne niż opis tekstowy. Świadczy o tym chociażby kariera notacji graficznych w projektowaniu oprogramowania. Z tych powodów istotne jest rozważenie różnych możliwości prezentacji asercji ze śladem. Poniżej przedstawiono cztery propozycje wizualizacji asercji ze śladem: w formie wykazu, digrafu, multigrafu oraz kolorowanego multigrafu. Wszystkie zaproponowane wizualizacje przedstawiono na rysunku 4.3. Przygotowane zostały dla przykładowych zbiorów asercji ze śladem przygotowanych na cele prezentacji, bez użycia rzeczywistej aplikacji. Punkty programu oznaczono jako litery w prostokatach. ˛ Rysunki nie zostały przygotowane automatycznie. Przygotowanie odpowiedniego narz˛edzia do wizualizacji zbiorów asercji ze śladem leży poza zakresem niniejszej pracy. Poza możliwościami prezentacji asercji ze śladem opisane wizualizacje moga˛ być wykorzystane do implementacji określonych struktur danych, takich jak listy dynamiczne, tablice czy grafy, których celem b˛edzie przechowywanie obiektów tego typu. Cennym rozszerzeniem środowisk do rozwoju aplikacji, które zintegrowane sa˛ już z mechanizmami do dynamicznego wykrywania asercji, może być wbudowanie w nie opisanych sposobów wizualizacji asercji ze śladem. Zaproponowane metody prezentacji asercji ze śladem nie wyczerpuja˛ wszystkich potencjalnych sposobów ich wizualizacji. Dla pewnych zastosowań użyteczniejsze moga˛ być inne rodzaje ich graficznego przedstawienia. 75 (A,B) q ≤ −1 (B,A) d ≤ −1 (B,A) p ≤ −5 A C (B,A) n = 2 (C,A) n ≥ 0 (A,B) i 6= 1 (C,B) n ≤ 6 B D (a) wykaz (A,B) i 6= 1 (B,A) n = 2 (C,A) n ≥ 0 B (B,A) d ≤ −1 (C,B) n ≤ 6 A D C (A,B) d ≤ −1 (B,A) d ≤ −5 (b) digraf 1 ) i 6= A ) n =2 (B,A) d ≤ −5 1 ≤− ) d ≤6 ) n (B,A (A,B (B,A B (A,B (C,B ) d ≤− 1 C D ≥0 ) n (C,A (c) multigraf (A,B) i 6= 1 (B,A) n = 2 (C,A) n ≥ 0 B (B,A) d ≤ −1 (C,B) n ≤ 6 A D C (A,B) d ≤ −1 (B,A) d ≤ −5 (d) kolorowany multigraf Rysunek 4.3. Różne formy prezentacji asercji ze śladem dla przykładowego programu 76 4.7.1. Wykaz Wizualizacja asercji w formie wykazu (listy) polega na wymienieniu punktów programu wraz z obowiazuj ˛ acymi ˛ w nich asercjami ze śladem. Przykładowy wykaz został przedstawiony na rysunku 4.3(a). Przy każdym z punktów programu wymieniono możliwe ślady (ciag ˛ punktów programu zapisano w nawiasach) wraz z asercjami, jakie dla nich sa˛ obowiazuj ˛ ace. ˛ Zaleta˛ tej formy prezentacji jest jej prostota. Może być ona wykorzystana w środowiskach nie posiadajacego ˛ interfejsu graficznego. Forma ta jest przejrzysta dla małej liczby punktów programu z niewielka˛ liczba˛ asercji. Wada˛ jest brak wykorzystania informacji o przechowywanych śladach w celu ułatwienia analizy przez człowieka. Idea wykazu asercji ze śladem przekłada si˛e na struktur˛e danych przeznaczona˛ do ich przechowywania dla całego programu w postaci implementacji listy dynamicznej lub tablicy, której elementami sa˛ obserwowane jego punkty oraz wskazania na list˛e (tablic˛e) zawierajac ˛ a˛ asercje ze śladem obowiazuj ˛ ace ˛ w określonych punktach. Lista punktów programu i asercji ze śladem może być tworzona, aktualizowana i weryfikowana w dowolnym momencie wykonania programu. 4.7.2. Digraf Wykorzystanie informacji o przechowywanych śladach w asercjach prowadzi do wizualizacji prezentujacych ˛ wybrane elementy przebiegu programu. Naturalnym sposobem prezentacji takich asercji jest struktura grafu. Na rysunku 4.3(b) przedstawiono zbiór asercji ze śladem zobrazowany w formie digrafu. Informacje, pozyskane na podstawie przechowywanych śladów, posłużyły do wykreślenia kraw˛edzi mi˛edzy wierzchołkami grafu reprezentujacymi ˛ punkty w programie. Kraw˛edź pomi˛edzy dwoma punktami oznacza potencjalna˛ możliwość bezpośredniego przejścia mi˛edzy nimi podczas wykonania programu. Zaleta˛ tej formy prezentacji jest uproszczenie analizy asercji ze śladem powiazanych ˛ z przebiegiem wykonania programu oraz wizualizacja potencjalnych ścieżek wykonania w programie. Wada˛ jest niejednoznaczność śladów wytyczanych poprzez kraw˛edzie o długości dłuższej niż jedno przejście, ponieważ nie wszystkie kombinacje przejść musza˛ być prawidłowe. Z tego powodu asercje przechowywane sa˛ w wierzchołkach grafu wraz z pełnymi śladami. Digraf prezentujacy ˛ asercje ze śladem przekłada si˛e na struktur˛e danych przeznaczona˛ do ich przechowywania dla całego programu w formie digrafu, w którym w wierzchołkach przechowywana jest lista dynamiczna lub tablica asercji ze śladem obowiazuj ˛ acych ˛ w określonym punkcie programu oraz lista kraw˛edzi skierowanych do wierzchołków, do których kolejne przejścia sa˛ możliwe. Dla dużych analizowanych programów przechowywanie danych w takiej strukturze może znaczaco ˛ przyspieszyć czas wyszukiwania odpowiednich asercji do sprawdzenia. Struktura tego typu może być tworzona, aktualizowana i weryfikowana w dowolnym momencie wykonania programu. 77 4.7.3. Multigraf Przeniesienie informacji o asercjach ze śladem w danym punkcie programu z wierzchołków grafu do jego kraw˛edzi prowadzi do wizualizacji w formie multigrafu, którego przykład pokazano na rysunku 4.3(c). W kraw˛edzi wchodzacej ˛ do danego wierzchołka przechowywany jest jeden z możliwych śladów wraz z odpowiadajacymi ˛ mu asercjami. Zaleta˛ multigrafu jest uproszczenie analizy asercji ze śladem powiazanych ˛ z przebiegiem wykonania programu oraz wizualizacja fragmentów ścieżek wykonania w programie. Forma ta jest przydatna, kiedy w wierzchołku (punkcie programu) wyst˛epuje duża liczba asercji. Poprzez przeniesienie ich do oddzielnych kraw˛edzi uzyskano wi˛eksza˛ przejrzystość. Wada˛ jest reprezentacja dłuższych śladów w formie jednej kraw˛edzi charakteryzujacej ˛ jedynie jednostkowy jego fragment. Multigraf prezentujacy ˛ asercje ze śladem odpowiada strukturze multigrafu przeznaczonej do ich przechowywania dla całego analizowanego programu. Dla każdej z kraw˛edzi wchodzacej ˛ do danego wierzchołka przechowywana jest etykieta zawierajaca ˛ określony ślad oraz lista dynamiczna lub tablica asercji obowiazuj ˛ acych ˛ w określonym punkcie programu dla danego śladu. Struktura tego typu może być tworzona i aktualizowana w dowolnym momencie wykonania programu. Może ona zostać także wykorzystana do obserwacji przebiegu programu i selekcji odpowiednich asercji podczas procesu weryfikacji. 4.7.4. Kolorowany multigraf Na rysunku 4.3(d) przedstawiono zbiór asercji ze śladem zobrazowany w formie kolorowanego multigrafu. Dla każdej asercji ze śladem wykreślono pełen przebieg śladu w formie kraw˛edzi określonego koloru. Zakończenie kraw˛edzi danego koloru powiazane ˛ jest z wystapieniem ˛ w wierzchołku asercji o identycznym oznaczeniu. Zaleta˛ takiego rozwiazania ˛ jest wizualizacja pełnego śladu dla asercji na grafie prezentujacym ˛ przebieg programu. Jest to wizualizacja dobra dla aplikacji o niewielkiej liczbie zróżnicowanych śladów lub dla fragmentów aplikacji. Przy ich znacznej liczbie rysunek może stać si˛e nieczytelny. W takim przypadku może być prezentowana na przykład jedynie cz˛eść asercji ze śladem. 4.8. Podsumowanie i wnioski W rozdziale zaproponowana została metoda podniesienia wiarygodności wykrywanych asercji poprzez uzależnienie ich od śladu wykonania programu. Przedstawione zostały metody pozwalajace ˛ na wykrywanie tego typu asercji oraz ich późniejsza˛ weryfikacj˛e w oprogramowaniu. Asercje tego typu można uznać za połaczenie ˛ asercji weryfikujacych ˛ poprawność danych w programie oraz przebiegu jego wykonania. Różne metody weryfikacji asercji ze śladem w oprogramowaniu pozwalaja˛ na ich wykorzystanie zarówno w celu wyłacznie ˛ wi˛ekszej 78 specjalizacji asercji sprawdzajacych ˛ dane jak i dodatkowo kontroli poprawności przebiegu wykonania programu. Dla zbiorów asercji ze śladem zaproponowano trzy algorytmy, których przeznaczeniem jest ich przetwarzanie w celu: — redukcji liczby śladów w zbiorze asercji ze śladem (algorytm 4.1), — skracania śladów w zbiorze asercji ze śladem (algorytm 4.2), — redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem (algorytm 4.3). W rozdziale przedstawione zostały także przykładowe sposoby wizualizacji zbiorów asercji ze śladem w postaci wykazu, digrafu, multigrafu i kolorowanego multigrafu. Moga˛ one być uzupełnieniem środowisk graficznych przeznaczonych do rozwoju oraz analizy działania aplikacji. Badanie asercji ze śladem może być szczególnie interesujace ˛ dla aplikacji reaktywnych, w których interakcja z użytkownikiem (lub działanie zależne od użytkownika) jest bardzo silne. Przykładem moga˛ być inteligentne systemy sterujace ˛ na przykład oświetleniem w domu, które swoje działanie dostosowuja˛ do specyficznych zachowań użytkownika oraz systemy analizujace ˛ sposób wykorzystania karty płatniczej lub usług sieciowych [63]. Dla takich aplikacji proces wykrywania asercji jest realizowany przez pewna˛ cz˛eść czasu pracy systemu, a nast˛epnie wykryte asercje zaczynaja˛ być sprawdzane lub oba procesy trwaja˛ jednocześnie aż do osiagni˛ ˛ ecia ustalonej minimalnej liczby zgłaszanych nieprawidłowych naruszeń asercji. Asercje ze śladem wykryte w takich systemach moga˛ odzwierciedlać zachowania specyficzne dla danego użytkownika, czy miejsca lub czasu zastosowania systemu. Asercje ze śladem moga˛ w takim przypadku pełnić nie tylko rol˛e zabezpieczeń programu, ale również sposobu jego używania ponieważ opisuja˛ jego własności dynamiczne. 79 5. Optymalizacja wykorzystania asercji w programach Niezb˛ednym elementem pracy badawczej w dziedzinie inżynierii oprogramowania sa˛ różnego rodzaju eksperymenty pozwalajace ˛ na obserwacj˛e, analiz˛e oraz ocen˛e działania proponowanych metod w praktycznych zastosowaniach, a także na dostrzeżenie problemów zwiazanych ˛ z ich użyciem. Z wyżej wymienionego oraz innych powodów przedstawionych w pracach [5, 102, 117] eksperymenty powinny nast˛epować po etapie teoretycznych rozważań i stanowić ich uzupełnienie. W rozdziale trzecim oraz czwartym zaproponowano metody, których celem jest poprawienie wybranych parametrów zestawu asercji lub podniesienie ich skuteczności. W niniejszym rozdziale przedstawiono metodologi˛e analizy opisanych metod oraz, na przykładzie konkretnych aplikacji, dokonana została eksperymentalna weryfikacja ich efektywności. 5.1. Redukcja liczby asercji w programie W punkcie 3.3 przedstawiona została metoda selekcji asercji umożliwiajaca ˛ wyznaczenie pewnego ich podzbioru, który w optymalny sposób spełni narzucone kryteria. Celem badania jest sprawdzenie w jaki sposób redukcja liczby dynamicznie wykrytych asercji wpłynie na parametry aplikacji takie jak jej kosz statyczny (punkt 3.2.3) i dynamiczny (punkt 3.2.4) oraz poziom detekcji bł˛edów wyrażony miara˛ skuteczności bezwzgl˛ednej i wzgl˛ednej (punkt 3.2.10). W pierwszym etapie badane aplikacje zostana˛ uruchomione w środowisku przeznaczonym do dynamicznego wykrywania asercji (rozdział drugi). Wszystkie wykryte asercje zostana˛ wprowadzone do programów. Tak wzbogacone ich wersje zostana˛ wielokrotnie uruchomione w systemie FITS [36, 37, 97] przeznaczonym do zakłócania działania aplikacji. W każdym z uruchomień do aplikacji zostanie wprowadzony losowy bład ˛ skutkujace ˛ określonym zachowaniem asercji, które b˛edzie obserwowane. Dane zebrane podczas obserwacji umożliwia˛ wyznaczenie parametrów asercji (punkt 3.3.1). Dane zebranie w trakcie obserwacji zachowania asercji zostana˛ wykorzystane na kolejnym etapie badania majacym ˛ na celu wybranie pewnego ich podzbioru (punkt 3.3.2). Wykorzystane zostana˛ różne kryteria selekcji asercji, co umożliwi ich późniejsza˛ analiz˛e porównawcza˛ pod 81 wzgl˛edem redukcji liczby asercji oraz zmiany innych parametrów programu. Na podstawie otrzymanych wyników przygotowane zostana˛ wersje aplikacji, w których zastosowane b˛eda˛ wyznaczone zbiory asercji. Programy te zostana˛ poddane eksperymentom weryfikujacym ˛ (punkt 3.3.3). Po otrzymaniu wyników z eksperymentów weryfikujacych ˛ możliwa b˛edzie analiza porównawcza liczby wykrytych bł˛edów przy zastosowaniu różnych podzbiorów wybranych asercji w stosunku do liczby bł˛edów wykrytych w aplikacjach, w których zastosowano wszystkie wykryte asercje lub nie stosowano mechanizmu asercji. W tym aspekcie porównane zostana˛ również inne parametry aplikacji takie jak liczba instrukcji stosowanych w różnych jej wersjach. W kolejnych punktach przedstawiono charakterystyk˛e badanych aplikacji oraz zaprezentowano szczegółowy przebieg eksperymentów wraz z przyj˛etymi parametrami. Do ich przeprowadzenia wykorzystano narz˛edzia z pakietu AEM szczegółowo opisane w dodatku A.1. Umożliwiaja˛ one automatyzacj˛e szeregu operacji wymaganych w metodzie takich jak pomiar parametrów asercji czy wyznaczanie ich podzbiorów, a także opracowanie wyników przeprowadzonych eksperymentów. W poniższym opisie każdemu z opisywanych eksperymentów przyporzadkowano ˛ zestaw identyfikatorów, których układ odpowiada badaniu jednej z wersji wymienionych aplikacji, różniacej ˛ si˛e na przykład podzbiorem wybranych asercji. Przedstawiona metodologia analizy jest uniwersalna. Przedstawiony sposób post˛epowania oraz przygotowane oprogramowanie wspomagajace ˛ omówiony proces może być zastosowane dla innych aplikacji. 5.1.1. Charakterystyka badanych programów W badaniu wykorzystano program symulujacy ˛ działanie linii produkcyjnej (identyfikator k) oraz aplikacj˛e przeznaczona˛ do rozwiazywania ˛ układu równań liniowych metoda˛ eliminacji Gaussa [19] (identyfikator g). Aplikacje stworzone zostały w j˛ezyku C++. Obliczenia przeprowadzane w programach zaimplementowano na dwa sposoby: — z wykorzystaniem operacji na liczbach zmiennoprzecinkowych realizowanych bezpośrednio przez rozkazy procesora (identyfikator f), — realizujacej ˛ operacje na liczbach zmiennoprzecinkowych poprzez bibliotek˛e SoftFloat1 , która implementuje je z wykorzystaniem rozkazów procesora operujacych ˛ na liczbach całkowitych (identyfikator i). Każda z aplikacji posiada moduł, który umożliwia ocen˛e poprawności przeprowadzonych obliczeń. Był on wykorzystywany w trakcie eksperymentów w celu oceny skutków wprowadzonych bł˛edów na wynik działania aplikacji. Moduł ten był niezależny i wyłaczony ˛ z procesu 1 http://www.cs.berkeley.edu/ jhauser/arithmetic/SoftFloat.html 82 wykrywania asercji oraz wprowadzania bł˛edów. Jako środowiska służacego ˛ do przeprowadzenia wszystkich eksperymentów użyto systemu Windows XP2 wraz z kompilatorem Visual C++3 . Zastosowany został komputer osobisty wyposażony w procesor Intel Core 2 CPU T7200 2.00 GHz. 5.1.2. Wykrywanie asercji W celu wykrycia asercji aplikacja k została uruchomiona pod kontrola˛ pakietu Daikon [29, 33] dla jednego zestawu danych wejściowych charakteryzujacych ˛ poprawne działanie sterownika. W wyniku analizy zebranych danych otrzymano 1851 asercji w module aplikacji przeprowadzajacym ˛ symulacj˛e działania linii produkcyjnej. Otrzymane asercje były identyczne zarówno dla aplikacji w wersji f jak i w wersji i. Do kodu źródłowego aplikacji wprowadzono wszystkie wykryte asercje. Automatycznie wykryte przez pakiet Daikon asercje dla aplikacji g opisywały jej zachowanie jedynie dla jednego zestawu danych wejściowych, którym był losowo wygenerowany układ równań liniowych posiadajacy ˛ jedno rozwiazanie. ˛ Danych tych użyto podczas uruchomienia podlegajacego ˛ obserwacji. Wykryte asercje były całkowicie zależne od danych wejściowych, co oznacza, że użycie innego układu równań spowodowałoby zgłaszanie przez nie naruszeń. Z tego powodu, na podstawie proponowanych asercji, manualnie wprowadzono zestaw zmodyfikowanych asercji, które uogólniono w taki sposób, aby były całkowicie niezależne od danych wejściowych. Asercjom przyporzadkowano ˛ atrybut (punkt 3.2.8) charakteryzujacy ˛ moduł programu w jakim wystapiły: ˛ wyznaczajacy ˛ lub sprawdzajacy ˛ rozwiazanie ˛ układu równań. W cz˛eści aplikacji wyznaczajacej ˛ rozwiazanie ˛ układu równań zastosowano sześćdziesiat ˛ asercji. We fragmencie weryfikujacym ˛ otrzymane rozwiazanie ˛ użyto sześciu asercji. Te same asercje zastosowano dla aplikacji w wersji f oraz i aplikacji g. Asercje wprowadzone do badanych programów opisywały asercj˛e typu a ◦ b, gdzie: — a było zmienna˛ liczbowa˛ używana˛ w programie, — b określało pewna˛ stała˛ wartość lub inna˛ zmienna˛ liczbowa˛ badanej aplikacji, — ◦ było jednym z operatorów <, >, =, 6=, ≤, ≥ określajacym ˛ zależność mi˛edzy a i b. Ponadto siedem asercji w aplikacji g opisywało zależność pomi˛edzy poprzednia˛ a aktualna˛ wartościa˛ danej zmiennej podczas iteracji na etapie obliczeń. Poprzednia wartość sprawdzanej zmiennej była przechowywana z użyciem dodatkowej zmiennej pomocniczej. 5.1.3. Pomiar parametrów asercji Pojedyncze uruchomienie programu (pojedynczy test) polegał na wykonaniu pełnego jego przebiegu z wygenerowanym losowym pojedynczym zakłóceniem cz˛eści aplikacji wykonujacej ˛ 2 3 http://www.microsoft.com/windowsxp/ http://msdn.microsoft.com/visualc/ 83 symulacj˛e (aplikacja k) lub wyznaczajacym ˛ rozwiazanie ˛ układu równań oraz je weryfikujacym ˛ (aplikacja g) w jednym z nast˛epujacych ˛ modułów systemu komputerowego: — rejestrów procesora, — rejestrach jednostki zmiennoprzecinkowej (FPU), — pami˛eci operacyjnej, w szczególności: — adresów w obszarze danych, — instrukcji przed jej wykonaniem, — kodu statycznego programu. Jako szczegółowe wartości parametrów generowanych bł˛edów wybrano domyślne ustawienia systemu FITS [37]. Bł˛edy generowane były w przypadkowych momentach. Stosowano jednobitowe inwersje w zakłócanych obszarach (rejestry, pami˛eć operacyjna). Bł˛edy miały charakter przemijajacy ˛ – czas utrzymania bł˛edu określono na jedna˛ instrukcj˛e. W wersji aplikacji realizujacej ˛ w sposób programowy operacje na liczbach zmiennoprzecinkowych obszar wprowadzania zakłóceń obejmował również bibliotek˛e SoftFloat. Liczba wykonanych testów była wybrana przez system FITS w taki sposób, aby zapewnić maksymalne pokrycie kodu z zakłócanego obszaru aplikacji. Tak wybrane parametry wprowadzanych bł˛edów pozwalaja˛ na poddanie aplikacji wpływom efektów działania zróżnicowanych rodzajów zakłóceń. Umożliwia to selekcj˛e asercji na podstawie wyników otrzymanych wskutek szerokiego przekroju profili obserwacji. Dla każdego z testów przeprowadzonego pod kontrola˛ systemu FITS określono wynik, którego możliwe wartości przedstawione zostały w tabeli 5.1. Zbiór możliwych wyników testu wynika z charakteru implementacji systemu FITS. W każdym z opisywanych poniżej eksperymentów wykonano około pi˛eciu tysi˛ecy testów zakłócajacych ˛ wyżej wymienione obszary wstrzykiwania bł˛edów. Celem pierwszej serii eksperymentów było zebranie danych wykorzystywanych do późniejszej selekcji zestawu asercji takich jak ich całkowity koszt dynamiczny oraz liczba wykrytych bł˛edów przekładajaca ˛ si˛e na wartość parametru skuteczności asercji. Podczas uruchomień badanych aplikacji zakłócany był jedynie obszar wykonujacy ˛ symulacj˛e (aplikacja k) lub wyznaczajacy ˛ rozwiazanie ˛ układu równań oraz je weryfikujacym ˛ (aplikacja g) z pomini˛eciem wprowadzonych asercji. Gdy dochodziło do naruszenia asercji podczas testu, nie przerywano działania programu, a jedynie rejestrowano zaistniały fakt poprzez wpis do dziennika działania aplikacji. W efekcie, mimo iż sprawdzano wprowadzone asercje, nie miały one wpływu na przebieg działania programu. System FITS przekazywał otrzymany wynik testu oraz dzienniki działania aplikacji do narz˛edzi z pakietu AEM, które umożliwiały automatyczna˛ rejestracj˛e obserwacji oraz analiz˛e naruszeń asercji. Dla aplikacji g zastosowano cztery różne zestawy danych wejściowych opisujace ˛ układ równań liniowych majacy ˛ jedno rozwiazanie ˛ o dwóch niewiadomych i dwóch równa- 84 N Zakłócenie niewprowadzone. System FITS nie zdołał wprowadzić zakłócenia w realizowanym teście wskutek czego program zadziałał prawidłowo (program zakończył si˛e i wygenerował prawidłowy wynik). Brak możliwości wprowadzenia bł˛edu do programu wynika z charakteru implementacji i wewn˛etrznej budowy systemu FITS. Testy zakończone tego rodzaju wynikiem były pomijane w trakcie obliczeń dzi˛eki zastosowaniu odpowiedniej funkcji wag. Nie miały one wpływu na selekcj˛e asercji. C Poprawny wynik obliczeń. System FITS wprowadził zakłócenie, ale jego efekt nie został wykryty przez funkcj˛e kontrolujac ˛ a˛ poprawność działania aplikacji, co oznacza, że program zadziałał prawidłowo (program zakończył si˛e i wygenerował prawidłowy wynik). I Niepoprawny wynik obliczeń. Żadna z asercji nie wykryła wprowadzonego zakłócenia. Jego efekt został wykryty przez funkcj˛e kontrolujac ˛ a˛ poprawność działania aplikacji (program zakończył si˛e i wygenerował nieprawidłowy wynik). A Naruszenie asercji. Podczas wykonania programu jedna z wprowadzonych asercji została naruszona w wyniku czego przerwano jego wykonanie. E Wyjatek ˛ systemowy. W trakcie wykonywania testu zgłoszony został wyjatek ˛ systemowy na skutek wprowadzonego bł˛edu. T Przekroczony czas oczekiwania. Wprowadzone zakłócenie uniemożliwiło w określonym czasie zakończenie programu, skutkujacego ˛ otrzymaniem jednego z wyników wymienionych powyżej (program został przerwany przez system FITS). Tabela 5.1. Wykaz możliwych wyników testu w systemie FITS 85 niach (identyfikator g2), pi˛eciu niewiadomych i pi˛eciu równaniach (identyfikator g5), pi˛etnastu niewiadomych i pi˛etnastu równaniach (identyfikator g15) oraz dwudziestu pi˛eciu niewiadomych i dwudziestu pi˛eciu równaniach (identyfikator g25). Obserwacje przeprowadzono oddzielnie dla każdej z wersji (f oraz i) badanych programów. Oznacza to, że dla aplikacji k wykonano dwa, a dla aplikacji g osiem eksperymentów obserwacyjnych. 5.1.4. Wybór zestawów asercji Podczas procesu selekcji asercji stosowano trzy różne postacie funkcji w(e) określajacej ˛ wartość wagi dla danego wyniku testu (definicja 3.2.13 w punkcie 3.2.10). Dla przewidzianych wyników testu przedstawionych w tabeli 5.1 przygotowano nast˛epujace ˛ funkcje: 0, −1, w(e) = 1, w(e) = 0, dla testów, w których nie wprowadzono zakłócenia (N), dla testów zakończonych poprawnym wynikiem obliczeń (C), dla testów zakończonych niepoprawnym wynikiem obliczeń (I) przekroczonym czasem oczekiwania (T) lub wyjatkiem ˛ systemowym (E). dla testów, w których nie wprowadzono zakłócenia (N) zakończonych wyjatkiem ˛ systemowym (E) lub przekroczonym czasem oczekiwania (T), −1, dla testów zakończonych poprawnym wynikiem obliczeń (C), 1, dla testów zakończonych niepoprawnym wynikiem obliczeń (I). w(e) = 0, (5.1) (5.2) dla testów, w których nie wprowadzono zakłócenia (N) testów z niepoprawnym wynikiem obliczeń (I) lub przekroczonym czasem oczekiwania (T), −1, dla testów zakończonych poprawnym wynikiem obliczeń (C), 1, dla testów zakończonych wyjatkiem ˛ systemowym (E). (5.3) Zaproponowane funkcje w(e) miały na celu ignorowanie wyników testów, w których systemowi FITS nie udało si˛e wprowadzić bł˛edu. Liczba takich testów nie miała wpływu na wartość 86 wykorzystanych parametrów asercji. Funkcja w(e) w postaci 5.1 promowała asercje wykrywajace ˛ dowolny z wyników testów, który użytkownik może uznać za niesatysfakcjonujacy ˛ (niepoprawny, wyjatek ˛ systemowy, przekroczenie czasu oczekiwania). W przypadku funkcji w(e) w postaci 5.2 ograniczono liczb˛e promowanych asercji, wybierajac ˛ jedynie te, które zapobiegały niepoprawnemu wynikowi obliczeń, a testy zakończone pozostałymi wynikami zakwalifikowano do ignorowanych. W analogiczny sposób funkcja w(e) w postaci 5.3 promowała asercje, które zapobiegały powstaniu wyjatku ˛ systemowego wskutek wprowadzonego bł˛edu. Dla wszystkich zaproponowanych funkcji test zakończony wynikiem poprawnym obniżał wartość wybranego parametru asercji określajacego ˛ skuteczność. Oznacza to, że asercja, która wykryła bład, ˛ mimo iż jego skutek nie wpłynał ˛ na poprawny wynik działania aplikacji, miała niższa˛ wartość badanego parametru niż asercja, dla której takie zachowanie nie zostało zaobserwowane. Obniża to wartość skuteczności dla asercji, które zgłaszaja˛ fałszywe alarmy. Przyporzadkowanie ˛ wag o tej samej wartości bezwzgl˛ednej miało na celu zrównoważenie wpływu negatywnego i pozytywnego na parametr asercji dla jednostkowego testu. Strategie selekcji zestawów asercji dla aplikacji k oraz g zastosowane zarówno dla implementacji typu f oraz i przedstawiono odpowiednio w tabelach 5.2 i 5.3. Wyniki eksperymentów wprowadzania zakłóceń w aplikacjach, w których nie zastosowano asercji oraz wprowadzono wszystkie asercje posłuża˛ jako dane referencyjne do analizy wyników z pozostałych wersji aplikacji. Parametry dla metody selekcji asercji, takie jak liczba asercji oraz ograniczenia na ich całkowity koszt dynamiczny zostały wybrane arbitralnie z uwzgl˛ednieniem zapewnienia istotnego spadku ich wartości w programie. Tak wybrane parametry metody powinny pozwolić wykazać zasadność jej stosowania. Zestawy asercji były wybierane na podstawie całościowego wyniku eksperymentu z punktu 5.1.3 dla jednej z dwóch wersji badanej aplikacji k oraz na podstawie całościowych i dedykowanych danej wersji z określona˛ liczba˛ stosowanych równań wyników eksperymentów aplikacji g. W każdym przypadku brano pod uwag˛e wszystkie obserwowane obszary zakłóceń. Nie wybierano zestawów asercji zoptymalizowanych tylko dla jednego z obszarów zakłóceń w celu przygotowania uniwersalnego podzbioru asercji reagujacego ˛ na różnorodne rodzaje bł˛edów. Zestawy asercji dla badanego programu zostały wybrane poprzez rozwiazania ˛ zadania programowania liniowego dla funkcji celu opisujacej ˛ maksymalizacj˛e skuteczności bezwzgl˛ednej lub wzgl˛ednej (w zależności od wybranej strategii) przy ograniczeniach zwiazanych ˛ z liczba˛ aktywnych asercji, całkowitym kosztem dynamicznym asercji (wybrane kryteria dla aplikacji k) lub położeniem asercji w programie (wybrane kryteria dla aplikacji g). Zostały one wyznaczone przez narz˛edzie z pakietu AEM automatyzujace ˛ selekcj˛e asercji na podstawie zadanej strategii oraz posiadanych danych z etapu obserwacji asercji. Przykłady przebiegu obliczeń zostały przedstawione w punkcie 3.3.4. 87 B Wszystkie asercje w programie zostały usuni˛ete (brak asercji). W Wszystkie asercje sa˛ stosowane w programie. N Wybór do dziesi˛eciu asercji przy zastosowaniu funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność bezwzgl˛edna.˛ Stosowano funkcj˛e w(e) w postaci 5.1. Z Wybór do dziesi˛eciu asercji przy zastosowaniu funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność wzgl˛edna.˛ Stosowano funkcj˛e w(e) w postaci 5.1. DN Wybór asercji według funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność bezwzgl˛edna˛ przy ograniczeniu na całkowity koszt dynamiczny wybranych asercji ustalony na dziesi˛eciokrotność kosztu asercji o najmniejszym całkowitym koszcie dynamicznym. Stosowano funkcj˛e w(e) w postaci 5.1. Dodatkowe ograniczenie na całkowity koszt dynamiczny wybranych asercji miało na celu maksymalne skrócenie czasu działania aplikacji przeznaczonego na sprawdzanie asercji. DZ Wybór asercji według funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność wzgl˛edna˛ przy ograniczeniu na całkowity koszt dynamiczny wybranych asercji ustalony na dziesi˛eciokrotność kosztu asercji o najmniejszym całkowitym koszcie dynamicznym. Stosowano funkcj˛e w(e) w postaci 5.1. Dodatkowe ograniczenie na całkowity koszt dynamiczny wybranych asercji miało na celu maksymalne skrócenie czasu działania aplikacji przeznaczonego na sprawdzanie asercji. I Przy selekcji asercji zastosowano funkcj˛e w(e) w postaci 5.2 zamiast funkcji w(e) w postaci 5.1. X Przy selekcji asercji zastosowano funkcj˛e w(e) w postaci 5.3 zamiast funkcji w(e) w postaci 5.1. Tabela 5.2. Strategie selekcji asercji dla aplikacji k 88 B Wszystkie asercje w programie zostały usuni˛ete (brak asercji). W Wszystkie asercje sa˛ stosowane w programie. R Stosowane sa˛ asercje z cz˛eści wyznaczajacej ˛ rozwiazanie ˛ układu równań. Asercje z cz˛eści przeprowadzajacej ˛ weryfikacj˛e znalezionego rozwiazania ˛ układu równań zostały usuni˛ete. S Stosowane sa˛ asercje z cz˛eści przeprowadzajacej ˛ weryfikacj˛e znalezionego rozwiazania ˛ układu równań. Asercje z cz˛eści wyznaczajacej ˛ rozwiazanie ˛ układu równań zostały usuni˛ete. N Co najmniej pi˛eciokrotne zmniejszenie liczby asercji przy zastosowaniu funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność bezwzgl˛edna.˛ Stosowano funkcj˛e w(e) w postaci 5.1. Z Co najmniej pi˛eciokrotne zmniejszenie liczby asercji przy zastosowaniu funkcji celu maksymalizujacej ˛ całkowita˛ skuteczność wzgl˛edna.˛ Stosowano funkcj˛e w(e) w postaci 5.1. I Przy selekcji asercji zastosowano funkcj˛e w(e) w postaci 5.2 zamiast funkcji w(e) w postaci 5.1. X Przy selekcji asercji zastosowano funkcj˛e w(e) w postaci 5.3 zamiast funkcji w(e) w postaci 5.1. d Przy selekcji asercji wykorzystano wyniki testów otrzymane dla określonej wersji programu (wyłacznie ˛ wyniki z obserwacji aplikacji g2 dla kolejnych procedur selekcji asercji wzgl˛edem różnych kryteriów dla aplikacji w wersji g2 itd.). t Przy selekcji asercji wykorzystano wyniki testów otrzymane dla wszystkich wersji programu (łaczne ˛ wyniki z obserwacji aplikacji g2, g5, g15 i g25 dla kolejnych procedur selekcji asercji wzgl˛edem różnych kryteriów dla aplikacji w wersji g2 itd.). Tabela 5.3. Strategie selekcji asercji dla aplikacji g 89 Przyrost statycznej (w kodzie) i dynamicznej (wykonanych) liczby instrukcji w badanych wersjach programów oraz liczb˛e wybranych asercji przedstawiono odpowiednio w tabeli 5.4 dla aplikacji k i tabeli 5.5 dla wybranych wersji aplikacji g (dla 2 i 25 rozwiazywanych ˛ równań). W pierwszej cz˛eści tabel przedstawiono dane dotyczace ˛ wersji programów operujacych ˛ na liczbach zmiennoprzecinkowych, w drugiej wykorzystujacych ˛ bibliotek˛e SoftFloat. Stosowane identyfikatory aplikacji sa˛ zgodne z przedstawionymi strategiami selekcji asercji w tabelach 5.2 i 5.3. Pomiar liczby instrukcji został wykonany z użyciem systemu FITS. Przyrosty podano wzgl˛edem wersji aplikacji, w której nieaktywne były wszystkie asercje (program bez asercji). Przyrost liczby instrukcji, zarówno w kodzie statycznym jak i wykonanych, przekładajacy ˛ si˛e mi˛edzy innymi na szybkość wykonania programu, jest mniejszy po zastosowaniu metody selekcji asercji dla wszystkich wersji badanych aplikacji. Eksperyment Liczba instrukcji Liczba asercji w kodzie przyrosta wykonanych przyrosta fB fW fN fZ fDN fDZ fDNI fDZI fDNX fDZX 157 9368 207 207 207 188 207 193 182 182 – 5866,9 31,8 31,8 31,8 19,7 31,8 22,9 15,9 15,9 2811600 152564400 5781600 5193600 2826600 2825400 2826600 2825400 2826600 2826600 – 5326,25 105,63 84,72 0,53 0,49 0,53 0,49 0,53 0,53 0 1851 10 10 10 7 10 8 5 5 iB iW iN iZ iDN iDZ iDNI iDZI iDNX iDZX 1224 24314 1453 1464 1453 1464 1431 1466 1431 1466 – 78075350 1886,4 2014764686 18,7 114726900 19,6 98697171 18,7 114726900 19,6 98697171 16,9 94966343 19,8 102049629 16,9 94966343 19,8 102049629 – 2480,54 46,94 26,41 46,94 26,41 21,63 30,71 21,63 30,71 0 1851 10 10 10 10 10 8 10 10 a przyrosty podano w procentach wzgl˛edem wielkości implementacji bez asercji Tabela 5.4. Liczba instrukcji dla poszczególnych wersji aplikacji k Dla aplikacji kf przy zastosowaniu metody selekcji asercji bez kryterium uwzgl˛edniajacego ˛ koszt wybranych asercji otrzymano prawie dwustukrotnie mniejszy przyrost liczby instrukcji w kodzie aplikacji oraz ponad pi˛ećdziesi˛eciokrotnie mniejszy wzrost liczby instrukcji wykonanych niż w wersji programu, w której stosowano wszystkie asercje. Po dodaniu kryterium 90 Eksperyment a Liczba instrukcji Liczba asercji w kodzie przyrosta wykonanych przyrosta 2fB 2fW 2fRW 2fSW 2fdRN 2fdRNI 2fdRNX 2fdRZ 2fdRZI 2fdRZX 2ftRN 2ftRNI 2ftRNX 2ftRZ 2ftRZI 2ftRZX 2fdSN 2fdSNI 2fdSNX 2fdSZ 2fdSZI 2fdSZX 2ftSN 2ftSNI 2ftSNX 2ftSZ 2ftSZI 2ftSZX 216 631 536 327 287 281 290 288 286 309 296 326 282 296 326 288 283 283 216 283 283 216 283 283 216 283 283 216 – 192,13 148,15 51,39 32,87 30,09 34,26 33,33 32,41 43,06 37,04 50,93 30,56 37,04 50,93 33,33 31,02 31,02 0,00 31,02 31,02 0,00 31,02 31,02 0,00 31,02 31,02 0,00 368 2136 1708 796 856 827 859 859 833 874 908 877 823 735 882 670 511 511 368 511 511 368 511 511 368 511 511 368 – 480,43 364,13 116,30 132,61 124,73 133,42 133,42 126,36 137,50 146,74 138,32 123,64 99,73 139,67 82,07 38,86 38,86 0,00 38,86 38,86 0,00 38,86 38,86 0,00 38,86 38,86 0,00 0 66 60 6 12 12 12 12 12 12 12 12 12 12 12 12 1 1 0 1 1 0 1 1 0 1 1 0 25fB 25fW 25fRW 25fSW 25fdRN 25fdRNI 25fdRNX 25fdRZ 25fdRZI 25fdRZX 25ftRN 25ftRNI 25ftRNX 25ftRZ 25ftRZI 25ftRZX 25fdSN 25fdSNI 25fdSNX 25fdSZ 25fdSZI 25fdSZX 25ftSN 25ftSNI 25ftSNX 25ftSZ 25ftSZI 25ftSZX 299 631 536 410 331 334 309 339 334 340 333 326 315 314 326 312 387 387 299 387 387 299 387 387 299 387 387 299 – 111,04 79,26 37,12 10,70 11,71 3,34 13,38 11,71 13,71 11,37 9,03 5,35 5,02 9,03 4,35 29,43 29,43 0,00 29,43 29,43 0,00 29,43 29,43 0,00 29,43 29,43 0,00 66447 924137 876306 114278 451754 499101 216651 451000 499101 406330 450953 517733 208402 201755 517531 174918 70503 70503 66447 70503 70503 66447 70503 70503 66447 70503 70503 66447 – 1290,79 1218,80 71,98 579,87 651,13 226,05 578,74 651,13 511,51 578,67 679,17 213,64 203,63 678,86 163,24 6,10 6,10 0,00 6,10 6,10 0,00 6,10 6,10 0,00 6,10 6,10 0,00 0 66 60 6 12 12 12 12 12 12 12 12 12 12 12 12 1 1 0 1 1 0 1 1 0 1 1 0 przyrosty podano w procentach wzgl˛edem wielkości implementacji bez asercji Tabela 5.5. Liczba instrukcji dla poszczególnych wersji aplikacji g 91 Eksperyment a Liczba instrukcji Liczba asercji w kodzie przyrosta wykonanych przyrosta 2iB 2iW 2iRW 2iSW 2idRN 2idRNI 2idRNX 2idRZ 2idRZI 2idRZX 2itRN 2itRNI 2itRNX 2itRZ 2itRZI 2itRZX 2idSN 2idSNI 2idSNX 2idSZ 2idSZI 2idSZX 2itSN 2itSNI 2itSNX 2itSZ 2itSZI 2itSZX 1524 3114 2666 2030 1860 1854 1665 1851 1851 1665 2109 2255 1661 1827 2003 1661 1825 1825 1524 1825 1825 1524 1825 1825 1524 1825 1825 1524 – 104,33 74,93 33,20 22,05 21,65 9,25 21,46 21,46 9,25 38,39 47,97 8,99 19,88 31,43 8,99 19,75 19,75 0,00 19,75 19,75 0,00 19,75 19,75 0,00 19,75 19,75 0,00 8830 34370 25739 17461 17257 17250 9391 17227 17227 9391 19787 22308 9388 15560 17055 9388 12365 12365 8830 12365 12365 8830 12365 12365 8830 12365 12365 8830 – 289,24 191,49 97,75 95,44 95,36 6,35 95,10 95,10 6,35 124,09 152,64 6,32 76,22 93,15 6,32 40,03 40,03 0,00 40,03 40,03 0,00 40,03 40,03 0,00 40,03 40,03 0,00 0 66 60 6 12 12 12 12 12 12 12 12 12 12 12 12 1 1 0 1 1 0 1 1 0 1 1 0 25iB 25iW 25iRW 25iSW 25idRN 25idRNI 25idRNX 25idRZ 25idRZI 25idRZX 25itRN 25itRNI 25itRNX 25itRZ 25itRZI 25itRZX 25idSN 25idSNI 25idSNX 25idSZ 25idSZI 25idSZX 25itSN 25itSNI 25itSNX 25itSZ 25itSZI 25itSZX 1674 3297 2816 2211 2384 2440 1869 1992 2274 1869 2257 2403 1811 1975 2151 1811 2006 2006 1674 2006 2006 1674 2006 2006 1674 2006 2006 1674 – 96,95 68,22 32,08 42,41 45,76 11,65 19,00 35,84 11,65 34,83 43,55 8,18 17,98 28,49 8,18 19,83 19,83 0,00 19,83 19,83 0,00 19,83 19,83 0,00 19,83 19,83 0,00 5015184 15891646 14613810 6293020 12088750 12056480 5200029 5402979 5841979 5200029 12291052 12290928 5034234 5923590 6061107 5034234 5477478 5477478 5015184 5477478 5477478 5015184 5477478 5477478 5015184 5477478 5477478 5015184 – 216,87 191,39 25,48 141,04 140,40 3,69 7,73 16,49 3,69 145,08 145,07 0,38 18,11 20,86 0,38 9,22 9,22 0,00 9,22 9,22 0,00 9,22 9,22 0,00 9,22 9,22 0,00 0 66 60 6 12 12 12 12 12 12 12 12 12 12 12 12 1 1 0 1 1 0 1 1 0 1 1 0 przyrosty podano w procentach wzgl˛edem wielkości implementacji bez asercji Tabela 5.5. Liczba instrukcji dla poszczególnych wersji aplikacji g (c.d.) 92 ograniczenia kosztu dla instrukcji wykonanych dodatkowo spadła liczba instrukcji w kodzie średnio o 30% dla wszystkich wersji aplikacji poza fDN oraz liczba instrukcji wykonanych o około 50%. W zależności od strategii selekcji aktywnych było od pi˛eciu do dziesi˛eciu asercji. Wersja i programu k bez asercji charakteryzowała si˛e wi˛eksza˛ liczba˛ instrukcji w stosunku do kfB z uwagi na użycie implementacji programowej do wykonywania obliczeń zmiennoprzecinkowych. Zastosowanie metody selekcji asercji spowodowało ponad stukrotny spadek przyrostu liczby instrukcji w kodzie i ponad pi˛ećdziesi˛eciokrotny spadek liczby instrukcji wykonanych. Dla wi˛ekszości wersji wybrano dziesi˛eć asercji. Zastosowanie dodatkowego kryterium uwzgl˛edniajacego ˛ koszt nie wpłyn˛eło w znaczacy ˛ sposób na spadek przyrostu liczby instrukcji. Powodem był wpływ optymalizacji kodu stosowanej przez kompilator. Aplikacja g charakteryzowała si˛e w wi˛ekszości przypadków wi˛ekszymi przyrostami liczby instrukcji niż aplikacja k, ponieważ podczas selekcji asercji nie stosowano w niej bezpośrednio ograniczenia zwiazanego ˛ z kosztem. Należy również zauważyć, że suma przyrostów liczby instrukcji dla aplikacji 2fSW i 2fRW nie jest równa przyrostowi dla aplikacji 2fW. Jest to skutkiem działania optymalizacji kodu stosowanej przez kompilator. Analogiczna sytuacja wyst˛epuje w wersji i aplikacji g. Wraz ze wzrostem liczby rozwiazywanych ˛ równań przyrost liczby instrukcji w kodzie wzgl˛edem implementacji bez asercji maleje dla różnych strategii selekcji asercji, przy czym spadki te sa˛ wi˛eksze dla implementacji typu f. Liczba instrukcji wykonanych przy tych samych założeniach rośnie w przypadku stosowania strategii R i odpowiednio maleje przy stosowaniu strategii S. Wia˛że si˛e to z lokalizacja˛ asercji. W pierwszym przypadku sa˛ one sprawdzane wielokrotnie w trakcie rozwiazywania ˛ układu równań. Dla strategii S sprawdzenie odbywa si˛e jednokrotnie, po zakończeniu etapu wyznaczania rozwiazania ˛ układu równań, co wpływa na mniejszy przyrost liczby instrukcji. Zastosowanie złożonych strategii optymalizacji SNX i SZX skutkowało wyborem pustego zbioru asercji. Oznacza to, że nie obserwowano naruszeń asercji dla tych strategii i niemożliwe było rozwiazanie ˛ zadania programowania liniowego. Dla pozostałych wersji aplikacji, w zależności od strategii selekcji, aktywnych było od jednej do dwunastu asercji. Dla aplikacji g o liczbie równań, dla których nie przedstawiono w tabelach szczegółowych wyliczeń, podane wyżej wnioski sa˛ analogiczne. Porównanie przyrostu liczby wykonanych instrukcji pomi˛edzy wersja˛ aplikacji ze wszystkimi asercjami a wersjami, w której wybrano pewna˛ liczb˛e asercji pokazuje jak istotne jest wprowadzenie odpowiednich ograniczeń podczas procedury selekcji asercji, w szczególności zwiazanych ˛ z kosztem ich stosowania. 93 5.1.5. Eksperymenty weryfikujace ˛ W końcowym etapie, w celu weryfikacji wyników zastosowania metody selekcji optymalnego zestawu asercji według ustalonej strategii przeprowadzono eksperymenty z wybranymi aktywnymi asercjami przy założeniu możliwości ich zakłócania oraz, w wypadku ich naruszenia, przerywania działania programu (wynik testu A według tabeli 5.1). Do przeprowadzenia eksperymentów weryfikujacych ˛ użyto tego samego środowiska, które posłużyło do pomiarów parametrów asercji. Scharakteryzowane zostało ono w punktach 5.1.1 i 5.1.3. Bł˛edy wprowadzano do badanych wersji programów z użyciem systemu FITS, wyniki były analizowane i opracowane za pomoca˛ narz˛edzi z pakietu AEM. Przeprowadzono eksperymenty weryfikujace ˛ skuteczność wybranych asercji w procesie wykrywania bł˛edów na nast˛epujacych ˛ wersjach programu: — z nieaktywnymi wszystkimi asercjami (identyfikator B), — z aktywnymi wszystkimi asercjami (identyfikator W), — z aktywnymi wybranymi asercjami (identyfikatory eksperymentów zgodne z przedstawionymi strategiami selekcji asercji w tabelach 5.2 i 5.3). Dla wyżej opisanych eksperymentów weryfikujacych ˛ używano takich samych parametrów zwiazanych ˛ z wprowadzaniem bł˛edów do aplikacji jakie przedstawiono w punkcie 5.1.3. Niektóre z nich, z uwagi na losowy charakter, mogły różnić si˛e na poziomie na przykład zakłóconego bitu w kodzie instrukcji. Wybrane asercje były przygotowane do wykrywania tego rodzaju bł˛edów. Dodatkowo przeprowadzono seri˛e eksperymentów dla aplikacji k i g, która polegała na wprowadzeniu mutacji do programu i obserwacji zachowania asercji. Dzi˛eki temu b˛edzie możliwa ocena skuteczności wybranych asercji na podstawie zamkni˛etej klasy bł˛edów do wykrywania zakłóceń innego rodzaju. Dla badanych aplikacji przygotowano skrypt, który dokonywał losowej zamiany zmiennych tego samego typu w kodzie źródłowym określonej wersji badanego programu. Przygotowana aplikacja była automatycznie kompilowana i uruchamiana. Rejestrowany był wynik przeprowadzonego testu. Dla każdej z badanych wersji aplikacji przygotowano pi˛eć tysi˛ecy mutacji. Dla każdej z mutacji generowano dziesi˛eć losowych układów równań o ilości niewiadomych od dwóch do dwudziestu pi˛eciu i dokonywano testowego uruchomienia programu. Poniżej przedstawiono wyniki oraz wnioski z przeprowadzonych eksperymentów. W przypadku aplikacji g, z uwagi na duża˛ liczb˛e wersji testowanych programów, po analizie otrzymanych rezultatów zdecydowano o umieszczeniu szczegółowych wyników tylko dla wersji aplikacji o skrajnych liczbach równań (wersje g2 i g25). Dla pozostałych dwóch wersji aplikacji charakter otrzymanych wyników oraz wnioski sa˛ zbieżne z zaprezentowanymi. Załaczone ˛ rysunki prezentuja˛ procentowy rozkład wszystkich możliwych wyników przeprowadzonych testów. Ich udział dla ograniczonego zestawu wyników testu zaprezentowano w formie tabelarycznej. 94 95 (e) kod statyczny (d) rejestry FPU (b) adresy obszaru danych Rysunek 5.1. Rozkład wyników testów aplikacji k dla określonych obszarów zakłóceń (c) wykonane instrukcje (a) rejestry procesora Na rysunku 5.1 przedstawiono histogramy opisujace ˛ procentowy rozkład wyników testów przeprowadzonych eksperymentów z użyciem FITS dla wszystkich wersji aplikacji k w poszczególnych obszarach wprowadzania zakłóceń wymienionych w punkcie 5.1.3. Zastosowane identyfikatory wyników testu sa˛ zgodne z przedstawionymi w tabeli 5.1. Uwzgl˛edniono jedynie te testy podczas których systemowi FITS udało si˛e wygenerować bład ˛ w działaniu aplikacji (pomini˛eto testy z wynikiem N). Wprowadzone asercje maja˛ wpływ głównie na obniżenie liczby niepoprawnych zakończeń programów dzi˛eki wcześniejszej detekcji bł˛edów. Najwi˛eksza liczba wykrytych bł˛edów dotyczy zakłóceń w obszarach instrukcji i kodu statycznego aplikacji. Najmniejszy wpływ wybranych asercji zaobserwowano dla bł˛edów generowanych w rejestrach procesora dla wersji f aplikacji. Wynika to z faktu, iż wykryte asercje opisywały głównie zależności dla zmiennych zmiennoprzecinkowych programu. Mimo istotnego zmniejszenia liczby asercji pomi˛edzy wersja˛ W a zoptymalizowanymi wersjami programu w wi˛ekszości przypadków nie jest zauważalna proporcjonalna zmiana liczby naruszeń asercji. Dla wersji i omawianej aplikacji nie rejestrowano naruszeń asercji w obszarze zakłóceń rejestrów jednostki zmiennoprzecinkowej ponieważ implementacja ta nie wykorzystywała liczb zmiennoprzecinkowych. Ponadto obserwowana jest mniejsza o około od 5% (obszar rejestrów procesora) do nawet 40% (obszar adresów) liczba rejestrowanych wyjatków ˛ systemowych. Zauważalny jest także (w przypadku zakłóceń rejestrów procesora) do 3% wzrost liczby naruszeń asercji. Asercje wybrane dla wersji i, poza strategia˛ DNX, umożliwiaja˛ efektywna˛ detekcj˛e bł˛edów, które prowadziły do otrzymania nieprawidłowego wyniku działania aplikacji. Zastosowanie strategii DNX prowadziło do selekcji takiego zbioru aktywnych asercji, która wykrywała niewiele niepoprawnych wyników I. Rezultat ten znacznie si˛e poprawił przy zastosowaniu strategii wykorzystujacej ˛ miar˛e skuteczności wzgl˛ednej. Pomimo zastosowania strategii X nie zauważono wzrostu detekcji bł˛edów prowadzacych ˛ do wystapienia ˛ wyjatku ˛ systemowego. W obszarze zakłóceń adresów wybranie podzbioru asercji pozwoliło na ograniczanie fałszywych alarmów, w przypadku gdy test kończył si˛e wynikiem C mimo wprowadzonego zakłócenia. Analogiczne histogramy dla aplikacji g2 i g25 przedstawiono na rysunku 5.2. Pomini˛eto obszar zakłóceń w rejestrach jednostki zmiennoprzecinkowej, w którym stosunek testów o wyniku innym niż C do testów o wyniku C był bliski zera. Wprowadzone asercje maja˛ wpływ głównie na obniżenie liczby niepoprawnych zakończeń programów poprzez wcześniejsze wykrycie bł˛edów. Dla wszystkich obszarów zakłóceń wi˛eksze pokrycie bł˛edów zapewnia selekcja asercji według strategii S w porównaniu do strategii R zapewniajac ˛ poziom maksymalnie do 3% mniejszy dla wyników I niż przy zastosowaniu wszystkich asercji. Nie dotyczy to eksperymentów, w których stosowano dodatkowo strategi˛e X. Wprowadzone asercje nie wykrywały bł˛edów z efektem wyjatku ˛ systemowego. W obszarze rejestrów procesora dla aplikacji g25 zaobserwowano wzrost liczby testów z wynikiem C o około 20% po wprowadzeniu asercji 96 97 Rysunek 5.2. Rozkład wyników testów aplikacji g dla określonych obszarów zakłóceń (b) rejestry procesora (wersja i) (a) rejestry procesora (wersja f) (c) adresy obszaru danych (wersja f) (d) adresy obszaru danych (wersja i) Rysunek 5.2. Rozkład wyników testów aplikacji g dla określonych obszarów zakłóceń (c.d.) 98 99 Rysunek 5.2. Rozkład wyników testów aplikacji g dla określonych obszarów zakłóceń (c.d.) (f) wykonane instrukcje (wersja i) (e) wykonane instrukcje (wersja f) (g) kod statyczny (wersja f) (h) kod statyczny (wersja i) Rysunek 5.2. Rozkład wyników testów aplikacji g dla określonych obszarów zakłóceń (c.d.) 100 do programu. Może to być spowodowane innym zbiorem wygenerowanych zakłóceń przez system FITS dla konkretnej wersji aplikacji, gdyż asercje nie miały wpływu na przywrócenie prawidłowego stanu działania programu (wprowadzone asercje badały jedynie stan zmiennych w programie, bez ich modyfikacji). Podobna sytuacja obserwowana była w przypadku obszaru kodu statycznego dla niektórych wersji aplikacji. W obszarze adresów zauważalny był spadek liczby testów z wynikiem I przy jednoczesnym wzroście naruszeń asercji dla wzrastajacej ˛ liczby równań w rozwiazywanym ˛ układzie. Asercje wykrywały wprowadzone zakłócenia, mimo iż nie miały one wpływu na wynik przeprowadzonych obliczeń. Zauważalne jest to w szczególności dla asercji wybranych według strategii R. Tabele 5.6 i 5.7 przedstawiaja˛ procentowy udział testów (z wykluczeniem testów o wyniku N) przeprowadzonych w systemie FITS zakończonych naruszeniem asercji w ogólnej liczbie wszystkich testów zakończonych innym wynikiem testu niż wynik poprawny (niepoprawny, wyjatek ˛ systemowy, przekroczony czas oczekiwania). W kolejnych kolumnach podano identyfikator eksperymentu, procentowy udział testów dla poszczególnych obszarów zakłóceń oraz ogólny udział testów dla wcześniej wymienionych obszarów. Aplikacja k w wersji f charakteryzuje si˛e najwi˛ekszym pokryciem bł˛edów przez asercje w obszarach jednostki zmiennoprzecinkowej (od 62% do 87%), najmniejszym w obszarze rejestrów (do 3%). Dla pozostałych obszarów pokrycie bł˛edów wynosi około 20%-30%. Różnica pomi˛edzy pokryciem bł˛edów dla wersji W a pozostałymi wersjami o ograniczonej liczbie asercji wynosi średnio 5 punktów procentowych. Dla wersji i aplikacji k pokrycie bł˛edów przez asercje było najwi˛eksze w obszarze adresów i wynosiło do 51%. Ogólne pokrycie wynosiło około 17%, poza wersja˛ X aplikacji, dla której spadło do 3%. Dla aplikacji g wraz ze wzrostem liczby równań w rozwiazywanym ˛ układzie obserwowany jest wzrost pokrycia bł˛edów przez asercje. Stosowanie optymalizacji liczby asercji z atrybutem R powodowało spadek pokrycia do 50%. Dla asercji z obszaru S utrzymywało si˛e ono na stałym poziomie z wykluczeniem wersji aplikacji dla których nie znaleziono rozwiazań ˛ w metodzie selekcji asercji. Aplikacja w wersji i charakteryzowała si˛e mniejszym pokryciem bł˛edów o średnio 8 punktów procentowych. Znaczaco ˛ odbiegajacy ˛ od średniego spadek zaobserwowano dla strategii X. Stosowanie strategii d i t dawało zróżnicowane efekty. Dla aplikacji g2 lepsze wyniki osiagni˛ ˛ eto stosujac ˛ całościowy zbiór zebranych danych z obserwacji przy selekcji asercji. Z kolei dla aplikacji g25 w wi˛ekszości przypadków wyniki te sa˛ gorsze o kilka punktów procentowych. Zbyt mała ilość danych z obserwacji zachowania asercji wpłyn˛eła na wybór gorszego ich podzbioru. Zbyt duża ilość danych może pogorszyć parametry wybranych asercji, jednak różnice te nie sa˛ tak znaczace ˛ jak w poprzednim przypadku. Pojawiajace ˛ si˛e niekiedy wzrosty pokrycia bł˛edów dla aplikacji o pomniejszonej liczbie asercji należy uznać za przypadkowe wahania wynikajace ˛ z charakteru przeprowadzanych testów. Wprowadzane do programów zakłócenia były generowane w sposób losowy. 101 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda fW fN fZ fDN fDZ fDNI fDZI fDNX fDZX 1,54 0,96 0,68 0,32 1,44 1,19 0,68 2,93 1,57 34,95 28,33 34,76 22,66 23,03 23,66 17,65 18,40 19,21 87,76 84,31 73,17 77,78 84,85 64,71 86,96 63,64 61,90 30,40 28,50 30,26 21,47 22,47 26,20 24,95 18,35 22,67 26,05 25,19 28,18 24,34 23,14 25,50 22,22 21,11 22,93 26,26 24,63 26,66 20,65 20,60 22,70 21,22 17,91 20,22 iW iN iZ iDN iDZ iDNI iDZI iDNX iDZX 22,13 2,68 8,28 2,65 8,28 6,58 3,57 1,62 4,25 96,15 47,62 46,88 50,00 46,88 16,67 25,00 21,74 51,61 – – – – – – – – – 22,53 20,03 20,61 19,89 20,95 15,76 16,51 1,71 20,89 19,17 18,63 22,21 18,54 21,78 17,72 17,55 4,32 19,37 22,80 16,88 19,66 16,80 19,63 15,00 14,64 3,03 17,98 wszystkie wielkości podano w procentach Tabela 5.6. Udział testów aplikacji k, w których doszło do naruszeń asercji, w liczbie testów o innym kodzie zakończenia niż poprawny 102 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2fW 2fRW 2fSW 2fdRN 2fdRNI 2fdRNX 2fdRZ 2fdRZI 2fdRZX 2ftRN 2ftRNI 2ftRNX 2ftRZ 2ftRZI 2ftRZX 2fdSN 2fdSNI 2fdSNX 2fdSZ 2fdSZI 2fdSZX 2ftSN 2ftSNI 2ftSNX 2ftSZ 2ftSZI 2ftSZX 25,00 20,75 11,60 7,21 4,91 7,88 7,21 8,27 5,74 11,36 17,22 8,67 18,42 15,79 4,90 17,26 17,26 0,00 17,26 17,26 0,00 17,26 17,26 0,00 17,26 17,26 0,00 67,96 53,41 56,90 30,91 33,93 30,30 26,79 32,31 26,98 34,72 30,26 39,06 27,69 30,14 33,33 29,63 29,63 0,00 29,63 29,63 0,00 29,63 29,63 0,00 29,63 29,63 0,00 33,33 33,33 40,00 26,67 9,09 20,00 33,33 16,67 14,29 12,50 20,00 16,67 12,50 33,33 16,67 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 26,21 19,61 19,75 15,05 13,91 12,31 14,24 13,64 12,64 15,52 20,84 14,46 18,58 18,54 11,66 18,36 18,36 0,00 18,36 18,36 0,00 18,36 18,36 0,00 18,36 18,36 0,00 32,68 28,60 24,10 8,83 9,02 9,07 12,11 13,85 7,71 7,66 17,66 8,75 12,72 13,23 9,47 15,57 15,57 0,00 15,57 15,57 0,00 15,57 15,57 0,00 15,57 15,57 0,00 30,28 24,30 20,74 12,30 11,33 11,42 12,82 13,57 10,43 13,24 19,66 12,68 17,35 17,23 10,70 18,22 18,22 0,00 18,22 18,22 0,00 18,22 18,22 0,00 18,22 18,22 0,00 25fW 25fRW 25fSW 25fdRN 25fdRNI 25fdRNX 25fdRZ 25fdRZI 25fdRZX 25ftRN 25ftRNI 25ftRNX 25ftRZ 25ftRZI 25ftRZX 25fdSN 25fdSNI 25fdSNX 25fdSZ 25fdSZI 25fdSZX 25ftSN 25ftSNI 25ftSNX 25ftSZ 25ftSZI 25ftSZX 35,85 24,86 28,04 18,03 20,84 12,38 17,99 21,26 25,97 18,29 25,48 10,30 21,14 25,18 7,66 32,66 32,66 0,00 32,66 32,66 0,00 32,66 32,66 0,00 32,66 32,66 0,00 76,52 50,00 73,33 37,25 18,05 27,47 32,50 18,05 28,57 36,19 24,63 30,65 31,61 26,98 34,87 66,67 66,67 0,00 66,67 66,67 0,00 66,67 66,67 0,00 66,67 66,67 0,00 80,00 50,00 44,44 50,00 21,05 14,29 33,33 21,05 25,00 46,15 12,50 15,79 14,29 42,86 9,09 46,67 46,67 0,00 46,67 46,67 0,00 46,67 46,67 0,00 46,67 46,67 0,00 31,14 30,68 28,02 22,00 29,13 21,14 23,07 29,13 22,65 20,54 25,55 15,99 26,87 28,68 17,79 37,38 37,38 0,00 37,38 37,38 0,00 37,38 37,38 0,00 37,38 37,38 0,00 34,08 29,84 26,35 13,10 16,42 13,31 13,78 16,42 13,21 12,23 20,87 11,86 17,31 19,81 11,97 23,28 23,28 0,00 23,28 23,28 0,00 23,28 23,28 0,00 23,28 23,28 0,00 36,74 30,87 28,93 19,01 22,29 17,37 19,40 22,38 20,38 18,31 23,86 14,37 23,08 25,04 14,87 32,03 32,03 0,00 32,03 32,03 0,00 32,03 32,03 0,00 32,03 32,03 0,00 wszystkie wielkości podano w procentach Tabela 5.7. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów o innym kodzie zakończenia niż poprawny 103 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2iW 2iRW 2iSW 2idRN 2idRNI 2idRNX 2idRZ 2idRZI 2idRZX 2itRN 2itRNI 2itRNX 2itRZ 2itRZI 2itRZX 2idSN 2idSNI 2idSNX 2idSZ 2idSZI 2idSZX 2itSN 2itSNI 2itSNX 2itSZ 2itSZI 2itSZX 18,90 13,11 15,90 8,50 10,67 0,98 9,94 9,94 0,98 13,58 12,61 0,65 8,96 7,08 0,65 15,92 15,92 0,00 15,92 15,92 0,00 15,92 15,92 0,00 15,92 15,92 0,00 64,10 68,57 67,92 41,67 43,75 2,00 43,24 43,24 2,00 58,82 42,42 5,26 39,02 51,28 5,26 59,57 59,57 0,00 59,57 59,57 0,00 59,57 59,57 0,00 59,57 59,57 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 25,52 13,99 22,94 11,35 9,95 2,80 10,57 10,57 2,80 12,78 13,25 3,41 8,55 10,28 3,41 22,48 22,48 0,00 22,48 22,48 0,00 22,48 22,33 0,00 22,33 22,33 0,00 21,84 17,08 18,03 8,22 8,67 1,45 5,83 5,83 1,45 11,45 13,57 3,43 11,49 10,64 3,43 18,85 18,85 0,00 18,85 18,85 0,00 18,85 18,85 0,00 18,85 18,85 0,00 23,95 16,00 21,28 10,32 10,25 1,99 9,48 9,48 1,99 13,43 13,82 2,96 10,33 10,70 2,96 21,09 21,09 0,00 21,09 21,09 0,00 21,09 21,02 0,00 21,02 21,02 0,00 25iW 25iRW 25iSW 25idRN 25idRNI 25idRNX 25idRZ 25idRZI 25idRZX 25itRN 25itRNI 25itRNX 25itRZ 25itRZI 25itRZX 25idSN 25idSNI 25idSNX 25idSZ 25idSZI 25idSZX 25itSN 25itSNI 25itSNX 25itSZ 25itSZI 25itSZX 21,70 24,55 28,27 17,95 20,91 2,51 1,81 6,77 2,59 23,25 22,35 1,25 6,73 6,81 1,20 27,12 27,18 0,00 27,54 27,54 0,00 27,39 26,67 0,00 27,52 27,05 0,00 78,67 76,47 78,38 64,10 58,54 7,55 16,13 14,89 8,16 74,07 83,33 7,14 11,11 16,33 6,25 60,00 60,00 0,00 60,00 60,00 0,00 60,00 58,97 0,00 60,00 60,53 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 31,39 20,77 26,47 20,19 19,50 9,48 13,47 9,28 11,42 19,69 21,85 11,95 11,16 11,33 9,48 29,47 26,66 0,00 28,68 28,68 0,00 27,83 26,56 0,00 29,27 29,39 0,00 26,11 17,98 20,92 13,38 15,99 9,73 10,79 12,94 8,43 15,96 14,15 5,89 11,58 11,39 6,06 23,85 23,01 0,00 22,28 22,28 0,00 23,51 21,31 0,00 21,76 23,26 0,00 28,90 21,99 25,88 18,40 19,39 8,32 10,25 10,27 8,66 19,90 20,37 7,57 10,51 10,56 6,59 27,74 26,26 0,00 26,91 26,91 0,00 26,97 25,43 0,00 27,00 27,54 0,00 wszystkie wielkości podano w procentach Tabela 5.7. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów o innym kodzie zakończenia niż poprawny (c.d.) 104 W tabelach 5.8 i 5.9 przedstawiono analogiczne do poprzednich wyliczenia obejmujace ˛ procentowy udział testów (z wykluczeniem testów o wyniku N) przeprowadzonych w systemie FITS zakończonych naruszeniem asercji w ogólnej liczbie wszystkich testów zakończonych nieprawidłowym wynikiem obliczeń. Pokrycie bł˛edów dla wszystkich wersji badanych aplikacji jest nawet kilkukrotnie wyższe od przedstawionego wcześniej pokrycia bł˛edów obejmujacych ˛ różne skutki w działaniu programu. Dla niektórych wersji aplikacji zaobserwowano pełne pokrycie bł˛edów, najcz˛eściej dla zakłóceń w obszarze jednostki zmiennoprzecinkowej, rzadziej w obszarze adresów i rejestrów. Oznacza to, że wykryte asercje w wysokim stopniu pokrywały bł˛edy, które prowadziły do nieprawidłowego wyniku obliczeń. Zastosowanie optymalizacji liczby asercji zmniejszało dla wi˛ekszości wersji poziom pokrycia, ale spadek ten jest niewspółmierny do spadku kosztów stosowania asercji omówionych wcześniej. Dla aplikacji k ogólne pokrycie wynosiło od około 72% do 89% (poza wersja˛ iDNX dla której było istotnie niższe). Dla aplikacji g przy stosowaniu strategii S ogólne pokrycie było wi˛eksze niż 90% (z wykluczeniem wersji, dla których nie znaleziono rozwiazań). ˛ Mniejsze pokrycie bł˛edów obserwowane jest dla wersji aplikacji, dla których stosowano strategi˛e X. Strategia ta promowała asercje wykrywajace ˛ wyjatki ˛ systemowe. Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda fW fN fZ fDN fDZ fDNI fDZI fDNX fDZX 10,00 5,08 4,55 2,00 9,09 8,33 5,00 16,22 8,82 90,28 100,00 97,01 90,91 95,35 89,80 88,24 82,98 86,67 100,00 100,00 100,00 100,00 100,00 100,00 100,00 100,00 100,00 92,93 92,31 96,60 89,47 95,69 93,02 94,26 84,03 94,37 85,45 84,03 89,68 79,40 84,72 77,86 72,87 72,15 73,05 84,51 82,49 87,99 79,11 83,84 81,10 80,00 72,80 77,56 iW iN iZ iDN iDZ iDNI iDZI iDNX iDZX 70,67 16,67 44,83 16,33 44,83 35,09 22,64 9,43 23,64 100,00 100,00 100,00 100,00 100,00 100,00 100,00 71,43 100,00 – – – – – – – – – 93,53 97,96 95,68 97,95 95,78 83,09 88,89 12,00 94,38 93,44 95,92 97,19 95,89 96,07 82,17 76,88 24,03 89,09 88,46 86,08 89,35 85,80 88,97 75,14 73,70 18,34 82,58 wszystkie wielkości podano w procentach Tabela 5.8. Udział testów aplikacji k, w których doszło do naruszeń asercji, w liczbie testów zakończonych niepoprawnym wynikiem obliczeń 105 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2fW 2fRW 2fSW 2fdRN 2fdRNI 2fdRNX 2fdRZ 2fdRZI 2fdRZX 2ftRN 2ftRNI 2ftRNX 2ftRZ 2ftRZI 2ftRZX 2fdSN 2fdSNI 2fdSNX 2fdSZ 2fdSZI 2fdSZX 2ftSN 2ftSNI 2ftSNX 2ftSZ 2ftSZI 2ftSZX 98,86 77,78 91,89 33,85 29,79 38,33 34,38 44,90 29,31 52,17 70,27 34,21 66,22 68,00 20,00 94,44 94,44 0,00 94,44 94,44 0,00 94,44 94,44 0,00 94,44 94,44 0,00 98,59 73,44 84,62 48,57 48,72 52,63 41,67 53,85 44,74 55,56 48,94 56,82 51,43 51,16 54,29 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 100,00 72,73 100,00 80,00 100,00 60,00 100,00 100,00 66,67 50,00 75,00 66,67 100,00 85,71 100,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 92,23 72,68 88,00 59,60 54,11 50,34 59,06 54,17 52,32 60,51 64,18 62,96 61,39 64,77 46,15 78,31 78,31 0,00 78,31 78,31 0,00 78,31 78,31 0,00 78,31 78,31 0,00 95,08 77,44 84,81 34,34 31,19 37,78 43,43 50,00 28,70 36,36 55,47 36,08 42,57 56,52 34,18 76,47 76,47 0,00 76,47 76,47 0,00 76,47 76,47 0,00 76,47 76,47 0,00 95,14 75,19 87,32 47,04 42,98 45,29 49,01 51,74 40,78 52,34 61,23 48,73 56,37 62,34 38,70 80,12 80,12 0,00 80,12 80,12 0,00 80,12 80,12 0,00 80,12 80,12 0,00 25fW 25fRW 25fSW 25fdRN 25fdRNI 25fdRNX 25fdRZ 25fdRZI 25fdRZX 25ftRN 25ftRNI 25ftRNX 25ftRZ 25ftRZI 25ftRZX 25fdSN 25fdSNI 25fdSNX 25fdSZ 25fdSZI 25fdSZX 25ftSN 25ftSNI 25ftSNX 25ftSZ 25ftSZI 25ftSZX 96,97 67,69 95,00 54,35 62,24 33,99 49,34 63,19 63,29 58,96 67,95 30,83 53,76 64,38 18,97 95,59 95,59 0,00 95,59 95,59 0,00 95,59 95,59 0,00 95,59 95,59 0,00 100,00 69,39 100,00 60,32 34,78 58,14 66,10 34,78 61,54 70,37 40,74 50,00 62,89 49,28 64,63 87,50 87,50 0,00 87,50 87,50 0,00 87,50 87,50 0,00 87,50 87,50 0,00 100,00 100,00 100,00 100,00 66,67 100,00 100,00 66,67 100,00 100,00 50,00 60,00 28,57 85,71 33,33 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 95,95 81,27 95,77 69,07 77,08 49,07 70,46 77,35 67,76 69,09 79,44 43,38 55,17 80,73 45,40 95,97 95,97 0,00 95,97 95,97 0,00 95,97 95,97 0,00 95,97 95,97 0,00 88,34 73,99 89,31 43,78 43,92 38,53 42,27 43,92 40,74 41,27 57,20 40,00 48,87 55,65 43,93 91,22 91,22 0,00 91,22 91,22 0,00 91,84 91,84 0,00 91,22 91,22 0,00 94,31 75,00 94,31 57,39 59,26 44,25 56,25 59,53 57,65 58,54 65,21 40,83 53,94 66,53 40,36 94,60 94,60 0,00 94,60 94,60 0,00 94,74 94,74 0,00 94,60 94,60 0,00 wszystkie wielkości podano w procentach Tabela 5.9. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów zakończonych niepoprawnym wynikiem obliczeń 106 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2iW 2iRW 2iSW 2idRN 2idRNI 2idRNX 2idRZ 2idRZI 2idRZX 2itRN 2itRNI 2itRNX 2itRZ 2itRZI 2itRZX 2idSN 2idSNI 2idSNX 2idSZ 2idSZI 2idSZX 2itSN 2itSNI 2itSNX 2itSZ 2itSZI 2itSZX 98,41 76,79 96,72 67,44 72,92 5,77 77,27 77,27 5,66 77,36 84,00 4,17 58,49 68,57 4,17 98,04 98,04 0,00 98,04 98,04 0,00 98,04 98,04 0,00 98,04 98,04 0,00 100,00 85,71 97,30 71,43 73,68 3,45 59,26 59,26 3,45 86,96 70,00 8,82 57,14 74,07 8,82 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 98,92 60,71 96,59 48,55 48,05 15,44 48,24 48,24 15,44 58,18 55,03 17,14 40,96 49,04 17,14 96,34 96,34 0,00 96,34 96,34 0,00 96,34 96,32 0,00 96,91 96,32 0,00 98,17 74,38 97,94 37,31 40,91 7,55 30,51 30,51 7,55 57,66 62,81 19,79 52,24 49,28 19,79 87,50 87,50 0,00 87,50 87,50 0,00 87,50 87,50 0,00 87,50 87,50 0,00 98,69 69,44 97,04 47,98 50,14 10,22 46,80 46,80 10,19 62,78 62,50 15,09 48,56 52,94 15,09 94,08 94,08 0,00 94,08 94,08 0,00 94,08 94,07 0,00 94,33 94,07 0,00 25iW 25iRW 25iSW 25idRN 25idRNI 25idRNX 25idRZ 25idRZI 25idRZX 25itRN 25itRNI 25itRNX 25itRZ 25itRZI 25itRZX 25idSN 25idSNI 25idSNX 25idSZ 25idSZI 25idSZX 25itSN 25itSNI 25itSNX 25itSZ 25itSZI 25itSZX 100,00 81,00 100,00 80,33 75,34 9,76 7,37 25,88 9,76 88,73 77,63 4,76 22,11 25,49 4,65 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 92,86 100,00 86,21 85,71 9,76 22,22 21,88 10,53 95,24 92,59 9,09 13,89 23,53 8,11 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 100,00 100,00 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 100,00 64,61 100,00 58,60 55,00 32,46 40,15 34,15 34,84 59,28 69,52 35,74 40,30 40,76 31,28 100,00 100,00 0,00 100,00 100,00 0,00 100,00 99,43 0,00 100,00 100,00 0,00 98,48 65,76 95,65 54,41 60,87 41,32 39,15 52,94 35,58 59,87 59,52 24,03 43,27 45,83 23,98 93,96 97,84 0,00 98,50 98,50 0,00 93,24 97,64 0,00 98,37 92,54 0,00 99,50 69,95 98,65 62,13 61,55 29,92 33,22 37,89 29,41 65,98 69,47 25,30 35,98 38,25 22,84 98,03 99,31 0,00 99,54 99,54 0,00 97,74 99,00 0,00 99,52 97,60 0,00 wszystkie wielkości podano w procentach Tabela 5.9. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów zakończonych niepoprawnym wynikiem obliczeń (c.d.) 107 Tabele 5.10 i 5.11 przedstawiaja˛ procentowy udział testów (z wykluczeniem testów o wyniku N) przeprowadzonych w systemie FITS zakończonych naruszeniem asercji w ogólnej liczbie wszystkich testów zakończonych wyjatkiem ˛ systemowym. Pokrycie bł˛edów dla wszystkich wersji badanych aplikacji jest zbliżone (z dokładnościa˛ do kilku punktów procentowych) od przedstawionego w tabelach 5.6 i 5.7. Oznacza to, że wykryte asercje w podobnym stopniu pokrywały bł˛edy, które prowadziły do powstania wyjatku ˛ systemowego jak i skutkujace ˛ wszystkimi możliwymi bł˛ednymi efektami działania aplikacji. Mniejsze pokrycie bł˛edów obserwowane jest dla wersji aplikacji, dla których stosowano strategi˛e X, ale spadek ten jest niższy niż dla wyliczeń przedstawionych w tabelach 5.8 i 5.9. Oznacza to, że asercje wprowadzone do programów, które lepiej pokrywały wyjatki ˛ systemowe, gorzej reagowały na bł˛edy prowadzace ˛ do innych wyników testu aplikacji. Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda fW fN fZ fDN fDZ fDNI fDZI fDNX fDZX 1,79 1,17 0,79 0,38 1,68 1,41 0,79 3,51 1,89 36,31 28,33 35,14 23,19 23,30 24,72 18,40 19,50 19,80 87,76 84,31 73,17 77,78 84,85 68,75 90,91 66,67 65,00 31,72 29,78 31,11 23,00 23,84 28,10 26,62 19,92 24,06 28,08 27,82 30,09 27,21 25,24 28,90 25,47 23,65 26,35 28,10 26,68 28,19 22,54 22,16 25,00 23,36 19,84 22,28 iW iN iZ iDN iDZ iDNI iDZI iDNX iDZX 24,37 3,10 9,22 3,08 9,22 7,52 4,07 1,92 4,92 98,04 47,62 46,88 50,00 46,88 16,67 25,00 23,81 51,61 – – – – – – – – – 22,96 20,78 21,26 20,63 21,60 16,79 17,54 2,11 21,85 19,43 19,08 22,58 19,00 22,29 18,48 18,89 5,07 20,08 23,54 17,71 20,40 17,64 20,42 16,01 15,83 3,63 19,03 wszystkie wielkości podano w procentach Tabela 5.10. Udział testów aplikacji k, w których doszło do naruszeń asercji, w liczbie testów zakończonych wyjatkiem ˛ systemowym Podsumowujac ˛ omówione wyniki dla aplikacji k, mimo wprowadzenia silnego ograniczenia przy optymalizacji liczby wszystkich aktywnych asercji lub całkowity koszt dynamiczny asercji, spadek wykryć bł˛edów przez asercje jest niewielki dla wi˛ekszości wersji f we wszystkich obszarach, natomiast dla wersji i w obszarach instrukcji i kodu statycznego. Asercje najskuteczniej wykrywały zakłócenia w jednostce zmiennoprzecinkowej (wersja f 108 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2fW 2fRW 2fSW 2fdRN 2fdRNI 2fdRNX 2fdRZ 2fdRZI 2fdRZX 2ftRN 2ftRNI 2ftRNX 2ftRZ 2ftRZI 2ftRZX 2fdSN 2fdSNI 2fdSNX 2fdSZ 2fdSZI 2fdSZX 2ftSN 2ftSNI 2ftSNX 2ftSZ 2ftSZI 2ftSZX 25,07 22,06 11,72 8,43 5,56 9,02 8,37 9,21 6,67 12,68 18,57 10,40 20,33 17,06 6,09 17,44 17,44 0,00 17,44 17,44 0,00 17,44 17,44 0,00 17,44 17,44 0,00 68,63 66,20 63,46 45,95 52,78 41,67 42,86 44,68 40,48 48,08 44,23 55,56 37,50 42,31 46,34 38,10 38,10 0,00 38,10 38,10 0,00 38,10 38,10 0,00 38,10 38,10 0,00 33,33 38,10 40,00 28,57 9,09 23,08 33,33 16,67 15,38 14,29 21,43 18,18 12,50 35,29 16,67 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 57,14 57,14 0,00 26,99 21,46 20,72 17,01 16,09 14,23 16,03 15,66 14,47 17,37 24,16 15,95 21,46 21,19 13,95 19,58 19,58 0,00 19,58 19,58 0,00 19,58 19,58 0,00 19,58 19,58 0,00 33,62 31,67 25,28 10,76 11,41 10,76 14,48 16,32 9,60 8,89 20,76 10,42 15,52 14,86 11,74 16,67 16,67 0,00 16,67 16,67 0,00 16,67 16,67 0,00 16,67 16,67 0,00 30,94 26,68 21,60 14,43 13,51 13,37 14,93 15,71 12,38 15,12 22,75 14,72 20,27 19,51 13,12 19,27 19,27 0,00 19,27 19,27 0,00 19,27 19,27 0,00 19,27 19,27 0,00 25fW 25fRW 25fSW 25fdRN 25fdRNI 25fdRNX 25fdRZ 25fdRZI 25fdRZX 25ftRN 25ftRNI 25ftRNX 25ftRZ 25ftRZI 25ftRZX 25fdSN 25fdSNI 25fdSNX 25fdSZ 25fdSZI 25fdSZX 25ftSN 25ftSNI 25ftSNX 25ftSZ 25ftSZI 25ftSZX 36,26 28,21 28,46 21,25 23,86 16,30 22,06 24,27 30,58 20,95 28,96 13,40 25,83 29,26 11,38 33,16 33,16 0,00 33,16 33,16 0,00 33,16 33,16 0,00 33,16 33,16 0,00 76,52 64,15 73,33 49,35 27,27 34,25 39,00 27,27 34,78 42,70 38,37 44,19 38,85 37,36 43,09 73,68 73,68 0,00 73,68 73,68 0,00 73,68 73,68 0,00 73,68 73,68 0,00 80,00 50,00 44,44 50,00 23,53 14,29 33,33 23,53 25,00 46,15 14,29 17,65 22,22 46,15 11,11 46,67 46,67 0,00 46,67 46,67 0,00 46,67 46,67 0,00 46,67 46,67 0,00 31,98 33,72 28,49 24,51 32,27 27,46 25,89 32,22 25,58 22,89 27,67 20,42 34,61 30,96 22,95 38,14 38,14 0,00 38,14 38,14 0,00 38,14 38,14 0,00 38,14 38,14 0,00 36,01 33,81 27,34 15,91 20,93 17,00 17,06 20,93 16,45 14,86 25,23 14,53 21,26 23,79 14,23 23,98 23,98 0,00 23,98 23,98 0,00 23,94 23,94 0,00 23,98 23,98 0,00 37,88 34,87 29,52 22,26 26,51 22,39 23,02 26,58 24,08 21,16 27,64 18,28 28,87 28,81 19,21 32,75 32,75 0,00 32,75 32,75 0,00 32,73 32,73 0,00 32,75 32,75 0,00 wszystkie wielkości podano w procentach Tabela 5.11. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów zakończonych wyjatkiem ˛ systemowym 109 Eksperyment a Lokalizacja zakłóceń Ogółem rejestry adresy FPU instrukcje koda 2iW 2iRW 2iSW 2idRN 2idRNI 2idRNX 2idRZ 2idRZI 2idRZX 2itRN 2itRNI 2itRNX 2itRZ 2itRZI 2itRZX 2idSN 2idSNI 2idSNX 2idSZ 2idSZI 2idSZX 2itSN 2itSNI 2itSNX 2itSZ 2itSZI 2itSZX 19,02 13,69 16,12 8,90 11,18 1,17 10,27 10,27 1,17 14,29 12,92 0,77 9,57 7,36 0,77 16,08 16,08 0,00 16,08 16,08 0,00 16,08 16,08 0,00 16,08 16,08 0,00 67,57 77,42 69,23 50,00 51,85 4,55 61,54 61,54 4,55 64,52 53,85 12,00 55,17 62,50 12,00 60,87 60,87 0,00 60,87 60,87 0,00 60,87 60,87 0,00 60,87 60,87 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 26,67 16,16 24,18 13,55 11,82 3,52 12,54 12,54 3,52 14,86 15,63 4,42 10,45 12,07 4,42 23,58 23,58 0,00 23,58 23,58 0,00 23,58 23,47 0,00 23,47 23,47 0,00 22,25 18,33 18,30 9,80 10,11 1,79 6,81 6,81 1,79 12,75 15,20 4,09 13,16 12,16 4,09 19,68 19,68 0,00 19,68 19,68 0,00 19,68 19,68 0,00 19,68 19,68 0,00 24,64 17,66 21,95 11,98 11,80 2,50 10,91 10,91 2,50 15,08 15,56 3,72 12,04 12,15 3,72 21,90 21,90 0,00 21,90 21,90 0,00 21,90 21,85 0,00 21,85 21,85 0,00 25iW 25iRW 25iSW 25idRN 25idRNI 25idRNX 25idRZ 25idRZI 25idRZX 25itRN 25itRNI 25itRNX 25itRZ 25itRZI 25itRZX 25idSN 25idSNI 25idSNX 25idSZ 25idSZI 25idSZX 25itSN 25itSNI 25itSNX 25itSZ 25itSZI 25itSZX 21,70 26,05 28,27 18,77 22,45 3,27 2,34 8,40 3,40 24,05 23,98 1,67 8,82 8,50 1,60 27,12 27,18 0,00 27,54 27,54 0,00 27,39 26,67 0,00 27,52 27,05 0,00 78,67 81,25 78,38 71,43 64,86 25,00 37,04 33,33 26,67 76,92 89,29 25,00 35,71 34,78 21,43 60,00 60,00 0,00 60,00 60,00 0,00 60,00 58,97 0,00 60,00 60,53 0,00 – – – – – – – – – – – – – – – – – – – – – – – – – – – 31,86 23,75 27,13 23,73 23,61 12,50 17,41 11,82 15,40 23,09 24,39 15,61 14,09 13,92 12,50 31,02 28,21 0,00 30,09 30,09 0,00 28,99 27,44 0,00 30,33 30,41 0,00 26,54 20,17 21,46 15,26 18,11 11,71 13,33 15,08 10,19 18,38 15,89 7,44 13,94 13,60 7,66 24,91 23,73 0,00 22,90 22,90 0,00 24,56 21,79 0,00 22,28 24,41 0,00 29,25 24,57 26,40 20,88 22,36 10,75 13,22 12,75 11,31 22,56 22,60 9,95 13,33 13,02 8,71 28,79 27,20 0,00 27,73 27,73 0,00 27,87 26,00 0,00 27,63 28,42 0,00 wszystkie wielkości podano w procentach Tabela 5.11. Udział testów aplikacji g, w których doszło do naruszeń asercji, w liczbie testów zakończonych wyjatkiem ˛ systemowym (c.d.) 110 programu), najgorzej w rejestrach (dla obu wersji). Dla wersji f programu spowodowane jest to zastosowaniem w badanym programie w przeważajacej ˛ liczbie zmiennych zmiennoprzecinkowych, co wpłyn˛eło na charakter wykrytych asercji, a w efekcie na pokrywane przez nie bł˛edy. Biorac ˛ pod uwag˛e metod˛e wykrycia asercji (automatyczna) oraz przyrost wielkości programu po selekcji asercji pokrycie bł˛edów dla wi˛ekszości zbiorów wybranych asercji można uznać za zadowalajace ˛ w odniesieniu do wzrostu rozmiarów aplikacji oraz stopy wykrywania bł˛edów przez asercje w programie zawierajacym ˛ wszystkie asercje (wersja W). W przypadku aplikacji g asercje lepiej wykrywały wprowadzone bł˛edy wraz ze wzrostem liczby rozwiazywanych ˛ równań we wszystkich badanych obszarach poza obszarem adresów w wersji f, dla którego w wi˛ekszości wersji zanotowano spadek o kilka punktów procentowych. Najwyższy poziom detekcji bł˛edów otrzymywano przy stosowaniu strategii S selekcji asercji (poza eksperymentami dodatkowo stosujacymi ˛ strategi˛e X). Był on zbliżony do poziomu dla wersji ze wszystkimi asercjami. Oznacza to, że przy założeniu możliwości detekcji na etapie sprawdzania wyznaczonego rozwiazania ˛ układu równań jedna z asercji umożliwiała wykrycie przeważajacej ˛ liczby wprowadzonych zakłóceń. Utrzymanie pokrycia bł˛edów na poziomie powyżej 15% w odniesieniu do pokrycia w zakresie 22%-36% otrzymanego w aplikacji ze wszystkimi asercjami (wersja W) dla wi˛ekszości zbiorów wybranych asercji można uznać za zadowalajace ˛ w odniesieniu do pi˛eciokrotnego zredukowania ich liczby w badanych wersjach programu. Rysunek 5.3. Rozkład rezultatów testów aplikacji k w eksperymentach z losowa˛ zamiana˛ zmiennych programu Na rysunku 5.3 przedstawiono procentowy rozkład wyników testów aplikacji k dla wszystkich przeprowadzonych eksperymentów polegajacych ˛ na wprowadzeniu prostej losowej mutacji do programu zamieniajacej ˛ miejscami dwie zmiennie w jego kodzie źródłowym. Wersje programu z mutacja˛ wygenerowano za pomoca˛ dedykowanego skryptu w j˛ezyku Perl. Dla wersji f programu k bez asercji około 4% testów zakończyło si˛e wynikiem poprawnym a 96% 111 wynikiem niepoprawnym. Nie zaobserwowano testów, w których zakłócenie powodowałoby przekroczenie czasu oczekiwania na zakończenie programu (nieskończona p˛etla) lub wyjatkiem ˛ systemowym (dzielenie przez zero). Po wprowadzeniu asercji do badanego programu liczba testów z poprawnym wynikiem zakończenia w kolejnych eksperymentach utrzymywała si˛e na poziomie od około 0,1%. Wynik ten wskazuje, że testy, które powinny zakończyć si˛e wynikiem poprawnym zostały zakończone naruszeniem asercji. Sa˛ to fałszywe alarmy generowane przez asercje. Wynikaja˛ one z niedoskonałości asercji wykrytych w sposób automatyczny. Naruszenia asercji zaobserwowano w od około 90% testów (eksperymenty fDNX, fDZX, fDNI, fDZI) do prawie 100% testów (eksperymenty fW, fN, fZ). W eksperymentach o najmniejszej liczbie obserwacji naruszeń asercji obserwowano w przeważajacej ˛ wi˛ekszości testy zakończone wynikiem nieprawidłowym. Podane rezultaty wskazuja,˛ że przy innym zestawie testów i generowanych w nich bł˛edów wybrane asercje dobrze radziły sobie z wykrywaniem zakłóceń, które mogły doprowadzić do wygenerowania nieprawidłowego wyniku testu. Uruchomienia, które mimo wprowadzonego bł˛edu były prawidłowa˛ symulacja˛ nie były przerywane przez naruszenie asercji. Dla wersji i programu k bez asercji około 3% testów zakończyło si˛e wynikiem poprawnym a 97% wynikiem niepoprawnym. Nie zaobserwowano testów o innych wynikach. W eksperymentach iW, iN, iZ zaobserwowano około 99% liczby testów, w których zaobserwowano naruszenie asercji. Obserwowanemu wzrostowi towarzyszył odpowiedni spadek liczby testów z wynikiem poprawnym. Nie zaobserwowano żadnego testu zakończonego wynikiem niepoprawnym. Rezultaty tej serii eksperymentów wskazuja˛ na fałszywe alarmy generowane przez asercje na poziomie około 2%. Testy, które powinny zakończyć si˛e wynikiem poprawnym zostały zakończone naruszeniem asercji. Pozytywnym aspektem jest całkowity brak testów zakończonych wynikiem niepoprawnym. Dla pozostałych wersji aplikacji i obserwowano do 5% testów zakończonych wynikiem niepoprawnym. Rysunek 5.4. Rozkład rezultatów testów aplikacji g w eksperymentach z losowa˛ zamiana˛ zmiennych programu 112 Na rysunku 5.4 przedstawiono procentowy rozkład wyników testów aplikacji g dla wybranych strategii selekcji asercji. Stosowano analogiczne mutacje programów jak we wcześniej opisanej serii eksperymentów. Zarówno dla wersji f jak i wersji i programu g bez asercji około 1% testów zakończyło si˛e wynikiem poprawnym, a pozostałe 99% wynikiem niepoprawnym. Nie zaobserwowano testów zakończonych wyjatkiem ˛ systemowym oraz przekroczonym czasem oczekiwania na zakończenie programu. Wprowadzone zakłócenia były w całości wykrywane przez asercje z grupy S (sprawdzajacej ˛ znalezione rozwiazanie ˛ układu równań). Dla asercji wybranych z użyciem strategii R obserwowano 1% testów z niepoprawnym wynikiem obliczeń. Pozytywnym aspektem jest utrzymanie si˛e około 1% liczby testów z wynikiem poprawnym dla wszystkich eksperymentów. Oznacza to, że asercje nie generowały fałszywych alarmów. 5.1.6. Wnioski Zastosowanie zaproponowanej metody selekcji asercji pozwoliło na redukcj˛e ich liczby oraz kosztu stosowania wyrażonego poprzez liczb˛e instrukcji w kodzie programu i wykonanych podczas jego działania. Jednocześnie, dla niektórych przeprowadzonych procedur selekcji asercji, utrzymany został poziom detekcji bł˛edów z ich użyciem, zbliżony do bazowej wersji aplikacji z wszystkimi asercjami. W przypadkach, w których nie udało si˛e utrzymać odpowiedniego poziomu wykrywalności wprowadzanych bł˛edów, możliwa była obserwacja takiej sytuacji na etapie eksperymentów weryfikujacych ˛ b˛edacych ˛ cz˛eścia˛ zaproponowanej metody. Umożliwia to odrzucenie proponowanego zbioru wybranych asercji i selekcj˛e innego poprzez zastosowanie odmiennej strategii. Zaobserwowano również przypadki (wersje iSX aplikacji g), dla których zastosowanie algorytmu selekcji asercji nie zwracało rozwiazania. ˛ Oznaczało to, iż w zbiorze testów, na podstawie którego dokonywano optymalizacji liczby asercji nie wyst˛epowały testy o wynikach uwzgl˛ednionych w kryteriach selekcji. Analiza wyników otrzymanych dla aplikacji g pokazała, że istotny jest dobór zbioru danych obserwacyjnych używanych do wyznaczenia podzbioru asercji. Zastosowanie zbyt małej ilości danych obserwacyjnych, nawet dedykowanych określonej wersji aplikacji, może skutkować wyborem gorzej sprawdzajacym ˛ si˛e podczas eksperymentów weryfikujacych. ˛ Zastosowanie zbyt dużego zbioru danych obserwacyjnych może mieć podobne skutki, choć obserwowane różnice nie były tak duże jak w poprzednim przypadku. Etap eksperymentów weryfikujacych ˛ umożliwia wykrycie tych sytuacji i selekcj˛e lepszego zbioru asercji. Zastosowanie metody selekcji asercji z pewnymi danymi obserwacyjnymi nie wyklucza użycia wybranych asercji do detekcji bł˛edów innych klas niż te, dla których przeprowadzano obserwacj˛e. Dla obu badanych aplikacji pokrycie bł˛edów mutacyjnych było bardzo wysokie, mimo iż stosowane asercje wybrano na podstawie innych zakłóceń. Na podstawie przeprowadzonych eksperymentów można uznać prawdziwość tezy, iż 113 zastosowanie odpowiedniej strategii selekcji asercji pozwala na zmniejszenie ich liczby przy zachowaniu możliwie wysokiego poziomu detekcji wybranych typów bł˛edów. Przedstawiona metodyka eksperymentu jest uniwersalna i może zostać zastosowana również do analizy innych aplikacji. 5.2. Asercje ze śladem W punkcie 4.2 wprowadzono poj˛ecie asercji ze śladem. Struktura tego typu umożliwia sprawdzenie wybranych asercji w zależności od przebiegu programu. Wybranie odpowiedniej metody weryfikacji (punkt 4.5) pozwala również na badanie poprawności samego przebiegu wykonania programu przez asercje ze śladem. Celem eksperymentów jest sprawdzenie w jaki sposób wprowadzenie do programu asercji ze śladem o zróżnicowanej długości śladu wpłynie na liczb˛e wykrytych asercji, zaufanie do wykrytych asercji wyrażane liczba˛ ich zmian dla określonej ilości analizowanych danych, stop˛e wykrywanych przez nie bł˛edów powstałych wskutek zakłócania działania aplikacji oraz fałszywych alarmów generowanych dla nieznanych na etapie wykrywania asercji ze śladem zbiorów danych wejściowych. W pierwszym etapie eksperymentu dla wybranych bibliotek, zawierajacych ˛ implementacje algorytmów z rodziny ZIP, przygotowano aplikacje realizujace ˛ operacje kompresji i dekompresji oraz kilkanaście zbiorów danych wejściowych. Programy zostały uruchomione w celu uzyskania dzienników ich wykonania, na podstawie których wykryte zostały asercje ze śladem. Analiza zebranych dzienników została przeprowadzona z użyciem specjalnie przygotowanych skryptów z pakietu FlowGraph. Przedstawiono je szczegółowo w dodatku A.2. Na podstawie danych zebranych w wybranych punktach bibliotek znalezione zostały asercje ze śladem. Wykorzystujac ˛ aplikacje wzbogacone o wykryte asercje ze śladem przeprowadzonych zostało kilka eksperymentów. W pierwszym z nich aplikacje uruchomione zostały w niezakłócanym środowisku z zastosowaniem nieznanych na etapie wykrywania asercji zbiorów danych wejściowych. Umożliwiło to obserwacj˛e ewentualnych fałszywych alarmów zgłaszanych przez asercje ze śladem. Nast˛epne badanie polegało na uruchomieniu aplikacji w zakłócanym środowisku (zakłócenia generowane przez narz˛edzia z pakietu FlowGraph) z zastosowaniem zarówno znanych jak i nieznanych na etapie wykrywania asercji ze śladem zbiorów danych wejściowych. Analiza zachowania asercji ze śladem pozwoliła na określenie ich przydatności w procesie detekcji bł˛edów. W końcowej cz˛eści analizy dla wykrytych zbiorów asercji ze śladem zaprezentowano wynik działania nast˛epujacych ˛ algorytmów: redukcji liczby śladów w zbiorze asercji ze śladem (algorytm 4.1), skracania śladów w zbiorze asercji ze śladem (algorytm 4.2), redukcji liczby 114 identyfikatorów punktów programu dla zbiorów asercji ze śladem (algorytm 4.3). Otrzymane rezultaty ich działania pozwalaja˛ oszacować oszcz˛edności zwiazane ˛ z narzutem dodatkowego kodu jakie można uzyskać na etapie integracji asercji ze śladem z badanymi programami. W kolejnych punktach przedstawiono charakterystyk˛e badanych bibliotek oraz zaprezentowano wyniki przeprowadzonych badań wraz z wnioskami z nich wynikajacymi. ˛ Omówiona poniżej procedura analizy asercji ze śladem oraz przygotowane oprogramowanie wspomagajace ˛ moga˛ zostać wykorzystane do badania innych aplikacji. 5.2.1. Charakterystyka badanych bibliotek W celu zilustrowania zastosowania zaproponowanych w rozdziale czwartym asercji ze śladem wykorzystane zostały trzy różne implementacje algorytmu kompresujacego ˛ z rodziny ZIP dostarczane przez biblioteki JZlib4 , jazzlib5 , bzip26 . liczba pakietów liczba klas liczba metod JZlib 1 15 119 jazzlib 1 28 259 bzip2 1 4 74 Tabela 5.12. Podstawowe parametry opisujace ˛ badane implementacje algorytmu kompresujacego ˛ z rodziny ZIP Badane implementacje wykonane zostały w j˛ezyku Java. Ich podstawowe parametry [92] takie jak liczba pakietów, klas, metod oraz TLOC (liczba linii kodu źródłowego) zebrane zostały w tabeli 5.12. Na rysunku 5.5 przedstawiono histogramy porównujace ˛ liczb˛e metod o danej złożoności cyklomatycznej oraz liczbie parametrów wejściowych. Powyższe charakterystyki badanych implementacji zostały przygotowane z użyciem pakietu metrics7 . Zaprezentowane metryki wskazuja˛ na zróżnicowany styl programowania stosowany przy implementacji. Ze wzgl˛edu na wybrane punkty obserwacji programu ich wartości b˛eda˛ mogły mieć wpływ na wyniki otrzymane w trakcie eksperymentów. 5.2.2. Wykrywanie asercji ze śladem Dla wymienionych bibliotek przygotowano programy realizujace ˛ operacje kompresji i dekompresji danych wejściowych. Do automatycznej modyfikacji aplikacji, które umożliwiły ich obserwacj˛e, wykorzystano pakiet AspectJ8 pozwalajacy ˛ na zastosowanie programowania aspektowego w środowisku Java. Zadaniem stworzonego aspektu była obserwacja nast˛epuja˛ cych punktów w badanych aplikacjach: 4 5 6 7 8 http://www.jcraft.com/jzlib/ http://jazzlib.sourceforge.net/ http://www.kohsuke.org/bzip2/ http://metrics.sourceforge.net/ http://www.eclipse.org/aspectj/ 115 (a) liczba metod o danej złożoności cyklomatycznej (CC) (b) liczba metod o danej liczbie parametrów wejściowych (NOPm) Rysunek 5.5. Liczba metod o danych własnościach dla badanych programów 116 — wywołanie konstruktora klasy, — zakończenie konstruktora klasy, — wywołanie metody wraz z obserwacja˛ parametrów wejściowych typu liczbowego, — zakończenie metody wraz z obserwacja˛ wartości zwracanej typu liczbowego, — punkty odczytu wartości zmiennych globalnych typu liczbowego, — punkty przypisania wartości do zmiennych globalnych typu liczbowego. Dla każdego z wyżej wymienionych punktów w programie utworzony aspekt rejestrował do plikowego dziennika aplikacji identyfikator punktu składajacy ˛ si˛e z jego typu (wywołanie konstruktora, zakończenie konstruktora, wywołanie metody, zakończenie metody, odczyt wartości zmiennej, przypisanie wartości do zmiennej), nazwy klasy obiektu, w którym nastapiło ˛ zdarzenie, nazw˛e metody (w przypadku zdarzeń typu wywołanie lub zakończenie metody) oraz wszystkie nazwy zmiennych typu liczbowego wraz z ich wartościami. Dla tak przygotowanych programów wygenerowano po 32 zestawy losowych danych wejściowych o długościach 512, 1024, 2048 i 4096 bajtów. Dla wszystkich badanych implementacji użyto tych samych danych. W kolejnym kroku uruchomiono programy dla wszystkich zestawów danych wejściowych rejestrujac ˛ ślad ich wykonania w postaci plików tekstowych zgodnie z opisanymi wyżej założeniami. W ten sposób dla każdej badanej aplikacji otrzymano po 32 zbiory uczace ˛ dla każdej z czterech długości danych wejściowych. 5.2.3. Liczba wykrytych asercji Zebrane dzienniki wykonania badanych aplikacji zostały poddane analizie przez algorytm wykrywajacy ˛ asercje ze śladem. Dla wszystkich zmiennych, których wartości zostały zarejestrowane w danych punktach obserwacji wykrywano asercje typu z ≤ zmax oraz z ≥ zmin , odpowiadajace ˛ odpowiednio maksymalnej i minimalnej wartości osiaganej ˛ przez zmienna˛ z. Wykrywano asercje spełnione lokalnie w punktach obserwacji o długościach śladów l z zakresu < 0, 8 >. W tabelach 5.13, 5.14 i 5.15 zawarto statystyki liczby wykrytych asercji osobno dla każdej z badanych implementacji z podziałem na stosowane wielkości zbiorów danych wejściowych s oraz długości śladów l. Pod poj˛eciem wykrycia asercji rozumie si˛e konieczność zdefiniowania nowej asercji dla obserwowanej zmiennej, której wcześniej, nawet dla innych wartości maksymalnej i minimalnej, nie obserwowano. Taka sytuacja zachodzi w przypadku, gdy osiagni˛ ˛ eto punkt w programie wcześniej nie obserwowany lub punkt, do którego prowadził ślad zarejestrowany po raz pierwszy. W kolejnych kolumnach wyróżniono długość śladu l, liczb˛e asercji wykrytych po zastosowaniu pierwszego zbioru uczacego ˛ n1 , łaczn ˛ a˛ liczb˛e asercji wykrytych dla 32 X kolejnych trzydziestu jeden zbiorów uczacych ˛ ni oraz właściwości statystyczne zmiennej i=2 losowej N , której wartościami sa˛ liczby wykrytych asercji po zastosowaniu kolejnych zbiorów 117 uczacych ˛ poza pierwszym. Właściwościami tymi sa˛ kolejno: wartość minimalna min(N ) (minimalna liczba wykrytych asercji), wartość maksymalna max(N ) (maksymalna liczba wykrytych asercji), mediana med(N ) (mediana liczby wykrytych asercji), wartość średnia N̄ (średnia liczba wykrytych asercji), odchylenie średniej d(N ) oraz odchylenie standardowe σ(N ). Statystyki zostały sporzadzone ˛ za pomoca˛ narz˛edzi z pakietu FlowGraph. Dla każdej implementacji liczba asercji wykrytych po analizie pierwszego zbioru uczacego ˛ przekracza, niekiedy kilkunastokrotnie, łaczn ˛ a˛ liczb˛e asercji wykrytych po zastosowaniu kolejnych zbiorów. Liczba wykrytych asercji rośnie wraz ze wzrostem długości obserwowanego śladu, co świadczy o zróżnicowanym przebiegu dojścia do wybranych punktów obserwacji. Mediana liczby wykrytych asercji dla kolejnych zbiorów uczacych ˛ równa wartości minimalnej świadczy o tym, że dla wi˛ekszości zbiorów nie sa˛ wykrywane nowe asercje. Ma to wpływ na znaczace ˛ wartości odchylenia średniego i standardowego zmiennej losowej N , które świadcza˛ o incydentalnym pojawianiu si˛e znaczacej ˛ liczby nowych asercji w kolejnych zbiorach uczacych. ˛ Wartości statystyczne rosna˛ wraz z badanymi długościami śladów asercji. Zauważalna jest również korelacja pomi˛edzy liczba˛ metod o dużej złożoności cyklomatycznej oraz dużej liczbie parametrów wejściowych w odniesieniu do liczby wykrytych asercji. Implementacja JZlib posiada najwi˛ecej takich metod, co w pewnym stopniu przekłada si˛e na liczb˛e wykrytych asercji. Analogiczny wniosek można wyciagn ˛ ać ˛ dla implementacji bzip2, gdzie liczba takich metod jest niewielka, co skutkuje mniejsza˛ liczba˛ asercji. Ze wzgl˛edu na obserwowane punkty w programie (nie sa˛ to tylko wywołania metod) oraz obserwowane zmienne (nie sa˛ to tylko zmienne wyst˛epujace ˛ jako dane wejściowe do metod) nie można jednak wnioskować o ścisłej korelacji w tym przypadku. 5.2.4. Analiza procesu wykrywania asercji W tabelach 5.16, 5.17 i 5.18 zawarto statystyki liczby niezb˛ednych zmian wykrytych asercji podczas fazy nauki dla badanych implementacji. Zmiany te były wynikiem pojawienia si˛e wartości prowadzacej ˛ do naruszenia już istniejacej ˛ asercji. Aby uniknać ˛ takiej sytuacji asercja musiała być aktualizowana. Dla każdej implementacji podano odr˛ebne statystyki w podziale na stosowane wielkości zbiorów danych wejściowych s, długości śladów l oraz wykrywane rodzaje asercji (z ≤ zmin oraz z ≥ zmax ). W kolejnych kolumnach zawarto liczb˛e zmian podczas analizy pierwszego zbioru uczacego ˛ u1 , stosunek liczby zmian do liczby wszystkich sprawdzeń danych asercji wyrażony w procentach oraz analogiczne, łaczn ˛ a˛ liczb˛e zmian dla 32 X kolejnych trzydziestu jeden zbiorów uczacych ˛ ui i stosunek liczby wszystkich zmian do i=2 liczby wszystkich sprawdzeń danych asercji dla kolejnych trzydziestu jeden zbiorów uczacych ˛ wyrażony w procentach. W dalszej cz˛eści opisu stosunek liczby zmian do liczby wszystkich sprawdzeń asercji b˛edzie nazywany zmiennościa˛ asercji. 118 l n1 32 X ni min(N ) max(N ) med(N ) N̄ d(N ) σ(N ) 0,62 2,12 3,87 5,51 7,53 10,75 14,97 19,70 25,08 1,77 6,01 10,95 14,17 17,23 22,60 28,62 35,17 43,33 s = 512 0 1 2 3 4 5 6 7 8 450 844 1118 1346 1550 1766 1984 2202 2422 10 34 64 98 144 214 310 428 590 0 0 0 0 0 0 0 0 0 10 34 62 80 96 122 148 178 212 0 0 0 0 0 0 0 0 2 0,32 1,10 2,06 3,16 4,65 6,90 10,00 13,81 19,03 s = 1024 0 1 2 3 4 5 6 7 8 460 876 1178 1428 1644 1884 2116 2342 2576 0 2 6 24 68 128 226 368 548 0 0 0 0 0 0 0 0 0 0 2 4 6 16 30 46 62 80 0 0 0 0 0 0 12 18 18 0,00 0,00 0,00 0,06 0,12 0,35 0,19 0,36 0,78 0,77 1,25 1,74 2,19 2,89 4,04 4,13 4,84 6,89 7,29 8,12 11,22 11,87 12,20 16,29 17,68 16,98 22,12 s = 2048 0 1 2 3 4 5 6 7 8 460 876 1174 1424 1642 1882 2130 2364 2606 0 2 10 30 72 140 238 396 592 0 0 0 0 0 0 0 0 0 0 2 10 20 38 64 92 128 170 0 0 0 0 0 0 2 2 2 0,00 0,00 0,06 0,12 0,32 0,62 0,97 1,69 2,32 3,49 4,52 6,38 7,68 9,54 12,77 13,76 19,10 19,12 s = 4096 i=2 0 1 2 3 4 5 6 7 8 460 876 1176 1430 1656 1902 2148 2390 2648 0 2 10 26 60 114 190 306 460 0 0 0 0 0 0 0 0 0 0 2 4 10 24 44 66 92 122 0 0 0 0 0 0 0 0 12 0,00 0,00 0,00 0,06 0,12 0,35 0,32 0,58 1,03 0,84 1,46 2,32 1,94 3,12 5,27 3,68 5,54 9,79 6,13 8,72 14,99 9,87 13,22 21,50 14,84 18,85 29,59 Tabela 5.13. Statystyki liczby wykrytych asercji dla implementacji JZlib 119 0,00 0,35 1,77 3,62 6,91 11,83 17,16 24,38 32,69 l n1 32 X ni min(N ) max(N ) med(N ) N̄ d(N ) σ(N ) 1,50 3,86 7,48 11,59 15,41 19,29 23,75 27,68 33,78 4,24 10,60 19,51 28,94 37,38 45,87 55,85 64,06 73,64 s = 512 0 228 1 496 2 728 3 906 4 1086 5 1240 6 1414 7 1574 8 1750 24 64 124 192 266 356 462 568 722 0 0 0 0 0 0 0 0 0 24 60 110 162 208 254 308 352 402 0 0 0 0 0 0 0 0 0 0,77 2,06 4,00 6,19 8,58 11,48 14,90 18,32 23,29 s = 1024 0 252 1 554 2 836 3 1044 4 1244 5 1418 6 1618 7 1796 8 1996 0 6 22 78 140 222 316 440 584 0 0 0 0 0 0 0 0 0 0 4 8 14 36 60 78 98 122 0 0 0 0 0 10 10 14 16 0,00 0,00 0,00 0,19 0,36 0,78 0,71 1,05 1,57 2,52 3,48 4,37 4,52 5,76 7,93 7,16 8,28 12,01 10,19 11,10 15,85 14,19 14,96 20,39 18,84 19,66 25,88 s = 2048 0 252 1 552 2 832 3 1036 4 1234 5 1408 6 1602 7 1792 8 2002 0 8 28 86 146 226 324 440 588 0 0 0 0 0 0 0 0 0 0 4 10 32 62 100 140 172 210 0 0 0 0 0 0 0 0 10 0,00 0,26 0,90 2,77 4,71 7,29 10,45 14,19 18,97 0,00 0,48 1,52 4,57 7,43 11,07 15,60 20,32 26,21 0,00 0,98 2,53 7,29 12,68 19,67 27,50 34,60 43,09 s = 4096 i=2 0 252 1 552 2 834 3 1044 4 1244 5 1432 6 1638 7 1838 8 2054 0 10 32 98 182 274 380 506 666 0 0 0 0 0 0 0 0 0 0 4 8 24 46 58 74 92 112 0 0 0 0 0 0 0 14 104 0,00 0,32 1,03 3,16 5,87 8,84 12,26 16,32 21,48 0,00 0,56 1,73 5,04 8,82 12,58 16,40 20,76 26,20 0,00 0,89 2,43 7,14 12,72 17,71 22,81 28,22 34,75 Tabela 5.14. Statystyki liczby wykrytych asercji dla implementacji jazzlib 120 l n1 32 X ni min(N ) max(N ) med(N ) N̄ d(N ) σ(N ) s = 512 0 142 1 332 2 488 3 612 4 730 5 864 6 1024 7 1174 8 1340 2 8 22 34 54 80 130 208 298 0 0 0 0 0 0 0 0 0 2 8 16 22 28 32 38 46 54 0 0 0 0 0 0 0 14 2 0,06 0,12 0,35 0,26 0,50 1,41 0,71 1,28 2,90 1,10 1,91 4,09 1,74 2,92 5,49 2,58 3,78 6,37 4,19 5,45 7,97 6,71 8,23 10,53 9,61 11,35 13,87 s = 1024 0 142 1 334 2 492 3 632 4 750 5 886 6 1048 7 1202 8 1374 0 10 18 24 38 60 106 172 244 0 0 0 0 0 0 0 0 0 0 6 8 12 16 20 24 52 84 0 0 0 0 0 0 0 0 0 0,00 0,00 0,00 0,32 0,60 1,25 0,58 1,05 1,98 0,77 1,35 2,52 1,23 2,06 3,40 1,94 3,12 4,61 3,42 5,17 6,93 5,55 8,07 11,53 7,87 11,16 17,09 s = 2048 0 142 1 332 2 488 3 630 4 766 5 900 6 1060 7 1218 8 1392 2 8 20 28 42 66 114 181 256 0 0 0 0 0 0 0 0 0 2 8 16 22 28 34 42 52 62 0 0 0 0 0 0 0 0 14 0,06 0,12 0,35 0,26 0,50 1,41 0,65 1,17 2,85 0,90 1,63 3,93 1,35 2,36 5,06 2,13 3,31 6,32 3,68 5,18 8,35 5,84 7,32 11,25 8,26 10,08 15,04 s = 4096 i=2 0 154 1 352 2 522 3 678 4 826 5 996 6 1194 7 1376 8 1568 0 10 32 52 80 116 164 258 388 0 0 0 0 0 0 0 0 0 0 4 6 8 18 22 36 66 98 0 0 0 0 0 0 0 0 14 0,00 0,00 0,00 0,32 0,56 0,89 1,03 1,53 1,89 1,68 2,38 2,92 2,58 3,66 4,61 3,74 4,94 6,22 5,29 6,91 9,26 8,32 10,78 15,96 12,52 14,67 22,99 Tabela 5.15. Statystyki liczby wykrytych asercji dla implementacji bzip2 121 z ≥ zmin l u1 % 32 X z ≤ zmax ui % u1 % ui % s = 512 0 1 2 3 4 5 6 7 8 503 2214 3327 3584 3994 4183 4410 4589 4722 0,52 2,29 3,44 3,71 4,13 4,33 4,56 4,75 4,88 27 108 188 279 373 490 650 826 1029 0,03 0,11 0,19 0,29 0,39 0,51 0,67 0,85 1,07 2208 5670 7328 7999 8258 8380 8484 8629 8849 2,28 5,86 7,58 8,27 8,54 8,67 8,77 8,92 9,15 83 217 321 442 563 709 885 1080 1316 0,09 0,22 0,33 0,46 0,58 0,73 0,92 1,12 1,36 s = 1024 0 1 2 3 4 5 6 7 8 524 3294 4958 5237 5640 5823 6065 6257 6384 0,44 2,76 4,15 4,39 4,73 4,88 5,08 5,24 5,35 65 164 254 347 470 621 790 996 1247 0,05 0,14 0,21 0,29 0,39 0,52 0,66 0,83 1,05 3606 9680 12872 14055 14316 14455 14564 14720 14960 3,02 8,11 10,79 11,78 12,00 12,11 12,20 12,33 12,54 72 210 335 455 586 748 912 1098 1321 0,06 0,18 0,28 0,38 0,49 0,63 0,76 0,92 1,11 s = 2048 i=2 0 1 2 3 4 5 6 7 8 543 5429 8210 8501 8923 9126 9379 9566 9702 0,33 3,27 4,95 5,13 5,38 5,50 5,66 5,77 5,85 70 169 279 380 509 678 858 1097 1356 0,04 0,10 0,17 0,23 0,31 0,41 0,52 0,66 0,82 6541 18055 24309 26501 26770 26912 27024 27189 27439 3,95 10,89 14,66 15,99 16,15 16,23 16,30 16,40 16,55 100 254 397 546 680 843 1021 1215 1450 0,06 0,15 0,24 0,33 0,41 0,51 0,62 0,73 0,88 s = 4096 i=2 32 X 0 1 2 3 4 5 6 7 8 564 9811 14958 15273 15692 15896 16158 16371 16543 0,22 3,76 5,73 5,85 6,01 6,09 6,19 6,27 6,34 55 149 247 352 459 619 786 991 1255 0,02 0,06 0,09 0,13 0,18 0,24 0,30 0,38 0,48 12189 34990 47339 51523 51809 51953 52065 52223 52483 4,67 13,41 18,14 19,74 19,85 19,90 19,95 20,01 20,11 125 297 427 554 669 840 999 1191 1436 0,05 0,11 0,16 0,21 0,26 0,32 0,38 0,46 0,55 Tabela 5.16. Liczba zmian istniejacych ˛ asercji oraz stosunek liczby zmian istniejacych ˛ asercji do ich wszystkich sprawdzeń wyrażony w procentach dla implementacji JZlib 122 z ≥ zmin l u1 % 32 X z ≤ zmax ui % u1 % ui % s = 512 0 1 2 3 4 5 6 7 8 170 1872 2556 2685 2807 2900 3020 3125 3225 0,58 6,37 8,69 9,13 9,55 9,86 10,27 10,63 10,97 39 110 234 372 518 678 836 994 1173 0,13 0,37 0,80 1,27 1,76 2,31 2,85 3,38 3,99 3868 7918 9109 9231 9331 9438 9530 9627 9727 13,16 26,93 30,98 31,40 31,74 32,10 32,42 32,75 33,09 110 223 380 543 705 859 1047 1237 1433 0,37 0,76 1,29 1,85 2,40 2,92 3,56 4,21 4,87 s = 1024 0 1 2 3 4 5 6 7 8 177 3454 4698 4860 4981 5089 5228 5344 5465 0,33 6,52 8,87 9,17 9,40 9,60 9,87 10,08 10,31 66 175 325 468 642 808 984 1186 1385 0,12 0,33 0,61 0,88 1,21 1,53 1,86 2,24 2,61 6717 14566 16834 16972 17094 17202 17305 17417 17535 12,68 27,49 31,77 32,03 32,26 32,46 32,66 32,87 33,09 73 190 350 529 701 889 1092 1306 1544 0,14 0,36 0,66 1,00 1,32 1,68 2,06 2,46 2,91 s = 2048 i=2 0 1 2 3 4 5 6 7 8 189 6634 9011 9158 9284 9409 9538 9660 9778 0,19 6,56 8,92 9,06 9,19 9,31 9,44 9,56 9,67 66 169 342 512 680 851 1046 1281 1528 0,07 0,17 0,34 0,51 0,67 0,84 1,04 1,27 1,51 12368 27913 32423 32575 32706 32813 32921 33020 33143 12,24 27,62 32,08 32,23 32,36 32,47 32,57 32,67 32,79 76 198 379 543 716 897 1085 1300 1531 0,08 0,20 0,38 0,54 0,71 0,89 1,07 1,29 1,52 s = 4096 i=2 32 X 0 1 2 3 4 5 6 7 8 198 13016 17743 17898 18042 18177 18311 18446 18604 0,10 6,54 8,91 8,99 9,06 9,13 9,20 9,27 9,35 59 149 307 480 670 850 1028 1264 1498 0,03 0,07 0,15 0,24 0,34 0,43 0,52 0,63 0,75 23621 54675 63888 64126 64284 64411 64532 64662 64815 11,87 27,47 32,10 32,22 32,30 32,36 32,42 32,49 32,56 125 277 455 612 774 952 1169 1389 1658 0,06 0,14 0,23 0,31 0,39 0,48 0,59 0,70 0,83 Tabela 5.17. Liczba zmian istniejacych ˛ asercji oraz stosunek liczby zmian istniejacych ˛ asercji do ich wszystkich sprawdzeń wyrażony w procentach dla implementacji jazzlib 123 z ≥ zmin l u1 % 32 X z ≤ zmax ui % u1 % ui % s = 512 0 135 1 289 2 403 3 507 4 591 5 668 6 787 7 911 8 1033 0,21 0,45 0,62 0,79 0,92 1,04 1,22 1,41 1,60 73 124 193 283 353 421 536 640 787 0,12 0,20 0,31 0,45 0,56 0,67 0,85 1,01 1,24 3154 5840 6964 7661 8005 8151 8319 8413 8571 4,89 9,05 10,8 11,88 12,41 12,64 12,90 13,04 13,29 59 132 216 309 384 488 647 780 948 0,09 0,21 0,34 0,49 0,61 0,77 1,02 1,23 1,49 s = 1024 0 122 1 253 2 358 3 461 4 542 5 636 6 763 7 884 8 1026 0,10 0,21 0,30 0,38 0,45 0,53 0,63 0,74 0,85 59 110 166 240 294 359 474 579 732 0,05 0,09 0,14 0,20 0,24 0,30 0,39 0,48 0,60 6587 11894 14059 15257 15626 15790 15930 16043 16160 5,48 9,89 11,69 12,69 13,00 13,13 13,25 13,34 13,44 69 123 179 264 319 415 536 663 827 0,06 0,10 0,15 0,22 0,26 0,34 0,44 0,55 0,68 s = 2048 i=2 0 149 1 314 2 434 3 543 4 648 5 740 6 868 7 1003 8 1143 0,06 0,13 0,18 0,23 0,27 0,31 0,36 0,42 0,48 55 98 144 230 298 363 497 610 754 0,02 0,04 0,06 0,10 0,12 0,15 0,21 0,25 0,31 12413 22741 26916 29197 29556 29728 29953 30139 30333 5,19 9,51 11,26 12,22 12,37 12,44 12,53 12,61 12,69 93 176 271 365 427 532 679 806 981 0,04 0,07 0,11 0,15 0,18 0,22 0,28 0,34 0,41 s = 4096 i=2 32 X 0 191 0,06 1 366 0,11 2 508 0,16 3 638 0,20 4 741 0,23 5 868 0,27 6 1025 0,31 7 1160 0,35 8 1284 0,39 85 160 225 315 396 501 632 789 1009 0,03 0,05 0,07 0,10 0,12 0,15 0,19 0,24 0,31 20325 40909 49168 53460 53827 54026 54173 54295 54404 6,22 12,52 15,04 16,36 16,47 16,53 16,58 16,61 16,65 67 151 241 340 419 520 679 825 1047 0,02 0,05 0,07 0,10 0,13 0,16 0,21 0,25 0,32 Tabela 5.18. Liczba zmian istniejacych ˛ asercji oraz stosunek liczby zmian istniejacych ˛ asercji do ich wszystkich sprawdzeń wyrażony w procentach dla implementacji bzip2 124 Badane implementacje charakteryzuja˛ si˛e zauważalnym spadkiem liczby zmian asercji po analizie pierwszego zbioru trenujacego. ˛ Oznacza to, że kolejne zbiory w coraz mniejszym stopniu wpływaja˛ na wykrywanie asercji odzwierciedlajacych ˛ działanie programów. Ewentualne odst˛epstwa od tej zasady spowodowane sa˛ pojawieniem si˛e zbioru danych wejściowych, dla którego przebieg algorytmu mógł przebiegać inna˛ ścieżka˛ niż dla wi˛ekszości pozostałych danych. Wartość tego spadku zmniejsza si˛e wraz z długościa˛ śladu wykrywanych asercji. Powodem takiej sytuacji jest zmniejszajaca ˛ si˛e ilość danych uczacych. ˛ Liczba obserwowanych zmian zwiazana ˛ jest również z wcześniej przedstawiona˛ liczba˛ wykrytych asercji dla badanych implementacji. Rośnie ona wraz ze wzrostem liczby znalezionych asercji. Liczba pojawiajacych ˛ si˛e nowych asercji dla kolejnych zbiorów uczacych ˛ wpływa również na liczb˛e koniecznych ich zmian. W analizowanych programach obserwowalna jest wi˛eksza liczba koniecznych zmian dla asercji z ≤ zmax w stosunku do asercji z ≥ zmin . Wynika to z charakteru programów, gdzie wi˛ekszość zmiennych przyjmuje wartości naturalne oraz zmienia si˛e proporcjonalnie wraz z kolejnymi partiami danych wejściowych. Na rysunku 5.6 przedstawiono zestawienie udziału asercji o danym zakresie zmienności obliczanym oddzielnie dla każdej asercji. Dane dla histogramów przygotowane zostały za pomoca˛ skryptów z pakietu FlowGraph dla implementacji bzip2 badanej dla danych wejściowych o rozmiarze 4096 bajtów. Poszczególne wykresy przedstawiaja˛ procentowy udział liczby asercji o danym zakresie zmienności w ogólnej liczbie wszystkich asercji. Uwzgl˛edniono na nich dziesi˛eć proporcjonalnych przedziałów dla wartości określajacej ˛ zmienność asercji: < 0%, 10%), < 10%, 20%), . . . , < 80%, 90%), < 90%, 100% >. Sa˛ one oznaczone kolorami: zielonym dla zakresów z przedziału < 0%, 50%) (od jasnozielonego do ciemnozielonego) oraz czerwonym dla zakresów z przedziału < 50%, 100% > (od ciemnoczerwonego do jasnoczerwonego). Kolejne wykresy przedstawiaja˛ udział asercji o danym zakresie zmienności po zastosowaniu różnej liczby zbiorów trenujacych. ˛ Przy ustalonej liczbie przeanalizowanych zbiorów uczacych ˛ widoczna jest zależność pomi˛edzy udziałem asercji o dużej wartości zmienności a długościa˛ śladu asercji. Dla asercji o dłuższym śladzie jest ich wi˛ecej. Jest to skutkiem malejacej ˛ ilości danych uczacych ˛ wraz ze wzrostem długości śladu przez co wysoki stopień zmienności utrzymuje si˛e dłużej. Z kolei, wraz ze wzrostem liczby zbiorów uczacych, ˛ zwi˛eksza si˛e liczba asercji o mniejszej wartości zmienności zast˛epujac ˛ asercje o dużej zmienności. Wniosek ten potwierdza wcześniejsza˛ obserwacj˛e dotyczac ˛ a˛ zmienności danych typów asercji w zależności od liczby zbiorów uczacych. ˛ Wraz ze wzrostem liczby przeanalizowanych zbiorów uczacych ˛ i długości śladów asercji zast˛epowanie asercji o dużej zmienności przez asercji o mniejszej zmienności nast˛epuje z coraz mniejsza˛ intensywnościa.˛ Ewentualne fluktuacje moga˛ być wynikiem pojawienia si˛e takiego zbioru danych wejściowych, dla którego zaszła konieczność zmian w dużej liczbie 125 (a) jeden zbiór uczacy ˛ (b) dwa zbiory uczace ˛ (c) trzy zbiory uczace ˛ (d) cztery zbiory uczace ˛ (e) osiem zbiorów uczacych ˛ (f) dwanaście zbiorów uczacych ˛ (g) szesnaście zbiorów uczacych ˛ (h) trzydzieści dwa zbiory uczace ˛ Rysunek 5.6. Rozkład liczby asercji o danym zakresie zmienności po analizie różnej liczby zbiorów uczacych ˛ (implementacja bzip2, dane wejściowe o wielkości 4096 bajtów) 126 wykrytych asercji. Charakter analogicznych zestawień dla innych implementacji i stosowanych wielkości zbiorów danych wejściowych jest podobny do przedstawionego. 5.2.5. Analiza nieprawidłowych naruszeń asercji Celem eksperymentu zwiazanego ˛ z badaniem zgłaszania fałszywych alarmów przez asercje (nieprawidłowych naruszeń asercji) była obserwacja zachowania wykrytych asercji dla uruchomień programu z danymi wejściowymi obejmujacymi ˛ zbiory, które nie były uwzgl˛ednione podczas procesu wykrywania asercji. W trakcie eksperymentu przebieg programu nie był w żaden sposób zakłócany, a stosowane dane wejściowe były prawidłowe. Oznacza to, że teoretycznie nie powinny pojawić si˛e żadne naruszenia asercji. Jednak charakter asercji, które wykryte sa˛ poprzez dynamiczna˛ analiz˛e programu oraz charakter zbiorów trenujacych ˛ (ograniczona liczba możliwych danych wejściowych) moga˛ spowodować sytuacje, że niektóre z asercji zostana˛ naruszone. Jeśli takie zachowanie zostanie zaobserwowane b˛edzie ono fałszywym alarmem. Jest to naruszenie, które nie powinno si˛e pojawić dla prawidłowych uruchomień programów i wynika ono z niedoskonałości wykrytych asercji. Eksperymenty tego typu wykonano dla wszystkich badanych bibliotek oraz stosowanych wielkości zbiorów danych wejściowych wraz z zestawami asercji wykrytymi po pierwszym, drugim, trzecim, czwartym, ósmym, szesnastym i trzydziestym drugim zbiorze uczacym. ˛ Obserwowano liczb˛e sprawdzeń asercji wraz z ich efektem (asercja nienaruszona albo asercja naruszona). Dla każdej kombinacji obejmujacej ˛ rodzaj implementacji, wielkość danych wejściowych i liczb˛e zbiorów trenujacych ˛ wykonano osiem eksperymentów z zastosowaniem różnych zbiorów danych wejściowych. Całościowe wyniki zebrano w tabeli 5.19. Dla każdej z badanej liczby zestawów zbiorów trenujacych ˛ k (wyróżnione cz˛eści tabeli) oraz możliwych długości śladów l (kolejne wiersze w wyróżnionych cz˛eściach tabeli) podano stosunek nieprawidłowych naruszeń asercji do ogólnej liczby ich sprawdzeń wyrażony w procentach (nazywany dalej udziałem nieprawidłowych naruszeń asercji) w podziale na zakresy zmienP ności asercji (punkt 5.2.4). W ostatniej kolumnie podana została ogólna wartość udziału nieprawidłowych naruszeń asercji, bez uwzgl˛ednienia wyróżnionych zakresów zmienności asercji. Dane zostały opracowane za pomoca˛ skryptu z pakietu FlowGraph umożliwiajacego ˛ obserwacj˛e zachowania wykrytych asercji i rejestrujacym ˛ niezb˛edne statystyki. Linia trendu dla ogólnej wartości udziału nieprawidłowych naruszeń asercji w badanym zakresie liczby zbiorów uczacych ˛ opisuje odwrotnie proporcjonalny spadek udziału fałszywych alarmów dla wzrostu liczby zbiorów trenujacych. ˛ Dwukrotne zwi˛ekszenie liczby zbiorów trenujacych ˛ powoduje od około dwukrotnego do czterokrotnego spadku udziału nieprawidłowych naruszeń w odniesieniu do wszystkich sprawdzeń asercji. Przykładowo, dla asercji ze śladem o l = 8 po zastosowaniu jednego zbioru trenujacego ˛ udział ten wynosi 0,69%, dwóch 127 k=1 0 1 2 3 4 5 6 7 8 0,16b 0,67 0,71 0,72 0,71 0,71 0,72 0,72 0,72 1,55 0,03 0,09 0,23 0,52 0,71 1,14 1,37 2,61 0,88 0,15 1,43 0,47 1,59 2,35 3,04 3,37 2,81 0,08 0,07 0,28 0,19 0,61 0,84 1,11 1,28 1,54 0,02 0,02 1,43 4,84 4,41 3,64 2,14 1,84 1,52 8,62 0,12 0,19 0,20 0,18 0,21 0,25 0,29 0,34 0,13 3,77 4,73 3,18 8,09 10,20 10,08 8,58 8,36 0,08 0,00 0,26 0,88 1,31 1,26 2,32 5,62 7,97 0,30 0,37 6,79 1,61 1,20 0,79 1,64 2,48 2,29 0,13 0,10 0,12 0,16 0,21 0,25 0,30 0,36 0,42 0,41 0,53 0,59 0,60 0,62 0,63 0,65 0,67 0,69 k=2 0 1 2 3 4 5 6 7 8 0,17 0,34 0,37 0,38 0,38 0,38 0,39 0,39 0,39 0,33 0,06 0,42 0,19 0,63 0,83 1,07 1,24 1,20 0,10 0,04 0,13 0,15 0,14 0,16 0,18 0,19 0,22 0,10 2,77 3,24 2,52 3,83 4,96 5,95 6,59 7,06 0,02 0,01 0,02 0,03 0,02 0,03 0,03 0,04 0,05 0,66 0,15 0,11 0,13 0,16 0,18 0,23 0,25 0,28 0,00 4,95 4,57 6,52 7,67 7,57 7,08 7,77 7,57 0,81 8,79 10,48 10,19 10,79 11,31 11,63 11,73 11,79 – – – 7,89 4,88 3,61 2,25 3,41 5,32 17,97 19,59 21,28 22,34 22,59 22,55 22,79 22,78 23,02 0,17 0,29 0,32 0,33 0,34 0,35 0,36 0,37 0,39 k=3 0 1 2 3 4 5 6 7 8 0,11 0,25 0,27 0,28 0,28 0,28 0,29 0,29 0,30 0,06 0,03 0,08 0,09 0,10 0,11 0,13 0,15 0,16 0,05 0,72 1,85 1,48 1,82 1,48 1,46 1,60 1,68 0,07 0,04 0,04 0,05 0,06 0,07 0,07 0,08 0,09 1,96 2,66 2,53 3,11 3,55 3,24 3,12 3,30 3,30 14,71 9,29 8,58 9,25 9,38 9,87 9,75 9,70 9,86 7,14 8,24 9,29 9,99 11,2 11,67 12,32 12,42 12,63 – 0,00 0,00 6,56 10,31 7,30 6,07 5,26 7,29 – – – – 7,14 8,04 9,76 7,36 9,47 14,91 19,12 22,35 22,53 23,22 24,20 23,27 23,36 23,07 0,11 0,21 0,24 0,24 0,25 0,25 0,27 0,27 0,28 k=4 P 0 1 2 3 4 5 6 7 8 0,04 0,15 0,16 0,16 0,17 0,17 0,18 0,18 0,18 0,03 0,03 0,09 0,11 0,09 0,10 0,11 0,13 0,15 0,07 0,03 0,03 0,04 0,04 0,05 0,06 0,07 0,08 3,21 3,74 4,14 4,11 4,25 4,41 4,46 4,28 4,26 10,00 8,28 8,84 10,61 10,75 11,01 10,56 9,82 8,86 12,98 10,75 10,42 9,93 10,44 10,51 10,18 10,36 10,40 – – 12,79 17,96 13,49 12,80 12,77 12,66 13,29 5,47 7,14 10,25 11,3 12,15 12,55 12,44 11,89 12,54 – – – – 17,86 36,36 – 3,13 16,67 22,00 28,10 26,62 25,76 25,51 26,61 26,01 25,91 26,00 0,04 0,13 0,14 0,15 0,15 0,16 0,17 0,17 0,18 k=8 < 10, 20) < 20, 30) < 30, 40) < 40, 50) < 50, 60) < 60, 70) < 70, 80) < 80, 90) < 90, 100 > 0 1 2 3 4 5 6 7 8 0,02 0,03 0,04 0,04 0,04 0,04 0,04 0,05 0,05 0,03 0,01 0,01 0,01 0,02 0,02 0,03 0,03 0,03 5,12 3,97 3,99 3,93 3,95 4,19 4,11 4,25 4,35 6,25 8,15 7,25 6,71 6,61 6,45 6,53 6,45 6,56 6,00 11,76 12,56 12,84 12,13 13,09 12,19 10,90 10,94 12,50 11,29 12,07 12,11 11,97 12,48 12,14 12,16 12,25 – 30,77 17,33 15,63 13,93 13,74 12,70 13,23 13,06 – 0,00 23,08 24,14 19,32 15,38 16,78 16,39 14,87 – – – – 31,25 25,00 23,08 30,00 21,05 – 8,33 16,67 21,61 23,76 23,95 22,24 22,47 21,92 0,02 0,03 0,03 0,04 0,04 0,04 0,05 0,05 0,06 k = 16 < 0, 10)a 0 1 2 3 4 5 6 7 8 0,01 0,02 0,02 0,02 0,02 0,02 0,02 0,02 0,03 4,62 2,41 2,19 2,07 2,14 2,28 2,19 2,12 2,09 5,52 8,16 7,58 6,76 6,39 5,95 5,55 5,32 5,31 – 14,29 6,45 7,12 6,11 6,22 5,87 5,77 5,73 – 0,00 4,17 10,91 8,96 10,11 9,84 10,74 9,31 – 5,56 10,42 10,65 9,52 10,78 11,01 11,79 12,06 – – 16,67 17,50 20,00 15,29 13,60 16,40 17,69 – – – 12,50 14,29 17,86 20,45 17,19 19,15 – – 0,00 0,00 0,00 5,56 9,09 11,54 12,50 – 50,00 21,43 33,33 31,01 30,08 27,88 28,05 27,83 0,01 0,02 0,02 0,02 0,03 0,03 0,03 0,03 0,03 k = 32 l 0 1 2 3 4 5 6 7 8 0,01 0,02 0,02 0,02 0,02 0,02 0,02 0,02 0,02 3,18 2,68 2,15 2,01 2,10 2,24 2,05 1,99 2,07 – 0,00 4,62 5,78 4,86 4,59 4,73 4,74 4,50 – 0,00 5,00 7,04 7,61 7,77 7,64 7,29 7,22 – – 0,00 4,17 4,76 7,55 11,31 14,29 11,81 – – 10,00 7,89 8,33 8,33 8,43 10,42 11,66 – 50,00 50,00 50,00 40,00 22,73 17,24 18,42 18,28 – – – 25,00 12,50 10,00 8,33 21,43 26,92 – – – – – – 25,00 27,78 28,57 – 0,00 0,00 8,33 8,93 15,45 14,53 16,56 17,26 0,01 0,02 0,02 0,02 0,02 0,02 0,02 0,02 0,02 a b górne i dolne ograniczenia przedziałów podano w procentach wartości podano w procentach Tabela 5.19. Rozkład nieprawidłowych naruszeń asercji w ogólnej liczbie sprawdzeń asercji dla różnej liczby wykorzystanych zbiorów uczacych ˛ 128 0,39%, czterech – 0,18%, ośmiu – 0,06%. Dla asercji ze śladem o l = 4 wartości te wynosza˛ odpowiednio 0,62%, 0,34%, 0,15%, 0,04%. Stosowanie wi˛ekszej liczby zbiorów trenujacych ˛ pozytywnie wpływa na otrzymany wynik, jednak wraz z rosnac ˛ a˛ liczba˛ zbiorów wpływ ten jest, w wartościach bezwzgl˛ednych, coraz mniejszy. Należy zauważyć, że nawet po zastosowaniu tylko jednego zbioru trenujacego ˛ udział fałszywych alarmów jest niewielki. Wraz ze zwi˛ekszajac ˛ a˛ si˛e długościa˛ śladu badanych asercji rośnie liczba ich nieprawidłowych naruszeń. Jest to skutek wi˛ekszej specjalizacji tych asercji co skutkuje ich wi˛eksza˛ wrażliwościa˛ nie tylko na bł˛edy, ale również w sytuacjach badanych w tym eksperymencie. Zachowanie to należy uznać za wad˛e stosowania asercji ze śladem. Najwi˛ekszy przyrost udziału nieprawidłowych asercji można zaobserwować porównujac ˛ asercje bez śladu oraz asercje ze śladem jednostkowej długości. Dalsze wydłużanie śladu ma coraz mniejszy wpływ na wzrost tej wartości. Najbardziej zbliżonymi do ogólnej wartości (kolumna P ) udziału nieprawidłowych naruszeń asercji sa˛ wartości dla asercji o małym zakresie zmienności. Wartości, które w istotny sposób odbiegaja˛ od wartości ogólnej (maja˛ istotnie wyższa˛ lub niższa˛ wartość) można uznać za lokalne anomalie w odniesieniu do wartości ogólniej. Wynikaja˛ one z niewielkiej liczby sprawdzeń asercji podlegajacych ˛ obserwacji w danym przedziale zmienności. 5.2.6. Analiza wykrywania bł˛edów przez asercje Seria eksperymentów dotyczacych ˛ wykrywania bł˛edów przez asercje ze śladem miała na celu zbadanie zachowania asercji podczas uruchomień programów w zaburzonym środowisku. Podczas eksperymentów wprowadzano nast˛epujace ˛ rodzaje zakłóceń do wykonywanych programów: — zakłócenie wartości zmiennej w programie polegajace ˛ na losowej inwersji jednego bitu w losowej zmiennej z zakresów od najmłodszego do: pierwszego, drugiego, trzeciego, czwartego, ósmego, szesnastego i trzydziestego drugiego bitu; zmienny zakres miał na celu wprowadzenie zróżnicowania zakresu zmiany wybranej zmiennej (od najmniejszej do najwi˛ekszej), — zakłócenie przebiegu wykonania programu, gdzie symulowano pomini˛ecie losowego punktu obserwacji poprzez usuni˛ecie go z aktualnie obserwowanego śladu jej wykonania; miało to na celu wprowadzenie zakłócenia w śladzie wykonania programu. Wszystkie wprowadzane zakłócenia miały charakter przemijajacy ˛ i ich wpływ obejmował jeden punkt w programie. Do realizacji eksperymentów wykorzystano skrypt injector z pakietu FlowGraph. W eksperymentach wykorzystano wszystkie badane programy. Aplikacje uruchamiano stosujac: ˛ — pierwszy zbiór danych uczacych, ˛ ponieważ były to dane wejściowe znane na etapie 129 wykrywania asercji dla wszystkich zbiorów asercji ze śladem zwiazanych ˛ odpowiednia˛ z liczba˛ zbiorów uczacych, ˛ — nieznany na etapie wykrywania asercji losowy zbiór danych wejściowych. Sumaryczne wyniki naruszeń asercji w przypadku zakłóconych wartości zmiennych przy zastosowaniu danych wejściowych wykorzystanych w fazie nauki zebrano w tabeli 5.20. W każdej komórce tabeli podano procentowy udział uruchomień programów zakończonych wykryciem wprowadzonego bł˛edu w stosunku do wszystkich uruchomień badanych programów. Wyniki przedstawiono dla różnych zakresów obszaru zakłóceń zmiennych (kolumny 1–1, 1–2, 1–4, 1–8, 1–16, 1–32) oraz zestawów asercji o określonych długościach śladów l P znalezionych po zastosowaniu danej liczby zbiorów trenujacych ˛ k. W ostatniej kolumnie podano wynik dla wszystkich zakresów obszaru zakłóceń zmiennych. W każdym z eksperymentów wykonano w sumie około dwóch milionów uruchomień badanych implementacji. Analogiczne wyniki dla nieznanego w fazie nauki zbioru danych wejściowych przedstawia tabela 5.21. Analiza otrzymanych wyników wskazuje, że stosowanie coraz wi˛ekszego zakresu zakłócania zmiennych skutkuje wi˛eksza˛ liczba˛ bł˛edów wykrywanych przez asercje. Wartości te rosna˛ od około 8% dla obszaru 1–1 do 24% dla obszaru 1–32. Analogiczny efekt powoduje stosowanie asercji z wi˛eksza˛ długościa˛ śladu - wartości rosna˛ o około od trzech punktów procentowych dla obszaru 1–1 do jednego punktu procentowego dla obszaru 1–32 wraz ze zwi˛ekszajacymi ˛ si˛e długościami śladu l. Liczba obserwowanych naruszeń jest wi˛eksza przy zastosowaniu danych wejściowych nieznanych w trakcie nauki. Jest to wynikiem dodatkowych nieprawidłowych naruszeń omawianych w poprzednim punkcie. Różnica ta jest jednak wi˛eksza niż obserwowane wcześniej nieprawidłowe naruszenia (punkt 5.2.5, tabela 5.19). Jest to spowodowane wpływem stosowanych zakłóceń. Podobnie jak w przypadku fałszywych alarmów asercji wraz ze wzrostem długości śladu l obserwowany jest coraz wi˛ekszy przyrost zgłaszanych naruszeń. Wynosi on od dwóch do ośmiu punktów procentowych dla k = 1 i maleje do kilku setnych punktu procentowego dla k = 32. Porównujac ˛ ogólna˛ liczb˛e nieprawidłowych naruszeń asercji przedstawionych w punkcie 5.2.5 z naruszeniami asercji spowodowanymi bł˛edami podczas wykonania programu dla danych wejściowych nieznanych w fazie nauki zauważalna jest istotna różnica w ich liczbie. Przykładowo, dla k = 1 i l = 8 wartości wynosza˛ odpowiednio 0,69% i 14,67%, dla k = 32 i l = 8 – 0,02% i 14,24%. Istotne różnice świadcza˛ o dobrej jakości wykrywanych asercji mimo stosowania ograniczonej liczby zbiorów trenujacych. ˛ Może to pozwolić na rozróżnienie czy naruszenia asercji sa˛ wynikiem ich niedoskonałości czy też pojawiajacych ˛ si˛e bł˛edów. Sposób ten był z powodzeniem używany przy zastosowaniu asercji w systemie nadzoru transportu (punkt 6.2). 130 a b l 1–1a 1–2 1–3 1–4 1–8 1–16 1–32 P k=1 0 1 2 3 4 5 6 7 8 8,10b 9,34 10,10 10,03 10,27 10,27 10,37 10,57 10,55 8,61 9,57 10,35 10,49 10,55 10,62 10,80 10,87 10,88 8,59 9,80 10,50 10,64 10,73 10,83 11,15 11,15 11,29 8,85 10,10 10,97 11,13 11,31 11,50 11,74 11,83 12,00 11,10 12,63 13,33 13,50 13,63 13,79 14,13 14,04 14,04 17,54 18,42 18,86 19,06 19,43 19,31 19,40 19,38 19,46 23,46 23,91 24,35 24,33 24,45 24,40 24,52 24,53 24,46 12,32 13,39 14,06 14,17 14,34 14,39 14,59 14,62 14,67 k=2 0 1 2 3 4 5 6 7 8 7,88 9,00 9,85 9,87 10,02 10,12 10,09 10,25 10,30 8,15 9,25 10,04 10,01 10,19 10,21 10,40 10,48 10,53 8,29 9,62 10,19 10,30 10,51 10,49 10,79 10,85 11,07 8,60 9,90 10,78 10,98 11,14 11,26 11,45 11,54 11,85 11,09 12,46 13,31 13,38 13,66 13,63 13,77 14,02 13,96 17,40 18,28 18,94 19,07 19,02 19,27 19,37 19,26 19,46 23,45 23,89 24,18 24,16 24,42 24,33 24,50 24,42 24,56 12,12 13,20 13,90 13,97 14,14 14,19 14,34 14,40 14,53 k=3 0 1 2 3 4 5 6 7 8 7,80 8,95 9,72 9,67 9,88 9,89 9,91 10,08 10,15 7,99 9,09 9,96 9,98 10,10 10,12 10,21 10,40 10,50 8,25 9,32 10,19 10,35 10,42 10,50 10,69 10,74 10,93 8,58 9,73 10,71 10,89 10,98 11,19 11,52 11,64 11,69 11,01 12,30 13,22 13,32 13,54 13,55 13,88 13,86 13,87 17,46 18,29 18,86 18,81 18,95 19,27 19,35 19,37 19,31 23,37 23,77 24,22 24,28 24,26 24,41 24,55 24,51 24,54 12,07 13,06 13,84 13,90 14,02 14,13 14,30 14,37 14,43 k=4 0 1 2 3 4 5 6 7 8 7,84 8,92 9,64 9,74 9,79 9,96 10,03 9,89 9,99 8,05 9,02 9,88 9,78 10,04 10,00 10,21 10,34 10,48 8,16 9,38 10,12 10,32 10,32 10,46 10,70 10,79 10,93 8,59 9,79 10,61 10,80 10,99 11,16 11,31 11,51 11,73 11,09 12,23 13,23 13,25 13,45 13,63 13,75 13,96 13,87 17,35 18,39 18,86 18,93 19,01 19,18 19,17 19,35 19,47 23,54 23,92 24,12 24,00 24,22 24,30 24,46 24,54 24,60 12,08 13,09 13,77 13,83 13,97 14,09 14,22 14,34 14,43 k=8 0 1 2 3 4 5 6 7 8 7,72 8,88 9,68 9,60 9,76 9,83 9,88 9,95 10,02 8,00 9,02 9,78 9,95 9,97 10,01 10,25 10,30 10,43 8,22 9,36 10,04 10,09 10,20 10,32 10,57 10,60 10,82 8,47 9,67 10,49 10,74 10,85 11,15 11,26 11,35 11,52 11,00 12,33 13,00 13,17 13,31 13,51 13,61 13,81 13,81 17,41 18,25 18,69 18,82 19,13 19,14 19,26 19,34 19,42 23,22 23,94 24,06 24,44 24,41 24,35 24,09 24,35 24,53 12,00 13,06 13,67 13,82 13,94 14,04 14,13 14,24 14,36 k = 16 0 1 2 3 4 5 6 7 8 7,67 8,75 9,53 9,44 9,55 9,69 9,76 9,77 9,81 7,96 9,00 9,76 9,79 9,88 9,90 10,05 10,17 10,33 8,23 9,21 10,06 10,01 10,10 10,13 10,48 10,45 10,73 8,47 9,64 10,51 10,86 10,82 11,03 11,18 11,31 11,45 10,96 12,25 12,96 13,17 13,34 13,47 13,53 13,74 13,71 17,20 18,14 18,66 18,70 19,12 19,16 19,12 19,31 19,26 23,46 23,96 24,18 24,12 24,15 24,27 24,40 24,36 24,50 11,99 12,99 13,67 13,73 13,85 13,95 14,08 14,16 14,26 k = 32 0 1 2 3 4 5 6 7 8 7,69 8,73 9,44 9,51 9,56 9,71 9,67 9,81 9,82 7,89 8,88 9,82 9,82 9,93 9,92 10,02 10,21 10,26 8,15 9,22 9,95 10,11 10,18 10,27 10,35 10,53 10,81 8,45 9,57 10,39 10,57 10,74 10,92 11,13 11,27 11,39 10,86 12,25 13,04 13,11 13,26 13,42 13,51 13,71 13,70 17,47 18,13 18,62 18,74 18,95 19,20 19,14 19,17 19,25 23,39 23,76 24,06 24,23 24,30 24,22 24,27 24,33 24,45 11,99 12,94 13,62 13,73 13,85 13,95 14,01 14,15 14,24 obszar obejmowany zakłóceniem liczony od najmłodszego bitu wartości podano w procentach Tabela 5.20. Rozkład wykrytych zakłóceń dla znanego przebiegu programu w ogólnej liczbie zakłóceń danego rodzaju dla różnej liczby wykorzystanych zbiorów uczacych ˛ 131 a b l 1–1a 1–2 1–3 1–4 1–8 1–16 1–32 P k=1 0 1 2 3 4 5 6 7 8 10,24b 15,09 16,83 17,34 18,12 19,20 20,59 22,18 23,81 10,70 15,47 17,08 17,73 18,47 19,57 21,02 22,49 24,37 10,86 15,55 17,26 18,01 18,77 19,77 21,21 22,79 24,68 11,08 16,01 17,82 18,39 19,24 20,53 21,96 23,58 25,28 13,51 18,46 20,15 20,81 21,62 22,74 24,24 25,76 27,51 19,86 24,19 25,69 26,03 27,32 28,37 29,59 31,03 32,81 25,89 29,69 30,95 31,57 32,38 33,28 34,61 36,19 37,75 14,60 19,17 20,64 20,89 21,19 21,41 21,79 22,04 22,31 k=2 0 1 2 3 4 5 6 7 8 8,60 13,38 14,42 14,76 15,37 16,10 16,75 17,77 18,88 8,98 13,57 14,58 15,13 15,61 16,30 17,12 18,19 19,20 9,18 13,77 14,83 15,18 15,87 16,52 17,42 18,35 19,40 9,48 14,16 15,41 15,75 16,38 17,26 18,06 19,17 20,41 11,98 16,74 17,81 18,28 18,71 19,54 20,41 21,54 22,47 18,32 22,63 23,44 23,91 24,37 25,16 25,90 26,79 28,03 24,28 28,16 28,64 29,17 29,74 30,32 30,96 31,80 33,07 12,97 17,47 18,35 18,56 18,76 19,00 19,20 19,43 19,69 k=3 0 1 2 3 4 5 6 7 8 7,91 12,61 13,50 13,56 14,11 14,55 15,17 15,83 16,69 8,08 12,78 13,78 13,92 14,25 14,91 15,33 16,12 17,06 8,37 12,88 14,00 14,21 14,52 15,18 15,80 16,64 17,41 8,70 13,41 14,42 14,62 15,15 15,81 16,34 17,29 18,25 11,12 15,87 16,83 17,07 17,58 18,08 18,68 19,55 20,33 17,49 21,83 22,46 22,59 23,23 23,74 24,25 24,96 25,68 23,61 27,31 27,86 28,02 28,38 28,89 29,36 29,94 30,91 12,18 16,67 17,53 17,60 17,83 18,08 18,24 18,42 18,59 k=4 0 1 2 3 4 5 6 7 8 7,70 12,55 13,41 13,42 14,00 14,28 14,76 15,33 15,96 7,99 12,68 13,54 13,77 14,05 14,58 15,01 15,53 16,39 8,28 12,82 13,94 14,01 14,32 14,76 15,40 16,07 16,73 8,66 13,25 14,31 14,41 15,02 15,56 16,01 16,80 17,41 11,04 15,70 16,72 17,00 17,25 17,79 18,34 19,03 19,68 17,33 21,80 22,17 22,62 22,94 23,39 23,92 24,51 25,14 23,60 27,36 27,79 27,91 28,36 28,65 28,97 29,57 30,36 12,08 16,58 17,38 17,49 17,70 17,88 18,05 18,22 18,37 k=8 0 1 2 3 4 5 6 7 8 7,72 8,95 9,66 9,74 9,92 10,12 10,20 10,49 10,78 8,07 9,12 10,02 10,08 10,18 10,15 10,54 10,90 11,21 8,24 9,31 10,15 10,25 10,37 10,57 10,93 11,24 11,48 8,53 9,77 10,63 10,75 11,02 11,34 11,67 11,96 12,37 10,89 12,21 13,13 13,25 13,37 13,76 13,95 14,45 14,79 17,43 18,10 18,83 18,98 18,94 19,34 19,65 19,84 19,90 23,32 23,84 24,13 24,49 24,35 24,38 24,93 24,93 25,12 12,04 13,05 13,80 13,94 14,00 14,16 14,39 14,52 14,62 k = 16 0 1 2 3 4 5 6 7 8 7,75 8,81 9,55 9,61 9,75 9,78 9,97 10,05 10,19 8,02 9,09 9,75 9,84 9,93 10,1 10,15 10,44 10,69 8,22 9,21 10,01 10,21 10,30 10,41 10,55 10,79 11,03 8,39 9,65 10,53 10,75 10,93 11,15 11,28 11,58 11,78 10,98 12,20 13,16 13,21 13,52 13,44 13,83 13,92 14,19 17,28 18,46 18,87 18,99 18,97 19,31 19,42 19,49 19,68 23,38 24,13 24,27 24,34 24,37 24,59 24,64 24,73 24,61 12,00 13,08 13,73 13,85 13,96 14,08 14,22 14,33 14,41 k = 32 0 1 2 3 4 5 6 7 8 7,70 8,89 9,46 9,54 9,62 9,74 9,89 9,93 10,08 7,95 8,91 9,74 9,86 9,98 10,02 10,12 10,35 10,49 8,24 9,21 10,07 10,10 10,25 10,41 10,37 10,69 10,91 8,46 9,62 10,42 10,72 10,91 11,18 11,28 11,38 11,59 10,83 12,19 13,15 13,17 13,42 13,51 13,82 13,77 13,95 17,28 18,27 18,86 18,86 19,07 19,27 19,21 19,37 19,29 23,34 23,90 24,26 24,08 24,29 24,36 24,65 24,48 24,62 11,97 13,00 13,71 13,77 13,93 14,06 14,17 14,26 14,35 obszar obejmowany zakłóceniem liczony od najmłodszego bitu wartości podano w procentach Tabela 5.21. Rozkład wykrytych zakłóceń dla nieznanego przebiegu programu w ogólnej liczbie zakłóceń danego rodzaju dla różnej liczby wykorzystanych zbiorów uczacych ˛ 132 Rezultaty dla eksperymentów, w których symulowano zakłócenie przebiegu wykonania programu poprzez usuwanie punktu obserwacji z rejestrowanego śladu wykonania przy znanych w fazie nauki danych wejściowych przedstawia tabela 5.22. W każdej komórce tabeli podano łaczny ˛ rezultat dla wszystkich badanych implementacji określajacy ˛ udział uruchomień programów zakończonych wykryciem zakłócenia w stosunku do wszystkich uruchomień programów w rozdzieleniu na stosowane zestawy asercji znane po określonej liczbie zbiorów uczacych ˛ k i długości śladów asercji l. Z powodu wykrywania bł˛edów wykrytych przez asercje o krótszym śladzie również przez asercje ze śladem dłuższym wyniki podano w sposób przyrostowy. Oznacza to, że na przykład udział wykrytych bł˛edów dla asercji ze śladem o długości trzech punktów jest suma˛ udziału wykrytych bł˛edów dla asercji bez zastosowanego śladu do śladu o długości trzech punktów. Taki sposób przedstawienia wyników pozwala na obserwacj˛e zysku przy wydłużeniu śladu o jeden punkt. W każdym z eksperymentów wykonano w sumie około pi˛ećdziesi˛eciu tysi˛ecy uruchomień badanych programów. Analogiczne wyniki dla nieznanego w fazie nauki zbioru danych wejściowych zebrano w tabeli 5.23. k l 1 0 0,00a 1 19,01 2 16,88 3 5,90 4 4,08 5 0,27 6 0,24 7 0,18 8 0,34 a 2 3 4 8 16 32 0,00 19,34 17,40 5,73 4,04 0,29 0,23 0,18 0,35 0,00 19,22 17,44 5,62 4,22 0,32 0,22 0,16 0,36 0,00 19,10 17,74 5,45 4,15 0,29 0,21 0,14 0,40 0,00 19,13 17,28 5,77 4,18 0,30 0,27 0,12 0,49 0,00 19,20 17,18 5,83 4,17 0,34 0,27 0,15 0,39 0,00 19,12 17,69 5,47 4,10 0,31 0,20 0,13 0,51 wartości podano w procentach Tabela 5.22. Rozkład wykrytych zakłóceń w przebiegu programu dla znanego zbioru danych wejściowych w ogólnej liczbie zakłóceń dla różnej liczby wykorzystanych zbiorów uczacych ˛ Przeważajacy ˛ wzrost liczby wykrytych bł˛edów obserwowany jest dla śladów o długości jednego i dwóch punktów. Odpowiednio wynosi on około dziewi˛etnaście i siedemnaście punktów procentowych. Dla śladów o długości trzech i czterech punktów jest on już ponad czterokrotnie mniejszy, a dla wi˛ekszych długości staje si˛e pomijalny. Ogólny udział wykrytych zakłóceń dla asercji o długości czterech punktów kształtuje si˛e na poziomie około 45% (suma wykrytych zakłóceń dla l = 1 . . . 4). Zwi˛ekszanie liczby zbiorów uczacych ˛ skutkuje w wi˛ekszości przypadków wzrostem liczby wykrywanych bł˛edów, jednak jest to wpływ niewielki, rz˛edu dziesiatych ˛ cz˛eści punktu procentowego. Świadczy to o niewielkim przyroście asercji uwzgl˛edniajacych ˛ nowe ślady wykonania po zastosowaniu kolejnych zbiorów trenujacych. ˛ Wyst˛epujace ˛ spadki można uznać za wyjatki ˛ b˛edace ˛ skutkiem losowego wprowadzania bł˛edów do aplikacji. 133 k l 1 a 0 0,00 1 20,27 2 16,81 3 4,68 4 4,04 5 0,33 6 0,24 7 0,21 8 0,42 a 2 3 4 8 16 32 0,00 20,31 17,62 4,79 4,05 0,35 0,24 0,20 0,40 0,00 20,13 17,36 5,14 4,09 0,31 0,24 0,17 0,38 0,00 19,73 17,60 5,05 4,20 0,37 0,25 0,15 0,45 0,00 19,04 17,49 5,88 4,22 0,30 0,23 0,14 0,51 0,00 19,31 17,42 5,71 4,06 0,28 0,22 0,17 0,59 0,00 19,06 17,44 5,82 4,17 0,33 0,25 0,12 0,44 wartości podano w procentach Tabela 5.23. Rozkład wykrytych zakłóceń w przebiegu programu dla nieznanych zbiorów danych wejściowych w ogólnej liczbie zakłóceń dla różnej liczby wykorzystanych zbiorów uczacych ˛ Różnice obserwowane pomi˛edzy tabela˛ 5.22 a 5.23 nie wykazuja˛ określonego trendu. Można je uznać za fluktuacje b˛edace ˛ nast˛epstwem losowego charakteru zakłóceń. Oznacza to, że przebieg działania badanych aplikacji, mimo stosowania różnych danych wejściowych, jest podobny. 5.2.7. Operacje na asercjach ze śladem Na wykrytych zbiorach asercji ze śladem wykonano algorytmy zaproponowane w rozdziale czwartym. Wykorzystana została ich implementacja zrealizowana w pakiecie FlowGraph. W tabeli 5.24 przedstawione zostały łacznie ˛ liczby stosowanych śladów dla wszystkich punktów programu przed (n) i po (n0 ) zastosowaniu algorytmu redukcji liczby śladów (algorytm 4.1). W ostatniej kolumnie dla każdej z badanych implementacji podano wyrażony w procentach spadek liczby stosowanych śladów wyliczony jako n−n0 . n Wyniki rozdzielono wzgl˛edem stosowanych wielkości zbiorów uczacych ˛ s oraz długości śladów wykrytych asercji l. W każdym przypadku osiagni˛ ˛ ety spadek liczby stosowanych śladów wynosi ponad 50%. Wynika to z typu wykrywanych asercji. Dla każdej ze zmiennych wykryte były zawsze dwie asercje o tym samym śladzie, co spowodowało redukcj˛e ich liczby o co najmniej połow˛e. Dodatkowy spadek wynika z wi˛ekszej liczby zmiennych w danym punkcie obserwacji, których ślady wykrytych asercji ze śladem mogły zostać połaczone. ˛ Tabela 5.25 zawiera procentowy spadek łacznej ˛ długości wszystkich stosowanych śladów dla badanych implementacji w wyniku zastosowania algorytmu skracania śladów (algorytm 4.2). W zależności od badanej biblioteki osiagni˛ ˛ eto spadek łacznej ˛ długości stosowanych śladów od około 14% do 76%. Pozwala to na zmniejszenie rozmiaru aplikacji z uwagi na mniejsza˛ liczb˛e punktów obserwacji przechowywanych w śladach asercji. Spadek łacznej ˛ długości śladów rośnie wraz ze wzrostem ich długości. Różnice obserwowane dla różnej wielkości stosowanych zbiorów uczacych ˛ s wynosza˛ do dwóch punktów procentowych. 134 JZlib n0 n % n n0 % s = 512 % 0 1 2 3 4 5 6 7 8 460 203 878 382 1182 510 1444 615 1694 720 1980 850 2294 991 2630 1132 3012 1296 55,87 252 110 56,49 560 242 56,85 852 370 57,41 1098 489 57,50 1352 593 57,07 1596 641 56,80 1876 791 56,96 2142 901 56,97 2472 1048 56,35 144 60 56,79 340 146 56,57 510 218 55,46 646 282 56,14 784 350 59,84 944 427 57,84 1154 518 57,94 1382 623 57,61 1638 738 58,33 57,06 57,25 56,35 55,36 54,77 55,11 54,92 54,95 s = 1024 n0 0 1 2 3 4 5 6 7 8 460 202 878 380 1184 514 1452 610 1712 728 2012 841 2342 1002 2710 1129 3124 1289 56,09 252 108 56,72 560 238 56,59 858 362 57,99 1122 470 57,48 1384 581 58,20 1640 689 57,22 1934 810 58,34 2236 947 58,74 2580 1076 57,14 142 59 57,50 344 146 57,81 510 216 58,11 656 280 58,02 788 346 57,99 946 422 58,12 1154 512 57,65 1374 612 58,29 1618 721 58,45 57,56 57,65 57,32 56,09 55,39 55,63 55,46 55,44 s = 2048 n bzip2 0 1 2 3 4 5 6 7 8 460 203 878 381 1184 513 1454 615 1714 721 2022 856 2368 987 2760 1118 3198 1284 55,87 252 110 56,61 560 238 56,67 860 363 57,70 1122 471 57,93 1380 578 57,67 1634 682 58,32 1926 810 59,49 2232 937 59,85 2590 1078 56,35 144 60 57,50 340 146 57,79 508 217 58,02 658 283 58,12 808 353 58,26 966 429 57,94 1174 519 58,02 1399 622 58,38 1648 734 58,33 57,06 57,28 56,99 56,31 55,59 55,79 55,54 55,46 s = 4096 l jazzlib 0 1 2 3 4 5 6 7 8 460 203 878 384 1186 512 1456 614 1716 732 2016 863 2338 1007 2696 1149 3108 1313 55,87 252 109 56,26 562 239 56,83 866 359 57,83 1142 469 57,34 1426 601 57,19 1706 720 56,93 2018 842 57,38 2344 980 57,75 2720 1124 56,75 57,47 58,55 58,93 57,85 57,80 58,28 58,19 58,68 59,09 57,73 57,94 57,53 56,95 56,83 57,07 57,04 57,31 154 362 554 730 906 1112 1358 1634 1956 63 153 233 310 390 480 583 702 835 Tabela 5.24. Zmiana liczby stosowanych śladów we wszystkich punktach obserwacji po zastosowaniu algorytmu 4.1 redukcji liczby śladów 135 JZlib jazzlib bzip2 l % % % s = 512 1 2 3 4 5 6 7 8 0,00 19,61 22,49 30,56 38,02 47,11 58,05 64,71 0,00 14,32 26,84 42,49 56,00 61,82 69,57 75,46 0,00 33,24 40,66 47,32 52,67 59,07 66,34 75,34 s = 1024 1 2 3 4 5 6 7 8 0,00 19,84 21,04 30,29 38,36 46,57 58,00 65,07 0,00 14,74 27,66 43,20 56,01 62,08 70,46 76,26 0,00 33,33 40,85 47,30 52,47 58,78 66,25 75,36 s = 2048 1 2 3 4 5 6 7 8 0,00 19,88 22,49 30,51 37,34 48,40 58,70 64,93 0,00 14,88 27,99 43,50 57,10 62,72 70,98 76,34 0,00 33,27 41,29 46,66 52,46 59,28 66,40 75,34 s = 4096 1 2 3 4 5 6 7 8 0,00 19,92 22,37 31,28 38,59 46,74 57,86 64,55 0,00 14,90 27,00 42,95 57,73 63,64 70,79 76,91 0,00 33,57 39,18 46,80 53,90 59,88 67,26 75,45 Tabela 5.25. Procentowy spadek łacznej ˛ długości śladów dla wszystkich punktów obserwacji po zastosowaniu algorytmu 4.2 skracania śladów przed redukcja˛ po redukcji JZlib 194 34 jazzlib 161 33 bzip2 106 30 Tabela 5.26. Liczba stosowanych różnych identyfikatorów punktów obserwacji przed i po zastosowaniu algorytmu 4.3 redukcji identyfikatorów 136 W tabeli 5.26 przedstawiono poczatkow ˛ a˛ liczb˛e stosowanych identyfikatorów punktów obserwacji oraz uzyskana˛ w wyniku zastosowania algorytmu redukcji liczby identyfikatorów punktów programu w zbiorach asercji ze śladem (algorytm 4.3). Dla każdej implementacji zaobserwowano spadek liczby identyfikatorów. Do zakodowania poczatkowej ˛ liczby identyfikatorów dla implementacji JZlib oraz jazzlib należałoby zastosować co najmniej 8 bitów, dla implementacji bzip2 co najmniej 7 bitów. W wyniku redukcji liczby identyfikatorów punktów obserwacji liczba bitów potrzebnych do kodowania jest mniejsza o 3 bity dla każdej z implementacji. 5.2.8. Wnioski Przedstawione rezultaty pozwalaja˛ na stwierdzenie, iż mimo niedoskonałości znalezionych asercji, która jest skutkiem stosowania ograniczonego zbiór danych trenujacych ˛ i przejawia si˛e zgłaszaniem fałszywych alarmów przez asercje ze śladem (punkt 5.2.5) możliwe jest wykrycie nieprawidłowego zachowania aplikacji, które jest skutkiem wystapienia ˛ w niej bł˛edów prowadzacych ˛ do zakłócenia w śladzie wykonania lub wartości zmiennych programu (punkt 5.2.6). Najcz˛eściej nast˛epuje w takich przypadkach istotny wzrost udziału naruszeń asercji w ogólnej liczbie ich sprawdzeń, co może być przesłanka˛ do wniosku o jej nieprawidłowym zachowaniu. Zastosowanie modyfikacji algorytmów wykrywajacych ˛ asercje w programach poprzez uzależnienie wykrywanych asercji od śladu wykonania pozwala na podwyższenie poziomu detekcji bł˛edów z ich użyciem. Na podstawie przeprowadzonych eksperymentów wzrost ten wyniósł od kilku do 130%, przy procentowym udziale wykrytych bł˛edów w zakresie od 8% do 37% (punkt 5.2.6, tabele 5.20 i 5.21) oraz stopie fałszywych alarmów wynoszacej ˛ do 0,7% (punkt 5.2.5, tabela 5.19). 137 6. Zastosowania W niniejszym rozdziale przedstawiono wybrane obszary zastosowań opisanej w rozdziale trzecim metody selekcji asercji oraz specjalizacji wykrywanych asercji poprzez wykorzystanie asercji ze śladem zaprezentowanej w rozdziale czwartym. W pierwszej cz˛eści skupiono si˛e na analizie możliwości rozszerzenia istniejacych ˛ systemów wykrywania asercji o nowe funkcje oraz na wykorzystaniu zaproponowanych metod w zastosowaniach takich jak lokalizacja bł˛edów w oprogramowaniu, automatycznej detekcji anomalii w działaniu programów czy też wspomaganiu pracy programisty, analityka lub użytkownika systemów. W drugiej cz˛eści rozdziału przedstawiono raport z zastosowania pakietu FlowGraph (dodatek A.2) w detekcji i lokalizacji bł˛edów wyst˛epujacych ˛ w systemie nadzoru transportu. 6.1. Wybrane obszary zastosowań 6.1.1. Systemy wykrywania asercji Istniejace ˛ systemy wykrywajace ˛ asercje w programach (rozdział drugi), takie jak pakiet Daikon [33, 66], DIDUCE [44] czy AgitarOne [95], moga˛ zostać rozszerzone o możliwość obserwacji śladu wykonania badanych aplikacji oraz takiej klasyfikacji kolekcjonowanych danych, aby wykrywane były asercje ze śladem (punkt 4.4). Dodanie takich funkcji nie powinno być operacja˛ trudna,˛ a tym bardziej nie wymagajac ˛ a˛ istotnej modyfikacji struktury istniejacych ˛ systemów. Obserwacja pojedynczego punktu programu, jaka ma miejsce przy wykrywaniu asercji w nim spełnionych, powinna zostać zastapiona ˛ obserwacja˛ punktu programu zależna˛ od jego przebiegu w wyznaczonej długości. Implementacje algorytmów wykrywajacych ˛ asercje na zmiennych programu w określonym jego punkcie pozostaja˛ niezmienione. Korzystaja˛ one jedynie z innego zestawu zebranych danych, rozdzielonych w zależności od przebiegu programu. W systemach wykrywania asercji zaimplementowane moga˛ zostać również algorytmy redukcji liczby śladów w zbiorze asercji ze śladem (punkt 4.4.1), skracania śladów w zbiorze asercji ze śladem (punkt 4.4.2) oraz redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem (punkt 4.5.1). Dzi˛eki temu przedstawiony jako wynik zbiór asercji ze śladem może być wst˛epnie przygotowany do dalszego wykorzystania. Uzupełnienie systemów wykrywania asercji o możliwość wykrywania asercji ze śladem przy ustalonej długości śladu nie wpłynie w sposób istotny na czas wykrywania asercji mimo iż ich liczba może być dużo wi˛eksza. Zmniejsza si˛e jednak ilość danych przeznaczonych do analizy na cele wykrycia 139 pojedynczej asercji. Wykrywanie asercji dla różnych długości śladów, w zależności od ich typu, może sprowadzać si˛e do łaczenia ˛ odpowiednich asercji znalezionych w asercjach ze śladem o dłuższym śladzie lub konieczności ponownej analizy wszystkich danych zebranych dla danego śladu. Określenie, pomiar i analiza wybranych parametrów asercji (punkt 3.2) oraz wybór podzbioru asercji poprzez optymalizacj˛e jego parametrów wzgl˛edem określonych kryteriów (punkt 3.3) może również stać si˛e cz˛eścia˛ implementacji systemów wykrywania asercji. Operacja ta może być przeprowadzona w końcowej fazie działania, kiedy eliminowane sa˛ asercje, które po uwzgl˛ednieniu pewnych kryteriów uznawane sa˛ za nadmiarowe. Wymagane jest jednak określenie pewnego zbioru testów na podstawie którego dokonana zostanie analiza parametrów znalezionych asercji. Wszystkie wykryte asercje moga˛ zostać automatycznie wprowadzone do badanego programu i po wykonaniu testów przeprowadzona zostać może faza ich selekcji. Operacje takie realizowane sa˛ przez pakiet AEM (dodatek A.1). Rozszerzenie systemów wykrywania asercji o automatyczny etap przeprowadzenia testów (punkt 5.1.3) na cele optymalizacji w istotny sposób wpłynie na czas działania tych systemów z uwagi na czasochłonność zwiazan ˛ a˛ z przeprowadzeniem odpowiedniej liczby testów. 6.1.2. Detekcja bł˛edów w programach Asercje wykryte automatycznie i wprowadzone do programu umożliwiaja˛ detekcj˛e nie tylko bł˛edów programowych, ale również powstałych na skutek niestabilności pracy wykorzystywanego sprz˛etu, systemu operacyjnego, środowiska, zastosowanej konfiguracji czy też powstałych w wyniku interakcji z innymi modułami. Bł˛edy takie wprowadzano do programów badanych w punkcie 5.1 i zastosowane tam asercje umożliwiały ich detekcj˛e. W zależności od rodzaju wykrytego bł˛edu asercje moga˛ nie tylko przerywać działanie programu, ale również skutkować wywołaniem procedury majacej ˛ na celu podj˛ecie akcji awaryjnej, jak na przykład próba naprawy konfiguracji. 6.1.3. Lokalizacja bł˛edów w programach Stosowanie wykrytych asercji we wczesnej fazie testowania oprogramowania umożliwia wykrycie oraz lokalizacj˛e potencjalnych bł˛edów w tworzonym oprogramowaniu. Szczególne przydatne moga˛ być asercje ze śladem ze wzgl˛edu na możliwość określenia bardziej szczegółowych warunków, w których doszło do naruszenia asercji. Ponadto asercje, które wykryte zostaja˛ w uzależnieniu od przebiegu programu, charakteryzuja˛ si˛e wi˛eksza˛ specjalizacja˛ co cz˛esto przekłada si˛e na wi˛eksze pokrycie bł˛edów, jakie moga˛ pojawić si˛e podczas jego wykonania (punkt 5.2). Na etapie produkcyjnego stosowania aplikacji, w której wprowadzono weryfikacj˛e asercji ze śladem, dane o jej naruszeniu moga˛ umożliwić określenie bardziej 140 szczegółowych warunków oraz przyczyny naruszenia jakie zostało zaobserwowane [51]. Zastosowanie takie przedstawiono w punkcie 6.2. 6.1.4. Detekcja anomalii w działaniu programów Użycie asercji ze śladem może być przydatne w systemach przetwarzajacych ˛ dane w pewien określony, stały sposób. Uzależnienie asercji jakie wykryte moga˛ zostać w przetwarzanym zbiorze danych od śladu wykonania może pozwolić na wczesna˛ detekcj˛e anomalii podczas jego działania, charakteryzujac ˛ a˛ si˛e na przykład znaczacym ˛ wzrostem naruszeń asercji (punkt 5.2.6). Dynamiczne wykrywanie i wykorzystanie asercji, w szczególności asercji ze śladem może zostać zintegrowane z badanym programem poprzez odpowiedni moduł b˛edacy ˛ jego cz˛eścia˛ lub aplikacj˛e monitorujac ˛ a.˛ Przykładem takiego narz˛edzia jest pakiet FlowGraph (dodatek A.2). W poczatkowej ˛ fazie działania programu moduł ten przetwarza określone dane pozyskiwane z programu wykrywajac ˛ i przechowujac ˛ określone asercje. W kolejnej fazie naruszenia znalezionych asercji moga˛ być raportowane jako wykryte anomalie w działaniu programu, a sam moduł może nadal modyfikować znalezione asercje ze wzgl˛edu na nowo otrzymane dane lub bazować na znalezionych już asercjach. Zakres wykrywanych asercji może być zróżnicowany i uzależniony od rodzaju badanej aplikacji. Ze wzgl˛edu na charakter działania wykrywane asercje powinny należeć do takiej grupy, dla której możliwe jest znalezienie i modyfikacja w trybie rzeczywistym. 6.1.5. Wspomaganie pracy programisty/analityka/użytkownika Dynamiczne wykrywanie asercji podczas rozwoju oprogramowania umożliwia programiście niezależna˛ weryfikacj˛e poprawności tworzonego kodu w odniesieniu do własności zmiennych jakie zostaja˛ wykryte. Niektóre ze znalezionych asercji pozwalaja˛ na szybkie wykrycie popełnionych bł˛edów lub eliminacj˛e drobnych nieścisłości, które moga˛ prowadzić do poważnych awarii w produkcyjnym działaniu aplikacji. Szczególna˛ rol˛e odgrywaja˛ tu asercje ze śladem, które moga˛ być trudne do bezpośredniego określenia przez programist˛e. Znalezione asercje moga˛ być szczególnie pomocne podczas analizy nieznanego oprogramowania. Prezentuja˛ one własności programu obowiazuj ˛ ace ˛ w trakcie jego działania i dzi˛eki temu umożliwiaja˛ szybsze powiazanie ˛ przegladanego ˛ kodu źródłowego z regułami biznesowymi. Asercje ze śladem, zawierajace ˛ dodatkowa˛ informacj˛e o przebiegu programu, pozwalaja˛ zrozumieć jego zachowanie oraz znaleźć zależności pomi˛edzy przebiegiem działania programu a regułami biznesowymi które dla danych przebiegów obowiazuj ˛ a.˛ Istotna˛ rol˛e odgrywać moga˛ metody wizualizacji asercji ze śladem omówione w punkcie 4.7. Wykrywane asercje moga˛ zostać wykorzystane podczas tworzenia poimplementacyjnej specyfikacji lub dokumentacji oprogramowania oraz na etapie jego implementacji poprzez 141 integracj˛e prezentowania wykrytych asercji w środowisku rozwoju aplikacji na przykład z użyciem pomocy kontekstowej. Obserwowane naruszenia asercji, rejestrowane na przykład w dzienniku działania aplikacji, moga˛ pomóc jej użytkownikom w efektywnym zgłaszaniu anomalii. 6.1.6. Systemy weryfikacji oprogramowania Systemy weryfikacji oprogramowania, wykorzystujace ˛ wykryte asercje w celu jego statycznej lub dynamicznej analizy moga˛ zostać rozszerzone o możliwość stosowania asercji ze śladem. W systemach, w których zaimplementowano już weryfikacj˛e asercji kontrolujacych ˛ przebieg programu konieczne jest umożliwienie sprawdzenia pewnego podzbioru asercji obowiazuj ˛ acego ˛ dla wybranego przebiegu. Można to osiagn ˛ ać ˛ poprzez połaczenie ˛ tych asercji w odpowiednim warunku logicznym lub poprzez zawarcie ich w bloku programu weryfikujacym ˛ asercje ze śladem w wybrany sposób. 6.1.7. Inne zastosowania Metoda selekcji asercji oraz wykorzystanie informacji jakie niosa˛ proponowane parametry asercji moga˛ zostać wykorzystane do analizy innych konstrukcji programowych, których celem jest w szczególności usuwanie awarii powstałych podczas działania programów. Modyfikacja pewnych elementów zaproponowanej metody poprzez wprowadzenie lub usuni˛ecie wybranych ograniczeń oraz parametrów pozwoli na zastosowanie jej dla pewnych specyficznych aplikacji, w których konieczne może być uwzgl˛ednienie dodatkowych własności badanych struktur programu jak na przykład wielkość dodatkowej pami˛eci operacyjnej jaka musi zostać zarezerwowana w celu ich wykonania. Idea asercji ze śladem oraz różnych sposobów ich weryfikacji (punkt 4.5) może zostać wykorzystana z innymi strukturami programowymi zast˛epujacymi ˛ lub uzupełniajacymi ˛ asercje w połaczeniu ˛ ze śladem wykonania programu. 6.2. System nadzoru transportu Aplikacja˛ komercyjna˛ działajac ˛ a˛ w środowisku produkcyjnym, dla której zastosowano oprogramowanie wykrywajace ˛ i weryfikujace ˛ asercje ze śladem opisane w dodatku A.2 w celu detekcji i lokalizacji bł˛edów, był system nadzoru transportu. Przeznaczony jest on do obserwacji przebiegu procedury transportu towarów obejmujacej ˛ akcje takie jak rejestracja towarów, wysyłka, dojazd, przejazd przez punkty pośrednie, kontrola tranzytu, zgłaszanie uwag, automatyczne informowanie zainteresowanych stron o przebiegu tranzytu oraz generowanie statystyk i raportów. System działa i jest dost˛epny w trybie ciagłym, ˛ wyłaczaj ˛ ac ˛ 142 sytuacje, gdy przeprowadzana jest jego aktualizacja lub wystapiła ˛ awaria krytyczna sprz˛etu lub oprogramowania. System jest stworzony w całości w j˛ezyku C. W ramach systemu udost˛epnione sa˛ poprzez infrastruktur˛e sieciowa˛ 34 serwisy. Określona przez producenta wartość TLOC (liczba linii kodu źródłowego) dla całości systemu wynosi 198792. Implementacja zawiera 138 plików źródłowych oraz 41 plików nagłówkowych. Jako punkty obserwacji wybrano wszystkie miejsca w systemie, które odkładaja˛ informacje do dziennika działania aplikacji. Zakres i charakter odkładanych informacji został określony przez producenta systemu. Sa˛ to w wi˛ekszości rejestracje wartości wybranych zmiennych w programie oraz informacje diagnostyczne. Wiele z wyznaczonych punktów raportuje informacje o wyniku działania wywoływanych funkcji. Liczba punktów obserwacji wynosi 6185. System przechowuje dane w zewn˛etrznej bazie danych. Klienci wykorzystuja˛ system poprzez zewn˛etrzna˛ aplikacj˛e korzystajac ˛ a˛ z usług udost˛epnionych przez serwisy. Aplikacja zewn˛etrzna nie podlegała obserwacji. Badane oprogramowanie w trakcie doby, która obejmuje dzień roboczy generuje od około 220 tysi˛ecy do 310 tysi˛ecy linii informacji diagnostycznych, które odpowiadaja˛ liczbie wizyt w punktach obserwacji. Jeżeli doba przypada na dzień wolny od pracy liczba linii informacji diagnostycznych jest wielokrotnie mniejsza i wynosi od około 15 tysi˛ecy do 20 tysi˛ecy. Wygenerowane informacje diagnostyczne były wst˛epnie przetworzone skryptem w celu przystosowania ich do formatu akceptowanego przez stosowane narz˛edzia z pakietu FlowGraph. W szczególności przetwarzanie dotyczyło rozdzielenia przeplatajacych ˛ si˛e informacji diagnostycznych z różnych procesów wywołanych przez niezależnych klientów lub przychodzace ˛ wiadomości. Takie sytuacje były traktowane jako analiza niepowiazanych ˛ ze soba˛ procesów w systemie. Do wygenerowania asercji ze śladem użyto informacji diagnostycznych z pełnego tygodnia działania systemu obejmujacego ˛ pi˛eć dni roboczych i dwa dni wolne od pracy. czasie nie zaobserwowano oznak wadliwego działania systemu. W tym Długość śladu ustalono arbitralnie na trzy. Wykrywano asercje jedynie dla wartości całkowitoliczbowych badajac ˛ zależność pomi˛edzy wartościa˛ zmiennej a liczba˛ 0. W otrzymanym modelu użyte zostały 5184 różne punkty obserwacji i wykryto 12903 asercje ze śladem. Założono, że wpis do pliku informacji diagnostycznych zawierajacy ˛ identyfikator punktu w programie jest punktem obserwacji. Zastosowane zostały jedynie punkty obserwacji wprowadzone przez twórców omawianego systemu. Poprzez analiz˛e plików z informacjami diagnostycznymi za pomoca˛ narz˛edzi z pakietu FlowGraph wygenerowano struktur˛e danych przechowujac ˛ a˛ wykryte asercje ze śladem. Była ona stosowana do obserwacji systemu jako narz˛edzie pomocnicze przez okres dwóch lat. W tym czasie w systemie zaobserwowano sześć awarii krytycznych (prowadzacych ˛ do braku 143 realizacji jakichkolwiek usług) oraz dziewi˛etnaście bł˛edów (system zachował si˛e niezgodnie ze specyfikacja). ˛ Zgłoszenia awarii krytycznych oraz bł˛edów przez klienta były realizowane niezależnie od stosowania do ich wykrycia omawianej metody. Klient nie miał dost˛epu do analiz przeprowadzanych przez pakiet FlowGraph. Podczas przetwarzania informacji diagnostycznych z systemu cz˛esto zdarzały si˛e sytuacje naruszeń asercji. W zależności od ilości danych diagnostycznych informacje o naruszeniach pojawiały si˛e średnio co kilkanaście minut. Sytuacje te były jednak ignorowane jeśli nie powtarzały si˛e one z duża˛ cz˛estotliwościa,˛ określana˛ w zależności od ilości spływajacych ˛ danych diagnostycznych i naruszeń asercji. Zakładano, że pojedyncze naruszenia asercji sa˛ fałszywymi alarmami. Sytuacj˛e uznawano za awaryjna,˛ kiedy wskutek dostarczania informacji diagnostycznych o kolejno osiaganych ˛ punktach obserwacji wi˛ekszość z nich prowadziła do naruszenia asercji ze śladem. Decyzja ta była jednak subiektywna i zależała od osoby obserwujacej ˛ informacje o naruszeniach asercji ze śladem. Dla pi˛eciu awarii krytycznych oraz czternastu bł˛edów (z ogólnej liczby zgłoszonych przez klienta) obserwowano tuż przed zgłoszeniem zauważalny przyrost naruszanych asercji ze śladem. W tym samym okresie zaobserwowano również około sześćdziesi˛eciu sytuacji, które sugerowały wystapienie ˛ awarii krytycznej lub bł˛edu, jednak po szczegółowej analizie okazywały si˛e poprawnym zachowaniem systemu. Każdorazowo po wystapieniu ˛ takiej sytuacji powtórnie przetwarzano informacje diagnostyczne z aktywna˛ opcja˛ aktualizacji struktury danych w pakiecie FlowGraph w celu zmiany oraz wykrycia nowych asercji ze śladem. Sytuacje te dotyczyły zazwyczaj rzadko wykorzystywanych funkcji systemu, które nie były użyte we wst˛epnej fazie wykrywania asercji ze śladem. Mimo to należy je zaliczyć do kategorii nieprawidłowych naruszeń asercji. Oznacza to, że około 25% sytuacji awaryjnych zostało wcześniej zarejestrowanych dzi˛eki monitorowaniu pracy aplikacji (dziewi˛etnaście potwierdzonych przez klienta przypadków na około osiemdziesiat ˛ alarmów sugerujacych ˛ awari˛e). W przypadku trzech awarii krytycznych oraz dwunastu bł˛edów punkty obserwacji, w których naruszane były asercje ze śladem były pośrednio zwiazane ˛ z punktem, gdzie wyst˛epował znaleziony wskutek analizy informacji diagnostycznych przez programist˛e bład ˛ implementacyjny. Dla dwóch awarii krytycznych przyczyna˛ było nieprawidłowe działanie komponentów zewn˛etrznych takich jak baza danych lub system operacyjny. w wi˛ekszości zwiazane ˛ były z obserwacja˛ nieprawidłowego śladu. Naruszenia Dla jednej z awarii krytycznych naruszenia dotyczyły wykrytej asercji i bezpośrednio wskazywały na obszar kodu źródłowego, w którym programista znalazł bład ˛ implementacyjny. Każdorazowo, po wprowadzeniu poprawek w systemie udoskonalano struktur˛e danych wygenerowana˛ przez FlowGraph poprzez przeanalizowanie danych diagnostycznych z aktualizacja˛ struktury danych przechowujacej ˛ asercje ze śladem z dwóch lub trzech dni roboczych. 144 W końcowym etapie w wygenerowanej strukturze danych użyte zostały 5502 różne punkty obserwacji i wykryto 13891 asercji ze śladem. Podsumowujac, ˛ zastosowanie asercji ze śladem umożliwiło stosunkowo szybka˛ lokalizacj˛e bł˛edów implementacyjnych przez programist˛e. W wi˛ekszości przypadków pozwoliło również na przygotowanie zespołu obsługujacego ˛ system do rejestracji zgłoszenia awarii krytycznej lub bł˛edu przez klienta. Można uznać, że dla omawianego systemu asercje ze śladem były przydatnym narz˛edziem dla dodatkowego monitorowania systemu mimo zdarzajacych ˛ si˛e fałszywych informacji o potencjalnej awarii krytycznej lub bł˛edzie. Nie było możliwości powtórzenia omawianego eksperymentu dla innych niż założone na poczatku ˛ parametry jak długość śladu i rodzaje wykrywanych asercji, ze wzgl˛edu na długi okres jego trwania oraz inne ograniczenia formalne w dost˛epie do informacji diagnostycznych z systemu. 145 7. Podsumowanie Praca dotyczy zagadnień wykrywania, oceny skuteczności oraz optymalizacji wykorzystania asercji w programach. W kontekście literatury dotyczacej ˛ przedmiotu badań zagadnienia te zostały omówione w punkcie 1.1. Treść rozdziału drugiego stanowi rozszerzone wprowadzenie do tematyki rozprawy. Teza oraz cel pracy zostały przedstawione w punkcie 1.2. Poniżej podsumowano najważniejsze osiagni˛ ˛ ecia autora. Oryginalna metoda selekcji i oceny asercji Opracowano algorytm selekcji asercji w programie z użyciem metod programowania liniowego (punkt 3.3) wykorzystujacy ˛ zdefiniowany przez autora zestaw parametrów pozwalajacych ˛ wyrazić mi˛edzy innymi skuteczność i nieskuteczność asercji w detekcji bł˛edów oraz szereg innych własności takich jak liczba sprawdzeń asercji, koszt statyczny, dynamiczny oraz zwiazany ˛ z lokalizacja˛ asercji w programie, czas detekcji bł˛edu, zaufanie do asercji oraz atrybuty i charakterystyki asercji (punkt 3.2). Usystematyzowano różnorodne kryteria zwiazane ˛ z wyborem zestawu asercji oraz zdefiniowano profile zachowania asercji w programach (punkt 3.2.9) w kontekście reakcji na wprowadzone bł˛edy. Opracowano również metod˛e weryfikacji oceny wkładu asercji do wykrywania bł˛edów (punkt 3.3.3). W końcowej cz˛eści rozdziału przedstawiono działanie metody selekcji asercji uwzgl˛edniajac ˛ przebieg kolejnych obliczeń (punkt 3.3.4). Wprowadzenie asercji ze śladem Metoda poprawy jakości asercji wykrywanych w sposób automatyczny poprzez uzależnienie ich od przebiegu wykonania programu została zaprezentowana w rozdziale czwartym. Wprowadzono w nim poj˛ecie asercji ze śladem (punkt 4.2), zaproponowano i omówiono algorytm ich wykrywania (punkt 4.4) oraz algorytmy optymalizujace ˛ ich użycie (algorytmy 4.1, 4.2 i 4.3) wraz z przykładem ich użycia (punkt 4.6). Przedstawione zostały również przykładowe techniki wizualizacji asercji ze śladem (punkt 4.7) i stosowania ich w programach (punkt 4.5). Omówiono możliwe sposoby rejestracji śladu (punkt 4.1.1). Opracowanie oryginalnej metody badań eksperymentalnych oraz oprogramowania wspomagajacego ˛ przeprowadzanie testów Metodyka prowadzenia badań oraz raport z wykonanych, złożonych eksperymentów wykorzystujacych ˛ zaproponowane algorytmy, zwiazane ˛ zarówno z metoda˛ selekcji asercji 147 jak i stosowania asercji ze śladem, przedstawione zostały w rozdziale piatym. ˛ Omówione eksperymenty były ukierunkowane na szerokie spektrum bł˛edów. Symulowano w nich zarówno bł˛edy programowe (mutacje) jak i sprz˛etowe. W niewielu pracach rozpatrzono ostatnia˛ klasa bł˛edów [56]. Ogółem we wszystkich przeprowadzonych eksperymentach wykonano kilka milionów jednostkowych testów badanych aplikacji. Pierwsza seria eksperymentów (punkt 5.1) miała na celu zbadanie możliwości ograniczenia liczby asercji w aplikacjach przy zachowaniu dobrego poziomu pokrycia bł˛edów. Stosowano zróżnicowane strategie selekcji asercji oraz funkcje wartościujace ˛ asercje w celu zbadania i prezentacji szerokich zastosowań tej metody. W licznych eksperymentach wykorzystano unikalny system FITS [36, 37, 97] opracowany w Instytucie Informatyki Politechniki Warszawskiej przeznaczony do symulacji bł˛edów w systemie komputerowym oraz badania ich efektów. Jego odpowiednia konfiguracja umożliwiła integracj˛e z modułami opracowanymi przez autora, dzi˛eki czemu dane otrzymane na podstawie eksperymentów przeanalizowane zostały w sposób automatyczny. Opracowana metoda selekcji asercji pozwoliła na ocen˛e zbioru asercji w detekcji bł˛edów oraz ograniczenie ich liczby przy zachowaniu dobrego poziomu pokrycia bł˛edów. W drugiej cz˛eści rozdziału (punkt 5.2) omówiono eksperymenty wykorzystujace ˛ asercje ze śladem. Do przeprowadzenia doświadczeń zastosowano trzy implementacje algorytmów z rodziny ZIP, zróżnicowana˛ liczb˛e zbiorów uczacych ˛ o różnych długościach stosowanych danych wejściowych. W raporcie omówiono liczb˛e wykrytych asercji o długościach śladu od 0 do 8 w odniesieniu do liczby zastosowanych zbiorów uczacych ˛ oraz rozmiaru danych wejściowych (punkt 5.2.3), przeanalizowano proces wykrywania asercji (punkt 5.2.4) oraz ich zachowanie w aspekcie nieprawidłowych naruszeń (punkt 5.2.5) i wykrywania bł˛edów b˛eda˛ cych skutkiem zakłócenia działania programu (punkt 5.2.6) zarówno dla wcześniej znanych zbiorów danych wejściowych jak i nieznanych na etapie nauki. Przeprowadzone eksperymenty wykazały, iż przy zastosowaniu asercji ze śladem znalezionych w sposób automatyczny możliwe jest wykrycie nieprawidłowego zachowania aplikacji, które jest skutkiem wystapienia ˛ w niej bł˛edów prowadzacych ˛ do zakłócenia w śladzie wykonania lub wartości zmiennych programu. Możliwe obszary zastosowań dla zaproponowanych metod zostały omówione w rozdziale szóstym. Przedstawiono tam również przypadek użycia, w którym z sukcesem zastosowano asercje ze śladem do nadzoru działania aplikacji komercyjnej działajacej ˛ w środowisku produkcyjnym realizujacej ˛ funkcj˛e systemu nadzoru transportu (punkt 6.2). Opracowane przez autora oprogramowanie, omówione w dodatku do pracy, może zostać wykorzystanie do przeprowadzenia analogicznych testów z użyciem innych aplikacji. Przeznaczone jest ono do analizy parametrów asercji w programie na podstawie wybranych miar służacych ˛ do selekcji ich zestawu wzgl˛edem wybranej strategii oraz wykrywania, weryfikacji, przekształcania oraz zakłócania asercji ze śladem. 148 7.1. Spostrzeżenia i wnioski Zaprezentowane w pracy metody oraz algorytmy pozwalaja˛ na ograniczenie liczby stosowanych asercji przy zachowaniu akceptowalnego poziomu wykrywania anomalii oraz wykrywanie i stosowanie asercji o wi˛ekszej specjalizacji osiagni˛ ˛ etej poprzez ich uzależnienie od przebiegu badanego programu. Zmniejszenie liczby asercji pozwala w szczególności na ograniczenie przyrostu statycznego i dynamicznego rozmiaru badanych programów wskutek stosowania asercji oraz minimalizacj˛e czasu przeznaczonego na ich przetwarzanie. Wykrywanie i stosowanie asercji zależnych od przebiegu działania programu umożliwia wykrywanie wi˛ekszej liczby bł˛edów oraz bardziej szczegółowe określanie okoliczności w jakich doszło do zakłócenia działania aplikacji. Ta koncepcja wypełnia luk˛e pomi˛edzy klasycznymi asercjami obliczeniowymi a technikami weryfikujacymi ˛ przepływ sterowania (techniki typu CFC [1, 2, 38, 75, 104]). Zasadność stosowania przedstawionych metod została potwierdzona w wielu eksperymentach, w których zastosowano różne klasy aplikacji (sterownik, aplikacj˛e obliczeniowa,˛ programy kompresujace). ˛ Dzi˛eki temu możliwe było określenie ich potencjalnej przydatność. Analogiczne eksperymenty moga˛ zostać wykonane dla innych aplikacji. Należy zwrócić uwag˛e na problemy zwiazane ˛ z praktycznym zastosowaniem zaproponowanych metod. W przypadku konieczności pełnej integracji przedstawionych metod z badanym programem konieczna jest ich implementacja w danym środowisku. Z tego powodu istotnym zagadnieniem sa˛ metody implementacji. Na podstawie przeprowadzonych eksperymentów za najbardziej praktyczna˛ należy uznać realizacj˛e procesu wykrywania i weryfikowania asercji z użyciem dzienników działania aplikacji. Wymaga ona dostosowania badanej aplikacji jedynie w aspekcie sposobu przekazywania danych do zewn˛etrznego systemu wykrywajacego ˛ i weryfikujacego ˛ asercje. Nie może być ona jednak zastosowana w każdym z przypadków, dlatego szczególnie istotne jest opracowanie wydajnych i prostych w implementacji algorytmów weryfikacji asercji w programach. Przeprowadzone eksperymenty na wybranych programach potwierdziły przydatność zaproponowanych metod. Autor pracy jest świadomy, że moga˛ być one wykorzystane wyłacznie ˛ dla pewnych klas aplikacji, obejmujacych ˛ w szczególności aplikacje transformacyjne oraz reaktywne, w których nie sa˛ stosowane czynniki losowe. Przy stosowaniu asercji ze śladem najlepsze wyniki moga˛ być osiagni˛ ˛ ete, jeżeli badany program cechuje ograniczony zbiór możliwych danych wejściowych lub ich ograniczony wpływ na przebieg programu. Właściwości te cechuja˛ głównie systemy wykonujace ˛ w stały sposób określona˛ grup˛e zadań. Dla tego typu aplikacji osiagano ˛ najlepsze wyniki w stosowaniu asercji ze śladem do detekcji anomalii. Stosowanie metody optymalizujacej ˛ zestaw asercji może przynieść zamierzone efekty, jeżeli w trakcie fazy majacej ˛ na celu zbadanie zachowania asercji poddana b˛edzie ona na działanie różnorodnych bł˛edów. Przy dużych zbiorach asercji jest to proces bardzo czasochłonny. 149 Niezb˛edne jest wykorzystanie narz˛edzi pozwalajacych ˛ na symulacj˛e szerokiej gamy zakłóceń w badanych programach. Dzi˛eki temu zastosowany zestaw testów b˛edzie reprezentatywny, a asercje wybrane na jego podstawie b˛eda˛ pokrywały różnorodne bł˛edy. W rozprawie potwierdzona została założona teza pracy oraz osiagni˛ ˛ eto wyznaczone cele. 7.2. Kierunki dalszych badań Praca ta może być punktem wyjściowym do dalszych badań nad rozwojem algorytmów wykrywania różnorodnych własności programów oraz ich wykorzystania. Pomimo zaproponowania pewnych metod pozostaje nadal szereg ważnych i ciekawych zagadnień, których rozważenie i zbadanie wykraczało poza zakres niniejszej pracy. Sa˛ to zarówno problemy wymagajace ˛ przeprowadzenia szeregu eksperymentów jak i zagadnienia natury inżynierskiej zwiazane ˛ z technikami implementacji oprogramowania. Jednym z wielu kierunków jest rozwój metod umożliwiajacych ˛ wykrywanie różnych typów asercji, szczególnie wyrażajacych ˛ pewne ogólniejsze cechy programów – zarówno w kontekście przechowywanych i przetwarzanych przez nie struktur danych, realizowanych procesów biznesowych jak i innych źródeł bł˛edów, b˛edacych ˛ skutkiem na przykład wadliwie działajacego ˛ sprz˛etu. Celowe wydaje si˛e powiazanie ˛ wykrywania asercji z wybranymi algorytmami stosowanymi w dziedzinie odkrywania wiedzy takimi jak na przykład wykrywanie reguł asocjacyjnych lub zależności temporalnych. Przedstawione w tej pracy wykrywanie asercji ze śladem można uznać za podstawowa˛ realizacj˛e asercji zależnej od pewnej reguły temporalnej. Asercje wykryte w kontekście bardziej zróżnicowanych reguł temporalnych, uwzgl˛edniajacych ˛ na przykład czas działania aplikacji czy wybranych komponentów systemu komputerowego, moga˛ okazać si˛e skuteczniejsze w wykrywaniu bł˛edów. Badania moga˛ również dotyczyć powiazania ˛ metod statycznej analizy programów z opisywana˛ w pracy metoda˛ bazujac ˛ a˛ jedynie na informacjach uzyskanych podczas jego wykonania. Może to umożliwić polepszenie jakości otrzymywanych asercji poprzez rozszerzenie klas wykrywanych przez nie bł˛edów. Kontynuacja badań przez autora pracy obejmować b˛edzie: — zbadanie możliwości integracji faz wykrywania asercji oraz wyboru najlepszych z nich według wybranych strategii, — zastosowanie i dostosowanie wybranych algorytmów z dziedziny metod odkrywania wiedzy majace ˛ na celu wydajniejsze znajdowanie zaawansowanych asercji w programach, — problematyk˛e automatycznego wykrywania asercji na poziomie kodu maszynowego programu (asercje zwiazane ˛ z wartościami przechowywanymi w rejestrach, kolejnościa˛ wykonywanych instrukcji itp.) oraz ich skuteczności w wykrywaniu bł˛edów, — rozwój narz˛edzi umożliwiajacych ˛ wykrywanie asercji, optymalizacj˛e ich wykorzystania 150 oraz monitorowania badanego programu w celu wykrywania potencjalnych anomalii w jego zachowaniu wynikajacych ˛ zarówno z bł˛edów oprogramowania jak i sprz˛etowych. 151 Bibliografia [1] Z. Alkhalifa, V. S. S. Nair. Design of a portable control-flow checking technique. High-Assurance Systems Engineering Workshop, 1997., Proceedings, strony 120–123, sierpień 1997. [2] Z. Alkhalifa, V. S. S. Nair, N. Krishnamurthy, J. A. Abraham. Design and evaluation of system-level checks for on-line control flow error detection. Parallel and Distributed Systems, IEEE Transactions on, 10(6):627–641, lipiec 1999. [3] G. Ammons, R. Bodik, J. R. Larus. Mining specifications. SIGPLAN Not., 37(1):4–16, 2002. [4] G. Ammons, D. Mandelin, R. Bodik, J. R. Larus. Debugging temporal specifications with concept analysis. PLDI 2003: Proceedings of the ACM SIGPLAN 2003 conference on Programming language design and implementation, strony 182–195, New York, NY, USA, 2003. ACM Press. [5] V. R. Basili. The Role of Experimentation in Software Engineering: Past, Current, and Future. ICSE, strony 442–449, 1996. [6] T. Bell. The concept of dynamic analysis. ESEC/FSE-7: Proceedings of the 7th European software engineering conference held jointly with the 7th ACM SIGSOFT international symposium on Foundations of software engineering, strony 216–234, London, UK, 1999. Springer-Verlag. [7] M. Bender. Finding loop invariants by static program analysis. [8] A. Benso, S. Di Carlo, G. Di Natale, P. Prinetto, L. Tagliaferri. Control-flow checking via regular expressions. Test Symposium, 2001. Proceedings. 10th Asian, strony 299–303, 2001. [9] A. Benso, S. Di Carlo, G. Di Natale, P. Prinetto, L. Tagliaferri. Software dependability techniques validated via fault injection experiments. Radiation and Its Effects on Components and Systems, 2001. 6th European Conference on, strony 269–274, wrzesień 2001. [10] M. Boul, Z. Zilic. Generating Hardware Assertion Checkers: For Hardware Verification, Emulation, Post-Fabrication Debugging and On-Line Monitoring. Springer Publishing Company, Incorporated, 2008. [11] Y. Brun, M. D. Ernst. Finding latent code errors via machine learning over program executions. ICSE 2004: Proceedings of the 26th International Conference on Software Engineering, strony 480–490, Edinburgh, Scotland, maj 2004. [12] L. Burdy, Y. Cheon, D. Cok, M.D. Ernst, J. Kiniry, G. T. Leavens, K. Rustan, M. Leino, E. Poll. An overview of JML tools and applications. Software Tools for Technology Transfer, 7(3):212–232, czerwiec 2005. [13] L. Burdy, A. Requet, J.-L. Lanet. Java Applet Correctness: A Developer-Oriented Approach. K. Araki, S. Gnesi, D. Mandrioli, redaktorzy, FME 2003: Formal Methods: International Symposium of Formal Methods Europe, wolumen 2805 serii LNCS, strony 422–439. Springer-Verlag, 2003. 153 [14] Palo Alto Research Center. The AspectJ Programming Guide, 2002-2003. [15] P. Chalin, J. R. Kiniry, G. T. Leavens, E. Poll. Beyond Assertions: Advanced Specification and Verification with JML and ESC/Java2. FMCO 2005: Formal Methods for Components and Objects, Revised Lectures, wolumen 4111 serii LNCS, strony 342–363. SV, 2006. [16] F. Chen, N. Tillmann, W. Schulte. Discovering Likely Method Specifications. Raport instytutowy MSR-TR-2005-146, Microsoft Research, Redmond, WA, USA, październik 2005. [17] J. W. Chinneck. Practical Optimization: a Gentle Introduction, 2000. [18] Paweł Cichosz. Systemy uczace ˛ si˛e. Wydawnictwo Naukowo-Techniczne, Warszawa, 2000. [19] T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein. Introduction to Algorithms. MIT Press, 2001. [20] C. Csallner, Y. Smaragdakis. DSD-Crasher: A hybrid analysis tool for bug finding. ISSTA 2006: Proceedings of the International Symposium on Software Testing and Analysis, strony 245–254, Portland, ME, USA, lipiec 2006. [21] C. Csallner, Y. Smaragdakis. Dynamically discovering likely interface specifications. ICSE 2006: Proceedings of the 28th International Conference on Software Engineering, strony 861–864, Shanghai, China, maj 2006. [22] M. d’Amorim, C. Pacheco, D. Marinov, T. Xie, M. D. Ernst. An empirical comparison of automated generation and classification techniques for object-oriented unit testing. ASE 2006: Proceedings of the 21st Annual International Conference on Automated Software Engineering, strony 59–68, Tokyo, Japan, wrzesień 2006. [23] W. B. Daszczuk. Weryfikacja własności temporalnych w systemach współbieżnych. Praca doktorska, Politechnika Warszawska, Wydział Elektroniki i Technik Informacyjnych, Instytut Informatyki, Warszawa, styczeń 2003. [24] L. Dean, D. Ernst, C. Smith. Improved simulation of Input/Output automata. Raport instytutowy, MIT Department of Electrical Engineering and Computer Science, 2001. [25] T. Denmat, A. Gotlieb, M. Ducassé. Proving or disproving likely invariants with constraint reasoning. WLPE 2005: 15th Workshop on Logic-based Methods in Programming Environments, październik 2005. [26] Daikon Developers. The Daikon Invariant Detector User Manual, czerwiec 2010. [27] N. Dodoo, L. Lin, M. D. Ernst. Selecting, refining, and evaluating predicates for program analysis. Raport instytutowy MIT-LCS-TR-914, MIT Laboratory for Computer Science, Cambridge, MA, lipiec 2003. [28] S. Elbaum, M. Diep. Profiling deployed software: Assessing strategies and testing opportunities. IEEE Transactions on Software Engineering, 31(4):312–327, kwiecień 2005. [29] M. D. Ernst. Dynamically Discovering Likely Program Invariants. Ph.D., University of Washington Department of Computer Science and Engineering, Seattle, Washington, sierpień 2000. [30] M. D. Ernst, J. Cockrell, W. G. Griswold, D. Notkin. Dynamically discovering likely program invariants to support program evolution. IEEE Transactions on Software Engineering, 27(2):99–123, luty 2001. 154 [31] M. D. Ernst, A. Czeisler, W. G. Griswold, D. Notkin. Quickly detecting relevant program invariants. ICSE 2000: Proceedings of the 22nd International Conference on Software Engineering, strony 449–458, Limerick, Ireland, czerwiec 2000. [32] M. D. Ernst, W. G. Griswold, Y. Kataoka, D. Notkin. Dynamically discovering program invariants involving collections. Raport instytutowy UW-CSE-99-11-02, University of Washington Department of Computer Science and Engineering, Seattle, WA, listopad 1999. [33] M. D. Ernst, J. H. Perkins, P. J. Guo, S. McCamant, C. Pacheco, M. S. Tschantz, C. Xiao. The Daikon system for dynamic detection of likely invariants. Science of Computer Programming, 2006. [34] H. Foster, L. Foster, D. Lacey, A. Krolnik. Assertion-Based Design. Kluwer Academic Publishers, Norwell, MA, USA, 2003. [35] S. J. Garland, N. Lynch. Using i/o automata for developing distributed systems. In Gary T. Leavens and Murali Sitaraman, editors, Foundations of Component-Based Systems, strony 285–312. Cambridge University Press, 2000. [36] P. Gawkowski, J. Sosnowski. Analyzing fault effects in fault insertion experiments. On-Line Testing Workshop, 2001. Proceedings. Seventh International, strony 21–24, 2001. [37] P. Gawkowski, J. Sosnowski. Using software implemented fault inserter in dependability analysis. Dependable Computing, 2002. Proceedings. 2002 Pacific Rim International Symposium on, strony 81–88, grudzień 2002. [38] O. Goloubeva, M. Rebaudengo, M. Sonza Reorda, M. Violante. Soft-error detection using control flow assertions. Defect and Fault Tolerance in VLSI Systems, 2003. Proceedings. 18th IEEE International Symposium on, strony 581–588, listopad 2003. [39] P. Guerreiro. Simple support for design by contract in C++. Technology of Object-Oriented Languages and Systems, 2001. TOOLS 39. 39th International Conference and Exhibition on, strony 24–34, 2001. [40] P. J. Guo. A scalable mixed-level approach to dynamic analysis of C and C++ programs. Praca magisterska, MIT Department of Electrical Engineering and Computer Science, Cambridge, MA, maj 2006. [41] P. J. Guo, J. H. Perkins, S. McCamant, M. D. Ernst. Dynamic inference of abstract types. ISSTA 2006, Proceedings of the 2006 International Symposium on Software Testing and Analysis, strony 255–265, Portland, ME, USA, lipiec 2006. [42] N. Gupta, Z. V. Heidepriem. A new structural coverage criterion for dynamic detection of program invariants. ASE 2003: Proceedings of the 18th Annual International Conference on Automated Software Engineering, strony 49–58, Montreal, Canada, październik 2003. [43] Dick Hamlet. When only random testing will do. RT ’06: Proceedings of the 1st international workshop on Random testing, strony 1–9, New York, NY, USA, 2006. ACM. [44] S. Hangal, M. S. Lam. Tracking down software bugs using automatic anomaly detection. ICSE 2002: Proceedings of the 24th International Conference on Software Engineering, strony 291–301, 2002. [45] C. A. R. Hoare. An Axiomatic Basis for Computer Programming. Communications of the ACM, 155 12(10):576–583, październik 1969. [46] M. Humphrey, S.-M. Park, J. Feng, N. Beekwilder, G. Wasson, J. Hogg, B. LaMacchia, B. Dillaway. Fine-grained access control for gridftp using secpal. GRID ’07: Proceedings of the 8th IEEE/ACM International Conference on Grid Computing, strony 217–225, Washington, DC, USA, 2007. IEEE Computer Society. [47] ISO 19757-3:2006. Information technology – Document Schema Definition Language (DSDL) – Part 3: Rule-based validation – Schematron. ISO, Geneva, Switzerland. [48] G. Kanawati, N. Kanawati, J. Abraham. FERRARI: A Flexible Software-Based Fault and Error Injection System. Computers, IEEE Transactions on, 44(2):248–260, luty 1995. [49] M. Karaorman, U. Hölzle, J. Bruno. jContractor: A reflective Java library to support design by contract. In Proceedings of Meta-Level Architectures and Reflection, volume 1616 of LNCS, strony 175–196, 1999. [50] Y. Kataoka, M. D. Ernst, W. G. Griswold, D. Notkin. Automated support for program refactoring using invariants. ICSM 2001: Proceedings of the International Conference on Software Maintenance, strony 736–743, Florence, Italy, listopad 2001. [51] S. Kim, T. Zimmermann, N. Nagappan. Crash Graphs: An Aggregated View of Multiple Crashes to Improve Crash Triage (Practical Experience Report). Proceedings of the 2011 IEEE/IFIP International Conference on Dependable Systems and Networks, czerwiec 2011. [52] J. Kiniry, A. E. Morkan, B. Denby. Soundness and Completeness Warnings in ESC/Java2. SAVCBS 2006: Fifth International Workshop on Specification and Verification of Component-Based Systems, strony 19–24, listopad 2006. [53] A. A. Krystosik. Formalna weryfikacja oprogramowania reaktywnych systemów wbudowanych. Praca doktorska, Politechnika Warszawska, Wydział Elektroniki i Technik Informacyjnych, Instytut Informatyki, Warszawa, luty 2008. [54] G. T. Leavens, A. L. Baker, C. Ruby. Preliminary Design of JML: A Behavioral Interface Specification Language for Java. Raport instytutowy, Iowa State University, Department of Computer Science, styczeń 2006. [55] G. T. Leavens, Y. Cheon. Design by Contract with JML, sierpień 2006. [56] M.-L. Li, P. Ramachandran, S. K. Sahoo, S. V. Adve, V. S. Adve, Y. Zhou. Understanding the Propagation of Hard Errors to Software and Implications for Resilient System Design. Proceedings of the 13th International Conference on Architectural Support for Programming Languages and Operating Systems, ASPLOS XIII, strony 265–276, New York, NY, USA, 2008. ACM. [57] C. A. Lisboa, C. Grando, A. Moreira, L. Carro. Using software invariants for dynamic detection of transient errors. 10th Latin American Test Workshop, strony 1–5, Punta del Este, Uruguay, marzec 2009. [58] C.-K. Luk, R. Cohn, R. Muth, H. Patil, A. Klauser, G. Lowney, S. Wallace, V. J. Reddi, K. Hazelwood. Pin: building customized program analysis tools with dynamic instrumentation. PLDI ’05: Proceedings of the 2005 ACM SIGPLAN conference on Programming language design and implementation, strony 190–200, New York, NY, USA, 2005. ACM. 156 [59] L. Mariani, M. Pezzè. Behavior capture and test: Automated analysis of component integration. International Conference on Engineering of Complex Computer Systems, strony 292–301, Shanghai, China, czerwiec 2005. [60] S. McCamant, M. D. Ernst. Predicting problems caused by component upgrades. ESEC/FSE 2003: Proceedings of the 10th European Software Engineering Conference and the 11th ACM SIGSOFT Symposium on the Foundations of Software Engineering, strony 287–296, Helsinki, Finland, wrzesień 2003. [61] B. Meyer. Applying design by contract. Computer, 25(10):40–51, październik 1992. [62] S. H. K. Narayanan, S. W. Son, M. Kandemir, F. Li. Using loop invariants to fight soft errors in data caches. Asia and South Pacific Design Automation Conference, strony 1317–1320, Shanghai, China, styczeń 2005. [63] G. Nascimento, M. Correia. Anomaly-based Intrusion Detection in Software as a Service. Dependable Systems and Networks Workshops, 0:19–24, 2011. [64] P. Nazimek. Java Cards i OpenCard Framework. Software Developers Journal, (1), styczeń 2006. [65] P. Nazimek. Java Modeling Language. Software Developers Journal, (8), sierpień 2006. [66] P. Nazimek. Daikon – odkrywanie właściwości programów. Software Developers Journal, (9), wrzesień 2007. [67] P. Nazimek. ESC/Java2. Software Developers Journal, (4), kwiecień 2007. [68] P. Nazimek. Wykrywanie, ocena skuteczności i optymalizacja asercji w programach. Zeszyty Naukowe Wydziału ETI Politechniki Gdańskiej, 16:281–286, 2008. [69] P. Nazimek. Wykrywanie i zastosowanie asercji ze śladem. Zeszyty Naukowe Wydziału ETI Politechniki Gdańskiej, 19:379–385, 2010. [70] P. Nazimek, J. Sosnowski, P. Gawkowski. Checking fault susceptibility of cryptographic algorithms. Pomiary, Automatyka, Kontrola, 55(10):827–830, 2009. [71] P. Nazimek, G. Wojtenko. Karty Java – technologia, bezpieczeństwo, implementacje. VIII Krajowa Konferencja Zastosowań Kryptografii Enigma, strony 25–54, Warszawa, Polska, maj 2004. Enigma Systemy Ochrony Informacji. [72] N. Nethercote, J. Seward. Valgrind: a framework for heavyweight dynamic binary instrumentation. SIGPLAN Not., 42(6):89–100, 2007. [73] J. W. Nimmer, M. D. Ernst. Static verification of dynamically detected program invariants: Integrating Daikon and ESC/Java. RV 2001: First Workshop on Runtime Verification, Paris, France, lipiec 2001. [74] J. W. Nimmer, M. D. Ernst. Automatic generation of program specifications. ISSTA 2002: Proceedings of the 2002 International Symposium on Software Testing and Analysis, strony 232–242, Rome, Italy, lipiec 2002. [75] N. Oh, P. P. Shirvani, E. J. McCluskey. Control-flow checking by software signatures. Reliability, IEEE Transactions on, 51(1):111–122, marzec 2002. [76] C. Pacheco, M. D. Ernst. Eclat: Automatic generation and classification of test inputs. ECOOP 2005: Object-Oriented Programming, 19th European Conference, strony 504–527, Glasgow, Scotland, lipiec 2005. 157 [77] K. Pattabiraman, Z. Kalbarczyk, R. K. Iyer. Application-Based Metrics for Strategic Placement of Detectors. Proceedings of the 11th Pacific Rim International Symposium on Dependable Computing, strony 75–82, Washington, DC, USA, 2005. IEEE Computer Society. [78] K. Pattabiraman, G. P. Saggese, D. Chen, Z. Kalbarczyk, R. K. Iyer. Dynamic Derivation of Application-Specific Error Detectors and their Implementation in Hardware. Proceedings of the Sixth European Dependable Computing Conference, strony 97–108, Washington, DC, USA, 2006. IEEE Computer Society. [79] J. H. Perkins, M. D. Ernst. Efficient incremental algorithms for dynamic detection of likely invariants. FSE 2004: Proceedings of the ACM SIGSOFT 12th Symposium on the Foundations of Software Engineering, strony 23–32, Newport Beach, CA, USA, listopad 2004. [80] M. Pistoia, S. Chandra, S. J. Fink, E. Yahav. A survey of static analysis methods for identifying security vulnerabilities in software systems. IBM System Journal, 46(2):265–288, 2007. [81] N. Polikarpova. CITADEL User Manual, listopad 2006. [82] N. Polikarpova, I. Ciupa, B. Meyer. A comparative study of programmer-written and automatically inferred contracts. ISSTA ’09: Proceedings of the eighteenth international symposium on Software testing and analysis, strony 93–104, New York, NY, USA, 2009. ACM. [83] L. L. Pullum. Software fault tolerance techniques and implementation. Artech House, Inc., Norwood, MA, USA, 2001. [84] B. Pytlik. Automatic debugging using potential invariants. Honors thesis, Brown University, Providence, Rhode Island, maj 2003. [85] B. Pytlik, M. Renieris, S. Krishnamurthi, S. P. Reiss. Automated fault localization using potential invariants. AADEBUG 2003: Fifth International Workshop on Automated and Algorithmic Debugging, strony 273–276, Ghent, Belgium, wrzesień 2003. [86] C. Rabejac, J.-P. Blanquart, J.-P. Queille. Executable assertions and timed traces for on-line software error detection. Fault Tolerant Computing, 1996., Proceedings of Annual Symposium on, strony 138–147, lipiec 1996. [87] S. K. Rad. Can structural test adequacy criteria be used to predict the quality of generated invariants? Praca magisterska, University of Antwerp Department of Mathematics and Computer Science, Antwerp, 2005. [88] M. K. Ramanathan, A. Grama S. Jagannathan. Static specification inference using predicate mining. PLDI ’07: Proceedings of the 2007 ACM SIGPLAN conference on Programming language design and implementation, strony 123–134, New York, NY, USA, 2007. [89] B. Randell. Computing Systems Reliability. Cambridge University Press, 1979. [90] I. Ronen, N. Dor, S. Porat, Y. Dubinsky. Combined static and dynamic analysis for inferring program dependencies using a pattern language. CASCON ’06: Proceedings of the 2006 conference of the Center for Advanced Studies on Collaborative research, strona 3, New York, NY, USA, 2006. [91] D. S. Rosenblum. A practical approach to programming with assertions. Software Engineering, IEEE Transactions on, 21(1):19–31, styczeń 1995. [92] K. Sacha. Inżynieria oprogramowania. Wydawnictwo Naukowe PWN, 2010. 158 [93] S. K. Sahoo, M.-L. Li, P. Ramachandran, S. V. Adve, V. S. Adve, Y. Zhou. Using Likely Program Invariants to Detect Hardware Errors. Proceedings of the International Conference on Dependable Systems and Networks, strony 70–79, Anchorage, Alaska, czerwiec 2008. [94] S. Shoham, E. Yahav, S. Fink, M. Pistoia. Static specification mining using automata-based abstractions. ISSTA ’07: Proceedings of the 2007 international symposium on Software testing and analysis, strony 174–184, New York, NY, USA, 2007. [95] Agitar Software. Getting Started With AgitarOne, listopad 2006. [96] J. Sosnowski. Testowanie i niezawodność systemów komputerowych. Akademicka Oficyna Wydawnicza EXIT, 2005. [97] J. Sosnowski, P. Gawkowski. Tracing fault effects in system environment. EUROMICRO Conference, 1999. Proceedings. 25th, 1:481–486, 1999. [98] V. Srivatsa. Effective Functional Verification: Principles and Processes. Springer Publishing Company, Incorporated, 2006. [99] A. Stachurski, A. P. Wierzbicki. Podstawy optymalizacji. Oficyna Wydawnicza Politechniki Warszawskiej, 1999. [100] J. Tantivongsathaporn, D. Stearns. An Experience With Design by Contract. Software Engineering Conference, 2006. APSEC 2006. 13th Asia Pacific, strony 335–341, grudzień 2006. [101] O. Tarasyuk, A. Gorbenko, V. Kharchenko. Practical aspects of applying the invariant-based approach to the formal system development and verification. Dependability of networks, wolumen 2 serii Monographs of System Dependability, strony 129–141. Oficyna Wydawnicza Politechniki Wrocławskiej, 2010. [102] W. F. Tichy. Should Computer Scientists Experiment More? Computer, 31(5):32–40, 1998. [103] N. Tran, C. Mingins, D. Abramson. Design and implementation of assertions for the common language infrastructure. IEE Proceedings - Software, 150(5):329–336, 2003. [104] R. Vemu, J. A. Abraham. CEDA: control-flow error detection through assertions. On-Line Testing Symposium, 2006. IOLTS 2006. 12th IEEE International, czerwiec 2006. [105] R. Vemu, J. A. Abraham. Budget-Dependent Control-Flow Error Detection. On-Line Testing Symposium, 2008. IOLTS 2008. 14th IEEE International, strony 73–78, lipiec 2008. [106] R. Venkatasubramanian, J. P. Hayes, B. T. Murray. Low-cost on-line fault detection using control flow assertions. On-Line Testing Symposium, 2003. IOLTS 2003. 9th IEEE, strony 137–143, lipiec 2003. [107] J. Voas. Software testability measurement for intelligent assertion placement. Software Quality Control, 6(4):327–336, 1997. [108] J. Whaley, M. C. Martin, M. S. Lam. Automatic extraction of object-oriented component interfaces. SIGSOFT Softw. Eng. Notes, 27(4):218–228, 2002. [109] T. Xie, D. Notkin. Checking inside the black box: Regression testing based on value spectra differences. ICSM 2004: Proceedings of the International Conference on Software Maintenance, strony 28–37, Chicago, Illinois, wrzesień 2004. [110] T. Xie, D. Notkin. Tool-assisted unit test generation and selection based on operational abstractions. Automated Software Engineering Journal, 2006. 159 [111] J. Yang. Automatically Inferring Temporal Properties. ICSE 2005: Proceedings of the 27th International Conference on Software Engineering, Saint Louis, Missouri, USA, 2005. IEEE Computer Society. [112] J. Yang, D. Evans. Automatically Inferring Temporal Properties for Program Evolution. ISSRE 2004: Proceedings of the 15th International Symposium on Software Reliability Engineering, strony 340–351, Washington, DC, USA, 2004. IEEE Computer Society. [113] J. Yang, D. Evans. Dynamically inferring temporal properties. PASTE 2004: Proceedings of the ACM-SIGPLAN-SIGSOFT workshop on Program analysis for software tools and engineering, strony 23–28, New York, NY, USA, 2004. ACM Press. [114] J. Yang, D. Evans. Automatically Discovering Temporal Properties for Program Verification. Raport instytutowy, Department of Computer Science, University of Virginia, 2005. [115] J. Yang, D. Evans, D. Bhardwaj, T. Bhat, M. Das. Perracotta: mining temporal API rules from imperfect traces. ICSE 2006: Proceeding of the 28th international conference on Software engineering, strony 282–291, New York, NY, USA, 2006. ACM Press. [116] H. Yuan, T. Xie. Substra: A framework for automatic generation of integration tests. AST 2006: 1st Workshop on Automation of Software Test, strony 64–70, Shanghai, China, maj 2006. [117] M. V. Zelkowitz, D. R. Wallace. Experimental Models for Validating Technology. Computer, 31(5):23–31, 1998. A. Zaimplementowane oprogramowanie Podczas prac badawczych, w ramach niniejszej rozprawy, opracowane zostało oryginalne oprogramowanie, przeznaczone do analizy parametrów asercji w programie na podstawie wybranych miar służacych ˛ do selekcji ich zestawu spełniajacego ˛ określone kryteria (rozdział trzeci) oraz umożliwiajace ˛ wykrywanie, weryfikacj˛e, przekształcanie oraz zakłócanie asercji ze śladem (rozdział czwarty). Programy, biblioteki oraz skrypty pomocnicze opisane w poniższym dodatku zostały wydzielone w dwa pakiety: — AEM – oprogramowanie przeznaczone do analizy wybranych parametrów asercji i selekcji ich zestawu dla programów w j˛ezykach C/C++ współpracujace ˛ z systemem wstrzykiwania bł˛edów FITS [37], — FlowGraph – narz˛edzia dedykowane zagadnieniom wykrywania oraz wykorzystania asercji ze śladem. A.1. Pakiet AEM Pakiet AEM przeznaczony jest do przeprowadzania pełnego procesu analizy wybranych parametrów asercji. Może on być bezpośrednio zastosowany dla programów stworzonych w j˛ezykach C/C++ wykonywanych pod kontrola˛ systemów z rodziny Windows. Współpracuje z aplikacjami, w których obserwowane asercje działaja˛ w ramach jednego watku. ˛ W pakiecie AEM zdefiniowano dwa poj˛ecia: asercji oraz warunku. Asercje sa˛ tożsame ze struktura˛ programowa˛ realizowana˛ przez makro assert(predykat) w j˛ezyku C/C++. Oznacza to, że działanie programu zostanie przerwane jeśli zaistnieje sytuacja, w której sprawdzany predykat b˛edzie niespełniony (naruszenie asercji). Warunki stanowia˛ analogi˛e do struktury programowej if (!predykat) {...}. Ich naruszenie powoduje wykonanie bloku pod instrukcja˛ warunku, której celem może być podj˛ecie działań naprawczych, maskujacych ˛ lub raportujacych ˛ wykryty przez warunek bład. ˛ Poszczególne składniki pakietu AEM wyszczególniono w tabeli A.1. Ogólna koncepcja oraz zależności pomi˛edzy elementami pakietu zostały przedstawione na rysunku A.1. Komponenty stworzone w ramach niniejszej pracy zostały wyróżnione drukiem tłustym. Pozostałe elementy wchodza˛ w skład zewn˛etrznego oprogramowania, które wykorzystano przy tworzeniu pakietu. 161 aemshm Program przeznaczony do zarzadzania ˛ wydzielonym obszarem pami˛eci współdzielonej, w której przechowywane sa˛ dane badanych asercji i warunków. aemtool Program przeznaczony do analizy danych przechowywanych w wydzielonym obszarze pami˛eci współdzielonej. biblioteka aem Biblioteka przeznaczona do integracji oprogramowania napisanego w j˛ezykach C/C++ z narz˛edziami aemshm i aemtool w celu umożliwienia pomiarów parametrów asercji oraz warunków. aem2stats Skrypt analizujacy ˛ dane pochodzace ˛ z systemu FITS, które opisuja˛ przebieg przeprowadzonych eksperymentów. aem2report Skrypt generujacy ˛ raport na podstawie przeanalizowanych wyników eksperymentów przeprowadzonych z użyciem systemu FITS. system FITS Oprogramowanie przeznaczone do zakłócania działania (wstrzykiwania bł˛edów) aplikacji działajacych ˛ pod kontrola˛ systemu Windows [37]. biblioteka glpka Biblioteka przeznaczona do rozwiazywania ˛ zadań programowania liniowego. gnuplotb Narz˛edzie do tworzenia wykresów. a b http://www.gnu.org/software/glpk/ http://www.gnuplot.info/ Tabela A.1. Komponenty pakietu AEM 162 obszar pamieci ˛ współdzielonej biblioteka aem badany program obszar pamieci ˛ aemshm aemtool TXT BIN system FITS dane opisujace ˛ przebieg testów plik zawierajacy ˛ obraz obszaru pamieci ˛ współdzielonej wykaz wybranych asercji i warunków biblioteka glpk TXT BIN dane opisujace ˛ przebieg testów aem2stats pliki gnuplot oraz pliki zawierajace ˛ dane statystyczne TXT aem2report TXT PNG pełny raport gnuplot Rysunek A.1. Struktura pakietu AEM Pakiet AEM przechowuje informacje o badanych asercjach oraz warunkach w wydzielonym obszarze pami˛eci współdzielonej. W poczatkowej ˛ wersji pakietu rozważane było zastosowanie pliku dyskowego na potrzeby składowania danych, jednak z uwagi na możliwość niekontrolowanego przerwania badanego programu w trakcie operacji wstrzykiwania bł˛edów plik musiałby być otwierany oraz zamykany przy weryfikacji każdej z asercji lub każdego z warunków. Takie rozwiazanie ˛ znacznie wydłużałoby czas działania programu. Z tego powodu, do przechowywania tych informacji, użyto pami˛eci operacyjnej, która˛ kontroluje aemshm. Ma ona określona˛ wielkość i struktur˛e ustalana˛ na etapie kompilacji pakietu poprzez zdefiniowanie maksymalnej liczby obiektów i zwiazanych ˛ z nimi danymi, jakie moga˛ być przechowywane. W celu przyspieszenia operacji wyszukiwania informacji o danym obiekcie w obszarze pami˛eci współdzielonej zastosowano heurystyk˛e zakładajac ˛ a˛ jej położenie za ostatnio sprawdzanym elementem, co zazwyczaj odpowiada kolejności wyst˛epowania asercji i warunków w badanym programie. Możliwa jest zmiana algorytmu wyszukiwania w przypadku, gdyby zaproponowana heurystyka była mało wydajna dla badanej aplikacji. W zależności od etapu przeprowadzanego badania w obszarze pami˛eci współdzielonej odkładane sa˛ różne rodzaje danych: — na etapie obserwacji (pomiaru parametrów asercji oraz warunków) obliczany jest koszt dynamiczny asercji i warunków oraz badane jest ich zachowanie w środowisku bez zakłóceń; etap ten odpowiada przeprowadzaniu procesu tak zwanego złotego przebiegu 163 (ang. golden run) to jest uruchomienia programu bez wprowadzania zakłóceń w systemie wstrzykiwania bł˛edów FITS, — na etapie weryfikacji bez skutków działania zachowywane sa˛ informacje o efekcie sprawdzenia asercji oraz warunków w odniesieniu do innych tego typu obiektów, które zdefiniowane sa˛ w badanym programie; dane te dla każdego uruchomienia programu odkładane sa˛ do pliku i stanowia˛ dane wejściowe dla późniejszych obliczeń. Narz˛edzie aemtool umożliwia dost˛ep do wydzielonego obszaru pami˛eci współdzielonej w trakcie przeprowadzania eksperymentu w celu zapami˛etania wyników danego testu lub przygotowania struktur danych dla kolejnych obserwacji. Wykorzystywane jest ono mi˛edzy innymi przez system FITS. Pozwala także na wygenerowanie oraz rozwiazanie ˛ zadania programowania liniowego majacego ˛ na celu selekcj˛e odpowiednich asercji i warunków spełniajacych ˛ określone, narzucone przez użytkownika, założenia. Badany program jest integrowany ze środowiskiem omawianego pakietu poprzez bibliotek˛e aem. Wprowadza ona definicj˛e makr umożliwiajacych ˛ odkładanie odpowiednich danych w wydzielonym obszarze pami˛eci współdzielonej przez obserwowane obiekty (na etapie obserwacji lub weryfikacji bez skutków działania) lub przekazywanie informacji do systemu FITS o naruszeniu asercji lub warunku przed realizacja˛ ich docelowego efektu (na przykład przerwania badanego programu). Biblioteka została przygotowana dla programów w j˛ezykach C/C++, ale możliwe jest stworzenie analogicznego rozwiazania ˛ dla innych j˛ezyków programowania, bez konieczności ponownej implementacji pozostałych narz˛edzi. Po przeprowadzeniu eksperymentów zebrane rezultaty moga˛ zostać przeanalizowane przez skrypty aem2stats oraz aem2report. Ich wynikiem sa˛ analizy statystyczne w formie tekstowej i graficznej (histogramy wygenerowane z użyciem pakietu gnuplot), które umożliwiaja˛ porównanie wyników otrzymanych na różnych etapach selekcji asercji i warunków. W dalszej cz˛eści szczegółowo omówiono elementy pakietu AEM nie b˛edace ˛ oprogramowaniem zewn˛etrznym. A.1.1. Program aemshm Program aemshm przeznaczony jest do utrzymania obszaru pami˛eci współdzielonej wykorzystywanej jako repozytorium danych przez asercje i warunki badanego programu (poprzez bibliotek˛e aem) oraz narz˛edzie aemtool. Umożliwia on także przeglad ˛ zawartości pami˛eci w formie czytelnej dla użytkownika oraz zachowanie obrazu obszaru pami˛eci współdzielonej w pliku. Pozwala to na późniejsze wykorzystanie zgromadzonych informacji. Aplikacja została zaimplementowana w j˛ezyku C i wykorzystuje elementy Windows API do zarzadzania ˛ obszarem pami˛eci współdzielonej. Sposób uruchomienia programu jest nast˛epujacy: ˛ aemshm nazwa pliku 164 gdzie nazwa pliku wskazuje na plik obrazu pami˛eci współdzielonej. Jeżeli plik o wskazanej nazwie nie istnieje tworzony jest nowy, pusty obszar pami˛eci współdzielonej. Przy zakończeniu działania programu możliwe jest zapisanie aktualnej zawartości pami˛eci współdzielonej w pliku o podanej wcześniej nazwie. Po uruchomieniu na ekranie widoczne jest aktywne okno konsoli. W trakcie działania programu, poprzez naciśni˛ecie odpowiednich klawiszy, można wywołać akcje, które zostały szczegółowo opisane w tabeli A.2. A.1.2. Program aemtool Sposób uruchomienia programu jest nast˛epujacy: ˛ aemtool [-stats2text nazwa pliku] [-dumpstats nazwa pliku] [-testnumber liczba | inc] [-exitcode liczba] [-testclear] [-problem nazwa pliku nazwa problemu nazwa funkcji specyfikacja funkcji wagi koszt rozmiar liczba] gdzie kolejne parametry pozwalaja˛ na wykonanie akcji oraz określenie ich parametrów, które zostały szczegółowo opisane w tabeli A.3. System FITS korzysta z aplikacji aemtool po każdym wykonanym teście, aby zapami˛etać jego rezultaty, poprzez przekazanie do aplikacji zarejestrowanego wyniku testu oraz przygotowanie obszaru pami˛eci współdzielonej do kolejnego testu. Wywołanie opisywanego narz˛edzia w celu realizacji opisanej akcji jest nast˛epujace: ˛ aemtool -testnumber inc -dumpstats tests.bin -exitcode 1 -testclear Przykładowy sposób uruchomienia opisywanej aplikacji w celu wybrania do dziesi˛eciu asercji na podstawie danych z pliku tests.bin maksymalizujac ˛ ich wartość skuteczności wzgl˛ednej i uwzgl˛edniajac ˛ charakterystyk˛e asercja jako pierwsza została naruszona z wagami: 1 dla testów które zakończyły si˛e zgłoszeniem bł˛edu, wyjatkiem ˛ systemowym lub przekroczeniem czasu oczekiwania, -1 jeśli test zakończył si˛e poprawnie i z pomini˛eciem testów, gdzie nie wprowadzono zakłóceń, jest nast˛epujacy: ˛ aemtool -problem tests.bin SAP FSAP I0000000010000000 0 1 -1 1 1 0 0 0 0 0 10 W wyniku uruchomienia powstana˛ dwa pliki tekstowe zawierajace ˛ odpowiednio sformułowanie zadania programowania liniowego dla zadanego problemu oraz jego rozwiazanie. ˛ A.1.3. Biblioteka aem Biblioteka aem przeznaczona jest do szybkiego dostosowania aplikacji zaimplementowanych w j˛ezykach C/C++ do środowiska pakietu AEM. Definiuje ona szereg makr pozwalajacych ˛ zastosować asercje oraz warunki określajac ˛ ich koszt statyczny. Przed załaczeniem ˛ pliku nagłówkowego aem.h możliwe jest określenie sposobu zachowania biblioteki dla asercji i warunków w badanym programie poprzez makra sterujace ˛ określone w tabeli A.4. 165 o Tryb obserwacji wszystkich asercji oraz warunków. Uaktualniane sa˛ parametry asercji oraz warunków (na przykład koszt dynamiczny) oraz informacja o ewentualnym zadziałaniu danej struktury. s Tryb weryfikacji bez skutków działania wszystkich asercji oraz warunków. Uaktualniane sa˛ dane o ewentualnym zadziałaniu danej struktury w odniesieniu do innych struktur na przykład: pierwsza naruszona asercja, asercja naruszona, gdy została naruszona już inna asercja itp. h Tryb weryfikacji wszystkich asercji oraz warunków. W przypadku naruszenia asercji program jest przerywany. SHIFT+s Tryb weryfikacji bez skutków działania asercji oraz warunków, których naruszenia nie zarejestrowano w trybie obserwacji. Skutki działania sa˛ analogiczne do komendy wywoływanej klawiszem s i tożsame z nia˛ jeśli żadna z asercji lub żaden z warunków podczas obserwacji nie był naruszony. Tryb ten pozwala automatycznie wyeliminować asercje i warunki, które naruszane sa˛ w trakcie poprawnego działania badanej aplikacji. Jest to przydatne dla asercji i warunków wykrytych automatycznie. SHIFT+h Tryb weryfikacji asercji oraz warunków, których naruszenia nie zarejestrowano w trybie obserwacji. Skutki działania sa˛ analogiczne do komendy wywoływanej klawiszem h i tożsame z nia˛ jeśli żadna z asercji lub żaden z warunków podczas obserwacji nie był naruszony. Tryb ten pozwala automatycznie wyeliminować asercje i warunki, które naruszane sa˛ w trakcie poprawnego działania badanej aplikacji. Jest to przydatne dla asercji i warunków wykrytych automatycznie. d Dezaktywacja wszystkich asercji i warunków. Program wykonywany jest z pomini˛eciem sprawdzania predykatów wszystkich asercji oraz warunków. p Wydruk na ekranie informacji o zarejestrowanych asercjach i warunkach wraz z ich parametrami w formie czytelnej dla użytkownika. ESC Zakończenie działania programu po dodatkowym potwierdzeniu ch˛eci wykonania tej operacji przez użytkownika. Wykonane zostanie zapisanie zawartości obszaru pami˛eci współdzielonej do pliku obrazu oraz jej zwolnienie. Tabela A.2. Klawisze komend w programie aemshm 166 stats2text Konwersja pliku binarnego nazwa pliku zawierajacego ˛ wyniki przeprowadzonych testów do czytelnego dla użytkownika formatu tekstowego na standardowym wyjściu. testnumber Ustawienie licznika określajacego ˛ numer testu w eksperymencie na wartość liczba lub jednostkowe zwi˛ekszenie aktualnej wartości (przełacznik ˛ inc). exitcode Ustawienie wyniku przeprowadzonego testu, dla którego zebrano statystyki na wartość liczba. Komenda wykorzystywana po zakończeniu testu. dumpstats Zachowanie aktualnych statystyk przeprowadzonego testu w pliku binarnym nazwa pliku. Jeżeli plik istnieje statystyki dopisywane sa˛ na jego końcu. testclear Usuni˛ecie statystyk ostatniego testu z obszaru pami˛eci współdzielonej. Komenda wykorzystywana przed wykonaniem testu. problem Sformułowanie i rozwiazanie ˛ zadania programowania liniowego służacego ˛ znalezieniu najlepszych asercji i warunków według zadanych kryteriów. Dane wejściowe zawierajace ˛ wyniki przeprowadzonych testów pobierane sa˛ z pliku nazwa pliku. Na ich podstawie, poprzez bibliotek˛e glpk, formułowany jest problem nazwa problemu z funkcja˛ celu nazwa funkcji. Parametr specyfikacja funkcji umożliwia określenie funkcji celu w formacie ciagu ˛ znaków rozpoczynajacego ˛ si˛e od litery S dla skuteczności bezwzgl˛ednej lub litery I dla skuteczności wzgl˛ednej oraz 16 cyfr 0 lub 1, które oznaczaja˛ odpowiednio nieuwzgl˛ednienie lub uwzgl˛ednienie wybranej charakterystyki danego obiektu. Kolejność identyfikatorów charakterystyk jest zgodna z kolejnościa˛ podana˛ w tabeli 3.2. Na parametr wagi składa si˛e pi˛eć liczb określajacych ˛ wagi dla wyników testu w kolejności: bład ˛ niewprowadzony, zakończenie z bł˛edem, zakończenie poprawne, wyjatek ˛ systemowy, przekroczony czas oczekiwania (zgodnie z wynikiem testu w systemie FITS). Parametry koszt, rozmiar, liczba wyznaczaja˛ dolne i górne ograniczenie wartości kolejno: całkowitego kosztu dynamicznego, kosztu statycznego oraz liczby wybranych obiektów dla rozwiazy˛ wanego problemu. Wprowadzenie wartości 0 dla ograniczeń skutkuje dezaktywacja˛ danego ograniczenia. Tabela A.3. Polecenia programu aemtool 167 AEM_ENABLE Biblioteka b˛edzie działać w sposób umożliwiajacy ˛ przeprowadzenie eksperymentów z FITS w środowisku nieobejmujacym ˛ asercji i warunków obszarem wstrzykiwania bł˛edów. Tryb ten używany jest w fazie obserwacji i weryfikacji bez skutków działania. Wywołanie sprawdzenia asercji lub warunku powoduje zapisanie odpowiednich informacji do obszaru pami˛eci współdzielonej. Makro to jest domyślnie zdefiniowane. AEM_FITS Biblioteka b˛edzie działać w sposób umożliwiajacy ˛ przeprowadzenie eksperymentów z FITS w środowisku zakłócania obejmujacym ˛ obszar asercji i warunków. Tryb ten używany jest podczas eksperymentów weryfikujacych, ˛ kiedy wybrano już określone asercje i warunki. AEM_DISABLE Biblioteka b˛edzie wyłaczona. ˛ Oznacza to, że wszystkie asercje i warunki w programie nie b˛eda˛ używane. Tabela A.4. Makra sterujace ˛ w bibliotece aem W bibliotece zdefiniowano również struktur˛e i format danych przechowywanych w obszarze pami˛eci współdzielonej. A.1.4. Skrypt aem2stats Skrypt aem2stats przeznaczony jest do analizy plików wynikowych tworzonych przez system FITS w celu opracowania statystyk zwiazanych ˛ z naruszeniami asercji oraz warunków wskutek wstrzykiwanych bł˛edów. Został on zaimplementowany z wykorzystaniem j˛ezyka skryptowego Perl. Sposób uruchomienia jest nast˛epujacy: ˛ perl aem2stats.pl < nazwa pliku gdzie nazwa pliku wskazuje na plik tekstowy generowany przez FITS. Wynikiem działania programu sa˛ pliki tekstowe zawierajace ˛ analizy statystyczne oraz skrypty dla aplikacji gnuplot umożliwiajace ˛ ich graficzna˛ wizualizacj˛e dla każdego z eksperymentów przeprowadzonych w systemie FITS. A.1.5. Skrypt aem2report Skrypt aem2report automatycznie przetwarza wszystkie pliki wygenerowane przez aem2stats tworzac ˛ czytelny raport w formie dokumentu HTML. Został on opracowany w j˛ezyku Perl. Do wygenerowania wykresów wykorzystuje narz˛edzie gnuplot. Sposób uruchomienia jest nast˛epujacy: ˛ perl aem2report.pl 168 Raport utworzony przez aem2report został wykorzystany w niniejszej pracy do opracowania wyników tabelarycznych i graficznych dla eksperymentów zwiazanych ˛ z selekcja˛ asercji o określonym profilu. A.2. Pakiet FlowGraph Pakiet FlowGraph przeznaczony jest do wykrywania, weryfikacji, przekształcania oraz zakłócania asercji ze śladem. Pakiet został w całości opracowany w j˛ezyku Perl. Narz˛edzia opracowane w pakiecie stanowia˛ baz˛e dla docelowych zastosowań. Możliwe jest ich uzupełnienie o algorytmy wykrywania określonego typu warunków w asercjach ze śladem czy też dostosowanie do innego formatu analizowanych danych wejściowych. W poczatkowej ˛ formie pakiet FlowGraph wykorzystany był do przeprowadzenia eksperymentów w ramach niniejszej rozprawy. Po drobnych modyfikacjach zastosowany został również do obserwacji aplikacji działajacej ˛ w środowisku produkcyjnym. Elementy wchodzace ˛ w skład pakietu FlowGraph zostały wyszczególnione w tabeli A.5. invariant Skrypt ten jest odpowiedzialny za analiz˛e danych wejściowych (informacji zebranych podczas wykonania programu) w celu wygenerowania, aktualizacji lub weryfikacji asercji ze śladem. analyze Skrypt umożliwia statystyczna˛ analiz˛e danych w pliku przechowuja˛ cym asercje ze śladem. injector Zadaniem tego skryptu jest symulacja zakłóceń w wykonaniu programu oraz obserwacja zachowania asercji ze śladem. transform Skrypt zawiera implementacj˛e algorytmów wykonujacych ˛ operacje na zbiorach asercji ze śladem. Tabela A.5. Komponenty pakietu FlowGraph Struktura˛ danych wykorzystywana˛ przez narz˛edzia z pakietu FlowGraph, w której przechowywane sa˛ informacje o asercjach ze śladem, jest digraf zapisywany w formie skompresowanych plików XML. Dla każdej z wykrytych asercji przechowywane sa˛ informacje dotyczace ˛ liczby uaktualnień na etapie wykrywania oraz liczby sprawdzeń na etapie weryfikacji umożliwiajace ˛ późniejsze analizy statystyczne otrzymanych wyników. A.2.1. Skrypt invariant Skrypt invariant przeznaczony jest do analizy informacji o wykonaniu programu w celu wykrywania, uaktualniania lub weryfikacji asercji ze śladem wraz z rejestracja˛ danych statystycznych zwiazanych ˛ z liczba˛ aktualizacji oraz sprawdzeń asercji. W szablonowej wersji skryptu zaimplementowano wykrywanie dwóch asercji badajacych ˛ wartość maksymalna˛ 169 i minimalna˛ zmiennych liczbowych, których wartość może być rejestrowana w punktach obserwacji badanego programu. Sposób uruchomienia jest nast˛epujacy: ˛ perl invariant.pl wejście wyjście aktualizacja długość śladu < dane gdzie kolejne parametry określaja: ˛ plik wejście zawierajacy ˛ asercje ze śladem dla badanego programu, wykryte we wcześniejszej fazie analizy (podanie nieistniejacego ˛ pliku powoduje utworzenie pustych struktur danych), plik wyjście, do którego zapisane zostana˛ struktury danych zawierajacego ˛ asercje ze śladem, tryb działania skryptu (aktualizacja wykrytych asercji wybierana wartościa˛ 1, weryfikacja wykrytych asercji wybierana wartościa˛ 0) oraz maksymalna długość obserwowanego śladu dla wykrywanych asercji. Dane do analizy pobierane sa˛ ze standardowego wejścia programu. Środowisko działania skryptu invariant zostało przedstawione na rysunku A.2. Format danych wejściowych składa si˛e z serii pól oddzielonych znakiem |. Pierwsze pole jest identyfikatorem punktu obserwacji, kolejne pola zawieraja˛ nazw˛e obserwowanej zmiennej wraz z jej typem i zarejestrowana˛ wartościa.˛ Przykładowy fragment danych opisujacych ˛ przebieg wykonania programu, który może zostać przeanalizowany przez skrypt invariant jest nast˛epujacy: ˛ org.apache.tools.bzip2.CBZip2OutputStream.runLength|i|int|1 org.apache.tools.bzip2.CBZip2OutputStream.last|i|int|5 badany program informacje o wykonaniu programu XML TXT invariant XML wejściowa struktura danych wyjściowa struktura danych Rysunek A.2. Pakiet FlowGraph – narz˛edzie invariant Możliwe jest również uruchomienie skryptu w taki sposób, aby informacje o przebiegu programu były analizowane na bieżaco, ˛ poprzez odpowiednie przekierowanie źródła informacji o wykonaniu badanego programu na standardowe wejście invariant. Naruszenia wykrytych asercji nie maja˛ wpływu na przebieg działania aplikacji, sa˛ one jedynie raportowane użytkownikowi poprzez wyświetlanie informacji w oknie wyników działania skryptu. 170 A.2.2. Skrypt analyze Skrypt analyze przeznaczony jest do analizy struktury danych przechowujacej ˛ asercje ze śladem. Jego działanie zobrazowane zostało na rysunku A.3. Dla zadanego pliku przechowujacego ˛ struktur˛e danych, opisujac ˛ a˛ wykryte asercje ze śladem, skrypt generuje pliki dla programu gnuplot oraz tabele ze statystykami opisujacymi: ˛ — liczba wykrytych asercji w rozdziale na długość śladu oraz stosunek liczby sprawdzeń asercji zarówno bez jak i z jej aktualizacja˛ (w formie tekstowej oraz graficznej w postaci histogramu), — analizy statystyczne zwiazane ˛ z weryfikacja˛ asercji (sprawdzenia, naruszenia, brak odpowiedniej asercji do sprawdzenia) w zależności od długości śladu asercji oraz wcześniej określonego stosunku liczby sprawdzeń asercji zarówno bez jak i z jej aktualizacja˛ na etapie wykrywania. wejściowa struktura danych XML TXT pliki dla programu gnuplot CSV tabele z danymi statystycznymi analyze Rysunek A.3. Pakiet FlowGraph – narz˛edzie analyze Skrypt umożliwia generowanie całościowych statystyk na podstawie kilku plików wejściowych. A.2.3. Skrypt injector Skrypt injector umożliwia symulowanie zakłóceń w programach poprzez modyfikacj˛e informacji o przebiegu jego wykonania polegajac ˛ a˛ na: — zakłóceniu wartości zmiennej w programie polegajace ˛ na losowej inwersji bitów z określonego zakresu (od najmłodszego do określonego bitu) w losowo wybranej zmiennej; zmienny zakres umożliwia zróżnicowanie zakresu zmiany wybranej zmiennej (od najmniejszej do najwi˛ekszej), — zakłóceniu przebiegu wykonania programu poprzez pomini˛ecie losowego punktu obserwacji co przekłada si˛e na zakłócenie w śladzie wykonania programu. Z uwagi na tryb wprowadzania zakłóceń wszystkie wprowadzane bł˛edy maja˛ charakter przemijajacy ˛ i ich wpływ obejmuje jedynie pojedynczy punkt w programie. Dodatkowo zakłócenia przebiegu wykonania programu wstrzykiwane sa˛ z zachowaniem minimalnej 171 liczby odwiedzonych pomi˛edzy nimi punktów obserwacji równej maksymalnej długości przechowywanego śladu, aby wykluczyć możliwość kumulacji efektu wprowadzonych zakłóceń. Mogłaby ona prowadzić do zafałszowania otrzymanych wyników ponieważ w takiej sytuacji omawiane narz˛edzie nie jest w stanie wykryć czy zgłoszone naruszenie powstało na skutek ostatnio wprowadzonego bł˛edu czy też innego, wprowadzonego wcześniej. Zachowanie odpowiedniego odst˛epu pomi˛edzy kolejnymi wprowadzonymi zakłóceniami w przebiegu programu zapobiega wystapieniu ˛ bł˛edów wielokrotnych. informacje o wykonaniu programu badany program TXT XML wejściowa struktura danych TXT pliki dla programu gnuplot CSV tabele z danymi statystycznymi injector XML wyjściowa struktura danych Rysunek A.4. Pakiet FlowGraph – narz˛edzie injector Działanie injector zobrazowano na rysunku A.4. Sposób uruchomienia skryptu jest nast˛epujacy: ˛ perl injector.pl wejście wyjście p rodzaj zakłócenia [liczba bitów] < dane gdzie kolejne parametry określaja: ˛ plik wejście zawierajacy ˛ asercje ze śladem dla badanego programu, wykryte w fazie analizy, plik wyjście, do którego zapisane zostana˛ struktury danych zawierajacego ˛ zaktualizowane dane statystyczne, prawdopodobieństwo wprowadzenia zakłócenia p wyrażone w procentach, rodzaj zakłócenia (var – zakłócenie wartości, trc – zakłócenie przebiegu wykonania) oraz, opcjonalnie dla trybu var, maksymalny indeks najstarszego bitu zakłócanej zmiennej, który może zostać zmieniony. Dane do analizy pobierane sa˛ ze standardowego wejścia programu. Wynikiem działania narz˛edzia injector sa˛ pliki tekstowe oraz wykresy z informacjami o liczbie wykrytych i niewykrytych zakłóceń w zależności od parametrów asercji ze śladem takich jak długość ich śladu. Dodatkowo struktura danych wyjściowych może zostać przeanalizowana skryptem analyze, co pozwala na wydobycie dodatkowych informacji takich jak liczba sprawdzeń każdej z asercji ze śladem. Skrypt injector może zostać rozszerzony o możliwość wprowadzania innego rodzaju zakłóceń do badanych programów oraz kolekcjonowania dodatkowych danych zwiazanych ˛ przeprowadzanymi symulacjami. 172 A.2.4. Skrypt transform Narz˛edzie transform, którego działanie przedstawia rysunek A.5, przetwarza ślady asercji wczytane z pliku zawierajacego ˛ wejściowa˛ struktur˛e danych przy użyciu zaproponowanych w pracy nast˛epujacych ˛ algorytmów: — redukcji liczby śladów w zbiorze asercji ze śladem (algorytm 4.1), — skracania śladów w zbiorze asercji ze śladem (algorytm 4.2), — redukcji liczby identyfikatorów punktów programu dla zbiorów asercji ze śladem (algorytm 4.3). wejściowa struktura danych XML transform TXT zredukowana liczba śladów TXT skrócone ślady TXT nowe identyfikatory Rysunek A.5. Pakiet FlowGraph – narz˛edzie transform Wyniki działania każdego z algorytmów zapisywane sa˛ w oddzielnym zbiorze wyjściowym. Opisuja˛ one, w sposób czytelny dla użytkownika, zmiany jakie zaszły w analizowanym zbiorze asercji ze śladem obejmujace: ˛ — wykaz asercji ze śladem po redukcji liczby śladów, — wykaz asercji ze śladem po skróceniu długości śladów, — przyporzadkowanie ˛ określajace ˛ nowe identyfikatory punktów obserwacji po redukcji ich liczby. 173