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 Gateway тайм-ауту.

тил

Бардык сүрөттөмөлөр орус тилинде, бул сонун. Бирок отчеттун шилтемелери ар дайым англисче версиясына алып келет. Диагностиканы дароо орусча көрүү үчүн тилди которсоңуз жакшы болмок. Мен интерфейстен мындай вариантты тапкан жокмун.

Консоль аркылуу диагностикалык деңгээлдер менен иштөө ыңгайсыз

Келгиле, эки команда колдонулганынан баштайлы (бул 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

Бул жерде мурда жок болгон кээ бир "деңгээлдер" пайда болду, мен документациядан алар жөнүндө эч нерсе тапкан жокмун.

Жалпысынан алганда, так эмес. Ошон үчүн баарын максимумга койдум.

Бир топ келесоо сөгүнүү

Мен анализдеген үч долбоордун экөө бирдик тестирлөө китепканасын колдонушат Catch2. Ал эми билдирүүлөрдүн арстандык үлүшү (!!! Биринде 90ден 138, экинчисинде 297төн 344!!!) төмөнкү формага ээ:

PVS-Studio (Linux, C++) боюнча көз карандысыз кароо

Көп агымды эске албайт

Өзгөрүлбөгөн өзгөрмөлөр же чексиз циклдер жөнүндө көптөгөн жалган позитивдер бар, ал эми бул өзгөрмөлөр менен иштөө ар кандай жиптерден ишке ашат жана эгер андай болбосо, бирдик тесттери иштебейт.

PVS-Studio (Linux, C++) боюнча көз карандысыз кароо

Бирок, статикалык анализатор муну эске ала алабы? Билбейм.

натыйжалары

PVS ачык булак долбоорлорумда эч кандай мүчүлүштүктөрдү тапкан жок жарылып и Жакын жерде, ошондой эле ачык себептерден улам мен сунуш кыла албай турган жумушчу долбоордо. Ырас, кээ бир кемчиликтер мурунтан эле колдонулуп, оңдолгондугун эстен чыгарбоо керек Cppcheck и scan-build.

Жалпысынан алганда, бул анализаторлордун бардыгынан алынган таасир болжол менен бирдей: ооба, алар бир нерсени, кээде маанилүү нерсени да кармашат, бирок жалпысынан компилятор жетиштүү.

Мүмкүн (жана мен жеке өзүм ошондой ойлогум келет) биздин команда программалык камсыздоону иштеп чыгуу практикасын колдонот, бул бизге эң аз көлөмдөгү бок кодду түзүүгө мүмкүндүк берет. Кыйынчылыктарды баатырдык менен жеңгенден көрө, жаратпай койгон жакшы.

Ошондуктан, мен С++ тилинде эч кимдин бутун атып албоо үчүн же чекесине тырмоо менен урбоо үчүн кантип жазуу керектиги боюнча бир нече кеңеш берем.

Компилятордун диагностикасын колдонуңуз

Биздин команда төмөнкү компиляция варианттарын колдонот (жана сизге кеңеш берет):

-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 же башка статикалык анализаторлорду колдонбоону жактабаганымды баса белгилегим келет. Бирок мен сизди статикалык анализатор сиздин кодуңузда олуттуу каталарды дайыма таап турганы жөнүндө ойлонууга чакырам.

Бул жөн гана натыйжа. Биз анын себебин издеп, жок кылышыбыз керек.

Source: www.habr.com

Комментарий кошуу