PVS-స్టూడియో యొక్క స్వతంత్ర సమీక్ష (Linux, C++)

PVS Linux కింద విశ్లేషించడం నేర్చుకున్న ఒక ప్రచురణను నేను చూశాను మరియు నా స్వంత ప్రాజెక్ట్‌లలో దీనిని ప్రయత్నించాలని నిర్ణయించుకున్నాను. మరియు ఇది బయటకు వచ్చింది.


కంటెంట్

  1. Плюсы
  2. Минусы
  3. ఫలితాలు
  4. తరువాతి మాట

Плюсы

ప్రతిస్పందించే మద్దతు

నేను ట్రయల్ కీని అభ్యర్థించాను మరియు వారు దానిని అదే రోజు నాకు పంపారు.

చాలా స్పష్టమైన డాక్యుమెంటేషన్

మేము ఎటువంటి సమస్యలు లేకుండా ఎనలైజర్‌ను ప్రారంభించగలిగాము. కన్సోల్ ఆదేశాల కోసం సహాయం కూడా అందుబాటులో ఉంది (ఇక్కడ కొన్ని ఫిర్యాదులు ఉన్నప్పటికీ, విభాగాన్ని చూడండి Минусы).

బహుళ-థ్రెడ్ విశ్లేషణ యొక్క అవకాశం

ఎనలైజర్‌కి "ప్రామాణిక" ఎంపిక ఉంది -j, అనేక పనులలో సమాంతరంగా విశ్లేషణను నిర్వహించడానికి అనుమతిస్తుంది. దీనివల్ల చాలా సమయం ఆదా అవుతుంది.

మంచి విజువలైజేషన్

టెక్స్ట్ నుండి చిన్న వెబ్ మజిల్ వరకు అనేక విభిన్న అవుట్‌పుట్ ఫార్మాట్‌లు. వెబ్ ఇంటర్‌ఫేస్ అనుకూలమైనది, సంక్షిప్తమైనది, కోడ్‌లోని పంక్తుల పక్కన సూచనలు మరియు డయాగ్నస్టిక్ వివరణలకు లింక్‌లతో ఉంటుంది.

అసెంబ్లీలో సులభంగా ఏకీకరణ

అన్ని డాక్యుమెంటేషన్ వారి వెబ్‌సైట్‌లో ఉంది, మీ ప్రాజెక్ట్ CMake ఉపయోగించి నిర్మించబడితే, ప్రతిదీ చాలా సులభం అని మాత్రమే నేను చెప్పగలను.

మంచి రోగనిర్ధారణ వివరణలు

మీరు మోడ్‌లో అవుట్‌పుట్ ఉత్పత్తి చేస్తే fullhtml, ఆపై ప్రతి సందేశానికి వివరణలు, కోడ్ ఉదాహరణలు మరియు అదనపు లింక్‌లతో విశ్లేషణ వివరణకు లింక్ ఉంటుంది.

Минусы

ఎనలైజర్ ద్వారా C++ భాష యొక్క అజ్ఞానం

దురదృష్టవశాత్తూ, PVS కొన్నిసార్లు సింటాక్స్ లోపాలను చేస్తుంది మరియు కోడ్ పూర్తిగా సరిగ్గా ఉన్నప్పుడు తప్పుడు సానుకూల సందేశాలను ఉత్పత్తి చేస్తుంది.

ఉదాహరణకు, తిరిగి ఇచ్చే ఒక ఫంక్షన్ ఉంది 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));
}

అవును అనేది కీలక పదం auto అర్థం చేసుకోవచ్చు void, దాని కోసమే కారు. కానీ PVS కింది సందేశాలను ఉత్పత్తి చేసింది:

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.

చాలా నెమ్మదైన సైట్

