PVS-Studio-ийн бие даасан тойм (Linux, C++)

Би PVS-ийн Линукс дээр дүн шинжилгээ хийж сурсан нийтлэлийг хараад өөрийн төслүүд дээр туршиж үзэхээр шийдсэн. Тэгээд үүнээс гарсан зүйл.


Агуулга

  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

Өмнө нь байгаагүй зарим "түвшин" энд гарч ирсэн бөгөөд би тэдний талаар баримт бичигт юу ч олсонгүй.

Ерөнхийдөө энэ нь тодорхойгүй байна. Тийм ч учраас би бүх зүйлийг дээд зэргээр тогтоосон.

Catch-ийн тэнэг хараал

Миний дүн шинжилгээ хийсэн гурван төслийн хоёр нь нэгж тестийн номын санг ашигладаг Catch2-ийг ашиглана уу. Мөн мессежийн арслангийн эзлэх хувь (!!! Нэгд нь 90-аас 138, нөгөөд нь 297-өөс 344!!!) дараах хэлбэртэй байна.

PVS-Studio-ийн бие даасан тойм (Linux, C++)

Олон урсгалыг харгалздаггүй

Өөрчлөгддөггүй хэмжигдэхүүнүүд эсвэл төгсгөлгүй гогцоонуудын талаар олон худал эерэг талууд байдаг бөгөөд эдгээр хувьсагчтай ажиллах нь өөр өөр утаснуудаас хийгддэг бөгөөд хэрэв тийм биш байсан бол нэгжийн тест ажиллахгүй.

PVS-Studio-ийн бие даасан тойм (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

Төсөлдөө тэдгээрийг идэвхжүүлж, кодынхоо талаар ихийг мэдэж аваарай.

Стандартыг дагаж мөрдөөрэй

Хэрэв стандарт аналогууд байгаа бол платформоос хамааралтай зүйлсийг ашиглахгүй байхыг хичээгээрэй, хэрэв та тэдэнгүйгээр хийх боломжгүй бол тэдгээрийг макро (эсвэл өөр зүйл) тусгай блокуудад боож, дэмжигдээгүй нөхцөлд кодыг эмхэтгэхийг бүү зөвшөөр.

Стандарт үйлдлийн семантикийг дагаж мөрдөөрэй

Нэмэлт нь нэмэх, үржүүлэх нь үржүүлэх, функцийн дуудлага нь функцийн дуудлага, хуулбар нь хуулбар, зөөвөрлөх, контейнер давтагдах, давталт нь урамшуулал байх ёстой. ++ болон лавлагааг хасах *. Гэх мэтчилэн.

Санаа нь ойлгомжтой гэж бодож байна. Таны кодын бүх хэрэглэгчид болон уншигчдад заавал биелүүлэх үүрэг хүлээдэггүй тогтсон конвенцууд байдаг. Бусдыг хуурах гэж бүү оролд, тэгэхгүй бол та өөрийгөө хуурах болно.

Тохиромжтой код бичнэ үү

Юуны өмнө би стандарт номын санг хэлж байна. Таны ангиуд болон функцүүдийн интерфейсийг стандарт болон бусад номын сангуудтай (жишээлбэл, Boost) ашиглахыг зөвлөж байна.

STL болон Boost интерфейсийг хараарай. Ховор тохиолдлоос бусад тохиолдолд та зохих үлгэр дуурайллыг тэнд харах болно.

Нээлттэй эхийн хэрэгслүүдийг бүрэн ашиглаарай

Ижил статик шинжилгээний хувьд CMake бүтээх системтэй ямар ч төсөлд нэг удаа холбогдож болох дор хаяж хоёр нээлттэй үнэгүй хэрэгсэл байдаг.

Та энэ талаар илүү ихийг миний сүүлийн нийтлэлээс уншиж болно.

Дараах үгс

Эцэст нь би PVS болон бусад статик анализаторыг ашиглахгүй байхыг уриалаагүй гэдгээ онцлон хэлмээр байна. Гэхдээ статик анализатор таны кодонд ихээхэн алдаа байнга илрүүлдэг нь хэрхэн тохиолдсон талаар бодохыг танд зөвлөж байна.

Энэ бол зүгээр л үр дагавар юм. Бид шалтгааныг хайж, арилгах хэрэгтэй.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх