Analiza programu - Program analysis

W informatyce , analiza programu jest procesem automatycznie analizuje zachowanie programów komputerowych dotyczących nieruchomości, takich jak dokładność, solidność, bezpieczeństwo i liveness. Analiza programu skupia się na dwóch głównych obszarach: optymalizacji programu i poprawności programu . Pierwsza koncentruje się na poprawie wydajności programu przy jednoczesnym zmniejszeniu zużycia zasobów, podczas gdy druga koncentruje się na zapewnieniu, że program robi to, co powinien.

Analiza programu może być wykonywana bez wykonywania programu ( statyczna analiza programu ), w czasie wykonywania ( dynamiczna analiza programu ) lub w połączeniu obu.

Statyczna analiza programu

W kontekście poprawności programu, analiza statyczna może wykryć luki w fazie rozwoju programu. Te luki są łatwiejsze do naprawienia niż te znalezione w fazie testowania, ponieważ analiza statyczna prowadzi do źródła luki.

Ze względu na to, że wiele form analizy statycznej jest nierozstrzygniętych obliczeniowo, mechanizmy jej wykonywania nie zawsze kończą się prawidłową odpowiedzią – albo dlatego, że czasami zwracają fałszywie negatywne („nie znaleziono problemów”, gdy kod faktycznie ma problemy) lub fałszywie pozytywne lub ponieważ nigdy nie zwracają błędnej odpowiedzi, ale czasami nigdy nie kończą. Pomimo swoich ograniczeń, pierwszy typ mechanizmu może zmniejszyć liczbę luk w zabezpieczeniach, podczas gdy drugi może czasami dawać silną pewność braku określonej klasy luk w zabezpieczeniach.

Nieprawidłowe optymalizacje są wysoce niepożądane. Tak więc w kontekście optymalizacji programu istnieją dwie główne strategie postępowania z nierozstrzygalną obliczeniowo analizą:

  1. Optymalizator, który ma zakończyć się w stosunkowo krótkim czasie, taki jak optymalizator w kompilatorze optymalizującym, może używać okrojonej wersji analizy, która gwarantuje ukończenie w skończonym czasie i gwarantuje tylko znalezienie poprawnej optymalizacje.
  2. Narzędzie optymalizacyjne innej firmy może zostać zaimplementowane w taki sposób, aby nigdy nie generować nieprawidłowej optymalizacji, ale także, aby w niektórych sytuacjach mogło działać w nieskończoność, dopóki nie znajdzie (co może się nigdy nie wydarzyć). W takim przypadku programista korzystający z narzędzia musiałby zatrzymać narzędzie i uniknąć ponownego uruchomienia narzędzia na tym fragmencie kodu (lub ewentualnie zmodyfikować kod, aby uniknąć potknięcia się narzędzia).

Istnieje jednak również trzecia strategia, która czasami ma zastosowanie w przypadku języków, które nie są całkowicie określone, na przykład C . Kompilator optymalizujący może generować kod, który robi wszystko w czasie wykonywania — nawet ulega awarii — jeśli napotka kod źródłowy, którego semantyka nie jest określona przez używany standard języka.

Kontrola przepływu

Celem analizy przepływu sterowania jest uzyskanie informacji o tym, które funkcje mogą być wywoływane w różnych momentach wykonywania programu. Zebrane informacje są reprezentowane przez wykres przepływu sterowania (CFG), w którym węzły są instrukcjami programu, a krawędzie reprezentują przepływ sterowania. Identyfikując bloki kodu i pętle, CFG staje się punktem wyjścia dla optymalizacji dokonywanych przez kompilator.

Analiza przepływu danych

Analiza przepływu danych to technika przeznaczona do zbierania informacji o wartościach w każdym punkcie programu oraz o tym, jak zmieniają się w czasie. Ta technika jest często używana przez kompilatory do optymalizacji kodu. Jednym z najbardziej znanych przykładów analizy przepływu danych jest sprawdzanie skażenia, które polega na uwzględnianiu wszystkich zmiennych zawierających dane dostarczone przez użytkownika – co jest uważane za „skażone”, tj. niezabezpieczone – i zapobieganie używaniu tych zmiennych, dopóki nie zostaną oczyszczone. Ta technika jest często używana do zapobiegania atakom typu SQL injection . Sprawdzanie skażenia może odbywać się statycznie lub dynamicznie.

Abstrakcyjna interpretacja

Interpretacja abstrakcyjna pozwala na wyodrębnienie informacji o możliwym wykonaniu programu bez faktycznego wykonywania programu. Te informacje mogą być wykorzystywane przez kompilatory do szukania możliwych optymalizacji lub do poświadczania programu pod kątem pewnych klas błędów.

Systemy typu

