متناثر
Sparse هي أداة برمجية حاسوبية مصممة للعثور على أخطاء برمجية محتملة في نواة لينكس . [ 2 ] على عكس الأدوات الأخرى المماثلة ، صُممت أداة التحليل الثابت هذه في البداية فقط لتحديد البنى التي من المحتمل أن تكون ذات أهمية لمطوري النواة ، مثل خلط المؤشرات إلى مساحات عناوين المستخدم والنواة .
يقوم النظام بإجراء فحوصات متفرقة للمشاكل المعروفة ويسمح للمطور بتضمين التعليقات التوضيحية في التعليمات البرمجية التي تنقل معلومات حول أنواع البيانات ، مثل مساحة العنوان التي تشير إليها المؤشرات والأقفال التي تحصل عليها الدالة أو تحررها.
بدأ لينوس تورفالدز في كتابة Sparse في عام 2003. وكان جوش تريبلت هو المسؤول عن صيانتها منذ عام 2006، وهو دور تولاه كريستوفر لي في عام 2009 [ 3 ] ولوك فان أوستنريك في نوفمبر 2018. [ 4 ] يتم إصدار Sparse بموجب ترخيص MIT .
التعليقات التوضيحية
تتطلب بعض عمليات التحقق التي يُجريها Sparse إضافة تعليقات توضيحية إلى شفرة المصدر باستخدام امتداد __attribute__GCC ، أو مُحدِّد Sparse الخاص __context__. [ 5 ] يُعرِّف Sparse قائمة السمات التالية:
address_space(num)bitwiseforcecontext(expression,in_context,out_context)
عند تعريف واجهة برمجة التطبيقات (API) باستخدام ماكرو، يمكن استبدال المحدد بـ .__attribute__((context(...)))__context__(...)
تعريفات نواة لينكس
تُعرّف نواة لينكس الصيغ المختصرة التالية كوحدات ماكرو للمعالجة المسبقة في الملفين linux/compiler.h و linux/types.h (عند البناء بدون __CHECKER__العلامة، تتم إزالة جميع هذه التعليقات التوضيحية من الكود):
#ifdef __CHECKER__ #define __user __attribute__((noderef, address_space(1))) #define __kernel __attribute__((address_space(0))) #define __safe __attribute__((safe)) #define __force __attribute__((force)) #define __nocast __attribute__((nocast)) #define __iomem __attribute__((noderef, address_space(2))) #define __must_hold(x) __attribute__((context(x,1,1))) #define __acquires(x) __attribute__((context(x,0,1))) #define __releases(x) __attribute__((context(x,1,0))) #define __acquire(x) __context__(x,1) #define __release(x) __context__(x,-1) #define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) #define __percpu __attribute__((noderef, address_space(3))) #ifdef CONFIG_SPARSE_RCU_POINTER #define __rcu __attribute__((noderef, address_space(4))) #else #define __rcu #endif extern void __chk_user_ptr ( const volatile void __user * ); extern void __chk_io_ptr ( const volatile void __iomem * ); #وإلا # تعريف __user # تعريف __kernel # تعريف __safe # تعريف __force # تعريف __nocast # تعريف __iomem # تعريف __chk_user_ptr(x) (void)0 # تعريف __chk_io_ptr(x) (void)0 # تعريف __builtin_warning(x, y...) (1) # تعريف __must_hold(x) # تعريف __acquires(x) # تعريف __releases(x) # تعريف __acquire(x) (void)0 # تعريف __release(x) (void)0 # تعريف __cond_lock(x,c) (c) # تعريف __percpu # تعريف __rcu #endif#ifdef __CHECKER__ # define __bitwise __attribute__((bitwise)) #else # define __bitwise #endifأمثلة
يمثل النوعان __le32و __be32أنواعًا عددية صحيحة 32 بت ذات ترتيب بتات مختلف . مع ذلك، لا تسمح لغة C بتحديد عدم جواز خلط المتغيرات من هذه الأنواع. bitwiseتُستخدم السمة لتمييز هذه الأنواع على أنها مقيدة، لذا سيُصدر Sparse تحذيرًا في حال خلط متغيرات من هذه الأنواع أو متغيرات عددية صحيحة أخرى.
typedef __u32 __bitwise __le32 ; typedef __u32 __bitwise __be32 ;لتمييز التحويلات الصحيحة بين الأنواع المقيدة، forceيتم استخدام التحويل باستخدام السمة لتجنب إعطاء Sparse تحذيرًا.
انظر أيضاً
مراجع
- ^ لوك فان أوستنريك (2021-09-06). "متناثر 0.6.4" . linux-sparse@vger.kernel.org (القائمة البريدية) . تم الاسترجاع بتاريخ 2024-05-08 .
- ↑ يوان باديوليو؛ رينيه ريدوف هانسن؛ جوليا ل. لاوال ؛ جيل مولر (2006). رقع دلالية لتوثيق وأتمتة التطورات الجانبية في برامج تشغيل أجهزة لينكس . وقائع ورشة العمل الثالثة حول لغات البرمجة وأنظمة التشغيل: الدعم اللغوي لأنظمة التشغيل الحديثة. CiteSeerX 10.1.1.122.7080 . doi : 10.1145/1215995.1216005 . ISBN 1-59593-577-0بدأ مجتمع لينكس مؤخرًا باستخدام أدوات متنوعة لتحسين تحليل
كود لغة C. Sparse هي مكتبة، تُشبه واجهة أمامية للمترجم، تُتيح الوصول بسهولة إلى شجرة بناء الجملة المجردة ومعلومات أنواع البيانات لبرنامج C.
- ↑ كريستوفر لي (16 أكتوبر 2009). "إصدار Sparse 0.4.2" . قائمة بريدية linux-sparse . تاريخ الاسترجاع: 6 نوفمبر 2010 .
- ↑ تغيير مسؤول صيانة Sparse ، تم الاطلاع عليه في 10 ديسمبر 2018
- ↑ "بنية السمات - استخدام مجموعة مترجمات جنو (GCC)" . مؤسسة البرمجيات الحرة . تم الاطلاع عليه بتاريخ 13 نوفمبر 2010 .
للمزيد من القراءة
- نيل براون (2016-06-08). "مُقتضب: نظرة من الداخل" . LWN.net . تاريخ الاسترجاع: 2021-11-26 .
- جوناثان كوربيت (1 يونيو 2004). "اكتشاف مشاكل النواة تلقائيًا" . LWN.net . تاريخ الاسترجاع: 26 نوفمبر 2021 .
- دوك سيرلز (24 نوفمبر 2003). "لينوس والمجانين، الجزء الأول" . مجلة لينكس . تاريخ الاسترجاع: 26 نوفمبر 2021 .
- سوبراتا موداك؛ بالبير سينغ؛ ياماتو ماساتاكي (2009). اختبار بروتوكول نقل لينكس (LTP) - التحقق من صحة نواة لينكس وحالات الاختبار (ملف PDF) . ندوة أوتاوا لينكس 2009. الصفحات 209-220 . تاريخ الاسترجاع: 26 نوفمبر 2021 .
- دانيال دي غراف (2010). الكشف عن العيوب الثابتة في مجموعات التغييرات (ملف PDF) (رسالة ماجستير). أميس، آيوا: جامعة ولاية آيوا. OCLC 665146513. تاريخ الاسترجاع: 7 نوفمبر 2010 .
روابط خارجية
- الوثائق الرسمية
- استخدام المصفوفات المتفرقة للتحقق من الأنواع ، وثائق نواة لينكس
- محلل دلالي للغة C – دليل مستخدم لينكس – أوامر المستخدم من Manned.org
- غلاف المُصرّف لتشغيل Sparse بعد التجميع – دليل مستخدم لينكس – أوامر المستخدم من Manned.org
- أدوات تحليل البرامج الثابتة
- أدوات اختبار البرمجيات المجانية
- برنامج مرخص بموجب ترخيص MIT