అవును, ప్రతి సందేశం పక్కన ఉన్న వెబ్ ఇంటర్‌ఫేస్‌లో ఉదాహరణలతో సంబంధిత విశ్లేషణ వివరణకు లింక్ ఉంది. కానీ మీరు లింక్‌పై క్లిక్ చేసినప్పుడు, మీరు చాలా కాలం వేచి ఉండాలి మరియు కొన్నిసార్లు ఇది జరుగుతుంది 504 గేట్‌వే సమయం ముగిసింది.

భాష

అన్ని వివరణలు రష్యన్ భాషలో ఉన్నాయి, ఇది చాలా బాగుంది. కానీ నివేదిక నుండి లింక్‌లు ఎల్లప్పుడూ ఆంగ్ల సంస్కరణకు దారితీస్తాయి. మీరు డయాగ్నస్టిక్‌లను వెంటనే రష్యన్‌లో వీక్షించగలిగేలా భాషను మార్చగలిగితే బాగుంటుంది. నేను ఇంటర్‌ఫేస్‌లో అలాంటి ఎంపికను కనుగొనలేదు.

కన్సోల్ ద్వారా డయాగ్నస్టిక్ స్థాయిలతో పని చేయడం అసౌకర్యంగా ఉంటుంది

రెండు ఆదేశాలు ఉపయోగించిన వాస్తవంతో ప్రారంభిద్దాం (ఇది pvs-studio-analyzer и plog-converter) డయాగ్నస్టిక్‌లను పేర్కొనడానికి వివిధ ఫార్మాట్‌లు.

కోసం సహాయం pvs-studio-analyzer చదువుతుంది:

-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

ఎక్కడికి వెళ్లాలో తెలియక చాలాసేపు గడిపాను జోడించడానికి ("విలువలను జోడించడం") కీలు. నేను వాటిని కామాలతో వేరు చేయడానికి ప్రయత్నించాను:

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

నేను కీని నమోదు చేయడానికి చాలాసార్లు ప్రయత్నించాను:

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

మరియు అప్పుడు మాత్రమే ఇవి బిట్ మాస్క్‌లు అని నేను గ్రహించాను! మరియు మీకు కావాలి సంగ్రహించండికానీ కాదు జోడించడానికి అర్థాలు. ఉదాహరణకు, సాధారణ విశ్లేషణలు, మైక్రో-ఆప్టిమైజేషన్‌లు మరియు MISRA కోసం డయాగ్నస్టిక్‌లు పొందడానికి, మీరు వాటిని సంగ్రహించాలి (4 + 8 + 32 = 44):

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

వినియోగదారు ఇంటర్‌ఫేస్‌లలో బిట్‌మాస్క్‌లను ఉపయోగించడం సాధారణంగా చెడు రూపం. ఇవన్నీ అంతర్గతంగా సంగ్రహించబడతాయి మరియు వినియోగదారు కోసం ఫ్లాగ్‌ల సమితిని సెట్ చేయవచ్చు.

అదనంగా, ఒక యుటిలిటీ కూడా ఉంది plog-converter, ఇది మానవులు చదవగలిగే స్టాటిక్ విశ్లేషణ సమాచారాన్ని ఉత్పత్తి చేస్తుంది. ఆమెకు ఇతర సమస్యలు ఉన్నాయి.

కార్యక్రమం కోసం సహాయం plog-converter నివేదికలు:

-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

ఇంతకు ముందు లేని కొన్ని "స్థాయిలు" ఇక్కడ కనిపించాయి మరియు డాక్యుమెంటేషన్‌లో వాటి గురించి నేను ఏమీ కనుగొనలేదు.

సాధారణంగా, ఇది స్పష్టంగా లేదు. అందుకే నేను ప్రతిదీ గరిష్టంగా సెట్ చేసాను.

క్యాచ్‌లో తెలివితక్కువ ప్రమాణాల సమూహం

