PVS-Studio'nun bağımsız incelemesi (Linux, C++)

PVS'nin Linux altında analiz etmeyi öğrendiği bir yayın gördüm ve onu kendi projelerimde denemeye karar verdim. Ve bundan çıkan da bu.


Içerik

  1. Avantajları:
  2. Eksileri
  3. sonuçlar
  4. Послесловие

Avantajları:

Duyarlı destek

Deneme anahtarı istedim ve aynı gün bana gönderdiler.

Oldukça açık belgeler

Analizörü sorunsuz bir şekilde başlatmayı başardık. Konsol komutları için yardım da mevcuttur (burada bazı şikayetler olmasına rağmen, bölüme bakın) Eksileri).

Çok iş parçacıklı analiz imkanı

Analizörün "standart" seçeneği vardır -jAnalizin çeşitli görevlerde paralel olarak yürütülmesine olanak tanır. Bu çok zaman kazandırır.

İyi görselleştirme

Metinden küçük bir web namlusuna kadar birçok farklı çıktı formatı. Web arayüzü, koddaki satırların yanında ipuçları ve teşhis açıklamalarına bağlantılar içeren, kullanışlı ve özlüdür..

Montaja kolay entegrasyon

Tüm belgeler web sitelerinde mevcut, ancak projeniz CMake kullanılarak oluşturulduysa her şeyin çok basit olduğunu söyleyebilirim.

İyi teşhis açıklamaları

modunda çıktı üretirseniz fullhtml, bu durumda her mesajda açıklamalar, kod örnekleri ve ek bağlantılar içeren bir teşhis açıklamasına bağlantı bulunur.

Eksileri

Analizcinin C++ dilini bilmemesi

Ne yazık ki, PVS bazen sözdizimi hataları yapar ve kod tamamen doğru olduğunda yanlış pozitif mesajlar üretir.

Örneğin, döndüren bir fonksiyon 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));
}

Evet, anahtar kelime auto Anlamına gelebilir void, bunun için Oto. Ancak PVS şu 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.

Çok yavaş site

Evet, web arayüzünde her mesajın yanında örneklerle ilgili teşhis açıklamasına giden bir bağlantı bulunmaktadır. Ancak bir bağlantıya tıkladığınızda oldukça uzun bir süre beklemeniz gerekir ve bazen bu olur 504 Ağ Geçidi Zaman Aşımı.

Dil

Tüm açıklamalar Rusça, bu harika. Ancak rapordaki bağlantılar her zaman İngilizce versiyona yönlendirir. Teşhisleri hemen Rusça görüntüleyebilmeniz için dili değiştirebilmeniz güzel olurdu. Arayüzde böyle bir seçenek bulamadım.

Konsol üzerinden teşhis seviyeleriyle çalışmak sakıncalıdır

Kullanılan iki komutun (bu pvs-studio-analyzer и plog-converter) tanılamayı belirtmek için farklı formatlar.

Şunun için yardım: pvs-studio-analyzer okur:

-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

Nereye gideceğimi bulmak için uzun süre uğraştım eklemek (“değerleri ekleme”) tuşlarına basın. Bunları virgülle ayırarak listelemeye çalıştım:

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

Anahtarı birkaç kez kaydetmeyi denedim:

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

Ve ancak o zaman bunların bit maskeleri olduğunu fark ettim! Ve ihtiyacın var özetlemekVe eklemek anlamlar. Örneğin, genel teşhisleri, mikro optimizasyonlara yönelik teşhisleri ve MISRA'yı elde etmek için bunları özetlemeniz gerekir (4 + 8 + 32 = 44):

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

Kullanıcı arayüzlerinde bit maskelerinin kullanılması genellikle kötü bir biçimdir. Bütün bunlar dahili olarak özetlenebilir ve kullanıcı için bir dizi bayrak ayarlanabilir.

Ayrıca, bir yardımcı program da var plog-converter, insan tarafından okunabilen statik analiz bilgileri üretir. Başka sorunları da var.

Program için yardım plog-converter raporlar:

-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 daha önce olmayan bazı "seviyeler" ortaya çıktı ve belgelerde de onlar hakkında hiçbir şey bulamadım.

Genel olarak net değil. Bu yüzden her şeyi maksimuma ayarladım.

Catch'te bir sürü aptalca küfür

