بعد ظهور المقالة المترجمة حول التحليل الثابت في دول مجلس التعاون الخليجي 10 ، ورد الفعل المتوقع من ممثلي مطور محلل الاستاتيك التجاري PVS-Studio الموجودين هنا ، سألت: "لماذا يرفض الممثلون اختبار منتجهم بمثل هذه الأمثلة البسيطة للتحليل الساكن ، ولا يخفون ما هم؟ "أندري 2008نعم ، إنها ليست مثيرة للاهتمام بالنسبة لي. اشتعلت / لم يمسك خطأ اصطناعي ، هذا لا يقول أي شيء عن قدرات المحلل
هل يجب عليهم بطريقة ما إجراء اختبارات الوحدة لمنتجهم وكيف ، إن لم يكن مع مثل هذه الأمثلة الاصطناعية البسيطة ؟!في الواقع ، كان علي أن أفعل ذلك بنفسي.اختبار رقم 1. أبسط مثال على الخطأ المزدوج الحر
تم التشخيص باستخدام:V586 يتم استدعاء الوظيفة "المجانية" مرتين لإلغاء تخصيص نفس مساحة الذاكرة. افحص الحجة الأولى. تحقق من الخطوط: 5 ، 6. 1_dbl_free.c 6مرتاختبار رقم 2. longjmp () مجانا ()
شتائم غير مفهومة في ثابت في malloc ، ولكن تم اكتشاف خطأ - رمز يتعذر الوصول إليه وذاكرة غير مستخدمة:تقبل وظيفة V118 malloc () تعبيرًا خطيرًا بصفته حجة. 2_longjump.c 13V779 تم اكتشاف رمز يتعذر الوصول إليه. من الممكن أن يكون هناك خطأ. 2_longjump.c 15V799 لا يتم استخدام المتغير "ptr" بعد تخصيص الذاكرة له. ضع في اعتبارك التحقق من استخدام هذا المتغير. 2_longjump.c 13مرتاختبار رقم 3. تسربات Malloc () و fopen () الملفات غير المغلقة
تم العثور:تقبل الدالة V118 malloc () تعبيرًا خطيرًا بصفته وسيطة. 3_fopen.c 7V773 تم الخروج من نطاق الرؤية لمقبض الملف 'f' بدون إغلاق الملف. من الممكن حدوث تسرب في الموارد. 3_fopen.c 9V773 تم الخروج من نطاق الرؤية للمؤشر 'p' دون تحرير الذاكرة. من الممكن حدوث تسرب للذاكرة. 3_fopen.c 9V799 لا يتم استخدام المتغير 'p' بعد تخصيص الذاكرة له. ضع في اعتبارك التحقق من استخدام هذا المتغير. 3_fopen.c 7مرتاختبار رقم 4. مراقبة استخدام الذاكرة بعد تحريرها
تم اكتشافخطأ : V774 تم استخدام المؤشر 'n' بعد تحرير الذاكرة. 4_use_after_free.c 9V591 يجب أن تُرجع الدالة غير الفارغة قيمة. 4_use_after_free.c 11مرتاختبار رقم 5. عنصر تحكم تحرير مؤشر غير كومة (كومة)
تم إصدار تحذيرات بدون أخطاء:V104 التحويل الضمني لـ 'n' إلى نوع memsize في تعبير حسابي: sizeof (int) * n 5_free_nonheap.c 11V799 لا يتم استخدام المتغير 'ptr' بعد تخصيص الذاكرة له. ضع في اعتبارك التحقق من استخدام هذا المتغير. 5_free_nonheap.c 11فشلاختبار رقم 6. معالج إشارة داخل غير صالح ()
فشل علىالرغم من أن هذا تشخيص محدد لدرجة أنني لن أؤذيه.بعد ذلك ، استعرضت قائمة التشخيصات في دول مجلس التعاون الخليجي 10 وأضفت أمثلة ، لذا المزيد من الاختبارات برموز المصدر.اختبار رقم 7. مضاعفة إغلاق ملف وإطلاق ملف مغلق *
لم يكشف PVS عن هذه الأخطاء وقداكتشف GCC 10 ازدواج fclose ولكنه لم يكتشف مجانًا لمقبض مغلق.#include <stdlib.h>
void closefile(FILE* f) {
fclose(f);
}
void test(const char *filename) {
FILE *f = fopen(filename, "r");
void *p = malloc(1024);
closefile(f);
fclose(f);
free (p);
free(f);
}
فشلاختبار رقم 8. longjmp () على كومة قديمة
لم يلاحظ PVS أي شيء ، عملت GCC10 بشكل صحيح#include <setjmp.h>
#include <stdlib.h>
static jmp_buf env;
static int i;
static void inner(void) {
longjmp(env, 1);
}
static void middle(void) {
inner();
}
void outer(void) {
i = setjmp(env);
}
void outer_x2(void) {
outer();
if (i == 0)
middle();
}
فشلاختبار رقم 9. إرجاع المؤشر إلى متغير المكدس
فشل كل من المشاركين ، على الرغم من أنه في حالات بسيطة ، يكتشف GCC هذا ، ولكن هذه ليست وظيفة -fanalyzer (أو قد لا يتم تنفيذها بعد).#include<stdlib.h>
struct str1 {
char buf[10];
};
struct str1 * ret(int sel)
{
struct str1 var1, *pval;
if(sel == 1)
pval = &var1;
else if(sel != 1)
pval = (struct str1 *)malloc(1000);
return pval;
}
فشلاختبار رقم 10. مصفوفة مصفوفة ملوثة وتشخيص قيمة استخدام غير مهيأة
يبدو أنهم لا يعملون في دول مجلس التعاون الخليجي 10 - fanalyzer حتى الآن .يلتقط PVS هذا ، كما تم إثباته عدة مرات.تم الاجتياز بنجاحاستنتاج
هناك بالتأكيد تحليل ثابت في PVS-Studio.على الرغم من أنه لا يخلو من بعض العوائق ، إلا أنه يستحق استخدامه ، خاصة أنه سيتم اكتشاف العديد من الأخطاء البشرية ، ليس فقط من مجال التحليل الثابت.