Sadza (oprogramowanie)
W statycznej analizie programu Soot jest platformą manipulacji i optymalizacji kodu bajtowego, składającą się z języków pośrednich dla Javy . Został opracowany przez Sable Research Group na Uniwersytecie McGill . Soot zapewnia cztery pośrednie reprezentacje do użytku za pośrednictwem swojego interfejsu API dla innych programów analitycznych, aby uzyskać dostęp i budować na nich:
- Baf: prawie bajtowa reprezentacja.
- Jimple : uproszczona wersja kodu źródłowego Java, która zawiera maksymalnie trzy komponenty na instrukcję.
- Shimple: odmiana SSA Jimple'a (podobna do GIMPLE ).
- Grimp: zagregowana wersja Jimple odpowiednia do dekompilacji i kontroli kodu.
Bieżąca wersja oprogramowania Soot zawiera również szczegółowe analizy programu , które mogą być używane od razu po wyjęciu z pudełka, takie jak kontekstowa, niewrażliwa na przepływ analiza punktów do , analiza wykresu wywołań i analiza dominacji (odpowiedź na pytanie „musi wystąpić zdarzenie następujące po zdarzenie b ?”). Posiada również dekompilator o nazwie dava.
Soot to darmowe oprogramowanie dostępne na licencji GNU Lesser General Public License (LGPL). W 2010 roku dwa artykuły naukowe na temat sadzy ( Vallée-Rai i in. 1999 i Pominville i in. 2000 ) zostały wybrane jako IBM CASCON First Decade High Impact Papers spośród 12 innych artykułów z 425 wpisów.
Jimple
Jimple jest pośrednią reprezentacją programu Java zaprojektowanego tak, aby był łatwiejszy do optymalizacji niż kod bajtowy Java . Jest typowany , ma konkretną składnię i jest oparty na trójadresowym kodzie .
Jimple obejmuje tylko 15 różnych operacji, co upraszcza analizę przepływu. Natomiast kod bajtowy Java obejmuje ponad 200 różnych operacji .
W przeciwieństwie do kodu bajtowego Java, w Jimple zmienne lokalne i stosowe są wpisywane, a Jimple jest z natury bezpieczny.
Konwersja do Jimple lub „Jimplifying” (po „uproszczeniu”) to konwersja kodu bajtowego na kod trójadresowy. Ideą konwersji, którą po raz pierwszy zbadał Clark Verbrugge, jest powiązanie zmiennej z każdą pozycją w stosie. Stąd operacje na stosie stają się przypisaniami obejmującymi zmienne stosu.
Przykład
Rozważ następujący kod bajtowy, który pochodzi z
iload 1 // ładuje zmienną x1 i umieszcza ją na stosie iload 2 // ładuje zmienną x2 i umieszcza na stosie iadd // pobiera dwie wartości i umieszcza ich sumę na stosie istore 1 // pobiera wartość z stos i przechowujemy go w zmiennej x1
Powyższe przekłada się na następujący trzyadresowy kod:
stos1 = x1 // iładuj 1 stos2 = x2 // iładuj 2 stos1 = stos1 + stos2 // iadd x1 = stos1 // przechowuj 1
Ogólnie wynikowy kod nie ma statycznego formularza pojedynczego przypisania .
Dalsza lektura
- Vallée-Rai, Raja; Co, Phong; Gagnon, Etienne; Hendren, Laurie; Lam, Patryk; Sundaresan, Vijay (1998). „Sadza: struktura optymalizacji kodu bajtowego Java” . Materiały z konferencji Centrum Studiów Zaawansowanych na temat wspólnych badań z 1999 roku . CASCON '99. Opublikowane ponownie w CASCON First Decade High Impact Papers . CASCON '10. s. 214–224. doi : 10.1145/1925805.1925818 .
- Pominville, Patrice; Qian, Feng; Vallée-Rai, Raja; Hendren, Laurie; Verbrugge, Clark (2000). Framework do optymalizacji Javy przy użyciu atrybutów . Opublikowane ponownie w CASCON First Decade High Impact Papers . CASCON '10. s. 225–241. doi : 10.1145/1925805.1925819 .
- Lam, Patryk; Bodden, Eric; Lhoták, Ondřej; Hendren, Laurie (2011). „Struktura Soota do analizy programów Java: retrospektywa” (PDF) . Warsztaty użytkowników Cetus i infrastruktury kompilatora .