عادة لا نكتب ملاحظات حول إصدار النسخة الجديدة من محلل PVS-Studio. ومع ذلك ، يتضمن الإصدار الجديد العديد من التغييرات المثيرة للاهتمام فيما يتعلق بتحليل شفرة C و C ++ ، والتي نود إخبار مستخدمينا عنها.
جافا قريبا
لنكون صادقين ، لا تزال أحدث الابتكارات وأكثرها إثارة للاهتمام في PVS-Studio مخفية. أعني الدعم في محلل لغة جافا. لا يوجد إصدار بيتا عام من PVS-Studio for Java حتى الآن ، ولكنه سيكون متاحًا قريبًا. إذا كنت ترغب في المشاركة في اختباره ، يمكنك الكتابة إلينا
بالدعم (اختر: أريد محلل لـ Java).
تشخيصات جديدة لـ C و C ++
في الإصدار الجديد ، ابتعدنا قليلاً وأضفنا على الفور 15 تشخيصًا للأغراض العامة لـ C و C ++ (V1021-V1035). في إصدار طفيف ، لم يتم إضافة العديد من التشخيصات دفعة واحدة. يمكن العثور على مزيد من التفاصيل حول كل تشخيص في
الوثائق . في رأيي ، فإن الأكثر إثارة للاهتمام بين التشخيصات الجديدة هي:
- V1026. المتغير يزداد في الحلقة. سيحدث سلوك غير محدد في حالة تجاوز عدد صحيح موقعة.
- V1033. تم تعريف المتغير على أنه تلقائي في C. نوعه الافتراضي هو int.
تم إنشاء التشخيص
V1026 بناءً على
المناقشة في منتدى linux.org.ru. اشتكى المبرمج من خلل في مترجم GCC 8 ، ولكن ، كما اتضح لاحقًا ، كان الخطأ هو الرمز غير الصحيح ، مما أدى إلى سلوك غير محدد. دعونا نلقي نظرة على هذه الحالة.
ملاحظة في المناقشة الأصلية ، يكون المتغير
s من نوع
const char * s . علاوة على ذلك ، على المنصة المستهدفة ، يكون نوع
char غير موقّع. لذلك ، للتوضيح ، كتبت على الفور في المثال أن نوع المؤشر هو
حرف غير موقعة * .
int foo(const unsigned char *s) { int r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return r & 0x7fffffff; }
لا يولد المحول البرمجي كود عامل تشغيل AND (&). ولهذا السبب ، تُرجع الدالة القيم السالبة ، على الرغم من أن هذا لا يجب أن يحدث لنية المبرمج.
يعتقد المطور أن هذا خلل في المترجم. لكن المبرمج الذي كتب مثل هذا الرمز خاطئ بالفعل. لا تعمل الوظيفة بشكل صحيح نظرًا لحدوث سلوك غير محدد فيها.
يرى المترجم أن كمية معينة تعتبر في المتغير
r . يجب ألا يحدث تجاوز للمتغير
r . خلاف ذلك ، هذا سلوك غير محدد لا يجب على المترجم مراعاته وأخذه في الاعتبار. لذلك ، يعتقد المترجم أنه بما أن القيمة في المتغير
r بعد نهاية الدورة لا يمكن أن تكون سالبة ، فإن العملية
r & 0x7fffffff لإعادة تعيين بت الإشارة غير ضرورية ويعيد المترجم ببساطة قيمة المتغير
r من الوظيفة.
تم تصميم التشخيص V1026 للكشف عن مثل هذه الأخطاء. لإصلاح الكود ، يكفي قراءة التجزئة باستخدام متغير غير موقع. النسخة المصححة من الكود:
int foo(const unsigned char *s) { unsigned r = 0; while(*s) { r += ((r * 20891 + *s *200) | *s ^ 4 | *s ^ 3) ^ (r >> 1); s++; } return (int)(r & 0x7fffffff); }
الآن دعونا نلقي نظرة على تشخيص
V1033 آخر. من المثير للاهتمام أن سبب الأخطاء المحتملة كان الكلمة الرئيسية
التلقائية الجديدة ، والتي ظهرت في C ++ 11. وليس مبتكرًا في لغة C ++ 11 نفسها ، بل الفروق الدقيقة في الخطة النفسية :). سأشرح الآن. ألق نظرة على هذا الرمز:
float d = 3.14f; int i = 1; auto sum = d + i;
هل تراه خطأ؟ فكر في الأمر. هذه صورة حتى لا تقرأ النص على الفور.
خمن ما يمكن أن يكون خطأ؟ إذا لم يكن الأمر كذلك ، فإليك بعض المعلومات الأكثر إثارة للاهتمام. سيكون المتغير
المجموع 4 وليس 4.14. لماذا؟
الآن سيقول القارئ أنه كان لغزاً غير شريف! الشيء هو أن هذا ليس C ++ ، ولكن C.
يحدث أن المشروع يستخدم كل من C ++ و C القديمة الجيدة. يعتاد المبرمج على استخدام
auto في C ++ ويمكنه عن طريق الخطأ استخدام هذه الكلمة في C. ولكن هذا يعني شيئًا آخر هناك:
السياراتيعرف المتغير المحلي بأنه له عمر محلي. تستخدم الكلمات الرئيسية التلقائية بناء الجملة التالي: [auto] data-definition;
نظرًا لأن العمر المحلي هو الافتراضي للمتغيرات المحلية ، نادرًا ما يتم استخدام الكلمة الرئيسية التلقائية.اتضح أن
المجموع المتغير من النوع
int ، ولهذا السبب ستكون قيمته 4.
على الرغم من أن الخطأ قد يبدو غريبًا ، في الواقع ، في مشروع يستخدم مزيجًا من ملفات C و C ++ ، فمن السهل جدًا القيام به. وفقًا لذلك ، عند تحليل ملفات C ، يحذر PVS-Studio من هذه التركيبات المشبوهة.
ابتكارات أخرى
تمت إضافة القدرة
على التحقق من المشاريع لنظام
بناء Waf .
نواصل
تطوير المحلل نحو الأنظمة المضمنة. يضيف هذا الإصدار دعمًا للتحقق من المشروع لمجموعة أدوات GNU Arm Embedded ، مترجم Arm Embedded GCC.
عند تحليل المشاريع لمترجم Visual C ++ (cl.exe ، مشاريع vcxproj لـ Visual Studio / Standalone) ، يقوم تقرير المحلل الآن بتخزين السجل في المسارات إلى الملفات المحددة. صقل من الجانب يبدو أسهل مما هو عليه حقا. عند معالجة الملفات ، يفسر المترجم cl.exe الحالة في أسماء الملفات. وعليك استعادتها مرة أخرى إلى المحلل.
تمت إضافة القدرة على استخدام ملفات pvsconfig من CLMonitor / Standalone على Windows.
تمت إضافة وضع تحليل تدريجي لوحدة pvs-studio-analzyer / CMake. يمكن الآن استخدام الوحدة النمطية PVS-Studio CMake على Windows للمشاريع التي تستخدم برنامج التحويل البرمجي Visual C ++ (cl.exe).
تمت إضافة دعم للتحليل المتزايد لمشاريع .NET Core / .NET Standard Visual Studio.
روابط أقسام الموقع
- PVS-Studio. تاريخ الإصدار .
- أندري كاربوف. السلوك غير المحدد أقرب مما تعتقد .
- ويل ديتز ، وبنغ لي ، وجون ريجير ، وفيكرام أدفي. فهم تجاوز عدد صحيح في C / C ++ .
- إيجور بريديكين. تطوير محلل ثابت جديد: PVS-Studio Java .