Min weşanek dît ku PVS fêrî analîzkirina Linux-ê bû, û biryar da ku wê li ser projeyên xwe biceribînim. Û ev e ya ku ji wê derket.
Contains
Piştgiriya bersivdar
Min mifteya ceribandinê xwest û wan jî heman rojê ji min re şandin.
Belgeyên pir zelal
Me karî ku analîzker bêyî pirsgirêk dest pê bike. Alîkarî ji bo emrên konsolê jî heye (her çend li vir hin gilî hene, li beşê binêre ).
Ihtîmala analîza pir-mijarî
Analîzator vebijarkek "standard" heye -j, dihêle ku analîz di çend karan de paralel were kirin. Ev gelek dem xilas dike.
Visualîzasyonek baş
Gelek formên derketinê yên cihêreng, ji nivîsê bigire heya mûçikek piçûk. .
Yekbûna hêsan di civînê de
Hemî belge li ser malpera wan e, ez tenê dikarim bibêjim ku heke projeya we bi karanîna CMake ve hatî çêkirin, wê hingê her tişt pir hêsan e.
Danasînên tespîtkirina baş
Heke hûn di modê de hilberan çêbikin fullhtml, wê hingê her peyamek bi ravekirinek, nimûneyên kodê û girêdanên din ve girêdanek ravekek tespîtkirinê heye.
Nezanîna zimanê C++ ji aliyê analîstê ve
Mixabin, PVS carinan xeletiyên hevoksaziyê dike û dema ku kod bi tevahî rast e peyamên erênî yên derewîn çêdike.
Mînakî, fonksiyonek heye ku vedigere 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));
}Erê peyva sereke ye auto Can wateya void, ji bo vê yekê ye auto. Lê PVS peyamên jêrîn hilberandin:
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.Malpera pir hêdî
Erê, di navgîniya webê de li tenişta her peyamê girêdanek bi danasîna tespîtkirina têkildar bi mînakan re heye. Lê gava ku hûn li ser zencîreyekê bikirtînin, divê hûn demek pir dirêj li bendê bin, û carinan jî çêdibe .
Ziman
Hemî danasîn bi rûsî ne, ku pir xweş e. Lê lînkên ji raporê her gav ber bi guhertoya îngilîzî ve diçin. Dê xweş be ku meriv bikaribe ziman biguhezîne da ku hûn tavilê teşhîs bi rûsî bibînin. Min di navberê de vebijarkek wusa nedît.
Nerehet e ku meriv bi astên tespîtkirinê re bi konsolê re bixebite
Werin em bi vê rastiyê dest pê bikin ku du ferman têne bikar anîn (ev pvs-studio-analyzer и plog-converter) Formatên cihêreng ên ji bo diyarkirina tespîtan.
Alîkarî ji bo pvs-studio-analyzer dixwîne:
-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: 4Min demek dirêj hewl da ku ez biçim ku derê lêzêdekirin ("zêdekirina nirxan") bişkokên. Min hewl da ku navnîşa wan bi kommasan veqetînim:
pvs-studio-analyzer analyze ... -a 1,4,16Min çend caran hewl da ku mifteyê tomar bikim:
pvs-studio-analyzer analyze ... -a 1 -a 4 -a 16Û tenê wê gavê min fêhm kir ku ev maskeyên pitik bûn! Û hûn hewce ne Kom kirinû ne lêzêdekirin wateyên. Mînakî, ji bo ku hûn tespîtên gelemperî, tespîtkirina ji bo mîkro-optimîzasyonan û MISRA bistînin, hûn hewce ne ku wan kurt bikin (4 + 8 + 32 = 44):
pvs-studio-analyzer analyze ... -a 44Bikaranîna bitmasks di navgînên bikarhêner de bi gelemperî rengek xirab e. Hemî ev dikare di hundurê de were kurt kirin, û komek ala dikare ji bo bikarhêner were danîn.
Digel vê yekê, karûbarek jî heye plog-converter, ku agahdariya analîzên statîk ên ku ji hêla mirovan ve têne xwendin diafirîne. Pirsgirêkên wê yên din hene.
Alîkariya bernameyê plog-converter rapor dike:
-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,2Hin "asta" li vir xuya bûn ku berê ne li wir bûn, û min di belgeyê de jî tiştek li ser wan nedît.
Bi gelemperî, ne diyar e. Ji ber vê yekê min her tişt li ser herî zêde datîne.
Komek sondxwarinên ehmeqî li ser Catch
Du ji sê projeyên ku min analîz kirin pirtûkxaneyek ceribandina yekîneyê bikar tînin . Û peyamên para şêran (!!! 90 ji 138 di yekî û 297 ji 344 di ya din!!!) ev form hene:

