كيفية التحقق بسرعة من التحذيرات المثيرة للاهتمام التي قدمها محلل PVS-Studio لرمز C و C ++؟


ذات مرة ، يسألني المبرمجون الذين يبدأون في التعرف على محلل كود PVS-Studio: "هل هناك قائمة من التحذيرات التي تشير بدقة إلى الأخطاء؟" لا توجد قائمة من هذا القبيل لأن التحذيرات غير الدقيقة (المزيفة) في أحد المشاريع مهمة ومفيدة للغاية في مشروع آخر. ومع ذلك ، يمكن للمرء بالتأكيد البدء في الحفر في محلل من التحذيرات الأكثر إثارة. دعونا نلقي نظرة فاحصة على هذا الموضوع.

تكمن المشكلة ، كقاعدة عامة ، في البداية في غرق مبرمج في عدد كبير من التحذيرات التي تلقاها. بطبيعة الحال ، يريد أن يبدأ في مراجعة التحذيرات الأكثر إثارة للاهتمام من أجل فهم ما إذا كان ينبغي أن يقضي وقته في فرز كل هذا. حسنًا ، إليك ثلاث خطوات بسيطة ستتيح له التحقق من التحذيرات الأكثر إثارة.

الخطوة 1





تعطيل جميع أنواع التحذيرات باستثناء العامة (GA). الخطأ الشائع هو تمكين جميع أنواع التحذيرات. المستخدمين عديمي الخبرة يعتقدون أنه كلما كان ذلك ممكنا ، كلما كان ذلك أفضل. هذا ليس هو الحال. هناك مجموعات تشخيصية ، مثل اختبارات 64 بت وقواعد MISRA ، التي ينبغي استخدامها فقط عندما يعرف المرء بوضوح ما هي وكيفية التعامل معها. على سبيل المثال ، عند تمكين تشخيصات MISRA لبرنامج تطبيق عادي ، ستغرق في عشرات الآلاف أو مئات الآلاف من التحذيرات مثل:
  • V2506 . ميسرا. يجب أن تحتوي الوظيفة على نقطة خروج واحدة في النهاية.
  • V2507 . ميسرا. يجب وضع نص عبارة حلقة / شرطية في الأقواس.
  • V2523 . ميسرا. يجب أن يكون لكل ثوابت عدد صحيح من النوع غير الموقّع لاحقة "u" أو "U".

تشير معظم تحذيرات MISRA إلى عدم وجود أخطاء ، ولكن رائحة الكود. بطبيعة الحال ، يبدأ مبرمج لطرح الأسئلة. كيف تجد شيئًا مثيرًا للاهتمام في كومة كل هذه التحذيرات؟ ما الأرقام التي يجب أن يشاهدها؟ هذه هي الأسئلة الخاطئة. تحتاج فقط إلى تعطيل مجموعة MISRA. هذا هو المعيار لكتابة رمز الجودة للأجهزة المدمجة. الهدف من المعيار هو جعل الكود بسيط للغاية ومفهوم. لا تحاول تطبيقه حيثما يكون غير مناسب.

المذكرة. نعم ، لدى MISRA قواعد مصممة لتحديد الأخطاء الحقيقية. مثال: V2538 - يجب عدم استخدام قيمة المتغير غير المهيأ . لكن لا تخف من تعطيل معيار MISRA. أنت لن تفقد أي شيء. ستظل الأخطاء الحقيقية موجودة كجزء من التشخيص العام (GA). على سبيل المثال ، سيتم العثور على متغير غير مهيأ بواسطة تشخيص V614 .

الخطوة 2





أي محلل ثابت يصدر ايجابيات كاذبة في أشواط الأولى ويتطلب بعض التكوين. لا يمكن فعل شيء حيال ذلك ، لكنه ليس مخيفًا كما قد يبدو. حتى الإعداد السريع البسيط يسمح لك بإزالة معظم الإيجابيات الخاطئة والبدء في عرض تقرير ذي صلة. لن أتحدث أكثر عن ذلك ، كما كتبت عن ذلك عدة مرات ، على سبيل المثال ، في هذه المقالة: " خصائص محلل PVS-Studio بواسطة مثال مكتبات EFL الأساسية ، 10-15٪ من المواقع الإيجابية الخاطئة ".

قضاء بعض الوقت في تعطيل التحذيرات غير ذات الصلة بشكل واضح ومحاربة الإيجابيات الخاطئة المتعلقة بوحدات الماكرو. بشكل عام ، وحدات الماكرو هي السبب الرئيسي للإيجابيات الخاطئة ، حيث يظهر تحذير في جميع الحالات عند استخدام ماكرو تم تنفيذه بشكل سيء. لمنع التحذيرات في وحدات الماكرو ، يمكنك كتابة تعليقات من نوع خاص بجوار إعلانها. يتم تغطية أكثر من تنسيق التعليقات في الوثائق .

نعم ، سيستغرق الإعداد الأولي بعض الوقت ، ولكنه سيحسن بشكل كبير من إدراك التقرير من خلال القضاء على الضوضاء المشتتة. يستغرق بعض الوقت للقيام بذلك. إذا كانت هناك أي صعوبات أو أسئلة ، فنحن دائمًا على استعداد للمساعدة ونخبرك بكيفية إعداد المحلل بأفضل طريقة. لا تتردد في الكتابة وطرح الأسئلة.

الخطوة 3





ابدأ في عرض التحذيرات من المستوى 1. فقط بعد مشاهدتها 2 و 3. لا تعد مستويات التحذير أكثر من صحة التحذير. من المرجح أن تشير تحذيرات المستوى 1 إلى خطأ فعلي من تحذيرات المستوى 2.

