كيف كسر جزء العلامات CSS برنامج التحويل البرمجي C ++

الصورة 1

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

Source: https://habr.com/ru/post/ar445496/


All Articles