Adolygiad annibynnol o PVS-Studio (Linux, C++)

Gwelais gyhoeddiad yr oedd PVS wedi dysgu ei ddadansoddi o dan Linux, a phenderfynais roi cynnig arno ar fy mhrosiectau fy hun. A dyma beth ddaeth allan ohono.


Cynnwys

  1. Manteision
  2. Cons
  3. Canlyniadau
  4. Afterword

Manteision

Cefnogaeth ymatebol

Gofynnais am allwedd prawf ac fe wnaethon nhw ei hanfon ataf yr un diwrnod.

Dogfennaeth eithaf clir

Llwyddom i lansio'r dadansoddwr heb unrhyw broblemau. Mae cymorth ar gyfer gorchmynion consol hefyd ar gael (er bod rhai cwynion yma, gweler yr adran Cons).

Posibilrwydd o ddadansoddiad aml-edau

Mae gan y dadansoddwr opsiwn "safonol". -j, gan ganiatáu i ddadansoddiad gael ei wneud ochr yn ochr â sawl tasg. Mae hyn yn arbed llawer o amser.

Delweddu da

Llawer o wahanol fformatau allbwn, o destun i we bach. Mae'r rhyngwyneb gwe yn gyfleus, yn gryno, gydag awgrymiadau wrth ymyl llinellau yn y cod a dolenni i ddisgrifiadau diagnostig.

Integreiddio hawdd i'r cynulliad

Mae'r holl ddogfennaeth ar eu gwefan, ni allaf ond dweud os caiff eich prosiect ei adeiladu gan ddefnyddio CMake, yna mae popeth yn syml iawn.

Disgrifiadau diagnostig da

Os ydych chi'n cynhyrchu allbwn yn y modd fullhtml, yna mae gan bob neges ddolen i ddisgrifiad diagnostig, gydag esboniadau, enghreifftiau cod a dolenni ychwanegol.

Cons

Anwybodaeth o'r iaith C++ gan y dadansoddwr

Yn anffodus, mae PVS weithiau'n gwneud gwallau cystrawen ac yn cynhyrchu negeseuon positif ffug pan fo'r cod yn hollol gywir.

Er enghraifft, mae yna swyddogaeth sy'n dychwelyd 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));
}

Ie yw'r gair allweddol auto Gall olygu void, dyna beth yw ei ddiben auto. Ond cynhyrchodd PVS y negeseuon canlynol:

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.

Safle araf iawn

Oes, yn y rhyngwyneb gwe wrth ymyl pob neges mae dolen i'r disgrifiad diagnostig cyfatebol gydag enghreifftiau. Ond pan fyddwch chi'n clicio ar ddolen, mae'n rhaid i chi aros am amser eithaf hir, ac weithiau mae'n digwydd 504 Amser Allan y Porth.

Iaith

Mae'r holl ddisgrifiadau yn Rwsieg, sy'n wych. Ond mae dolenni o'r adroddiad bob amser yn arwain at y fersiwn Saesneg. Byddai'n braf gallu newid yr iaith fel y gallwch weld diagnosteg ar unwaith yn Rwsieg. Doeddwn i ddim yn dod o hyd i opsiwn o'r fath yn y rhyngwyneb.

Mae'n anghyfleus gweithio gyda lefelau diagnostig trwy'r consol

Gadewch i ni ddechrau gyda'r ffaith bod y ddau orchymyn a ddefnyddiwyd (hyn pvs-studio-analyzer и plog-converter) fformatau gwahanol ar gyfer nodi diagnosteg.

Help ar gyfer pvs-studio-analyzer yn darllen:

-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

