بدراسة تحذيرات محلل PVS-Studio في عملية فحص المشاريع المفتوحة المختلفة ، نتأكد مرارًا وتكرارًا من مدى فائدة هذه الأداة. محلل الشفرة يقظ بشكل لا يصدق ولا يتعب أبدًا. يشير إلى الأخطاء التي تتلاشى حتى مع مراجعة متأنية للكود. النظر في حالة أخرى من هذا القبيل.
آخر مرة كتبت فيها
ملاحظة مماثلة ، درست فيها كود المصدر لمشروع StarEngine: 2D Game Engine. لقد أظهر المحلل الآن تفوقه علي أثناء التحقق من إطار عمل Qt.
آخر مرة
اختبرنا فيها إطار Qt في 2014. مر الكثير من الوقت ، تغير المشروع ، وظهرت العديد من التشخيصات الجديدة في محلل PVS-Studio. لذا ، من الممكن كتابة مقال آخر ، وهو ما فعلته.
كتابة أمثلة مثيرة للاهتمام من الأخطاء ، جئت عبر هذا الرمز:
QWindowsCursor::CursorState QWindowsCursor::cursorState() { enum { cursorShowing = 0x1, cursorSuppressed = 0x2 }; CURSORINFO cursorInfo; cursorInfo.cbSize = sizeof(CURSORINFO); if (GetCursorInfo(&cursorInfo)) { if (cursorInfo.flags & CursorShowing)
أصدر PVS-Studio تحذيرًا لهذا الرمز:
V616 CWE-480 يتم استخدام ثابت CursorShowing المسمى بقيمة 0 في عملية أحادي المعامل. 669
تم استخدام إصدار غير مستقر من PVS-Studio للتحقق ، لذلك تعثر إيماني بالمحلل. تنهدت ، وكتبت هذه الحالة إلى متعقب الأخطاء كخطأ يؤدي إلى إيجابية خاطئة: "أوه ، شيء اخترقناه في آليات معالجة عمليات النقل غير المسماة".
كنت متأكدًا تمامًا من أن المحلل كان مخطئًا. بعد كل شيء ، مع وجود أسطر قليلة فقط مكتوبًا أن ثابت
CursorShowing هو 1.
في الوقت نفسه ، حاولت أن أكون حذرا! لقد راجعت الرمز عدة مرات للتأكد من أن المحلل خاطئ. لقد صممت هذا الجزء من التعليمات البرمجية والرسالة المقابلة كخطأ في bugtracker.
لقد قمت بمراجعة شاملة لهذه القطعة الصغيرة من الكود وأفسدت الأمر على أي حال. المحلل على حق وليس الشخص.
في دراسة تفصيلية للحالة ، اتضح أن ثابت
المؤشر يظهر
أعلاه ، ويتم استخدام ثابت
المؤشر في الحالة. الفرق فقط في الحرف الأول! في مكان واحد هو صغير ، وفي عاصمة أخرى.
لماذا يتم تجميع الكود؟ لأن ثابت
المؤشر يظهر أيضًا. ها هو إعلانها:
class QWindowsCursor : public QPlatformCursor { public: enum CursorState { CursorShowing, CursorHidden, CursorSuppressed }; .... }
كما ترون ، ثابت
CursorShowing هو 0. لذلك ، فإن محلل PVS-Studio محق تمامًا في القول بأن الشرط
(cursorInfo.flags & CursorShowing) لا معنى له. الشرط دائما خطأ.
وجد المحلل خطأ مطبعيًا رائعًا. تحليل الحب رمز ثابت! :)

إذا كنت تريد مشاركة هذه المقالة مع جمهور ناطق باللغة الإنجليزية ، فيرجى استخدام رابط الترجمة: Andrey Karpov.
مرة أخرى ، أثبت محلل PVS-Studio أنه أكثر انتباهًا من الشخص .