Analiza programu

W informatyce analiza programu to proces automatycznej analizy zachowania programów komputerowych pod względem właściwości, takich jak poprawność, solidność, bezpieczeństwo i żywotność . Analiza programu koncentruje się na dwóch głównych obszarach: optymalizacji programu i poprawności programu . Pierwszy koncentruje się na poprawie wydajności programu przy jednoczesnym zmniejszeniu zużycia zasobów, podczas gdy drugi koncentruje się na zapewnieniu, że program robi to, co powinien.

Analiza programu może być przeprowadzona bez wykonywania programu ( statyczna analiza programu ), w czasie wykonywania ( dynamiczna analiza programu ) lub w kombinacji obu.

Statyczna analiza programu

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

Ze względu na to, że wiele form analizy statycznej jest nierozstrzygalnych obliczeniowo, mechanizmy jej wykonywania nie zawsze zakończą się właściwą odpowiedzią - albo dlatego, że czasami zwracają fałszywie ujemny („nie znaleziono problemów”, gdy kod faktycznie ma problemy) lub fałszywie dodatnie lub dlatego, że nigdy nie zwracają błędnej odpowiedzi, ale czasami nigdy nie kończą. Pomimo swoich ograniczeń, pierwszy typ mechanizmu może zmniejszyć liczbę podatności, podczas gdy drugi może czasami dać silną pewność braku określonej klasy podatności.

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

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

Istnieje jednak również trzecia strategia, która czasami ma zastosowanie do języków, które nie są w pełni 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ęzykowy.

Kontrola przepływu

Celem analizy sterowania przepływem jest uzyskanie informacji o tym, które funkcje można wywołać w różnych momentach wykonywania programu. Zebrane informacje są reprezentowane przez wykres przepływu sterowania (CFG), gdzie 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 tworzonych 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ę one 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ędnieniu wszystkich zmiennych zawierających dane dostarczone przez użytkownika – które są uważane za „skażone”, tj. zdezynfekowane. Ta technika jest często używana do zapobiegania typu SQL injection . Sprawdzanie skażeń można przeprowadzać statycznie lub dynamicznie.

Interpretacja abstrakcyjna

Interpretacja abstrakcyjna pozwala na wydobycie informacji o możliwym wykonaniu programu bez faktycznego wykonania programu. Informacje te mogą być wykorzystywane przez kompilatory do wyszukiwania możliwych optymalizacji lub do certyfikowania programu pod kątem pewnych klas błędów.

Systemy typów

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

Sprawdzanie typu jest stosowane w programowaniu w celu ograniczenia sposobu używania obiektów programistycznych i ich możliwości. Robi to kompilator lub interpreter . Sprawdzanie typu może również pomóc w zapobieganiu lukom w zabezpieczeniach, upewniając się, ż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 optymalizacji, takich jak zastępowanie tablic opakowanych tablicami opakowanymi.

Systemy efektów

Systemy efektów to formalne systemy zaprojektowane do reprezentowania efektów, jakie może mieć wykonanie funkcji lub metody. Efekt kodyfikuje to, co się robi i z czym to się robi – zwykle określa się je odpowiednio jako rodzaj efektu i obszar efektu . [ wymagane wyjaśnienie ]

Sprawdzenie modelu

Sprawdzanie modelu odnosi się do ścisłych, formalnych i zautomatyzowanych sposobów sprawdzania, czy model ( który w tym kontekście oznacza formalny model fragmentu kodu, choć w innych kontekstach może to być model sprzętu) jest zgodny z zadanym specyfikacja. Ze względu na nieodłączną skończoną naturę kodu, a zarówno specyfikację, jak i kod można przekształcić w formuły logiczne , możliwe jest sprawdzenie, czy system narusza specyfikację, przy użyciu wydajnych metod algorytmicznych.

Dynamiczna analiza programu

Analiza dynamiczna może wykorzystywać wiedzę o programie w czasie wykonywania, aby zwiększyć precyzję 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 ono wysokiej jakości i działa tak, jak powinno, w niezawodny sposób oraz że nie powoduje konfliktów z innym oprogramowaniem, które może działać obok niego. Testy są wykonywane przez wykonanie programu z danymi wejściowymi i ocenę jego zachowania oraz wygenerowanych danych wyjściowych. 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 kraść informacji, zakłócać normalnego działania oprogramowania ani wykorzystywać go 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 je przeglądać 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 określane jako weryfikacja w czasie wykonywania .

Krojenie programu

Dla danego podzbioru zachowania programu, cięcie programu polega na zredukowaniu programu do minimalnej postaci, która nadal wytwarza wybrane zachowanie. Zredukowany program nazywany jest „wycinkiem” i jest wierną reprezentacją oryginalnego programu w domenie określonego podzbioru zachowań. Ogólnie rzecz biorąc, znalezienie wycinka jest problemem nierozwiązywalnym, ale określając docelowy podzbiór zachowań za pomocą wartości zestawu zmiennych, możliwe jest uzyskanie przybliżonych wycięć za pomocą algorytmu przepływu danych. Te wycinki są zwykle używane przez programistów podczas debugowania w celu zlokalizowania źródła błędów.

Zobacz też

Dalsza lektura

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

Linki zewnętrzne