Független PVS-Studio áttekintés (Linux, C++)

Láttam egy bejegyzést arról, hogy a PVS végre képes az elemzésre Linux rendszereken, és úgy döntöttem, kipróbálom a projektjeimen. Íme, mi sült ki belőle.


Tartalom

  1. Előnyök
  2. Hátrányok
  3. Összegzés
  4. Utószó

Előnyök

Reagáló támogatás

Kértem egy próbaverziós kulcsot, aznap meg is kaptam.

Elég érthető dokumentáció

Az elemzőt szinte bármilyen problémamentesen sikerült elindítani. A konzolos parancsokhoz van útmutató is (bár itt vannak észrevételek, lásd a szekciót Hátrányok).

Többszálú elemzés lehetősége

Az elemzőnek van egy "szokásos" opciója -j, amely lehetővé teszi, hogy párhuzamosan több feladatban végezzen elemzést. Ez jelentősen lerövidíti az időt.

Jó vizualizáció

Több különböző formátumú kimenet, a szöveges formátumtól kezdve a kis webes felületig. A webes felület kényelmes, tömör, a kódsorok mellett van segítség a diagnosztikák leírásaira mutató linkekkel..

Egyszerű integráció a buildbe

Minden dokumentáció elérhető a weboldalukon, csak annyit mondok, hogy ha a projektedet CMake segítségével építed, akkor minden nagyon egyszerű.

Jó diagnosztikai leírások

Ha a kimenetet a fullhtmlmódban generáljuk, minden üzenethez van link a diagnosztika leírásához, magyarázatokkal, kódrészletekkel és további linkekkel.

Hátrányok

A C++ nyelv ismeretének hiánya az elemző számára

Sajnos, a PVS néha hibázik a szintaxisban, és hamis pozitív üzeneteket generál teljesen helyes kód esetén.

Például van egy függvény, amely visszaad egy void:

template 
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));
}

Igen, a kulcsszó auto jelentheti void, ahogy kell is. autoDe a PVS ilyen üzeneteket adott:

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.

Nagyon lassú weboldal

Igen, a webes felületen minden üzenet mellett van link a megfelelő diagnosztika leírásához példákkal. De a link megnyitásakor elég sokáig kell várni, néha pedig még 504 Gateway Time-out.

Nyelv

Minden leírás oroszul érhető el, ez nagyszerű. De a jelentésből származó linkek mindig az angol változatra mutatnak. Jó lenne, ha lenne lehetőség a nyelv váltására, hogy a diagnosztikákat azonnal oroszul nézhessem. A felületen nem találtam ennek a lehetőségét.

Nem kényelmes a diagnosztikai szintek konzolon keresztüli kezelése

Kezdjük azzal, hogy a használt két parancsnak (ez a pvs-studio-analyzer és plog-converter) eltérő diagnosztikai formátumai vannak.

A program útmutatója szerint: pvs-studio-analyzer гласит:

-a [MODE], --analysis-mode [MODE]
    A MODE meghatározza a figyelmeztetések típusát:
    1 - 64-bites hibák;
    2 - fenntartott;
    4 - Általános elemzés;
    8 - Mikroadaptációk;
    16 - Ügyfél-specifikus kérések;
    32 - MISRA.
    A módokat a értékek összegzésével lehet kombinálni.
    Alapértelmezett: 4

Hosszú ideig próbálkoztam, hogy hova kellene hozzáadni ("adding the values") a kulcsokat. Próbálkoztam a vesszővel történő felsorolással:

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

Többször próbáltam megadni a kulcsot:

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

És csak később jöttem rá, hogy ezek bitmaszkok! És össze kell adni, nem pedig hozzáadni az értékeket. Például ahhoz, hogy általános diagnosztikát, mikroadaptációkat és MISRA-t kapjak, ezeket össze kell adni (4 + 8 + 32 = 44):

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

A bitmaszkok használata a felhasználói felületeken általában rossz stílus. Mindezt belül is össze lehetett volna foglalni, és a felhasználónak egy kész jelölőt lehetett volna adott.

Ezen kívül van egy másik eszköz, plog-converteramely emberi olvasásra alkalmas információt generál a statikus elemzésről. Ennek más furcsaságai vannak.

