สถานะ: | อยู่ระหว่างการพัฒนา |
ที่ตั้ง: | 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)]
ดูเอกสารประกอบสำหรับตัวอย่างเพิ่มเติม