| สถานะ: | อยู่ระหว่างการพัฒนา |
| ที่ตั้ง: | https://github.com/bdcht/ccrawl |
| เวอร์ชัน: | 1.x |
| เอกสาร: | http://ccrawl.readthedocs.io/en/latest/index.html |
Ccrawl ใช้เสียงดังกราวเพื่อสร้างฐานข้อมูลที่เกี่ยวข้องกับโครงสร้างข้อมูล C/C++ ต่างๆ (struct, union, class, enum, typedef, ต้นแบบ และมาโคร) ซึ่งช่วยในการระบุประเภทข้อมูลและค่าคงที่/มาโครโดยการสืบค้นฐานข้อมูลนี้สำหรับคุณสมบัติเฉพาะ รวมถึงคุณสมบัติ เกี่ยวข้องกับโครงร่างหน่วยความจำ struct/class
โดยพื้นฐานแล้วจะช่วยให้ตัวอย่างเช่น
จากนั้น Ccrawl จะอนุญาตให้ส่งออกโครงสร้างที่พบในหลายรูปแบบ: แน่นอนว่า C/C++ รวมถึง ctypes หรือ amoco ด้วย เอาต์พุต ctypes ของคลาส C++ สอดคล้องกับเค้าโครงอินสแตนซ์ (วัตถุ) ในหน่วยความจำ รวมถึงตัวชี้ตารางเสมือนทั้งหมด (หรือ VTT) ที่เป็นผลมาจากคลาสพาเรนต์หลายคลาส (อาจเป็นเสมือน)
สุดท้ายนี้ Ccrawl อนุญาตให้คำนวณสถิติต่างๆ เกี่ยวกับไลบรารี API และอนุญาตให้คำนวณกราฟการขึ้นต่อกันของประเภทที่กำหนด เช่น (ดูการทดสอบ/ตัวอย่าง/xxx/graph.h):

เอกสารประกอบผู้ใช้และ API สามารถพบได้ที่ http://ccrawl.readthedocs.io/en/latest/index.html
พิจารณาโครงสร้าง C ต่อไปนี้จากไฟล์ ตัวอย่าง/simple.h
โครงสร้าง S {
ถ่านค;
อินท์เอ็น;
สหภาพ {
ถ่านที่ไม่ได้ลงนาม x [2];
สั้นที่ไม่ได้ลงนาม s;
} คุณ;
ถ่าน (*PtrCharArrayOf3[2])[3];
เป็นโมฆะ (*pfunc)(int, int);
-
ขั้นแรก ให้รวบรวมคำจำกัดความของโครงสร้างในฐานข้อมูลภายในเครื่อง:
$ ccrawl -l test.db -g 'test0' รวบรวมตัวอย่าง/simple.h [100%] ง่าย ๆ [ 2] - บันทึกฐานข้อมูล... [ 2]
จากนั้นจึงเป็นไปได้ที่จะแปลโครงสร้างทั้งหมดเป็น ctypes
$ ccrawl -l test.db แสดง -r -f ctypes 'struct S'
struct_S = type('struct_S',(โครงสร้าง,),{})
union_b0eccf67 = type('union_b0eccf67',(ยูเนี่ยน,),{})
union_b0eccf67._fields_ = [("x", c_ubyte*2)
("s", c_ushort)]
struct_S._anonymous_ = ("คุณ",)
struct_S._fields_ = [("c", c_byte)
("น", c_int)
("คุณ", union_b0eccf67),
("PtrCharArrayOf3", ตัวชี้(c_byte*3)*2),
("pfunc", POINTER(CFUNCTYPE(ไม่มี, c_int, c_int)))]
หรือเพียงเพื่อคำนวณออฟเซ็ตของฟิลด์
$ ccrawl -l ข้อมูล test.db 'struct S' ตัวระบุ: struct S คลาส : cStruct ที่มา: simple.h แท็ก: ทดสอบ0 ขนาด : 40 ออฟเซ็ต : [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
ตอนนี้เรามาจัดการกับตัวอย่าง C++ ที่ยุ่งยากกว่านี้กันดีกว่า:
$ ccrawl -l test.db รวบรวม -a --cxx ตัวอย่าง/shahar.cpp [100%] shahar.cpp [ 18] - บันทึกฐานข้อมูล... [ 18]
เราสามารถแสดงคำจำกัดความ แบบเต็ม (เรียกซ้ำ) ของคลาสได้:
$ ccrawl -l test.db แสดง -r 'คลาสเด็ก'
คลาสปู่ย่าตายาย {
สาธารณะ:
โมฆะเสมือนปู่ย่าตายาย_foo ();
int ปู่ย่าตายาย_data;
-
คลาส Parent1 : ปู่ย่าตายายเสมือนสาธารณะ {
สาธารณะ:
โมฆะเสมือน parent1_foo();
int parent1_data;
-
คลาส Parent2 : ปู่ย่าตายายเสมือนสาธารณะ {
สาธารณะ:
โมฆะเสมือน parent2_foo();
int parent2_data;
-
เด็กคลาส: Parent1 สาธารณะ, Parent2 สาธารณะ {
สาธารณะ:
โมฆะเสมือน child_foo();
int child_data;
-
และเค้าโครงหน่วยความจำ ctypes:
$ ccrawl -l test.db แสดง -f ctypes 'คลาส Child'
struct___layout$Child = type('struct___layout$Child',(โครงสร้าง,),{})
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$ปู่ย่าตายาย", c_void_p),
("ปู่ย่าตายาย_data", c_int)]
ดูเอกสารประกอบสำหรับตัวอย่างเพิ่มเติม