2012-03-21 12 views

Odpowiedz

16

Frama-C jest platformą analizy statycznej Open Source z a slicer for C programs na podstawie obliczenia wykresu zależności programu.

Należy zauważyć, że krojenie rzeczywistych programów napisanych w prawdziwym języku programowania, takim jak C, wiąże się z wieloma specjalnymi przypadkami i pojęciami, które zostały skrócone w publikacjach naukowych. Wciąż jestem pewien, że nie znajdziesz niczego prostszego niż obliczenia PDG-Fram-PD, po pierwsze dlatego, że jest to jedyny dostępny Open Source (o którym wiem), a po drugie, ponieważ jakiekolwiek inne obliczenia PDG, które obsługują programy C, miałyby rozwiązać te same problemy i wprowadzić te same pojęcia.

Oto przykład:

int a, b, d, *p; 

int f (int x) { 
    return a + x; 
} 

int main (int c, char **v) { 
    p = &b; 
    a = 1; 
    *p = 2; 
    d = 3; 
    c = f(b); 
} 

Polecenie frama-c -pdg -dot-pdg graph -pdg-print t.c generuje pliki dot graph.main.dot i graph.f.dot zawierające PDG w main() i f() odpowiednio.

Można użyć programu dot do całkiem-print jeden z nich tak: dot -Tpdf graph.main.dot > graph.pdf

Wynik jest poniżej:

PDG of main()

Uwaga krawędź od węzła c = f(b); do węzła *p = 2;. Obliczenia PDG twierdzące, że są przydatne dla programów w języku C, muszą obsługiwać aliasing.

Z drugiej strony, przy użyciu tej PDG krajalnica do krojenia na kryterium „wejść oświadczenie c = f(b);” byłby w stanie usunąć d = 3;, które nie mogą wpływać na wywołanie funkcji, nawet poprzez dostęp wskaźnik *p. Krajarka Frama-C wykorzystuje zależności wskazane przez PDG, aby zachować tylko te instrukcje, które są użyteczne dla określonego przez użytkownika kryterium krojenia. Na przykład, polecenia frama-c -slice-wr c t.c -then-on 'Slicing export' -print wytwarza zredukowanego programu poniżej, w którym przypisanie z d zostały usunięte:

/* Generated by Frama-C */ 
int a; 
int b; 
int *p; 
int f_slice_1(int x) 
{ 
    int __retres; 
    __retres = a + x; 
    return (__retres); 
} 

void main(int c) 
{ 
    p = & b; 
    a = 1; 
    *p = 2; 
    c = f_slice_1(b); 
    return; 
} 
+0

dziękuję bardzo za wspaniałą pomoc. Zaczynam się uczyć, jak używać Frama-C. W odniesieniu do Frama-C, nie mogę znaleźć znaczenia linii na wykresie graph.main.dot. Co oznaczają różne style linii? czy jest jakiś materiał na ten temat? – user1283336

+0

@ user1283336 Istnieją 3 rodzaje strzał: odpowiednio zależności danych, sterowania i adresu. Program 'int a, b, * p; void main (int x, int y, int z) { p = i a; * p = x; jeśli (y) b = z; } 'zawiera wszystkie 3 rodzaje zależności. Używając tych samych linii poleceń, jak w pierwszym przykładzie, nie powinieneś mieć trudności z rozpoznaniem, która jest która. Nie ma dostępnego dla użytkownika opisu wewnętrznych części krajarki, przepraszam, tylko zewnętrzny opis jak z niego korzystać. –

+1

Myślę, że musi to być '-pdg-kropka' zamiast' -dot-pdg'? Przynajmniej dla mnie działało tylko dawniej. – Paddre

4

Jeśli chcesz zwizualizować zależności między metodami wywołującymi się nawzajem i używają gcc, może ci zainteresować się opcja gcc-fdump-rtl-expand.

Dla każdego pliku źródłowego skompilowanego za pomocą opcji -fdump-rtl-expandgcc zostanie wyświetlony plik *.expand.

Pliki dostarczone do narzędzia egypt generują wykresy ilustrujące zależności metody.

+0

PDG wykres której węzły są oświadczenia. Zobacz na przykład http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html –