PVS-Studio-nun müstəqil nəzərdən keçirilməsi (Linux, C++)

PVS-nin Linux altında təhlil etməyi öyrəndiyi bir nəşr gördüm və onu öz layihələrimdə sınamaq qərarına gəldim. Və ondan çıxan da budur.


Məzmun

  1. Pros
  2. Eksiler
  3. Nəticələri
  4. Sözündən sonra

Pros

Cavab verən dəstək

Sınaq açarı istədim və həmin gün onu mənə göndərdilər.

Kifayət qədər aydın sənədlər

Biz heç bir problem olmadan analizatoru işə sala bildik. Konsol əmrləri üçün yardım da mövcuddur (burada bəzi şikayətlər olsa da, bölməyə baxın Eksiler).

Çox yivli analiz imkanı

Analizatorun "standart" seçimi var -j, təhlilin bir neçə tapşırıqda paralel aparılmasına imkan verir. Bu, çox vaxta qənaət edir.

Yaxşı vizuallaşdırma

Mətndən tutmuş kiçik veb ağzına qədər bir çox müxtəlif çıxış formatları. Veb interfeysi rahat, qısa, koddakı sətirlərin yanında göstərişlər və diaqnostik təsvirlərə keçidlərlə.

Assambleyaya asan inteqrasiya

Bütün sənədlər onların veb saytındadır, yalnız deyə bilərəm ki, layihəniz CMake istifadə edərək qurulubsa, hər şey çox sadədir.

Yaxşı diaqnostik təsvirlər

Rejimdə çıxış yaratsanız fullhtml, sonra hər bir mesajda izahatlar, kod nümunələri və əlavə bağlantılar olan diaqnostik təsvirə keçid var.

Eksiler

Analizatorun C++ dilini bilməməsi

Təəssüf ki, PVS bəzən sintaksis səhvlərinə yol verir və kod tamamilə düzgün olduqda yanlış müsbət mesajlar yaradır.

Məsələn, qaytaran bir funksiya var 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));
}

Bəli açar sözdür auto demək olar void, bunun üçündür auto. Lakin PVS aşağıdakı mesajları verdi:

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.

Çox yavaş sayt

Bəli, hər bir mesajın yanında veb-interfeysdə nümunələrlə müvafiq diaqnostik təsvirə keçid var. Ancaq bir keçidə tıkladığınız zaman kifayət qədər uzun müddət gözləməli olursunuz və bəzən belə olur 504 Gateway Zaman aşımı.

Dil

Bütün təsvirlər rus dilindədir, bu əladır. Lakin hesabatdakı bağlantılar həmişə ingilis versiyasına gətirib çıxarır. Diaqnostikaya dərhal rus dilində baxa bilmək üçün dili dəyişdirə bilmək yaxşı olardı. İnterfeysdə belə bir seçim tapmadım.

Konsol vasitəsilə diaqnostik səviyyələrlə işləmək əlverişsizdir

İki əmrin istifadə edildiyindən başlayaq (bu pvs-studio-analyzer и plog-converter) diaqnostikanı təyin etmək üçün müxtəlif formatlar.

üçün yardım pvs-studio-analyzer oxuyur:

-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

Uzun müddət hara gedəcəyimi anlamağa çalışdım əlavə edin (“dəyərlərin əlavə edilməsi”) düymələri. Onları vergüllə ayırmağa çalışdım:

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

Açarı bir neçə dəfə qeydiyyatdan keçirməyə çalışdım:

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

Və yalnız bundan sonra başa düşdüm ki, bunlar bit maskalarıdır! Və sizə lazımdır yekunlaşdırmaqəlavə edin mənalar. Məsələn, ümumi diaqnostika, mikro-optimallaşdırma və MISRA diaqnostikasını əldə etmək üçün onları ümumiləşdirmək lazımdır (4 + 8 + 32 = 44):

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

İstifadəçi interfeyslərində bit maskalarından istifadə ümumiyyətlə pis formadır. Bütün bunlar daxili olaraq ümumiləşdirilə bilər və istifadəçi üçün bir sıra bayraqlar təyin edilə bilər.

Bundan əlavə, bir kommunal da var plog-converter, insan tərəfindən oxuna bilən statik analiz məlumatı yaradan. Onun başqa problemləri var.

Proqram üçün kömək plog-converter hesabatlar:

-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

Burada əvvəllər olmayan bəzi "səviyyələr" meydana çıxdı və mən sənədlərdə də onlar haqqında heç nə tapmadım.

Ümumiyyətlə, aydın deyil. Ona görə də hər şeyi maksimuma qoyuram.

Catch-də bir dəstə axmaq söyüş

