PVS-Studio (Linux, C++) тәуелсіз шолуы

Мен PVS Linux жүйесінде талдауды үйренген басылымды көрдім және оны өз жобаларымда сынап көруді шештім. Ал одан шыққаны осы.


Мазмұны

  1. Плюсы
  2. Минусы
  3. Нәтижелері
  4. Кейінгі сөз

Плюсы

Жауапты қолдау

Мен сынақ кілтін сұрадым, олар оны маған сол күні жіберді.

Өте анық құжаттама

Біз анализаторды еш қиындықсыз іске қостық. Консоль пәрмендері бойынша анықтама да қолжетімді (бірақ мұнда кейбір шағымдар бар, бөлімді қараңыз Минусы).

Көп ағынды талдау мүмкіндігі

Анализатордың «стандартты» опциясы бар -j, талдауды бірнеше тапсырмаларда қатар жүргізуге мүмкіндік береді. Бұл көп уақытты үнемдейді.

Жақсы визуализация

Мәтіннен шағын веб-мұртқа дейін көптеген әртүрлі шығыс пішімдері. Веб-интерфейс ыңғайлы, қысқа, кодтағы жолдардың жанындағы кеңестермен және диагностикалық сипаттамаларға сілтемелерімен..

Құрылымға оңай біріктіру

Барлық құжаттама олардың веб-сайтында, мен тек айта аламын, егер сіздің жобаңыз CMake көмегімен салынған болса, онда бәрі өте қарапайым.

Жақсы диагностикалық сипаттамалар

Егер сіз режимде шығыс жасасаңыз fullhtml, содан кейін әрбір хабарламада түсіндірмелер, код мысалдары және қосымша сілтемелері бар диагностикалық сипаттамаға сілтеме болады.

Минусы

Анализатордың С++ тілін білмеуі

Өкінішке орай, 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-Studio (Linux, C++) тәуелсіз шолуы

Көп ағынды есепке алмайды

Өзгермейтін айнымалылар немесе шексіз циклдар туралы көптеген жалған позитивтер бар, бұл айнымалылармен жұмыс әртүрлі ағындардан орындалады және егер олай болмаса, бірлік сынақтары жұмыс істемейді.

PVS-Studio (Linux, C++) тәуелсіз шолуы

Дегенмен, статикалық анализатор тіпті мұны ескере ала ма? Білмеймін.

Нәтижелері

PVS менің ашық бастапқы жобаларымда нақты қателерді таппады Burst и Проксима, сондай-ақ түсінікті себептермен мен ұсына алмайтын жұмыс жобасында. Рас, кейбір кемшіліктер бұрын қолданылып, түзетілгенін есте ұстаған жөн 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

Оларды жобаңызда қосыңыз және кодыңыз туралы көп нәрсені біліңіз.

Стандартты ұстаныңыз

Стандартты аналогтар бар болса, платформаға тәуелді заттарды қолданбауға тырысыңыз және оларсыз мүлдем жасай алмасаңыз, оларды макростар үшін арнайы блоктарға (немесе басқа нәрсе) ораңыз және кодты қолдау көрсетілмейтін жағдайларда құрастыруға жол бермеңіз.

Стандартты операция семантикасын ұстаныңыз

Қосу қосу, көбейту көбейту, функция шақыру функционалды шақыру, көшіру көшіру, тасымалдау тасымалдау, контейнер қайталанатын болуы керек, итераторда жылжыту болуы керек ++ және сілтемені жою *. Және тағы басқалар.

Менің ойымша, идея түсінікті. Міндетті емес, бірақ кодтың барлық пайдаланушылары мен оқырмандары көруді күтетін бекітілген конвенциялар бар. Басқаларды алдауға тырыспаңыз, әйтпесе өзіңізді алдайсыз.

Үйлесімді кодты жазыңыз

Ең алдымен стандартты кітапхананы айтамын. Сіздің сыныптарыңыз бен функцияларыңыздың интерфейстерін стандартты және басқа кітапханалармен (мысалы, Boost) пайдалану өте қажет.

STL және Boost интерфейстерін қарап шығыңыз. Сирек жағдайларды қоспағанда, онда сіз лайықты үлгіні көресіз.

Ашық бастапқы құралдарды барынша пайдаланыңыз

Бірдей статикалық талдау үшін CMake құрастыру жүйесі бар кез келген жобаға бір рет қосылуға болатын кемінде екі ашық тегін құрал бар.

Бұл туралы толығырақ менің соңғы жарияланымнан оқи аласыз.

Кейінгі сөз

Соңында, мен PVS немесе басқа статикалық анализаторларды пайдаланбауды жақтамайтынымды атап өткім келеді. Бірақ мен сізге статикалық анализатор сіздің кодыңызда маңызды қателерді үнемі тауып алатыны туралы ойлануға шақырамын.

Бұл салдары ғана. Біз оның себебін іздеп, жоюымыз керек.

Ақпарат көзі: www.habr.com

пікір қалдыру