నేను విశ్లేషించిన మూడు ప్రాజెక్ట్‌లలో రెండు యూనిట్ టెస్టింగ్ లైబ్రరీని ఉపయోగిస్తాయి క్యాచ్2. మరియు సందేశాలలో సింహభాగం (!!! ఒకదానిలో 90లో 138 మరియు మరొకదానిలో 297లో 344!!!) క్రింది ఫారమ్‌ను కలిగి ఉంది:

PVS-స్టూడియో యొక్క స్వతంత్ర సమీక్ష (Linux, C++)

మల్టీథ్రెడింగ్‌ను పరిగణనలోకి తీసుకోదు

మారని వేరియబుల్స్ లేదా అంతులేని లూప్‌ల గురించి చాలా తప్పుడు పాజిటివ్‌లు ఉన్నాయి, అయితే ఈ వేరియబుల్స్‌తో పని వివిధ థ్రెడ్‌ల నుండి జరుగుతుంది మరియు ఇది అలా కాకపోతే, యూనిట్ పరీక్షలు పని చేయవు.

PVS-స్టూడియో యొక్క స్వతంత్ర సమీక్ష (Linux, C++)

అయితే, స్టాటిక్ ఎనలైజర్ దీన్ని కూడా పరిగణనలోకి తీసుకోవచ్చా? తెలియదు.

ఫలితాలు

PVS నా ఓపెన్ సోర్స్ ప్రాజెక్ట్‌లలో నిజమైన బగ్‌లు ఏవీ కనుగొనలేదు విస్ఫోటనం и ప్రాక్సిమా, అలాగే వర్కింగ్ డ్రాఫ్ట్‌లో, స్పష్టమైన కారణాల వల్ల, నేను ప్రదర్శించలేను. నిజమే, కొన్ని లోపాలను ఇప్పటికే పట్టుకుని, ముందుగా ఉపయోగించి సరిదిద్దబడిందని గుర్తుంచుకోవడం విలువ Cppcheck и scan-build.

సాధారణంగా, ఈ అన్ని ఎనలైజర్‌ల నుండి వచ్చే అభిప్రాయం దాదాపు ఒకే విధంగా ఉంటుంది: అవును, వారు ఏదో ఒకదానిని పట్టుకుంటారు, కొన్నిసార్లు ముఖ్యమైనది కూడా, కానీ మొత్తంగా కంపైలర్ సరిపోతుంది.

మా బృందం సాఫ్ట్‌వేర్ డెవలప్‌మెంట్ ప్రాక్టీస్‌లను ఉపయోగించడం సాధ్యమవుతుంది (మరియు నేను వ్యక్తిగతంగా అలా ఆలోచించాలనుకుంటున్నాను) మాకు కనీస మొత్తంలో చెత్త కోడ్‌ను రూపొందించడానికి వీలు కల్పిస్తుంది. వీరోచితంగా వాటిని అధిగమించడం కంటే సమస్యలను సృష్టించకుండా ఉండటం మంచిది.

అందువల్ల, ఎవరి కాళ్లను కాల్చకుండా లేదా ఎవరి నుదిటిపై ఒక రేక్‌తో కొట్టకుండా C++లో ఎలా వ్రాయాలో కొన్ని సలహాలు ఇచ్చే స్వేచ్ఛ నాకు ఉంది.

కంపైలర్ డయాగ్నస్టిక్స్‌ని ఎక్కువగా ఉపయోగించుకోండి

మా బృందం క్రింది సంకలన ఎంపికలను ఉపయోగిస్తుంది (మరియు మీకు సలహా ఇస్తుంది):

-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

వాటిని మీ ప్రాజెక్ట్‌లో ప్రారంభించండి మరియు మీ కోడ్ గురించి చాలా తెలుసుకోండి.

ప్రమాణానికి కట్టుబడి ఉండండి

