Status: | In Entwicklung |
Standort: | https://github.com/bdcht/ccrawl |
Version: | 1.x |
Dokument: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl verwendet Clang, um eine Datenbank zu erstellen, die sich auf verschiedene C/C++-Datenstrukturen (Struktur, Union, Klasse, Aufzählung, Typdefinition, Prototypen und Makros) bezieht und die es ermöglicht, Datentypen und Konstanten/Makros zu identifizieren, indem diese Datenbank nach bestimmten Eigenschaften, einschließlich Eigenschaften, abgefragt wird im Zusammenhang mit dem Struktur-/Klassenspeicherlayout.
Im Grunde erlaubt es zum Beispiel
Ccrawl erlaubt dann die Ausgabe gefundener Strukturen in vielen Formaten: C/C++ natürlich, aber auch ctypes oder amoco. Die ctypes-Ausgabe einer C++-Klasse entspricht einem Instanz-(Objekt-)Layout im Speicher, einschließlich aller virtuellen Tabellenzeiger (oder VTT), die aus möglicherweise mehreren übergeordneten (möglicherweise virtuellen) Klassen resultieren.
Schließlich ermöglicht Ccrawl die Berechnung verschiedener Statistiken über eine Bibliotheks-API und die Berechnung des Abhängigkeitsdiagramms eines beliebigen Typs, wie zum Beispiel (siehe tests/samples/xxx/graph.h):
Benutzerdokumentation und API finden Sie unter http://ccrawl.readthedocs.io/en/latest/index.html
Betrachten Sie die folgende C-Struktur aus der Datei „samples/simple.h“.
Struktur S { char c; int n; Gewerkschaft { unsigned char x[2]; unsignierte kurze s; } u; char (*PtrCharArrayOf3[2])[3]; void (*pfunc)(int, int); };
Sammeln Sie zunächst die Strukturdefinition in einer lokalen Datenbank:
$ ccrawl -l test.db -g 'test0' Proben sammeln/simple.h [100 %] simple.h [ 2] -------------------------------------------------- ------------------- Datenbank wird gespeichert... [ 2]
Dann ist es möglich, die vollständige Struktur in ctypes zu übersetzen
$ ccrawl -l test.db show -r -f ctypes 'struct S' struct_S = type('struct_S',(Struktur,),{}) union_b0eccf67 = type('union_b0eccf67',(Union,),{}) union_b0eccf67._fields_ = [("x", c_ubyte*2), ("s", c_ushort)] struct_S._anonymous_ = ("u") struct_S._fields_ = [("c", c_byte), ("n", c_int), ("u", union_b0eccf67), ("PtrCharArrayOf3", POINTER(c_byte*3)*2), ("pfunc", POINTER(CFUNCTYPE(None, c_int, c_int)))]
Oder einfach, um die Feldversätze zu berechnen
$ ccrawl -l test.db info 'struct S' Bezeichner: Struktur S Klasse: cStruct Quelle: simple.h Schlagwort: test0 Größe: 40 Offsets: [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
Kommen wir nun zu einem kniffligeren C++-Beispiel:
$ ccrawl -l test.db Collect -a --cxx Proben/shahar.cpp [100 %] shahar.cpp [ 18] -------------------------------------------------- ------------------- Datenbank wird gespeichert... [ 18]
Wir können eine vollständige (rekursive) Definition einer Klasse zeigen:
$ ccrawl -l test.db show -r 'class Child' Klasse Großeltern { öffentlich: virtuelle Leere grandparent_foo(); int grandparent_data; }; Klasse Parent1: virtueller öffentlicher Großelternteil { öffentlich: virtuelle Leere parent1_foo(); int parent1_data; }; Klasse Parent2: virtueller öffentlicher Großelternteil { öffentlich: virtuelle Leere parent2_foo(); int parent2_data; }; Klasse Kind: öffentlicher Elternteil1, öffentlicher Elternteil2 { öffentlich: virtuelle Leere child_foo(); int child_data; };
Und sein ctypes-Speicherlayout:
$ ccrawl -l test.db show -f ctypes 'class Child' struct___layout$Child = type('struct___layout$Child',(Struktur,),{}) struct___layout$Child._fields_ = [("__vptr$Parent1", c_void_p), ("parent1_data", c_int), ("__vptr$Parent2", c_void_p), ("parent2_data", c_int), ("child_data", c_int), ("__vptr$Grandparent", c_void_p), ("grandparent_data", c_int)]
Weitere Beispiele finden Sie in der Dokumentation.