
سبب الحزن تعليق على إحدى مقالاتنا. في هذه المقالة ، تمت كتابة أن المحلل يكتشف خطأ مطبعي عن طريق إصدار تحذير إلى الكود التالي:
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' صحيح دائمًا.
المبرمجين لا داعي للقلق. الأدوات الحديثة متطورة ولا تصدر سوى تحذيرات من التعليمات البرمجية المشبوهة حقًا. هناك إيجابيات خاطئة ، ولكن كقاعدة عامة ، ترتبط بوجود رمز محير ، والذي قد يكون من الصعب حتى على الشخص فهمه.

روابط إضافية
- أمثلة على الأخطاء التي تم اكتشافها بواسطة أداة التشخيص V547 .
- الاعراب الثابت والتعبيرات العادية (لماذا هي فكرة سيئة :).
- التقنيات المستخدمة في محلل كود PVS-Studio لاكتشاف الأخطاء ونقاط الضعف المحتملة .

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