كيف ترى بسرعة تحذيرات مثيرة للاهتمام تم إنشاؤها بواسطة محلل 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 Core Libraries ، 10-15٪ من الإيجابيات الخاطئة ."

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

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

الخطوة 3





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

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

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

فلماذا لا يوجد حتى الآن قائمة؟





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

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

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

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

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 تستحق عن كثب ، فيمكنك نقلها من المستوى الثالث إلى الأول. هذا النوع من الإعدادات موصوف في الوثائق (انظر "كيفية ضبط مستواك على تشخيصات محددة").

استنتاج




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



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

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


All Articles