حالة: | قيد التطوير |
موقع: | https://github.com/bdcht/ccrawl |
إصدار: | 1.x |
الوثيقة: | http://ccrawl.readthedocs.io/en/latest/index.html |
يستخدم Ccrawl clang لإنشاء قاعدة بيانات مرتبطة بمختلف هياكل بيانات C/C++ (البنية، والاتحاد، والفئة، والتعداد، والنوع، والنماذج الأولية، ووحدات الماكرو) والتي تسمح بتحديد أنواع البيانات والثوابت/وحدات الماكرو عن طريق الاستعلام عن قاعدة البيانات هذه لخصائص محددة، بما في ذلك الخصائص تتعلق بتخطيط ذاكرة البنية/الفئة.
في الأساس يسمح على سبيل المثال ل
يسمح Ccrawl بعد ذلك بإخراج الهياكل التي تم العثور عليها في العديد من التنسيقات: C/C++ بالطبع، ولكن أيضًا ctypes أو amoco. يتوافق إخراج ctypes لفئة C++ مع تخطيط مثيل (كائن) في الذاكرة، بما في ذلك جميع مؤشرات الجدول الافتراضية (أو VTT) التي تنتج من فئات أصل متعددة (ربما افتراضية).
أخيرًا، يسمح Ccrawl بحساب إحصائيات مختلفة حول واجهة برمجة تطبيقات المكتبة، ويسمح بحساب الرسم البياني للتبعية لأي نوع معين، على سبيل المثال (انظر الاختبارات/العينات/xxx/graph.h):
يمكن العثور على وثائق المستخدم وواجهة برمجة التطبيقات على http://ccrawl.readthedocs.io/en/latest/index.html
خذ بعين الاعتبار بنية C التالية من ملف Samples/simple.h
البنية س { شار ج؛ كثافة العمليات ن؛ اتحاد { حرف x غير موقع[2]; قصيرة غير موقعة؛ } ش; شار (*PtrCharArrayOf3[2])[3]; باطلة (*pfunc)(int, int); };
أولاً، قم بجمع تعريف البنية في قاعدة بيانات محلية:
$ ccrawl -l test.db -g 'test0' جمع العينات/simple.h [100%] بسيط.ح [ 2] -------------------------------------------------- ------------------ حفظ قاعدة البيانات... [ 2]
ومن ثم، من الممكن ترجمة البنية الكاملة إلى أنواع ctypes
$ ccrawl -l test.db show -r -f ctypes 'struct S' struct_S = type('struct_S',(الهيكل,),{}) union_b0eccf67 = النوع('union_b0eccf67',(الاتحاد,),{}) union_b0eccf67._fields_ = [("x"، c_ubyte*2)، ("ق"، c_ushort)] struct_S._anonymous_ = ("u"،) struct_S._fields_ = [("c"، c_byte)، ("ن"، ج_int)، ("ش"، union_b0eccf67)، ("PtrCharArrayOf3"، POINTER(c_byte*3)*2)، ("pfunc"، POINTER(CFUNCTYPE(None, c_int, c_int)))]
أو ببساطة لحساب إزاحة الحقول
$ ccrawl -l test.db معلومات "struct S" المعرف: الهيكل S الفئة: جستروكت المصدر: simple.h العلامة: اختبار0 الحجم: 40 الإزاحات : [(0, 1), (4, 4), (8, 2), (16, 16), (32, 8)]
الآن دعونا نتعامل مع مثال C++ أكثر صعوبة:
$ ccrawl -l test.db Collect -a --cxx Samples/shahar.cpp [100%] shahar.cpp [ 18] -------------------------------------------------- ------------------ حفظ قاعدة البيانات... [ 18]
يمكننا إظهار تعريف كامل (عودي) للفئة:
$ ccrawl -l test.db show -r 'class Child' فئة الجد { عام: الفراغ الظاهري grandparent_foo(); int grandparent_data؛ }; فئة Parent1: الجد العام الظاهري { عام: الفراغ الظاهريparent1_foo(); intparent1_data; }; فئة Parent2: الجد العام الظاهري { عام: الفراغ الظاهريparent2_foo(); intparent2_data; }; فئة الطفل: Parent1 العامة، Parent2 العامة { عام: الفراغ الظاهري Child_foo(); كثافة العمليات الخاصة ببيانات الطفل؛ };
وتخطيط ذاكرة ctypes الخاص بها:
$ ccrawl -l test.db show -f ctypes "class 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)، ("بيانات_الطفل"، c_int)، ("__vptr$الجد"، c_void_p)، ("بيانات_الجد"، c_int)]
راجع الوثائق لمزيد من الأمثلة.