Təhlil etdiyim üç layihədən ikisi vahid test kitabxanasından istifadə edir Catch2. Mesajların aslan payı (!!! Birində 90-dən 138-ı, digərində 297-dən 344-si!!!) aşağıdakı formadadır:

PVS-Studio-nun müstəqil nəzərdən keçirilməsi (Linux, C++)

Çox iş parçacığı nəzərə alınmır

Dəyişməyən dəyişənlər və ya sonsuz döngələr haqqında çoxlu yanlış pozitivlər var, halbuki bu dəyişənlərlə iş müxtəlif mövzulardan baş verir və əgər belə olmasaydı, vahid testləri işləməzdi.

PVS-Studio-nun müstəqil nəzərdən keçirilməsi (Linux, C++)

Bununla belə, statik analizator bunu nəzərə ala bilərmi? bilmirəm.

Nəticələri

PVS açıq mənbə layihələrimdə heç bir real səhv tapmadı Partlayış и Proksima, eləcə də aydın səbəblərə görə təqdim edə bilmədiyim işçi layihədə. Düzdür, nəzərə almağa dəyər ki, bəzi çatışmazlıqlar əvvəllər istifadə edilərək artıq tutuldu və düzəldildi Cppcheck и scan-build.

Ümumiyyətlə, bütün bu analizatorlardan gələn təəssürat təxminən eynidir: bəli, onlar nəyisə, bəzən hətta vacib bir şeyi tuturlar, lakin ümumilikdə tərtibçi kifayətdir.

Mümkündür (və şəxsən mən belə düşünməyi xoşlayıram) komandamızın minimum miqdarda pis kod yaratmağa imkan verən proqram inkişaf etdirmə təcrübələrindən istifadə edir. Problem yaratmamaq, onları qəhrəmancasına aradan qaldırmaqdan daha yaxşıdır.

Buna görə də, heç kimin ayağını vurmamaq və heç kimin alnına dırmıq vurmamaq üçün C++-da necə yazmaq barədə bəzi məsləhətlər verməkdən azadam.

Kompilyator diaqnostikasından maksimum yararlanın

Komandamız aşağıdakı tərtib seçimlərindən istifadə edir (və sizə məsləhət görür):

-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

Onları layihənizdə aktivləşdirin və kodunuz haqqında çox şey öyrənin.

Standarta sadiq qalın

Standart analoqlar varsa, platformadan asılı olan şeylərdən istifadə etməməyə çalışın və onlarsız tamamilə edə bilmirsinizsə, onları makrolar (və ya başqa bir şey) üçün xüsusi bloklara sarın və sadəcə olaraq kodunuzun dəstəklənməyən şəraitdə yığılmasına icazə verməyin.

Standart əməliyyat semantikasına sadiq qalın

Əlavə toplama olmalıdır, vurma vurma olmalıdır, funksiya çağırışı funksiya çağırışı olmalıdır, surət surəti olmalıdır, daşıma daşımalı, konteyner təkrarlanmalıdır, iterator yüksəltmə olmalıdır ++ və istinaddan imtina *. Və sair və s.

Düşünürəm ki, fikir aydındır. Məcburi olmayan, lakin kodunuzun bütün istifadəçiləri və oxucularının görməyi gözlədiyi müəyyən edilmiş konvensiyalar var. Başqalarını aldatmağa çalışmayın, əks halda özünüzü aldadacaqsınız.

Uyğun kodu yazın

İlk növbədə standart kitabxananı nəzərdə tuturam. Dərslərinizin və funksiyalarınızın interfeyslərinin standart və digər kitabxanalarla (məsələn, Boost) istifadə oluna bilməsi çox arzu edilir.

STL və Boost interfeyslərinə nəzər salmaqdan çekinmeyin. Nadir istisnalar istisna olmaqla, orada layiqli örnək görəcəksən.

Açıq mənbə alətlərindən maksimum yararlanın

Eyni statik analiz üçün CMake qurma sistemi ilə hər hansı bir layihəyə yalnız bir dəfə qoşula bilən ən azı iki açıq pulsuz alət var.

Bu barədə mənim son nəşrimdə oxuya bilərsiniz.

Sözündən sonra

Nəhayət, vurğulamaq istərdim ki, mən PVS və ya hər hansı digər statik analizatorlardan istifadə etməməyi müdafiə etmirəm. Ancaq mən sizi statik analizatorun kodunuzda daim əhəmiyyətli səhvlər tapmasının necə baş verdiyini düşünməyə dəvət edirəm.

Bu sadəcə bir nəticədir. Səbəbini axtarmaq və aradan qaldırmaq lazımdır.

Mənbə: www.habr.com

Добавить комментарий