เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡ PVS-Studio (Linux, C++)

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เป€เบซเบฑเบ™เบชเบดเปˆเบ‡เบžเบดเบกเบ—เบตเปˆ PVS เป„เบ”เป‰เบฎเบฝเบ™เบฎเบนเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบžเบฒเบเปƒเบ•เป‰ Linux, เปเบฅเบฐเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ—เบปเบ”เบฅเบญเบ‡เปƒเบŠเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเป€เบญเบ‡. เปเบฅเบฐเบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆเบญเบญเบเบกเบฒเบˆเบฒเบเบกเบฑเบ™.


เป€เบ™เบทเป‰เบญเปƒเบ™

  1. เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™
  2. ะœะธะฝัƒัั‹
  3. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš
  4. Afterword

เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™

เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡

เบ‚เป‰เบญเบเบ‚เปเบเบฐเปเบˆเบ—เบปเบ”เบฅเบญเบ‡ เปเบฅเบฐเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบชเบปเปˆเบ‡เปƒเบซเป‰เบ‚เป‰เบญเบเปƒเบ™เบกเบทเป‰เบ”เบฝเบงเบเบฑเบ™.

เป€เบญเบเบฐเบชเบฒเบ™เบ—เบตเปˆเบŠเบฑเบ”เป€เบˆเบ™เบžเปเบชเบปเบกเบ„เบงเบ™

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฑเบ”เบเบฒเบ™เป€เบ›เบตเบ”เบ•เบปเบงเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเป‚เบ”เบเบšเปเปˆเบกเบตเบšเบฑเบ™เบซเบฒเปƒเบ”เป†. เบเบฒเบ™เบŠเปˆเบงเบเป€เบซเบผเบทเบญเบชเปเบฒเบฅเบฑเบšเบ„เปเบฒเบชเบฑเปˆเบ‡ console เปเบกเปˆเบ™เบกเบตเบขเบนเปˆ (เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบšเบฒเบ‡เบ„เปเบฒเบฎเป‰เบญเบ‡เบ—เบธเบเบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰, เป€เบšเบดเปˆเบ‡เบžเบฒเบ ะœะธะฝัƒัั‹).

เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบ‚เบญเบ‡เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบซเบผเบฒเบเบเบฐเบ—เบนเป‰

เป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบกเบตเบ—เบฒเบ‡เป€เบฅเบทเบญเบ "เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™". -j, เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเบชเบฒเบกเบฒเบ”เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เปƒเบ™เบซเบผเบฒเบเบงเบฝเบเบ‡เบฒเบ™. เบ™เบตเป‰เบŠเปˆเบงเบเบ›เบฐเบขเบฑเบ”เป€เบงเบฅเบฒเบซเบผเบฒเบ.

เบเบฒเบ™เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เบ—เบตเปˆเบ”เบต

เบฎเบนเบšเปเบšเบšเบœเบปเบ™เบœเบฐเบฅเบดเบ”เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™เบซเบผเบฒเบ, เบˆเบฒเบเบ‚เปเป‰เบ„เบงเบฒเบกเป„เบ›เบซเบฒ muzzle เป€เบงเบฑเบšเบ‚เบฐเบซเบ™เบฒเบ”เบ™เป‰เบญเบ. เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เป€เบงเบฑเบšเปเบกเปˆเบ™เบชเบฐเบ”เบงเบ, เบซเบเปเป‰, เบกเบตเบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบ—เบตเปˆเบขเบนเปˆเบ‚เป‰เบฒเบ‡เปเบ–เบงเปƒเบ™เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบช..

เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเป‚เบเบ‡เบ‡เปˆเบฒเบเป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบเบฒเบ™เบ›เบฐเบเบญเบš

เป€เบญเบเบฐเบชเบฒเบ™เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบชเบฒเบกเบฒเบ”เป€เบงเบปเป‰เบฒเป„เบ”เป‰เบงเปˆเบฒเบ–เป‰เบฒเป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบถเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰ CMake, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ—เบธเบเบชเบดเปˆเบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปเบกเปˆเบ™เบ‡เปˆเบฒเบเบ”เบฒเบเบซเบผเบฒเบ.

เบฅเบฒเบเบฅเบฐเบญเบฝเบ”เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบ—เบตเปˆเบ”เบต

เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบชเป‰เบฒเบ‡เบœเบปเบ™เบœเบฐเบฅเบดเบ”เปƒเบ™เบฎเบนเบšเปเบšเบš fullhtml, เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เปเบ•เปˆเบฅเบฐเบ‚เปเป‰เบ„เบงเบฒเบกเบกเบตเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบเบฑเบšเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบช, เบกเบตเบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบ, เบ•เบปเบงเบขเปˆเบฒเบ‡เบฅเบฐเบซเบฑเบ”เปเบฅเบฐเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบก.

ะœะธะฝัƒัั‹

เบ„เบงเบฒเบกเบšเปเปˆเป€เบ‚เบปเป‰เบฒเปƒเบˆเบ‚เบญเบ‡เบžเบฒเบชเบฒ C ++ เป‚เบ”เบเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐ

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, PVS เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰ syntax เบœเบดเบ”เบžเบฒเบ”เปเบฅเบฐเบชเป‰เบฒเบ‡เบ‚เปเป‰เบ„เบงเบฒเบกเปƒเบ™เบ—เบฒเบ‡เบšเบงเบเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเบฅเบฐเบซเบฑเบ”เบ–เบทเบเบ•เป‰เบญเบ‡เบซเบกเบปเบ”.

เบ•เบปเบงเบขเปˆเบฒเบ‡, เบกเบตเบซเบ™เป‰เบฒเบ—เบตเปˆเบชเบปเปˆเบ‡เบ„เบทเบ™ 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 เปเบปเบ”เป€เบงเบฅเบฒ.

เบžเบฒเบชเบฒ

เบ„เปเบฒเบญเบฐเบ—เบดเบšเบฒเบเบ—เบฑเบ‡เบซเบกเบปเบ”เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบ, เบŠเบถเปˆเบ‡เป€เบ›เบฑเบ™เบ—เบตเปˆเบเบดเปˆเบ‡เปƒเบซเบเปˆ. เปเบ•เปˆเบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบˆเบฒเบเบšเบปเบ”เบฅเบฒเบเบ‡เบฒเบ™เบชเบฐเป€เบซเบกเบตเบ™เปเบฒเป„เบ›เบชเบนเปˆเบชเบฐเบšเบฑเบšเบžเบฒเบชเบฒเบญเบฑเบ‡เบเบดเบ”. เบกเบฑเบ™เบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบชเบฒเบกเบฒเบ”เบ›เปˆเบฝเบ™เบžเบฒเบชเบฒเป€เบžเบทเปˆเบญเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเป„เบ”เป‰เบ—เบฑเบ™เบ—เบตเปƒเบ™เบžเบฒเบชเบฒเบฅเบฑเบ”เป€เบŠเบ. เบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ”เบฑเปˆเบ‡เบเปˆเบฒเบงเปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš.

เบกเบฑเบ™เบšเปเปˆเบชเบฐเบ”เบงเบเบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบฅเบฐเบ”เบฑเบšเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบœเปˆเบฒเบ™ console

เปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบชเบญเบ‡เบ„เปเบฒเบชเบฑเปˆเบ‡เบ—เบตเปˆเปƒเบŠเป‰ (เบ™เบตเป‰ 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

เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเป„เบ”เป‰เบฎเบฑเบšเบฎเบนเป‰เบงเปˆเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เปเบกเปˆเบ™เบซเบ™เป‰เบฒเบเบฒเบเป€เบฅเบฑเบเบ™เป‰เบญเบ! เปเบฅเบฐเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™ เบชเบฐเบซเบผเบธเบšเปเบฅเบฐเบšเปเปˆ เป€เบžเบตเปˆเบก เบ„เบงเบฒเบกโ€‹เบซเบกเบฒเบ. เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบขเปˆเบฒเบ‡, เป€เบžเบทเปˆเบญเปƒเบซเป‰เป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบ—เบปเปˆเบงเป„เบ›, เบเบฒเบ™เบงเบดเบ™เบดเบ”เป„เบชเบชเปเบฒเบฅเบฑเบš micro-optimizations เปเบฅเบฐ MISRA, เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป„เบ”เป‰เบชเบฐเบซเบผเบธเบšเปƒเบซเป‰เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบ–เบดเบ‡ (4 + 8 + 32 = 44):

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

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ bitmasks เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบœเบนเป‰เปƒเบŠเป‰เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบกเปˆเบ™เบฎเบนเบšเปเบšเบšเบ—เบตเปˆเบšเปเปˆเบ”เบต. เบ—เบฑเบ‡เปเบปเบ”เบ™เบตเป‰เบชเบฒเบกเบฒเบ”เบชเบฐเบซเบผเบธเบšเป„เบ”เป‰เบžเบฒเบเปƒเบ™, เปเบฅเบฐเบŠเบธเบ”เบ—เบธเบ‡เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ•เบฑเป‰เบ‡เปƒเบซเป‰เบœเบนเป‰เปƒเบŠเป‰เป„เบ”เป‰.

เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฑเบ‡เบกเบตเบœเบปเบ™เบ›เบฐเป‚เบซเบเบ” 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

เบšเบฒเบ‡ "เบฅเบฐเบ”เบฑเบš" เบ›เบฒเบเบปเบ”เบขเบนเปˆเบ—เบตเปˆเบ™เบตเป‰เบ—เบตเปˆเบšเปเปˆเป€เบ„เบตเบเบกเบตเบกเบฒเบเปˆเบญเบ™, เปเบฅเบฐเบ‚เป‰เบญเบเบšเปเปˆเบžเบปเบšเบซเบเบฑเบ‡เบเปˆเบฝเบงเบเบฑเบšเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เป€เบญเบเบฐเบชเบฒเบ™.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบกเบฑเบ™เบšเปเปˆเบŠเบฑเบ”เป€เบˆเบ™. เบ™เบฑเป‰เบ™เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบ•เบฑเป‰เบ‡เบ—เบธเบเบขเปˆเบฒเบ‡เปƒเบซเป‰เบชเบนเบ‡เบชเบธเบ”.

เบŠเปเปˆเบ‚เบญเบ‡ stupid swear เบชเบธเบ” Catch

เบชเบญเบ‡เปƒเบ™เบชเบฒเบกเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบงเบดเป€เบ„เบฒเบฐเปƒเบŠเป‰เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบซเบ™เปˆเบงเบ Catch2. เปเบฅเบฐเบชเปˆเบงเบ™เปเบšเปˆเบ‡เบ‚เบญเบ‡เบŠเป‰เบฒเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบ„เบงเบฒเบก (!!! 90 เบญเบญเบเบˆเบฒเบ 138 เปƒเบ™เบซเบ™เบถเปˆเบ‡เปเบฅเบฐ 297 เปƒเบ™ 344 เบญเบทเปˆเบ™เป†!!!) เบกเบตเบฎเบนเบšเปเบšเบšเบ”เบฑเปˆเบ‡เบ•เปเปˆเป„เบ›เบ™เบตเป‰:

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡ PVS-Studio (Linux, C++)

เบšเปเปˆเป„เบ”เป‰เบ„เปเบฒเบ™เบถเบ‡เป€เบ–เบดเบ‡ multithreading

เบกเบตเบ‚เปเป‰เบ”เบตเบ—เบตเปˆเบšเปเปˆเบ–เบทเบเบ•เป‰เบญเบ‡เบซเบผเบฒเบเบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบ•เบปเบงเปเบ›เบ—เบตเปˆเบšเปเปˆเบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบผเบท loops เบ—เบตเปˆเบšเปเปˆเบชเบดเป‰เบ™เบชเบธเบ”, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ•เบปเบงเปเบ›เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป€เบเบตเบ”เบ‚เบทเป‰เบ™เบˆเบฒเบเบเบฐเบ—เบนเป‰เบ—เบตเปˆเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เปเบฅเบฐเบ–เป‰เบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบซเบ™เปˆเบงเบเบ‡เบฒเบ™เบˆเบฐเบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบ.

เบเบฒเบ™เบ—เบปเบšเบ—เบงเบ™เบ„เบทเบ™เป€เบญเบเบฐเบฅเบฒเบ”เบ‚เบญเบ‡ PVS-Studio (Linux, C++)

เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เบชเบฒเบกเบฒเบ”เป€เบญเบปเบฒเบชเบดเปˆเบ‡เบ™เบตเป‰เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบšเบฑเบ™เบŠเบตเป„เบ”เป‰เบšเป? เบšเปเปˆเบฎเบนเป‰.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš

PVS เบšเปเปˆเบžเบปเบšเบ‚เปเป‰เบšเบปเบเบžเปˆเบญเบ‡เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ เบฅเบฐเป€เบšเบตเบ” ะธ เบ•เปเปˆเป„เบ›, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเปƒเบ™เบฎเปˆเบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ, เป€เบŠเบดเปˆเบ‡, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบˆเบฐเปเบˆเป‰เบ‡, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เบ™เปเบฒเบชเบฐเป€เบซเบ™เบต. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เบกเบฑเบ™เป€เบ›เบฑเบ™เบกเบนเบ™เบ„เปˆเบฒเบ—เบตเปˆเบ„เบงเบ™เบˆเบทเปˆเป„เบงเป‰เบงเปˆเบฒเบ‚เปเป‰เบšเบปเบเบœเปˆเบญเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เป„เบ”เป‰เบ–เบทเบเบˆเบฑเบšเปเบฅเบฐเปเบเป‰เป„เบ‚เบเปˆเบญเบ™เบซเบ™เป‰เบฒเบ™เบตเป‰เป‚เบ”เบเปƒเบŠเป‰ Cppcheck ะธ scan-build.

เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เบ„เบงเบฒเบกเบ›เบฐเบ—เบฑเบšเปƒเบˆเบˆเบฒเบเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบ—เบฑเบ‡เบซเบกเบปเบ”เบ™เบตเป‰เปเบกเปˆเบ™เบ›เบฐเบกเบฒเบ™เบ„เบทเบเบฑเบ™: เปเบกเปˆเบ™เปเบฅเป‰เบง, เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบˆเบฑเบšเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡, เบšเบฒเบ‡เบ„เบฑเป‰เบ‡เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบšเบฒเบ‡เบชเบดเปˆเบ‡เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™, เปเบ•เปˆเป‚เบ”เบเบฅเบงเบก compiler เปเบกเปˆเบ™เบžเบฝเบ‡เบžเป.

เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰ (เปเบฅเบฐเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเปˆเบงเบ™เบšเบธเบเบ„เบปเบ™เบขเบฒเบเบ„เบดเบ”เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™) เบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบŠเบญเบšเปเบงเบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบชเป‰เบฒเบ‡เบˆเปเบฒเบ™เบงเบ™เบ•เปเบฒเปˆเบชเบธเบ”เบ—เบตเปˆเบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ” shitty. เบกเบฑเบ™เบ”เบตเบเบงเปˆเบฒเบ—เบตเปˆเบˆเบฐเบšเปเปˆเบชเป‰เบฒเบ‡เบšเบฑเบ™เบซเบฒเบซเบผเบฒเบเบเปˆเบงเบฒเบเบฒเบ™เป€เบญเบปเบฒเบŠเบฐเบ™เบฐเบžเบงเบเป€เบ‚เบปเบฒเบขเปˆเบฒเบ‡เบเป‰เบฒเบซเบฒเบ™.

เป€เบžเบฒเบฐเบชเบฐเบ™เบฑเป‰เบ™, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบกเบตเบชเบดเบ”เป€เบชเบฅเบตเบžเบฒเบšเปƒเบ™เบเบฒเบ™เปƒเบซเป‰เบ„เปเบฒเปเบ™เบฐเบ™เปเบฒเบšเบฒเบ‡เบขเปˆเบฒเบ‡เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฝเบ™เปƒเบ™ C ++ เปƒเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ—เบตเปˆเบˆเบฐเบšเปเปˆเบเบดเบ‡เบ‚เบฒเบ‚เบญเบ‡เปƒเบœเบซเบผเบทเบ•เบตเปƒเบœเบขเบนเปˆเปƒเบ™เบซเบ™เป‰เบฒเบœเบฒเบเบ”เป‰เบงเบ rake.

เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบชเบนเบ‡เบชเบธเบ”เบˆเบฒเบเบเบฒเบ™เบงเบดเบ™เบดเป„เบชเบเบฒเบ™เบฅเบงเบšเบฅเบงเบก

เบ—เบตเบกเบ‡เบฒเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ (เปเบฅเบฐเปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบ—เปˆเบฒเบ™) เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบเบฒเบ™เบฅเบงเบšเบฅเบงเบกเบ•เปเปˆเป„เบ›เบ™เบตเป‰:

-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

เป€เบ›เบตเบ”เปƒเบŠเป‰เบžเบงเบเบกเบฑเบ™เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เปเบฅเบฐเบฎเบฝเบ™เบฎเบนเป‰เบซเบผเบฒเบเบเปˆเบฝเบงเบเบฑเบšเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบเบถเบ”เบ•เบดเบ”เบเบฑเบšเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™

เบžเบฐเบเบฒเบเบฒเบกเบšเปเปˆเปƒเบŠเป‰เบชเบดเปˆเบ‡เบ—เบตเปˆเบญเบตเบ‡เปƒเบชเปˆเป€เบงเบ—เบตเบ–เป‰เบฒเบกเบต analogues เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เปเบฅเบฐเบ–เป‰เบฒเบ—เปˆเบฒเบ™เบšเปเปˆเบชเบฒเบกเบฒเบ”เป€เบฎเบฑเบ”เป„เบ”เป‰เบขเปˆเบฒเบ‡เปเบ—เป‰เบˆเบดเบ‡, เบซเปเปˆเบžเบงเบเบกเบฑเบ™เบขเบนเปˆเปƒเบ™เบšเบฅเบฑเบญเบเบžเบดเป€เบชเบ”เบชเปเบฒเบฅเบฑเบš macros (เบซเบผเบทเบชเบดเปˆเบ‡เบญเบทเปˆเบ™) เปเบฅเบฐเบžเบฝเบ‡เปเบ•เปˆเบšเปเปˆเปƒเบซเป‰เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ–เบทเบเบฅเบงเบšเบฅเบงเบกเบžเบฒเบเปƒเบ•เป‰เป€เบ‡เบทเปˆเบญเบ™เป„เบ‚เบ—เบตเปˆเบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™.

เบเบถเบ”เบ•เบดเบ”เบเบฑเบšเบ„เบงเบฒเบกเบซเบกเบฒเบเบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™

เบเบฒเบ™เบšเบงเบเบ•เป‰เบญเบ‡เบšเบงเบ, เบ„เบนเบ™เบ•เป‰เบญเบ‡เบ„เบนเบ™, เบเบฒเบ™เป€เบญเบตเป‰เบ™เบŸเบฑเบ‡เบŠเบฑเบ™เบ•เป‰เบญเบ‡เป€เบ›เบฑเบ™ function call, copy เบ•เป‰เบญเบ‡ copy, carry must be carry, container must be iterable, iterator เบ•เป‰เบญเบ‡เบกเบตเป‚เบ›เบฃเป‚เบกเบŠเบฑเบ™ ++ เปเบฅเบฐเบเบฒเบ™เบญเป‰เบฒเบ‡เบญเบดเบ‡ *. เปเบฅเบฐเบญเบทเปˆเบ™เป†เปเบฅเบฐเบญเบทเปˆเบ™เป†.

เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบ„เบดเบ”เบงเปˆเบฒเบ„เบงเบฒเบกเบ„เบดเบ”เปเบกเปˆเบ™เบˆเบฐเปเบˆเป‰เบ‡. เบกเบตเบเบฒเบ™เบชเป‰เบฒเบ‡เบ•เบฑเป‰เบ‡เบชเบปเบ™เบ—เบดเบชเบฑเบ™เบเบฒเบ—เบตเปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบœเบนเบเบกเบฑเบ”, เปเบ•เปˆเบงเปˆเบฒเบœเบนเป‰เปƒเบŠเป‰เบ—เบฑเบ‡เบซเบกเบปเบ”เปเบฅเบฐเบœเบนเป‰เบญเปˆเบฒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ„เบฒเบ”เบงเปˆเบฒเบˆเบฐเป€เบซเบฑเบ™. เบขเปˆเบฒเบžเบฐเบเบฒเบเบฒเบกเบซเบฅเบญเบเบฅเบงเบ‡เบ„เบปเบ™เบญเบทเปˆเบ™, เบ–เป‰เบฒเบšเปเปˆเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เป€เบˆเบปเป‰เบฒเบˆเบฐ outwit เบ•เบปเบงเป€เบญเบ‡.

เบ‚เบฝเบ™เบฅเบฐเบซเบฑเบ”เป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ‚เป‰เบญเบ เปเบฒเบ เป€เบ–เบดเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™. เบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ›เบฒเบ–เบฐเบซเบ™เบฒเบชเบนเบ‡เบ—เบตเปˆเบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบšเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบฎเบฝเบ™เปเบฅเบฐเบซเบ™เป‰เบฒเบ—เบตเปˆเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ–เบทเบเบ™เปเบฒเปƒเบŠเป‰เบเบฑเบšเบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบฅเบฐเบญเบทเปˆเบ™เป† (เบ•เบปเบงเบขเปˆเบฒเบ‡, Boost).

เบฎเบนเป‰เบชเบถเบเบงเปˆเบฒเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเป€เบžเบทเปˆเบญเป€เบ‚เบปเป‰เบฒเป„เบ›เป€เบšเบดเปˆเบ‡เปƒเบ™เบเบฒเบ™เป‚เบ•เป‰เบ•เบญเบš STL เปเบฅเบฐ Boost. เบกเบตเบ‚เปเป‰เบเบปเบเป€เบงเบฑเป‰เบ™เบ—เบตเปˆเบซเบฒเบเบฒเบ, เบ—เปˆเบฒเบ™เบˆเบฐเป€เบซเบฑเบ™เปเบšเบšเบขเปˆเบฒเบ‡เบ—เบตเปˆเบกเบตเบ„เปˆเบฒเบ„เบงเบ™เบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™.

เปƒเบŠเป‰เบ›เบฐเป‚เบซเบเบ”เบชเบนเบ‡เบชเบธเบ”เบˆเบฒเบเป€เบ„เบทเปˆเบญเบ‡เบกเบทเปเบซเบผเปˆเบ‡เป€เบ›เบตเบ”

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบงเบดเป€เบ„เบฒเบฐเปเบšเบšเบ„เบปเบ‡เบ—เบตเปˆเบ”เบฝเบงเบเบฑเบ™, เบกเบตเบขเปˆเบฒเบ‡เบซเบ™เป‰เบญเบเบชเบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เบกเบทเบ—เบตเปˆเบšเปเปˆเป€เบชเบเบ„เปˆเบฒเบ—เบตเปˆเบชเบฒเบกเบฒเบ”เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบ„เบฑเป‰เบ‡เบเบฑเบšเป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเบกเบตเบฅเบฐเบšเบปเบšเบเบฒเบ™เบเปเปˆเบชเป‰เบฒเบ‡ CMake.

เป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เปƒเบ™เบชเบดเปˆเบ‡เบžเบดเบกเบซเบผเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบ‚เป‰เบญเบ.

Afterword

เบชเบธเบ”เบ—เป‰เบฒเบ, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเป€เบ™เบฑเป‰เบ™เบซเบ™เบฑเบเบงเปˆเบฒเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบšเปเปˆเป„เบ”เป‰เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบšเปเปˆเปƒเบซเป‰เปƒเบŠเป‰ PVS เบซเบผเบทเป€เบ„เบทเปˆเบญเบ‡เบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เบญเบทเปˆเบ™เป†. เปเบ•เปˆเบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบŠเบธเบเบเบนเป‰เปƒเบซเป‰เบ—เปˆเบฒเบ™เบ„เบดเบ”เบเปˆเบฝเบงเบเบฑเบšเบงเบดเบ—เบตเบ—เบตเปˆเบกเบฑเบ™เป€เบเบตเบ”เบ‚เบถเป‰เบ™เบ—เบตเปˆเบ™เบฑเบเบงเบดเป€เบ„เบฒเบฐเบชเบฐเบ–เบดเบ”เบขเบนเปˆเบชเบฐเป€เบซเบกเบตเบŠเบญเบเบซเบฒเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เปƒเบ™เบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™.

เบ™เบตเป‰เปเบกเปˆเบ™เบžเบฝเบ‡เปเบ•เปˆเบœเบปเบ™เบชเบฐเบ—เป‰เบญเบ™. เบžเบงเบเป€เบฎเบปเบฒเบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เบŠเบญเบเบซเบฒเปเบฅเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบชเบฒเป€เบซเบ”.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™