منهجية التحليل الثابت تستخدم تقنيات مختلفة. واحد منهم هو المعالجة المسبقة للملفات مباشرة قبل تحليلها. يتم إنشاء الملفات التي تمت معالجتها مسبقًا بواسطة برنامج التحويل البرمجي الذي يعمل في وضع التشغيل الخاص. لسوء الحظ ، لم يتم اختبار هذا الوضع جيدًا ، كما توضح سنوات خبرتنا العديدة في تطوير أداة تحليل الشفرة الثابتة. في هذه الملاحظة ، سأقدم مثالًا على خطأ تم العثور عليه حديثًا في برنامج التحويل البرمجي C ++ من Microsoft.
مقدمة
لإظهار قدرات محلل ثابت PVS-Studio ، يقوم فريقنا بفحص الكود المصدري لمشاريع Open Source. هذا هو
مساهمة كبيرة في جودة البرمجيات مفتوحة المصدر ، الإعلان إضافية واختبار محلل. في بعض الأحيان نجد مشاكل غير عادية للغاية في المجمعين والتي يصعب القيام بها على جانب المحلل. لذلك ، كتب أحد الزملاء مؤخرًا مقالًا "لم يعد
الملف الذي يحتوي على توجيه" الاستيراد "(خطأ داخلي للمترجم" msc1.cpp ") قد تم تحليله. ماذا علي أن أفعل؟ " لمساعدة مستخدمينا في حل مشكلة "أجنبية".
ماذا عن المغلق؟
تم العثور على خلل مثير للاهتمام بنفس القدر عند فحص مشروع كبير. برنامج التحويل البرمجي Microsoft لـ C / C ++ الإصدار 19.16.27027.1 (Visual Studio v15.9.9) أنتج هذا الخطأ عند تحليل عدة ملفات:
fatal error C1021: invalid preprocessor command 'tooltiphint'
من الواضح أن هذا ليس توجيهًا للمعالج المسبق ، ولكن ما هو؟ هذا مقتطف من شفرة CSS:
#tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; }
بعد عرض الجزء ، أصبح من الواضح أن المترجم قد أخطأ أثناء المعالجة المسبقة للملف ، ولكن تم تجميع الشفرة بنجاح. مقتطف من شفرة CSS هو جزء من السلسلة الحرفية لرمز C ++. إليك نموذج التعليمات البرمجية كافية لتكرار الخطأ:
std::string test = R"<<<( <style type="text/css"> body { color:#000000; background-color:#ffffff } body { font-family:Helvetica, sans-serif; font-size:10pt } #tooltiphint { position: fixed; width: 50em; margin-left: -25em; left: 50%; padding: 10px; border: 1px solid #b0b0b0; border-radius: 2px; box-shadow: 1px 1px 7px black; background-color: #c0c0c0; z-index: 2; } .macro { color: darkmagenta; background-color:LemonChiffon; /* Macros are position: relative to provide base for expansions. */ position: relative; } </style> </head> <body>)<<<";
جزء الرمز أعلاه لا يتداخل مع الترجمة الناجحة ، ولكن في الوقت نفسه ، سيحدث خطأ في وضع المعالجة المسبقة (
/ علامة
P ).
هذه هي الحياة الصعبة لمطوري التحليلات الثابتة :). يبدو أن PVS-Studio ليست مسؤولة ، ولكن لا يزال يتعين علينا التعامل مع مشاكل مماثلة. ومع ذلك ، هذا ليس شيئا جديدا. يمكن العثور على بعض الحالات المماثلة الأخرى في المقال "
PVS-Studio والبيئة المعادية ".
استنتاج
سيتم إرسال هذه المشكلة إلى متعقب الأخطاء الرسمي ، ولكن لا يمكن إيجاد حل سريع للمشكلة. على سبيل المثال ، سيتم حل مشكلة توجيه
#import التي حددناها قبل عدة أشهر ، والتي كتبت عنها في البداية ، فقط في الإصدار التالي من Visual Studio. لأن سيحدث إصدار Visual Studio 2019 الجديد في غضون أسبوع ، على الأرجح ، لن يتم إصلاح هذا الخطأ بحلول هذا التاريخ. يُنصح مستخدمو PVS-Studio أيضًا باستخدام الماكرو
PVS_STUDIO .

إذا كنت ترغب في مشاركة هذه المقالة مع جمهور يتحدث الإنجليزية ، فالرجاء استخدام الرابط الخاص بالترجمة: Svyatoslav Razmyslov.
كيف كسر جزء العلامات CSS برنامج التحويل البرمجي C ++