PVS Studio.VS التحليل الإحصائي لدول مجلس التعاون الخليجي 10. اختبار مصغر مستقل

بعد ظهور المقالة المترجمة حول التحليل الثابت في دول مجلس التعاون الخليجي 10 ، ورد الفعل المتوقع من ممثلي مطور محلل الاستاتيك التجاري PVS-Studio الموجودين هنا ، سألت: "لماذا يرفض الممثلون اختبار منتجهم بمثل هذه الأمثلة البسيطة للتحليل الساكن ، ولا يخفون ما هم؟ "
أندري 2008نعم ، إنها ليست مثيرة للاهتمام بالنسبة لي. اشتعلت / لم يمسك خطأ اصطناعي ، هذا لا يقول أي شيء عن قدرات المحلل
هل يجب عليهم بطريقة ما إجراء اختبارات الوحدة لمنتجهم وكيف ، إن لم يكن مع مثل هذه الأمثلة الاصطناعية البسيطة ؟!

في الواقع ، كان علي أن أفعل ذلك بنفسي.

اختبار رقم 1. أبسط مثال على الخطأ المزدوج الحر


تم التشخيص باستخدام:
V586 يتم استدعاء الوظيفة "المجانية" مرتين لإلغاء تخصيص نفس مساحة الذاكرة. افحص الحجة الأولى. تحقق من الخطوط: 5 ، 6. 1_dbl_free.c 6

مرت

اختبار رقم 2. longjmp () مجانا ()


شتائم غير مفهومة في ثابت في malloc ، ولكن تم اكتشاف خطأ - رمز يتعذر الوصول إليه وذاكرة غير مستخدمة:
تقبل وظيفة V118 malloc () تعبيرًا خطيرًا بصفته حجة. 2_longjump.c 13
V779 تم اكتشاف رمز يتعذر الوصول إليه. من الممكن أن يكون هناك خطأ. 2_longjump.c 15
V799 لا يتم استخدام المتغير "ptr" بعد تخصيص الذاكرة له. ضع في اعتبارك التحقق من استخدام هذا المتغير. 2_longjump.c 13

مرت

اختبار رقم 3. تسربات Malloc () و fopen () الملفات غير المغلقة


تم العثور:
تقبل الدالة V118 malloc () تعبيرًا خطيرًا بصفته وسيطة. 3_fopen.c 7
V773 تم الخروج من نطاق الرؤية لمقبض الملف 'f' بدون إغلاق الملف. من الممكن حدوث تسرب في الموارد. 3_fopen.c 9
V773 تم الخروج من نطاق الرؤية للمؤشر 'p' دون تحرير الذاكرة. من الممكن حدوث تسرب للذاكرة. 3_fopen.c 9
V799 لا يتم استخدام المتغير 'p' بعد تخصيص الذاكرة له. ضع في اعتبارك التحقق من استخدام هذا المتغير. 3_fopen.c 7

مرت

اختبار رقم 4. مراقبة استخدام الذاكرة بعد تحريرها


تم اكتشاف
خطأ : V774 تم استخدام المؤشر 'n' بعد تحرير الذاكرة. 4_use_after_free.c 9
V591 يجب أن تُرجع الدالة غير الفارغة قيمة. 4_use_after_free.c 11

مرت

اختبار رقم 5. عنصر تحكم تحرير مؤشر غير كومة (كومة)


تم إصدار تحذيرات بدون أخطاء:
V104 التحويل الضمني لـ 'n' إلى نوع memsize في تعبير حسابي: sizeof (int) * n 5_free_nonheap.c 11
V799 لا يتم استخدام المتغير '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);
  /* do stuff */
  closefile(f);
  fclose(f);
  free (p);
  free(f);  // <-  UB
}

فشل

اختبار رقم 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.

على الرغم من أنه لا يخلو من بعض العوائق ، إلا أنه يستحق استخدامه ، خاصة أنه سيتم اكتشاف العديد من الأخطاء البشرية ، ليس فقط من مجال التحليل الثابت.

All Articles