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
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 ).
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. .
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.
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 .
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: 4Hosszú 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,16Tö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 44A 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 Nem veszi figyelembe a párhuzamos futtatást.

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.

A PVS nem talált egyetlen valódi hibát sem az általam nyitott projekteken
Burst és Cppcheck és .
Ö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-promoA 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.
.
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