يمكنك القول ، عندما تختار "مشاهدة المستوى 1" ، تضغط على الزر "شاهد الأخطاء الأكثر إثارة للاهتمام".

بمزيد من التفصيل ، تم وصف تصنيف تحذيرات PVS-Studio حسب المستويات في المقالة " الطريقة التي يحارب بها المحللون الثابتون الإيجابيات الخاطئة ، ولماذا يفعلون ذلك ".

إذن لماذا لا توجد قائمة؟





ومع ذلك ، قد لا تزال فكرة وجود قائمة بالتحذيرات الأكثر فائدة معقولة. اسمحوا لي أن أريك في مثال عملي أن فائدة التشخيص نسبية وتعتمد على المشروع.

دعونا ننظر في تحذير V550 . يكشف التحذير عن خطأ محتمل يتعلق بحقيقة أنه من أجل مقارنة الأرقام بنقطة عائمة ، يكون العاملون == أو! = مستخدمون.

يعتقد معظم المطورين الذين تحدثت إليهم أن هذا التشخيص عديم الفائدة ويقومون بتعطيله نظرًا لأن كل عمليات إطلاقه لمشروعهم خاطئة. لهذا السبب فإن هذا التشخيص لديه مستوى منخفض من اليقين ويتصل بالمستوى 3.

في الواقع ، في معظم التطبيقات ، يتم استخدام أنواع تعويم / مزدوجة في خوارزميات بسيطة للغاية. غالبًا ما يتم استخدام المقارنة مع الثابت فقط للتحقق مما إذا تم تعيين قيمة معينة افتراضيًا أو ما إذا كانت قد تغيرت. في هذه الحالة ، يكون الفحص الدقيق مناسبًا تمامًا. ساوضح ذلك مع رمز الزائفة.

float value = 1.0f; if (IsUserInputNewValue()) value = GetUserValue(); if (value == 1.0f) DefaultBehavior(); else Foo(value); 

هنا المقارنة (قيمة 1.0f) صحيحة وآمنة.

هل هذا يعني أن تشخيص V550 غير مهتم؟ لا. كل هذا يتوقف على المشروع. اسمحوا لي أن أقتبس قصاصة من مقال " كيف حاولنا التحليل الثابت في مشروع محاكاة التدريب على جراحة الأوعية الدموية بالأشعة السينية " ، الذي كتبه مستخدمنا.

لذلك ، ما محلل ثابت لدينا تولي اهتماما هنا:

V550 مقارنة دقيقة فردية: t! = 0. من الأفضل استخدام مقارنة بدقة محددة: fabs (A - B)> Epsilon. objectextractpart.cpp 3401

 D3DXVECTOR3 N = VectorMultiplication( VectorMultiplication(V-VP, VN), VN); float t = Qsqrt(Scalar(N, N)); if (t!=0) { N/=t; V = V - N * DistPointToSurface(V, VP, N); } 

أخطاء من هذا النوع تتكرر في كثير من الأحيان في هذه المكتبة. لا أستطيع أن أقول أنها جاءت مفاجأة لي. في السابق ، التقيت بمعالجة غير صحيحة للأرقام بنقطة عائمة في هذا المشروع. ومع ذلك ، لم تكن هناك موارد للتحقق بشكل منهجي من المصادر. نتيجة الفحص ، أصبح من الواضح أنه كان من الضروري إعطاء المطور شيئًا ما لتوسيع آفاقه من حيث العمل بأرقام الفاصلة العائمة. لقد تم ربطه ببعض المقالات الجيدة. سنرى كيف تسير الامور. من الصعب أن نقول على وجه اليقين ما إذا كان هذا الخطأ يسبب اضطرابات حقيقية في البرنامج. يكشف الحل الحالي عن عدد من المتطلبات للشبكة المضلعة الأصلية للشرايين ، والتي تحاكي انتشار مادة تباين الأشعة السينية. إذا لم يتم استيفاء المتطلبات ، فقد يسقط البرنامج ، أو يكون العمل غير صحيح بشكل واضح. يتم الحصول على بعض هذه المتطلبات من الناحية التحليلية ، والبعض الآخر - بشكل تجريبي. من الممكن أن تتزايد هذه المجموعة التجريبية من المتطلبات لمجرد التعامل غير الصحيح مع الأرقام بنقطة عائمة. تجدر الإشارة إلى أن الحالات التي تم العثور عليها باستخدام المقارنة الدقيقة للأرقام مع الفاصلة العائمة لم تكن كلها خطأ.

كما ترون ، ما هو غير مثير للاهتمام في بعض المشاريع هو الاهتمام بمشروعات أخرى. هذا يجعل من المستحيل إنشاء قائمة من "الأكثر إثارة للاهتمام".

المذكرة. يمكنك أيضًا ضبط مستوى التحذيرات باستخدام الإعدادات. على سبيل المثال ، إذا كنت تعتقد أن تشخيص V550 يستحق عن كثب ، فيمكنك نقله من المستوى 3 إلى المستوى 1. يتم وصف هذا النوع من الإعدادات في الوثائق (راجع "كيفية ضبط مستواك على تشخيصات محددة").

استنتاج



الآن أنت تعرف كيفية البدء في دراسة تحذيرات المحللين من خلال النظر في أكثرها إثارة للاهتمام. ولا تنس النظر في الوثائق للحصول على وصف تفصيلي للتحذيرات. في بعض الأحيان ، يحدث تحذير وراء الكذب ، من الوهلة الأولى. مثال على هذه التشخيصات: V597 ، V1026 . شكرا لاهتمامكم

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


All Articles