A program útmutatója jelzi: plog-converter -a, --analyzer Meghatározza az elemző(ket) és a szint(ek)et, amelyeket a szűréshez használnak, azaz: 'GA:1,2;64:1;OP:1,2,3;CS:1;MISRA:1,2' Alapértelmezett: GA:1,2

Itt megjelent néhány "szint", amelyek korábban sehol nem voltak, és a dokumentációban sem találtam róluk semmit.

Összességében nem világos. Ezért mindent maximálisra állítottam.

Rengeteg értelmetlen hibaüzenet a Catch

A három projektből, amelyeket elemeztem, kettő a

Catch2 moduláris tesztelési könyvtárat használja. És a hibaüzenetek nagy része (!!! 90 a 138-ból egyben, és 297 a 344-ből a másikban !!!) a következő formát öltötte:Nem veszi figyelembe a párhuzamos futtatást.

Független PVS-Studio áttekintés (Linux, C++)

Sok hamis pozitív hitelesítés a látszólagos változatlan változókkal vagy végtelen ciklusokkal kapcsolatban, miközben a változókkal más szálakból van művelet, és ha nem így lenne, a moduláris tesztek nem aktiválódtak volna.

Bár, vajon egy statikus elemző egyáltalán figyelembe tudja-e venni ezt? Nem tudom.

Független PVS-Studio áttekintés (Linux, C++)

A PVS nem talált egyetlen valódi hibát sem az általam nyitott projekteken

Összegzés

Burst Proxima és , és a munkában lévő projektemnél, amelyet nyilvánvaló okokból nem tudok bemutatni. Igaz, érdemes észben tartani, hogy néhány hibát már korábban észleltek és javítottak aCppcheck scan-build segítségével. és scan-build.

Összességében az összes ilyen elemző benyomása nagyjából azonos: igen, valamit észlelnek, néha még valami fontosat is, de összességében elegendő a fordító.

Lehet (és nekem személy szerint kellemes ezt gondolni), hogy csapatunk olyan szoftverfejlesztési gyakorlatokat alkalmaz, amelyek minimalizálják a felesleges kódot. Jobb problémákat nem létrehozni, mint hősként legyőzni azokat.

Ezért bátran adok néhány tanácsot arra, hogyan írjunk C++ nyelven úgy, hogy senki lábát ne lőjük le, és ne üssük be a fejünket a gereblyébe.

Maximalizálja a fordító diagnosztikáit

Csapatunk (és nektek is javasoljuk) a következő fordítási opciókat használja:

-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

A projektjébe beépítve sok újdonságra bukkan a kódjával kapcsolatban.

Tartsa be a szabványt

Próbálja elkerülni a platformfüggetlen megoldásokat, ha léteznek szabványos alternatívák. Ha mégis szükség van rájuk, csomagolja őket speciális blokkokba makrósorokkal (vagy más módon), és egyszerűen ne engedje, hogy a kódja nem támogatott körülmények között forduljon.

Tartsa be a műveletek szabványos szemantikáját

A kivonásnak kivonásnak, a szorzásnak szorzásnak, a függvényhívásnak függvényhívásnak, a másolásnak másolnia kell, a mozgatásnak pedig mozgatnia kell, a konténernek iterálhatónak kell lennie, az iterátornak pedig előre kell haladnia ++ és de-referálás *. És így tovább, és így tovább.

Gondolom, a gondolat világos. Léteznek elterjedt megállapodások, amelyek nem kötelezőek, de amelyeket minden felhasználó és kódolkotó elvár, hogy lásson a kódjában. Ne próbálja meg túljárni mások eszén, mert akkor csak saját magát fogja megtréfálni.

Írjon kompatibilis kódot

Elsősorban a standard könyvtárra gondolok. Nagyon kívánatos, hogy osztályainak és függvényeinek interfészei használhatóak legyenek a standard és más könyvtárakkal (például a Boost-tal).

Ne habozzon rápillantani az STL és Boost interfészeire. Ritka kivételektől eltekintve ott méltó példákat fog látni.

Maximálisan használja ki a nyílt eszközöket

A minimum of two open-source free tools exist for the same static analysis, which connect to any project with a CMake build system with just one command.

You can read more about this in my recent publication..

Utószó

In conclusion, I want to emphasize that I am not advocating against using PVS or any other static analyzers. However, I urge you to consider how it is that the static analyzer constantly finds significant errors in your code.

This is just a consequence. One must search for and eliminate the cause.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster