بررسی مستقل PVS-Studio (Linux، C++)

من نشریه ای را دیدم که PVS آن را تحت لینوکس آموخته بود و تصمیم گرفتم آن را در پروژه های خودم امتحان کنم. و این چیزی است که از آن بیرون آمد.


مقدار

  1. مزایا
  2. منفی
  3. نمایش نتایج: از
  4. پس از کلمه

مزایا

پشتیبانی پاسخگو

من یک کلید آزمایشی درخواست کردم و همان روز آن را برای من ارسال کردند.

مستندات نسبتا واضح

ما موفق شدیم آنالایزر را بدون هیچ مشکلی راه اندازی کنیم. راهنما برای دستورات کنسول نیز موجود است (اگرچه در اینجا شکایاتی وجود دارد، بخش را ببینید منفی).

امکان تحلیل چند رشته ای

آنالایزر یک گزینه "استاندارد" دارد -j، اجازه می دهد تا تجزیه و تحلیل به صورت موازی در چندین کار انجام شود. این باعث صرفه جویی در زمان زیادی می شود.

تجسم خوب

بسیاری از فرمت های خروجی مختلف، از متن گرفته تا یک پوزه وب کوچک. رابط وب راحت، مختصر، با نکاتی در کنار خطوط در کد و پیوندهایی به توضیحات تشخیصی است..

ادغام آسان در مونتاژ

تمام مستندات در وب سایت آنها وجود دارد، فقط می توانم بگویم که اگر پروژه شما با استفاده از CMake ساخته شده باشد، همه چیز بسیار ساده است.

توضیحات تشخیصی خوب

اگر خروجی را در حالت تولید کنید fullhtml، سپس هر پیام دارای پیوندی به توضیحات تشخیصی، همراه با توضیحات، نمونه کد و پیوندهای اضافی است.

منفی

نادیده گرفتن زبان C++ توسط تحلیلگر

متأسفانه، PVS گاهی اوقات خطاهای نحوی ایجاد می کند و پیام های مثبت کاذب تولید می کند که کد کاملاً صحیح باشد.

به عنوان مثال، یک تابع وجود دارد که برمی گردد void:

template <typename T>
auto copy (const void * source, void * destination)
    ->
        std::enable_if_t
        <
            std::is_copy_constructible<T>::value
        >
{
    new (destination) T(*static_cast<const T *>(source));
}

بله کلمه کلیدی auto می تواند به معنای void، برای همین است خودکار. اما PVS پیام های زیر را تولید کرد:

dynamic_tuple_management.hpp:29:1: error: V591 Non-void function should return a value.
dynamic_tuple_management.hpp:29:1: error: V2542 Function with a non-void return type should return a value from all exit paths.

سایت بسیار کند

بله، در رابط وب در کنار هر پیام پیوندی به توضیحات تشخیصی مربوطه با مثال وجود دارد. اما وقتی روی یک لینک کلیک می کنید، باید مدت زیادی منتظر بمانید و گاهی اوقات این اتفاق می افتد 504 دروازه تایم اتم.

زبان

تمام توضیحات به زبان روسی است که عالی است. اما پیوندهای گزارش همیشه به نسخه انگلیسی منتهی می شود. خوب است که بتوانید زبان را تغییر دهید تا بتوانید فوراً تشخیص را به زبان روسی مشاهده کنید. من چنین گزینه ای را در رابط پیدا نکردم.

کار با سطوح تشخیصی از طریق کنسول ناخوشایند است

بیایید با این واقعیت شروع کنیم که دو دستور استفاده شده (این pvs-studio-analyzer и plog-converter) فرمت های مختلف برای تعیین تشخیص.

کمک برای pvs-studio-analyzer می خواند:

-a [MODE], --analysis-mode [MODE]
    MODE defines the type of warnings:
    1 - 64-bit errors;
    2 - reserved;
    4 - General Analysis;
    8 - Micro-optimizations;
    16 - Customers Specific Requests;
    32 - MISRA.
    Modes can be combined by adding the values
    Default: 4

مدت زیادی تلاش کردم تا بفهمم کجا باید بروم اضافه کردن ("افزودن مقادیر") کلید. من سعی کردم آنها را با کاما از هم جدا کنم:

pvs-studio-analyzer analyze ... -a 1,4,16

چندین بار سعی کردم کلید را ثبت کنم:

pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16

و تازه آن موقع متوجه شدم که اینها ماسک های بیتی هستند! و شما نیاز دارید خلاصه کردنو نه اضافه کردن معانی به عنوان مثال، برای دریافت تشخیص عمومی، تشخیص برای میکرو بهینه‌سازی‌ها و MISRA، باید آنها را جمع‌بندی کنید (4 + 8 + 32 = 44):

pvs-studio-analyzer analyze ... -a 44

استفاده از بیت ماسک در رابط های کاربری به طور کلی بد است. همه اینها را می توان به صورت داخلی خلاصه کرد و مجموعه ای از پرچم ها را برای کاربر تنظیم کرد.

علاوه بر این، یک ابزار مفید نیز وجود دارد plog-converter، که اطلاعات تجزیه و تحلیل استاتیک قابل خواندن توسط انسان را تولید می کند. او مشکلات دیگری دارد.

کمک به برنامه plog-converter گزارش ها:

-a, --analyzer            Specifies analyzer(s) and level(s) to be
                          used for filtering, i.e.
                          'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2'
                          Default: GA:1,2

