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:

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;
}
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
@ 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ć. –
Myślę, że musi to być '-pdg-kropka' zamiast' -dot-pdg'? Przynajmniej dla mnie działało tylko dawniej. – Paddre