స్టాండర్డ్ అనలాగ్‌లు ఉన్నట్లయితే ప్లాట్‌ఫారమ్-ఆధారిత విషయాలను ఉపయోగించకుండా ప్రయత్నించండి మరియు అవి లేకుండా మీరు ఖచ్చితంగా చేయలేకపోతే, వాటిని మాక్రోల (లేదా మరేదైనా) కోసం ప్రత్యేక బ్లాక్‌లలో చుట్టండి మరియు మద్దతు లేని పరిస్థితుల్లో మీ కోడ్‌ను కంపైల్ చేయనివ్వవద్దు.

ప్రామాణిక ఆపరేషన్ సెమాంటిక్స్‌కు కట్టుబడి ఉండండి

కూడిక తప్పనిసరిగా కూడిక అయి ఉండాలి, గుణకారం తప్పనిసరిగా గుణకారం అయి ఉండాలి, ఫంక్షన్ కాల్ తప్పనిసరిగా ఫంక్షన్ కాల్ అయి ఉండాలి, కాపీ తప్పనిసరిగా కాపీ అయి ఉండాలి, క్యారీ చేయాలి క్యారీ చేయాలి, కంటైనర్ తప్పనిసరిగా మళ్ళించదగినదిగా ఉండాలి, ఇటరేటర్ తప్పనిసరిగా ప్రమోషన్ కలిగి ఉండాలి ++ మరియు డిఫరెన్సింగ్ *. మరియు అందువలన న.

ఆలోచన స్పష్టంగా ఉందని నేను భావిస్తున్నాను. బైండింగ్ లేని ఏర్పాటు చేసిన సమావేశాలు ఉన్నాయి, కానీ మీ కోడ్ యొక్క వినియోగదారులు మరియు రీడర్‌లందరూ చూడాలని ఆశిస్తున్నారు. ఇతరులను అధిగమించడానికి ప్రయత్నించవద్దు, లేకుంటే మీరు మిమ్మల్ని మీరు అధిగమిస్తారు.

అనుకూల కోడ్ వ్రాయండి

అన్నింటిలో మొదటిది, నా ఉద్దేశ్యం ప్రామాణిక లైబ్రరీ. మీ తరగతులు మరియు ఫంక్షన్‌ల ఇంటర్‌ఫేస్‌లు ప్రామాణిక మరియు ఇతర లైబ్రరీలతో (ఉదాహరణకు, బూస్ట్) ఉపయోగించబడటం చాలా అవసరం.

STL మరియు బూస్ట్ ఇంటర్‌ఫేస్‌లను పరిశీలించడానికి సంకోచించకండి. అరుదైన మినహాయింపులతో, మీరు అక్కడ విలువైన రోల్ మోడల్‌ను చూస్తారు.

ఓపెన్ సోర్స్ సాధనాలను ఎక్కువగా ఉపయోగించుకోండి

అదే స్టాటిక్ విశ్లేషణ కోసం, CMake బిల్డ్ సిస్టమ్‌తో ఏదైనా ప్రాజెక్ట్‌కి ఒకసారి కనెక్ట్ చేయగల కనీసం రెండు ఓపెన్ ఫ్రీ టూల్స్ ఉన్నాయి.

మీరు నా ఇటీవలి ప్రచురణలో దీని గురించి మరింత చదువుకోవచ్చు.

తరువాతి మాట

చివరగా, నేను PVS లేదా ఏదైనా ఇతర స్టాటిక్ ఎనలైజర్‌లను ఉపయోగించకూడదని నేను సూచించడం లేదని నొక్కి చెప్పాలనుకుంటున్నాను. కానీ స్టాటిక్ ఎనలైజర్ నిరంతరం మీ కోడ్‌లో ముఖ్యమైన లోపాలను కనుగొనడం ఎలా జరిగిందో ఆలోచించమని నేను మిమ్మల్ని ప్రోత్సహిస్తున్నాను.

ఇది కేవలం పర్యవసానమే. మేము కారణాన్ని వెతకాలి మరియు తొలగించాలి.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి