PVS-Studio-ni mustaqil ko'rib chiqish (Linux, C++)

Men PVS Linux ostida tahlil qilishni o'rgangan nashrni ko'rdim va uni o'z loyihalarimda sinab ko'rishga qaror qildim. Va shundan kelib chiqqan narsa.


Mundarija

  1. Plyusy
  2. Minusy
  3. natijalar
  4. So'zdan keyin

Plyusy

Javobgar qo'llab-quvvatlash

Men sinov kalitini so'radim va ular o'sha kuni menga yuborishdi.

Juda aniq hujjatlar

Biz hech qanday muammosiz analizatorni ishga tushirishga muvaffaq bo'ldik. Konsol buyruqlari uchun yordam ham mavjud (garchi bu erda ba'zi shikoyatlar mavjud bo'lsa-da, bo'limga qarang Minusy).

Ko'p tarmoqli tahlil qilish imkoniyati

Analizatorda "standart" variant mavjud -j, tahlilni bir nechta vazifalarda parallel ravishda amalga oshirish imkonini beradi. Bu ko'p vaqtni tejaydi.

Yaxshi vizualizatsiya

Ko'p turli xil chiqish formatlari, matndan tortib, kichik veb-mozgacha. Veb-interfeys qulay, ixcham, koddagi satrlar yonidagi maslahatlar va diagnostika tavsiflariga havolalar bilan..

Assambleyaga oson integratsiya

Barcha hujjatlar ularning veb-saytida, faqat shuni aytishim mumkinki, agar sizning loyihangiz CMake yordamida qurilgan bo'lsa, unda hamma narsa juda oddiy.

Yaxshi diagnostika tavsiflari

Agar rejimda chiqish hosil qilsangiz fullhtml, keyin har bir xabarda tushuntirishlar, kod misollari va qo'shimcha havolalar bilan diagnostika tavsifiga havola mavjud.

Minusy

Analizatorning C++ tilini bilmasligi

Afsuski, PVS ba'zan sintaktik xatolarga yo'l qo'yadi va kod to'liq to'g'ri bo'lsa, noto'g'ri ijobiy xabarlarni yaratadi.

Masalan, qaytaradigan funksiya mavjud 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));
}

Ha bu kalit so'z auto Demak mumkin void, bu nima uchun avtomobil. Ammo PVS quyidagi xabarlarni ishlab chiqardi:

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.

Juda sekin sayt

Ha, har bir xabarning yonidagi veb-interfeysda misollar bilan tegishli diagnostika tavsifiga havola mavjud. Ammo havolani bosganingizda, siz ancha vaqt kutishingiz kerak va ba'zida bu sodir bo'ladi 504 Gateway vaqti tugashi.

til

Barcha tavsiflar rus tilida, bu juda yaxshi. Ammo hisobotdagi havolalar har doim inglizcha versiyaga olib keladi. Tilni o'zgartirsangiz yaxshi bo'lardi, shunda diagnostikani darhol rus tilida ko'rishingiz mumkin. Men interfeysda bunday imkoniyatni topmadim.

Konsol orqali diagnostika darajalari bilan ishlash noqulay

Keling, ikkita buyruq ishlatilganligidan boshlaylik (bu pvs-studio-analyzer и plog-converter) diagnostikani belgilash uchun turli formatlar.

uchun yordam pvs-studio-analyzer o'qiydi:

-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

Qaerga borishni o'ylab uzoq vaqt o'tkazdim qo'shish ("qiymatlarni qo'shish") tugmalari. Men ularni vergul bilan ajratib ko'rsatishga harakat qildim:

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

Men kalitni bir necha marta ro'yxatdan o'tkazishga harakat qildim:

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

Va shundan keyingina men bu niqoblar ekanligini angladim! Va sizga kerak xulosa qilish, va emas qo'shish ma'nolari. Masalan, umumiy diagnostika, mikro-optimallashtirish va MISRA diagnostikasini olish uchun siz ularni umumlashtirishingiz kerak (4 + 8 + 32 = 44):

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

Bitmasklardan foydalanuvchi interfeyslarida foydalanish odatda yomon shakldir. Bularning barchasi ichkarida umumlashtirilishi mumkin va foydalanuvchi uchun bayroqlar to'plami o'rnatilishi mumkin.

Bundan tashqari, yordamchi dastur ham mavjud plog-converter, bu inson o'qiy oladigan statik tahlil ma'lumotlarini yaratadi. Uning boshqa muammolari bor.

Dastur uchun yordam plog-converter hisobotlar:

-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

Bu erda ilgari bo'lmagan ba'zi "darajalar" paydo bo'ldi va men hujjatlarda ham ular haqida hech narsa topmadim.

Umuman olganda, bu aniq emas. Shuning uchun men hamma narsani maksimal darajaga qo'ydim.

Catch haqida bir qancha ahmoqona so'kinishlar

Men tahlil qilgan uchta loyihadan ikkitasi birlik test kutubxonasidan foydalanadi 2. Xabarlarning sher ulushi (!!! birida 90 tadan 138 tasi, ikkinchisida 297 tadan 344 tasi!!!) quyidagi shaklga ega:

PVS-Studio-ni mustaqil ko'rib chiqish (Linux, C++)

Ko'p ish zarralarini hisobga olmaydi

Go'yoki o'zgarmas o'zgaruvchilar yoki cheksiz tsikllar haqida juda ko'p noto'g'ri musbatlar mavjud, bu o'zgaruvchilar bilan ishlash turli mavzularda amalga oshiriladi va agar bunday bo'lmasa, birlik testlari ishlamaydi.

PVS-Studio-ni mustaqil ko'rib chiqish (Linux, C++)

Biroq, statik analizator buni hisobga olishi mumkinmi? Bilmayman.

natijalar

PVS mening ochiq manbali loyihalarimda haqiqiy xatolarni topmadi Burst и Proksima, shuningdek, aniq sabablarga ko'ra men taqdim eta olmaydigan ishchi loyihada. To'g'ri, ba'zi kamchiliklar allaqachon qo'llanilgan va tuzatilganligini yodda tutish kerak Cppcheck и scan-build.

Umuman olganda, ushbu analizatorlarning barchasidan olingan taassurot taxminan bir xil: ha, ular biror narsani, ba'zida muhim narsani ham ushlaydilar, lekin umuman kompilyator etarli.

Bizning jamoamiz dasturiy ta'minotni ishlab chiqish amaliyotlaridan foydalanishi mumkin (va men shaxsan shunday deb o'ylayman), bu bizga eng kam miqdordagi axloqsiz kodni yaratishga imkon beradi. Muammolarni qahramonona engishdan ko'ra, ularni yaratmaslik yaxshiroqdir.

Shuning uchun men C++ da hech kimning oyog'ini otib tashlamaslik yoki peshonasiga rake bilan urmaslik uchun qanday yozish kerakligi bo'yicha maslahatlar berish erkinligini his qilaman.

Kompilyator diagnostikasidan maksimal darajada foydalaning

Bizning jamoamiz quyidagi kompilyatsiya opsiyalaridan foydalanadi (va sizga maslahat beradi):

-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

Loyihangizda ularni yoqing va kodingiz haqida ko'p narsalarni bilib oling.

Standartga rioya qiling

Agar standart analoglar mavjud bo'lsa, platformaga bog'liq narsalardan foydalanmaslikka harakat qiling va agar ularsiz mutlaqo qila olmasangiz, ularni makrolar (yoki boshqa biror narsa) uchun maxsus bloklarga o'rang va kodingizni qo'llab-quvvatlanmaydigan sharoitlarda kompilyatsiya qilishga yo'l qo'ymang.

Standart operatsiya semantikasiga rioya qiling

Qo'shish qo'shish, ko'paytirish ko'paytirish, funktsiya chaqiruvi funksiya chaqiruvi, nusxa nusxa ko'chirish, olib yurish, konteyner takrorlanadigan bo'lishi kerak, iterator ko'tarilishi kerak ++ va havolani bekor qilish *. Va hokazo va hokazo.

Menimcha, fikr aniq. Majburiy bo'lmagan, lekin sizning kodingizning barcha foydalanuvchilar va o'quvchilari ko'rishni kutadigan o'rnatilgan konventsiyalar mavjud. Boshqalarni aldashga urinmang, aks holda siz o'zingizni aldab qo'yasiz.

Mos keladigan kodni yozing

Avvalo, men standart kutubxonani nazarda tutyapman. Sizning sinflaringiz va funktsiyalaringiz interfeyslarini standart va boshqa kutubxonalar (masalan, Boost) bilan ishlatish juda ma'qul.

STL va Boost interfeyslarini ko'rib chiqing. Kamdan-kam holatlardan tashqari, siz u erda munosib namunani ko'rasiz.

Ochiq manba vositalaridan maksimal darajada foydalaning

Xuddi shu statik tahlil uchun CMake qurish tizimi bilan har qanday loyihaga bir marta ulanishi mumkin bo'lgan kamida ikkita ochiq bepul vosita mavjud.

Bu haqda ko'proq ma'lumotni mening so'nggi nashrimda o'qishingiz mumkin.

So'zdan keyin

Va nihoyat, shuni ta'kidlashni istardimki, men PVS yoki boshqa statik analizatorlardan foydalanmaslikni targ'ib qilmayman. Ammo men sizni statik analizator sizning kodingizda doimiy ravishda jiddiy xatolarni topishi qanday sodir bo'lganligi haqida o'ylashni taklif qilaman.

Bu shunchaki oqibat. Buning sababini izlash va yo'q qilish kerak.

Manba: www.habr.com

a Izoh qo'shish