Pirtextî li ber çavan nagire
Di derheqê guhêrbarên neguhêrbar an lûleyên bêdawî de gelek pozîtîfên derewîn hene, dema ku xebata bi van guherbaran re ji mijarên cihêreng pêk tê, û ger ne wusa bûya, wê hingê ceribandinên yekîneyê dê nexebitin.

Lêbelê, analîzatorek statîk dikare vê yekê jî bihesibîne? Nizanim.
PVS di projeyên min ên çavkaniya vekirî de xeletiyên rastîn nedît и , û her weha di pêşnûmeyek xebatê de, ku ji ber sedemên diyar, ez nikarim pêşkêş bikim. Rast e, hêja ye ku ji bîr mekin ku hin kêmasiyên berê berê hatine girtin û rast kirin и .
Bi gelemperî, bandora van hemî analîzkeran hema hema yek e: erê, ew tiştek digirin, carinan carinan jî tiştek girîng e, lê bi tevahî berhevkar bes e.
Mimkun e (û ez bi xwe dixwazim wusa bifikirim) ku tîmê me pratîkên pêşkeftina nermalavê bikar tîne ku destûrê dide me ku em hindiktirîn kodek şîrîn biafirînin. Çêtir e ku pirsgirêkan çênekin ji bi qehremanî derbaskirina wan çêtir e.
Ji ber vê yekê, ez azad dibim ku hin şîretan bidim ka meriv çawa di C++-ê de bi vî rengî dinivîse ku lingên yekî neteqîne an jî bi kêzikê li eniya kesî nexe.
Ji tespîtkirina berhevkerê herî zêde bikar bînin
Tîma me vebijarkên berhevkirina jêrîn bikar tîne (û şîret li we dike):
-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-promoDi projeya xwe de wan çalak bikin û di derbarê koda xwe de pir tiştan fêr bibin.
Li gorî standardê bisekinin
Ger analogên standard hebin, biceribînin ku tiştên girêdayî platformê bikar neynin, û heke hûn bi tevahî nikaribin bêyî wan bikin, wan ji bo makroyan (an tiştek din) di blokên taybetî de bipêçin û bi tenê nehêlin koda we di bin şert û mercên nepiştgirî de were berhev kirin.
Bi semantîka xebata standard ve girêdayî bin
Pêvekirin divê zêdebûn be, pirkirin divê pirkirin be, banga fonksiyonê divê banga fonksiyonê be, kopî divê kopî be, hilgirtin divê were hilgirtin, konteynir divê dubare be, îterator divê promosyonê hebe. ++ û jêderxistin *. Û filan û bêvan.
Ez difikirim ku fikir zelal e. Peymanên sazkirî hene ku ne girêdayî ne, lê hemî bikarhêner û xwendevanên koda we hêvî dikin ku bibînin. Hewl nedin ku kesên din bixapînin, wekî din hûn ê xwe bixapînin.
Koda lihevhatî binivîsin
Berî her tiştî, mebesta min pirtûkxaneya standard e. Pir tê xwestin ku navberên çîn û fonksiyonên we bi pirtûkxaneyên standard û yên din re bêne bikar anîn (mînak, Boost).
Hûn bi dilxwazî li navberên STL û Boost binêrin. Ji bilî îstîsnayên kêm, hûn ê li wir modelek rola hêja bibînin.
Ji amûrên çavkaniya vekirî herî zêde bikar bînin
Ji bo heman analîza statîk, bi kêmî ve du amûrên belaş ên vekirî hene ku dikarin bi pergala avakirina CMake re tenê carekê bi her projeyek ve werin girêdan.
.
Di dawiyê de, ez dixwazim tekez bikim ku ez naxwazim ku PVS an analîzkerên din ên statîk bikar neynin. Lê ez ji we re teşwîq dikim ku hûn bifikirin ka çawa çêbû ku analîstê statîk bi domdarî di koda we de xeletiyên girîng dibîne.
Ev tenê encamek e. Divê em li sedemê bigerin û ji holê rakin.
Source: www.habr.com
