إنه لأمر مخز للآراء حول محللات الكود الثابت

لقد مضت أدوات تحليل التعليمات البرمجية الثابتة إلى الأمام بعيدًا. هذه ليست على الإطلاق "linters" التي كانت تستخدم بنشاط قبل 20 عاما. ومع ذلك ، لا يزال الكثيرون يشيرون إليها على أنها أدوات بسيطة للغاية. إنه لعار. إنه لأمر مخز بالنسبة لمنهجية تحليل الكود بشكل عام وأداة PVS-Studio.







سبب الحزن تعليق على إحدى مقالاتنا. في هذه المقالة ، تمت كتابة أن المحلل يكتشف خطأ مطبعي عن طريق إصدار تحذير إلى الكود التالي:



if (A[0] == 0)
{
  X = Y;
  if (A[0] == 0)
    ....
}


يقول المحلل أن الشرط الثاني صحيح دائمًا. في الواقع ، إذا قمت بفحص جسم الوظيفة ، يصبح من الواضح أنه يجب فحص عنصر آخر من المصفوفة.



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



وبطبيعة الحال ، فإن أي محلل ثابت حديث يتتبع التغييرات في قيمة المتغيرات. إذا لم يتغير المتغير ، ستكون هناك رسالة. إذا تغير ، فلن تكون هناك رسالة. لهذا ، يتم استخدام تقنية تحليل تدفق البيانات.



هذا هو بالضبط ما يفعله محلل PVS-Studio الثابت. دعنا نلقي نظرة على المثال التركيبي التالي:



char get();
int foo(char *p, bool arg)
{
    if (p[1] == 1)
    {
        if (arg)
            p[0] = get();
        if (p[1] == 1)          // Warning
            return 1;
    }
    if (p[2] == 2)
    {
        if (arg)
            p[2] = get();
        if (p[2] == 2)          // Ok
            return 2;
    }
    return 3;
}


يحتوي الرمز على كتلتين متشابهتين. في أحدهما ، لا يتغير المتغير المحدد ، وفي الثاني يتغير. لذلك ، يقوم المحلل بإصدار تحذير للكتلة الأولى فقط: التعبير V547 'p [1] == 1' صحيح دائمًا.



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





روابط إضافية







إذا كنت ترغب في مشاركة هذه المقالة مع جمهور يتحدث الإنجليزية ، فيرجى استخدام رابط الترجمة: Andrey Karpov. آراء مزعجة حول Static Analyzers .



All Articles