Treuliais amser hir yn ceisio darganfod ble i fynd ychwanegu allweddi (“ychwanegu'r gwerthoedd”). Ceisiais eu rhestru wedi'u gwahanu gan atalnodau:

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

Ceisiais gofrestru'r allwedd sawl gwaith:

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

A dim ond wedyn sylweddolais mai mygydau bach oedd y rhain! Ac mae angen crynhoiAc nid ychwanegu ystyron. Er enghraifft, i gael diagnosteg gyffredinol, diagnosteg ar gyfer micro-optimeiddio a MISRA, mae angen i chi eu crynhoi (4 + 8 + 32 = 44):

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

Yn gyffredinol, mae defnyddio masgiau did mewn rhyngwynebau defnyddwyr yn ffurf wael. Gellid crynhoi hyn i gyd yn fewnol, a gellid gosod set o fflagiau ar gyfer y defnyddiwr.

Yn ogystal, mae yna hefyd cyfleustodau plog-converter, sy'n cynhyrchu gwybodaeth ddadansoddi statig y gall pobl ei darllen. Mae ganddi broblemau eraill.

Cymorth ar gyfer y rhaglen plog-converter adroddiadau:

-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

Ymddangosodd rhai “lefelau” yma nad oeddent yno o'r blaen, ac ni wnes i ddod o hyd i unrhyw beth amdanynt yn y ddogfennaeth ychwaith.

Yn gyffredinol, nid yw'n glir. Dyna pam yr wyf yn gosod popeth i'r eithaf.

Criw o regi gwirion ar Catch

Mae dau o'r tri phrosiect a ddadansoddais yn defnyddio llyfrgell profi unedau Dal2. Ac mae cyfran y llew o negeseuon (!!! 90 allan o 138 yn un a 297 allan o 344 yn y llall!!!) â'r ffurf ganlynol:

Adolygiad annibynnol o PVS-Studio (Linux, C++)

Nid yw'n cymryd multithreading i ystyriaeth

Mae yna lawer o bethau cadarnhaol ffug ynghylch newidynnau neu ddolenni diddiwedd sydd i fod yn ddigyfnewid, tra bod gwaith gyda'r newidynnau hyn yn digwydd o wahanol edafedd, a phe na bai hyn felly, ni fyddai profion uned yn gweithio.

Adolygiad annibynnol o PVS-Studio (Linux, C++)

Fodd bynnag, a all dadansoddwr statig hyd yn oed gymryd hyn i ystyriaeth? Ddim yn gwybod.

Canlyniadau

Ni ddaeth PVS o hyd i unrhyw fygiau go iawn yn fy mhrosiectau ffynhonnell agored Burst и Nesaf, yn ogystal ag mewn drafft gweithredol, na allaf, am resymau amlwg, ei gyflwyno. Yn wir, mae'n werth cofio bod rhai diffygion eisoes wedi'u dal a'u cywiro yn gynharach gan ddefnyddio Gwiriad Cpp и scan-build.

Yn gyffredinol, mae'r argraff gan yr holl ddadansoddwyr hyn tua'r un peth: ydyn, maen nhw'n dal rhywbeth, weithiau hyd yn oed rhywbeth pwysig, ond yn gyffredinol mae'r casglwr yn ddigon.

Mae'n bosibl (ac rwy'n bersonol yn hoffi meddwl hynny) bod ein tîm yn defnyddio arferion datblygu meddalwedd sy'n ein galluogi i gynhyrchu isafswm o god shitty. Mae'n well peidio â chreu problemau na'u goresgyn yn arwrol.

Felly, rwy’n cymryd y rhyddid o roi rhywfaint o gyngor ar sut i ysgrifennu yn C ++ yn y fath fodd fel na fyddwn yn saethu coesau neb i ffwrdd na tharo unrhyw un yn y talcen gyda rhaca.

Manteisio i'r eithaf ar ddiagnosteg casglwr

Mae ein tîm yn defnyddio (ac yn eich cynghori i) yr opsiynau casglu canlynol:

-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

Galluogi nhw yn eich prosiect a dysgu llawer am eich cod.

Cadw at y safon

Ceisiwch beidio â defnyddio pethau sy'n dibynnu ar blatfform os oes analogau safonol, ac os na allwch wneud hebddynt, lapiwch nhw mewn blociau arbennig ar gyfer macros (neu rywbeth arall) a pheidiwch â gadael i'ch cod gael ei lunio o dan amodau heb eu cefnogi.

Cadw at semanteg gweithrediad safonol

Rhaid ychwanegu hefyd, rhaid i luosi fod yn lluosi, rhaid i alwad swyddogaeth fod yn alwad swyddogaeth, rhaid i gopi fod yn gopi, rhaid cario, rhaid i'r cynhwysydd fod yn ailadroddadwy, rhaid i'r iterator gael dyrchafiad ++ a dadgyfeirio *. Ac yn y blaen ac yn y blaen.

Rwy'n meddwl bod y syniad yn glir. Mae yna gonfensiynau sefydledig nad ydynt yn rhwymol, ond y mae holl ddefnyddwyr a darllenwyr eich cod yn disgwyl eu gweld. Peidiwch â cheisio trechu eraill, fel arall byddwch yn drech na chi'ch hun.

Ysgrifennwch god cydnaws

Yn gyntaf oll, yr wyf yn golygu y llyfrgell safonol. Mae'n ddymunol iawn y gellir defnyddio rhyngwynebau eich dosbarthiadau a swyddogaethau gyda llyfrgelloedd safonol a llyfrgelloedd eraill (er enghraifft, Hwb).

Mae croeso i chi edrych ar y rhyngwynebau STL a Boost. Gydag eithriadau prin, fe welwch fodel rôl teilwng yno.

Gwnewch y gorau o offer ffynhonnell agored

Ar gyfer yr un dadansoddiad statig, mae o leiaf ddau offer rhad ac am ddim agored y gellir eu cysylltu unwaith yn unig ag unrhyw brosiect gyda system adeiladu CMake.

Gallwch ddarllen mwy am hyn yn fy nghyhoeddiad diweddar.

Afterword

Yn olaf, hoffwn bwysleisio nad wyf yn argymell peidio â defnyddio PVS nac unrhyw ddadansoddwyr statig eraill. Ond rwy'n eich annog i feddwl sut y digwyddodd bod y dadansoddwr statig yn gyson yn canfod gwallau sylweddol yn eich cod.

Canlyniad yn unig yw hyn. Mae angen inni chwilio am yr achos a'i ddileu.

Ffynhonnell: hab.com

Ychwanegu sylw