Status: | Dalam Pembangunan |
Lokasi: | https://github.com/bdcht/ccrawl |
Versi: | 1.x |
Dokter: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl menggunakan dentang untuk membangun database yang terkait dengan berbagai struktur data C/C++ (struct, union, class, enum, typedef, prototype, dan makro) yang memungkinkan untuk mengidentifikasi tipe data dan konstanta/makro dengan menanyakan database ini untuk properti tertentu, termasuk properti terkait dengan tata letak memori struct/kelas.
Pada dasarnya ini memungkinkan misalnya untuk
Ccrawl kemudian memungkinkan untuk menampilkan struktur yang ditemukan dalam banyak format: C/C++ tentu saja, tetapi juga ctypes, atau amoco. Output ctypes dari kelas C++ sesuai dengan tata letak instance (objek) di memori, termasuk semua penunjuk tabel virtual (atau VTT) yang mungkin dihasilkan dari beberapa kelas induk (mungkin virtual).
Terakhir, Ccrawl memungkinkan untuk menghitung berbagai statistik tentang API perpustakaan, dan memungkinkan untuk menghitung grafik ketergantungan jenis apa pun seperti misalnya (lihat tes/samples/xxx/graph.h):
Dokumentasi pengguna dan API dapat ditemukan di http://ccrawl.readthedocs.io/en/latest/index.html
Pertimbangkan struct C berikut dari file sample/simple.h
struktur S { karakter c; ke dalam n; serikat pekerja { karakter x[2] yang tidak ditandatangani; s pendek yang tidak ditandatangani; } kamu; char(*PtrCharArrayOf3[2])[3]; batal (*pfunc)(int, int); };
Pertama, kumpulkan definisi struktur dalam database lokal:
$ ccrawl -l test.db -g 'test0' kumpulkan sampel/simple.h [100%] sederhana.h [ 2] --------------------------------------------------- ------------------------------ menyimpan basis data... [ 2]
Kemudian, dimungkinkan untuk menerjemahkan struktur lengkap dalam ctypes
$ ccrawl -l test.db tampilkan -r -f ctypes 'struct S' struct_S = tipe('struct_S',(Struktur,),{}) union_b0eccf67 = tipe('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), ("kamu", union_b0eccf67), ("PtrCharArrayOf3", POINTER(c_byte*3)*2), ("pfunc", POINTER(CFUNCTYPE(Tidak ada, c_int, c_int)))]
Atau sekadar menghitung offset bidang
$ ccrawl -l tes.db info 'struct S' pengidentifikasi: struct S kelas : cStruct sumber : sederhana.h tag: tes0 ukuran : 40 offset : [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
Sekarang mari kita bahas contoh C++ yang lebih rumit:
$ ccrawl -l test.db kumpulkan -a --cxx sampel/shahar.cpp [100%] shahar.cpp [ 18] --------------------------------------------------- ------------------------------ menyimpan basis data... [ 18]
Kita dapat menunjukkan definisi kelas secara penuh (rekursif):
$ ccrawl -l test.db tampilkan -r 'kelas Anak' kelas Kakek-Nenek { publik: kekosongan virtual grandparent_foo(); int data_kakek; }; kelas Induk1 : kakek-nenek publik virtual { publik: kekosongan virtual parent1_foo(); int induk1_data; }; kelas Induk2 : kakek-nenek publik virtual { publik: kekosongan virtual parent2_foo(); int induk2_data; }; kelas Anak : Induk publik1, Induk publik2 { publik: kekosongan virtual child_foo(); int data_anak; };
Dan tata letak memori ctypesnya:
$ ccrawl -l test.db tampilkan -f ctypes 'kelas Anak' struct___layout$Child = type('struct___layout$Child',(Struktur,),{}) struct___layout$Child._fields_ = [("__vptr$Parent1", c_void_p), ("induk1_data", c_int), ("__vptr$Parent2", c_void_p), ("induk2_data", c_int), ("data_anak", c_int), ("__vptr$Kakek", c_void_p), ("data_kakek", c_int)]
Lihat dokumentasi untuk contoh lainnya.