Systemy typów kojarzą typy z programami, które spełniają określone wymagania. Ich celem jest wybór podzbioru programów w języku, które są uważane za poprawne zgodnie z właściwością.

  • Sprawdzanie typu – sprawdź, czy program jest akceptowany przez system typów.

Sprawdzanie typu jest używane w programowaniu, aby ograniczyć sposób używania obiektu programistycznego i co mogą one zrobić. Robi to kompilator lub interpreter. Sprawdzanie typu może również pomóc w zapobieganiu lukom w zabezpieczeniach, zapewniając, że podpisana wartość nie jest przypisywana do zmiennej bez znaku. Sprawdzanie typu może odbywać się statycznie (w czasie kompilacji), dynamicznie (w czasie wykonywania) lub kombinacją obu.

Informacje o typie statycznym ( wywnioskowane lub jawnie dostarczone przez adnotacje typu w kodzie źródłowym) mogą być również używane do przeprowadzania optymalizacji, takich jak zastępowanie tablic w ramkach tablicami bez ramek.

Systemy efektów

Systemy efektów to formalne systemy zaprojektowane do reprezentowania efektów, jakie może mieć funkcja lub metoda. Efekt kodyfikuje to, co jest robione i co jest robione – zwykle określane odpowiednio jako rodzaj i region efektu.

Sprawdzanie modelu

Sprawdzanie modelu odnosi się do ścisłych, formalnych i zautomatyzowanych sposobów sprawdzania, czy model (co w tym kontekście oznacza formalny model fragmentu kodu, choć w innych kontekstach może to być model fragmentu sprzętu) jest zgodny z zadanym specyfikacja. Ze względu na wrodzoną skończoną naturę kodu oraz możliwość konwersji specyfikacji i kodu na formuły logiczne, możliwe jest sprawdzenie, czy system narusza specyfikację za pomocą wydajnych metod algorytmicznych.

Dynamiczna analiza programu

Analiza dynamiczna może wykorzystywać wiedzę o czasie wykonywania programu w celu zwiększenia precyzji analizy, zapewniając jednocześnie ochronę w czasie wykonywania, ale może analizować tylko pojedyncze wykonanie problemu i może obniżyć wydajność programu z powodu kontroli w czasie wykonywania.

Testowanie

Oprogramowanie powinno być testowane, aby upewnić się, że jest jakość i działa tak, jak powinno, w sposób niezawodny i nie powoduje konfliktów z innym oprogramowaniem, które może działać obok niego. Testy są wykonywane poprzez wykonanie programu z danymi wejściowymi oraz ocenę jego zachowania i wygenerowanego wyjścia. Nawet jeśli nie określono żadnych wymagań dotyczących bezpieczeństwa, należy przeprowadzić dodatkowe testy bezpieczeństwa, aby upewnić się, że osoba atakująca nie może manipulować oprogramowaniem i wykradać informacji, zakłócać normalnych operacji oprogramowania ani używać go jako punktu zwrotnego do atakowania użytkowników.

Monitorowanie

Monitorowanie programu rejestruje i rejestruje różne rodzaje informacji o programie, takie jak wykorzystanie zasobów, zdarzenia i interakcje, dzięki czemu można go przejrzeć w celu znalezienia lub wskazania przyczyn nieprawidłowego zachowania. Ponadto może służyć do przeprowadzania audytów bezpieczeństwa. Zautomatyzowane monitorowanie programów jest czasami nazywane weryfikacją w czasie wykonywania .

Krojenie programu

Dla danego podzbioru zachowania programu, dzielenie programu na plasterki polega na zredukowaniu programu do minimalnej formy, która nadal powoduje wybrane zachowanie. Zredukowany program nazywany jest „plasterkiem” i jest wierną reprezentacją oryginalnego programu w domenie określonego podzbioru zachowań. Ogólnie rzecz biorąc, znalezienie wycinka jest problemem nie do rozwiązania, ale określając podzbiór zachowania docelowego za pomocą wartości zestawu zmiennych, można uzyskać przybliżone wycinki przy użyciu algorytmu przepływu danych. Wycinki te są zwykle używane przez programistów podczas debugowania w celu zlokalizowania źródła błędów.

Zobacz też

Bibliografia

Dalsza lektura

  • Agrawal, Hiralal; Horgan, Joseph R. Dynamiczne krojenie programu (PDF) .
  • Chunlei, Wang; Gang, Zhao; Yiqi, Dai (2009). „Efektywne podejście do analizy bezpieczeństwa przepływu sterowania dla plików wykonywalnych binarnych”. 2009 II Międzynarodowa Konferencja IEEE na temat Informatyki i Technologii Informacyjnych . s. 272-276. doi : 10.1109/ICCSIT.2009.5234950 . Numer ISBN 978-1-4244-4519-6.
  • Nielson, Flemming; Nielson, Hanne Riis; Hankin, Chris (2005). Zasady analizy programu . Springer Nauka+Biznes Media .

Zewnętrzne linki