Analiz ettiğim üç projeden ikisi birim test kütüphanesi kullanıyor Catch2. Ve mesajların aslan payı (!!! birinde 90'den 138'ı, diğerinde 297'ten 344'si!!!) şu şekildedir:

PVS-Studio'nun bağımsız incelemesi (Linux, C++)

Çoklu iş parçacığını dikkate almaz

Sözde değişmeyen değişkenler veya sonsuz döngüler hakkında birçok yanlış pozitif vardır, ancak bu değişkenlerle çalışma farklı iş parçacıklarından gerçekleşir ve eğer böyle olmasaydı birim testleri işe yaramazdı.

PVS-Studio'nun bağımsız incelemesi (Linux, C++)

Ancak bir statik analizci bunu hesaba katabilir mi? Bilmiyorum.

sonuçlar

PVS açık kaynak projelerimde gerçek bir hata bulamadı Burst и Proximave bariz nedenlerden dolayı sunamadığım bir çalışma taslağında. Doğru, bazı eksikliklerin daha önce yakalanıp düzeltildiğini akılda tutmakta fayda var. Cpp kontrolü и scan-build.

Genel olarak, tüm bu analizörlerin izlenimi yaklaşık olarak aynıdır: evet, bir şeyi yakalarlar, hatta bazen önemli bir şeyi, ancak genel olarak derleyici yeterlidir.

Ekibimizin minimum miktarda boktan kod üretmemize izin veren yazılım geliştirme uygulamalarını kullanması mümkündür (ve ben kişisel olarak öyle düşünmek isterim). Kahramanca üstesinden gelmektense sorun yaratmamak daha iyidir.

Bu nedenle, kimsenin bacaklarını uçurmayacak veya kimsenin alnına tırmıkla vurmayacak şekilde C++ dilinde nasıl yazılacağına dair bazı tavsiyeler verme özgürlüğünü kullanıyorum.

Derleyici tanılamalarından en iyi şekilde yararlanın

Ekibimiz aşağıdaki derleme seçeneklerini kullanır (ve size tavsiyelerde bulunur):

-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

Bunları projenizde etkinleştirin ve kodunuz hakkında çok şey öğrenin.

Standarda sadık kalın

Standart analoglar varsa platforma bağlı şeyleri kullanmamaya çalışın ve kesinlikle onlarsız yapamıyorsanız, bunları makrolar (veya başka bir şey) için özel bloklara sarın ve kodunuzun desteklenmeyen koşullar altında derlenmesine izin vermeyin.

Standart işlem semantiğine sadık kalın

Toplama toplama olmalı, çarpma çarpma olmalı, işlev çağrısı işlev çağrısı olmalı, kopya kopyalanmalı, taşıma taşıma olmalı, kapsayıcı yinelenebilir olmalı, yineleyicide tanıtım olmalı ++ ve referansın kaldırılması *. Ve benzeri.

Bence fikir açık. Bağlayıcı olmayan ancak kodunuzun tüm kullanıcılarının ve okuyucularının görmeyi beklediği yerleşik kurallar vardır. Başkalarını zekanızla alt etmeye çalışmayın, aksi takdirde kendinizi zekanızla alt edersiniz.

Uyumlu kod yazın

Öncelikle standart kütüphaneyi kastediyorum. Sınıflarınızın ve fonksiyonlarınızın arayüzlerinin standart ve diğer kütüphanelerle (örneğin Boost) birlikte kullanılabilmesi oldukça arzu edilir.

STL ve Boost arayüzlerine göz atmaktan çekinmeyin. Nadir istisnalar dışında, orada değerli bir rol modeli göreceksiniz.

Açık kaynak araçlarından en iyi şekilde yararlanın

Aynı statik analiz için CMake derleme sistemiyle herhangi bir projeye yalnızca bir kez bağlanabilen en az iki açık ücretsiz araç vardır.

Bu konuyla ilgili daha fazla bilgiyi son yayınımda okuyabilirsiniz..

Послесловие

Son olarak PVS veya diğer statik analizörlerin kullanılmamasını savunmadığımı vurgulamak isterim. Ancak statik analizcinin kodunuzda sürekli olarak önemli hatalar bulmasının nasıl gerçekleştiğini düşünmenizi tavsiye ederim.

Bu sadece bir sonuçtur. Nedenini araştırmalı ve ortadan kaldırmalıyız.

Kaynak: habr.com

Yorum ekle