| 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.