تتضمن منهجية التحليل الثابت التقنيات المختلفة. واحد منهم هو تجهيز الملفات مباشرة قبل تحليلها. يتم إنشاء الملفات المعدة بواسطة برنامج التحويل البرمجي الذي يعمل في وضع عمل خاص. لسوء الحظ ، تُظهر تجربتنا الطويلة في تطوير محلل ثابت أن هذا الوضع ليس جيدًا للاختبار. في هذه الملاحظة ، سأقدم مثالًا عن خطأ جديد في برنامج التحويل البرمجي C ++ من Microsoft.
مقدمة
لإثبات قدرات محلل الاستاتيك الثابت في PVS-Studio ، يقوم فريقنا بفحص كود المشاريع المفتوحة المصدر. هذا هو
مساهمة كبيرة في جودة البرمجيات مفتوحة المصدر ، والدعاية الإضافية واختبار محلل. في بعض الأحيان ، نكشف عن بعض المشكلات غير المعتادة في المجمعين ، والتي يصعب التعامل معها من جانب المحلل. وهكذا ، كتب زميلي مؤخرًا المقالة "لم
يعد الملف ذو التوجيه" استيراد "يعمل (الخطأ الداخلي للمترجم 'msc1.cpp'). ماذا سنفعل؟ " لمساعدة مستخدمينا في حل مشكلة "شخص آخر" .
ما هو الارتباط مع CSS؟
لقد وجدت خللًا لا يقل إثارة للاهتمام عند التحقق من مشروع كبير. أصدر برنامج التحويل البرمجي لـ 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 أيضًا .