برخی از "سطوح" در اینجا ظاهر شدند که قبلاً وجود نداشتند، و من نیز چیزی در مورد آنها در اسناد پیدا نکردم.

در کل مشخص نیست. به همین دلیل همه چیز را روی حداکثر تنظیم کردم.

یک سری فحش های احمقانه روی Catch

دو تا از سه پروژه ای که من تحلیل کردم از یک کتابخانه تست واحد استفاده می کنند Catch2. و سهم شیر پیام ها (!!! 90 از 138 در یکی و 297 از 344 در دیگری!!!) به شکل زیر است:

بررسی مستقل PVS-Studio (Linux، C++)

چند رشته ای را در نظر نمی گیرد

موارد مثبت کاذب زیادی در مورد متغیرهای ظاهراً تغییرناپذیر یا حلقه‌های بی‌پایان وجود دارد، در حالی که کار با این متغیرها از رشته‌های مختلف اتفاق می‌افتد، و اگر اینطور نبود، تست‌های واحد کار نمی‌کردند.

بررسی مستقل PVS-Studio (Linux، C++)

با این حال، آیا یک آنالایزر استاتیک می تواند این را در نظر بگیرد؟ نمی دانم.

نمایش نتایج: از

PVS هیچ باگ واقعی در پروژه های منبع باز من پیدا نکرد عکسبرداری پی در پی и پروکسیماو همچنین در یک پیش نویس کاری که به دلایل واضح نمی توانم ارائه کنم. درست است، شایان ذکر است که برخی از کاستی ها قبلاً با استفاده از قبل شناسایی و اصلاح شده اند Cppcheck и scan-build.

به طور کلی، برداشت از همه این تحلیلگرها تقریباً یکسان است: بله، آنها چیزی را می گیرند، گاهی اوقات حتی چیز مهمی را، اما به طور کلی کامپایلر کافی است.

ممکن است (و من شخصاً دوست دارم اینطور فکر کنم) که تیم ما از روش‌های توسعه نرم‌افزاری استفاده می‌کند که به ما امکان می‌دهد حداقل کدهای نامطلوب تولید کنیم. بهتر است مشکلات ایجاد نکنیم تا قهرمانانه بر آنها غلبه کنیم.

بنابراین، من این خود را می‌پذیرم که در مورد نحوه نوشتن در C++ به گونه‌ای توصیه کنم که به پاهای کسی شلیک نکنم یا با چنگک به پیشانی کسی نزنیم.

از عیب یابی کامپایلر نهایت استفاده را ببرید

تیم ما از گزینه های تلفیقی زیر استفاده می کند (و به شما توصیه می کند):

-Werror

-Wall
-Wextra
-Wpedantic

-Wcast-align
-Wcast-qual
-Wconversion
-Wctor-dtor-privacy
-Wenum-compare
-Wfloat-equal
-Wnon-virtual-dtor
-Wold-style-cast
-Woverloaded-virtual
-Wredundant-decls
-Wsign-conversion
-Wsign-promo

آنها را در پروژه خود فعال کنید و چیزهای زیادی در مورد کد خود یاد بگیرید.

به استاندارد پایبند باشید

سعی کنید در صورت وجود آنالوگ های استاندارد از چیزهای وابسته به پلتفرم استفاده نکنید، و اگر مطلقاً نمی توانید بدون آنها کار کنید، آنها را در بلوک های مخصوص ماکروها (یا چیز دیگری) بپیچید و به سادگی اجازه ندهید کد شما تحت شرایط پشتیبانی نشده کامپایل شود.

به معنای عملیات استاندارد پایبند باشید

جمع باید جمع باشد، ضرب باید ضرب باشد، فراخوانی تابع باید فراخوانی تابع باشد، کپی باید کپی باشد، حمل باید حمل باشد، ظرف باید تکرار شود، تکرار کننده باید ارتقا داشته باشد. ++ و عدم ارجاع *. و به همین ترتیب، و غیره.

فکر می کنم ایده روشن است. قراردادهایی وجود دارد که الزام آور نیستند، اما همه کاربران و خوانندگان کد شما انتظار دارند آن ها را ببینند. سعی نکنید دیگران را گول بزنید، در غیر این صورت خودتان را گول می زنید.

کدهای سازگار بنویسید

اول از همه منظورم کتابخانه استاندارد است. بسیار مطلوب است که رابط های کلاس ها و توابع شما با کتابخانه های استاندارد و سایر کتابخانه ها (مثلا Boost) قابل استفاده باشند.

با خیال راحت به رابط های STL و Boost نگاهی بیندازید. به استثنای موارد نادر، شما یک الگوی شایسته را در آنجا خواهید دید.

از ابزارهای متن باز نهایت استفاده را ببرید

برای همان تجزیه و تحلیل استاتیک، حداقل دو ابزار رایگان باز وجود دارد که می توانند فقط یک بار به هر پروژه با سیستم ساخت CMake متصل شوند.

شما می توانید بیشتر در مورد این در انتشار اخیر من بخوانید.

پس از کلمه

در پایان، من می خواهم تأکید کنم که من از استفاده نکردن از PVS یا هر آنالایزر استاتیک دیگری دفاع نمی کنم. اما من شما را تشویق می‌کنم به این فکر کنید که چگونه اتفاق افتاده است که تحلیلگر استاتیک دائماً خطاهای قابل توجهی در کد شما پیدا می‌کند.

این فقط یک نتیجه است. باید علت را جستجو کنیم و از بین ببریم.

منبع: www.habr.com

اضافه کردن نظر