αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒ PVS-Studio (Linux, C++)

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžƒαžΎαž‰αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αžŠαŸ‚αž› PVS αž”αžΆαž“αžšαŸ€αž“αžœαž·αž—αžΆαž‚αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž›αžΈαž“αž»αž… αž αžΎαž™αž”αžΆαž“αžŸαž˜αŸ’αžšαŸαž…αž…αž·αžαŸ’αžαžŸαžΆαž€αž›αŸ’αž”αž„αžœαžΆαž“αŸ…αž›αžΎαž‚αž˜αŸ’αžšαŸ„αž„αž•αŸ’αž‘αžΆαž›αŸ‹αžαŸ’αž›αž½αž“αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†αŸ” αž αžΎαž™αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αŸ’αžœαžΈαžŠαŸ‚αž›αž…αŸαž‰αž–αžΈαžœαžΆαŸ”


αž˜αžΆαžαž·αž€αžΆ

  1. αž•αž
  2. ΠœΠΈΠ½ΡƒΡΡ‹
  3. αž›αž‘αŸ’αž’αž•αž›
  4. Afterword

αž•αž

αž€αžΆαžšαž‚αžΆαŸ†αž‘αŸ’αžšαž†αŸ’αž›αžΎαž™αžαž”

αžαŸ’αž‰αž»αŸ†αž”αžΆαž“αžŸαŸ’αž“αžΎαžŸαž»αŸ†αžŸαŸ„αžŸαžΆαž€αž›αŸ’αž”αž„ αž αžΎαž™αž–αž½αž€αž‚αŸαž”αžΆαž“αž•αŸ’αž‰αžΎαžœαžΆαž˜αž€αžαŸ’αž‰αž»αŸ†αž“αŸ…αžαŸ’αž„αŸƒαžαŸ‚αž˜αž½αž™αŸ”

αž―αž€αžŸαžΆαžšαž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹

αž™αžΎαž„αž”αžΆαž“αž‚αŸ’αžšαž”αŸ‹αž‚αŸ’αžšαž„αžŠαžΎαž˜αŸ’αž”αžΈαž”αžΎαž€αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž”αž‰αŸ’αž αžΆαŸ” αž‡αŸ†αž“αž½αž™αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž–αžΆαž€αŸ’αž™αž”αž‰αŸ’αž‡αžΆαž€αž»αž„αžŸαžΌαž›αž€αŸαž˜αžΆαž“αž•αž„αžŠαŸ‚αžš (αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αžΆαž“αž€αžΆαžšαžαŸ’αž’αžΌαž‰αžαŸ’αž’αŸ‚αžšαžαŸ’αž›αŸ‡αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžŸαžΌαž˜αž˜αžΎαž›αž•αŸ’αž“αŸ‚αž€ ΠœΠΈΠ½ΡƒΡΡ‹).

αž›αž‘αŸ’αž’αž—αžΆαž–αž“αŸƒαž€αžΆαžšαžœαž·αž—αžΆαž‚αž–αž αž»αžαŸ’αžŸαŸ‚

αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž˜αžΆαž“αž‡αž˜αŸ’αžšαžΎαžŸ "αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš" -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

αž€αžΆαžšαž”αŸ’αžšαžΎ 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

"αž€αž˜αŸ’αžšαž·αž" αž˜αž½αž™αž…αŸ†αž“αž½αž“αž”αžΆαž“αž”αž„αŸ’αž αžΆαž‰αžαŸ’αž›αž½αž“αž“αŸ…αž‘αžΈαž“αŸαŸ‡ αžŠαŸ‚αž›αž˜αž·αž“αž˜αžΆαž“αž–αžΈαž˜αž»αž“αž˜αž€ αž αžΎαž™αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αž”αžΆαž“αžšαž€αžƒαžΎαž‰αž’αŸ’αžœαžΈαž’αŸ†αž–αžΈαž–αž½αž€αž‚αŸαž“αŸ…αž€αŸ’αž“αž»αž„αž―αž€αžŸαžΆαžšαž•αž„αžŠαŸ‚αžšαŸ”

αž‡αžΆαž‘αžΌαž‘αŸ…αžœαžΆαž˜αž·αž“αž…αŸ’αž”αžΆαžŸαŸ‹αž‘αŸαŸ” αž“αŸ„αŸ‡αž αžΎαž™αž‡αžΆαž˜αžΌαž›αž αŸαžαž»αžŠαŸ‚αž›αžαŸ’αž‰αž»αŸ†αž€αŸ†αžŽαžαŸ‹αž’αŸ’αžœαžΈαž‚αŸ’αžšαž”αŸ‹αž™αŸ‰αžΆαž„αž‘αŸ…αž‡αžΆαž’αžαž·αž”αžšαž˜αžΆαŸ”

αž αŸ’αžœαžΌαž„αž“αŸƒαž€αžΆαžšαžŸαŸ’αž”αžαž†αŸ„αžαž›αŸ’αž„αž„αŸ‹αž“αŸ…αž›αžΎ Catch

αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž–αžΈαžšβ€‹αž€αŸ’αž“αž»αž„β€‹αž…αŸ†αžŽαŸ„αž˜β€‹αž‚αž˜αŸ’αžšαŸ„αž„β€‹αž‘αžΆαŸ†αž„β€‹αž”αžΈβ€‹αžŠαŸ‚αž›β€‹αžαŸ’αž‰αž»αŸ†β€‹αž”αžΆαž“β€‹αžœαž·αž—αžΆαž‚β€‹αž”αŸ’αžšαžΎβ€‹αž”αžŽαŸ’αžŽαžΆαž›αŸαž™β€‹αžαŸαžŸαŸ’αžβ€‹αž―αž€αžαžΆ Catch2. αž αžΎαž™αž€αžΆαžšαž…αŸ‚αž€αžšαŸ†αž›αŸ‚αž€αžŸαžΆαžšαžšαž”αžŸαŸ‹αžŸαžαŸ’αžœαžαŸ„ (!!! 90 αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜ 138 αž€αŸ’αž“αž»αž„αž˜αž½αž™ αž“αž·αž„ 297 αž€αŸ’αž“αž»αž„αž…αŸ†αžŽαŸ„αž˜ 344 αž•αŸ’αžŸαŸαž„αž‘αŸ€αž!!!) αž˜αžΆαž“αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαžΌαž…αžαžΆαž„αž€αŸ’αžšαŸ„αž˜αŸˆ

αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒ PVS-Studio (Linux, C++)

αž˜αž·αž“β€‹αž‚αž·αžβ€‹αž”αž‰αŸ’αž…αžΌαž›β€‹αž‘αŸ…β€‹αž€αŸ’αž“αž»αž„β€‹αž‚αžŽαž“αžΈ multithreading

αž˜αžΆαž“αž—αžΆαž–αžœαž·αž‡αŸ’αž‡αž˜αžΆαž“αž˜αž·αž“αž–αž·αžαž‡αžΆαž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈαž’αžαŸαžšαžŠαŸ‚αž›αž˜αž·αž“αž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžš αž¬αžšαž„αŸ’αžœαž·αž›αž‡αž»αŸ†αž‚αŸ’αž˜αžΆαž“αž‘αžΈαž”αž‰αŸ’αž…αž”αŸ‹ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž›αž€αžΆαžšαž„αžΆαžšαž‡αžΆαž˜αž½αž™αž’αžαŸαžšαž‘αžΆαŸ†αž„αž“αŸαŸ‡αž€αžΎαžαž‘αžΎαž„αž–αžΈαžαŸ’αžŸαŸ‚αžŸαŸ’αžšαž‘αžΆαž™αž•αŸ’αžŸαŸαž„αŸ—αž‚αŸ’αž“αžΆ αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαžœαžΆαž˜αž·αž“αžŠαžΌαž…αŸ’αž“αŸ„αŸ‡αž‘αŸ αž“αŸ„αŸ‡αž€αžΆαžšαž’αŸ’αžœαžΎαžαŸαžŸαŸ’αžαž―αž€αžαžΆαž“αžΉαž„αž˜αž·αž“αžŠαŸ†αžŽαžΎαžšαž€αžΆαžšαž‘αŸαŸ”

αž€αžΆαžšαž–αž·αž“αž·αžαŸ’αž™αž―αž€αžšαžΆαž‡αŸ’αž™αž“αŸƒ 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

αž”αžΎαž€αž–αž½αž€αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž‚αž˜αŸ’αžšαŸ„αž„αžšαž”αžŸαŸ‹αž’αŸ’αž“αž€ αž αžΎαž™αžšαŸ€αž“αž…αŸ’αžšαžΎαž“αž’αŸ†αž–αžΈαž€αžΌαžŠαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž”αŸ’αžšαž€αžΆαž“αŸ‹αžαŸ’αž‡αžΆαž”αŸ‹αžαžΆαž˜αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš

αž–αŸ’αž™αžΆαž™αžΆαž˜αž˜αž·αž“αž”αŸ’αžšαžΎαžšαž”αžŸαŸ‹αžŠαŸ‚αž›αž–αžΉαž„αž•αŸ’αž’αŸ‚αž€αž›αžΎαžœαŸαž‘αž·αž€αžΆ αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž˜αžΆαž“ analogues αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž αžΎαž™αž”αŸ’αžšαžŸαž·αž“αž”αžΎαž’αŸ’αž“αž€αž–αž·αžαž‡αžΆαž˜αž·αž“αž’αžΆαž…αž’αŸ’αžœαžΎαžŠαŸ„αž™αž‚αŸ’αž˜αžΆαž“αž–αž½αž€αžœαžΆαž‘αŸ αžŸαžΌαž˜αžšαž»αŸ†αžœαžΆαž“αŸ…αž€αŸ’αž“αž»αž„αž”αŸ’αž›αž»αž€αž–αž·αžŸαŸαžŸαžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž˜αŸ‰αžΆαž€αŸ’αžšαžΌ (αž¬αž’αŸ’αžœαžΈαž•αŸ’αžŸαŸαž„αž‘αŸ€αž) αž αžΎαž™αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž€αž»αŸ†αž±αŸ’αž™αž€αžΌαžŠαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž”αžΆαž“αž…αž„αž€αŸ’αžšαž„αž“αŸ…αž€αŸ’αžšαŸ„αž˜αž›αž€αŸ’αžαžαžŽαŸ’αžŒαžŠαŸ‚αž›αž˜αž·αž“αž‚αžΆαŸ†αž‘αŸ’αžšαŸ”

αž”αŸ’αžšαž€αžΆαž“αŸ‹αžαŸ’αž‡αžΆαž”αŸ‹αž“αžΌαžœαžŸαž˜αžΈαž€αžΆαžšαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžšαžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš

αž€αžΆαžšαž”αž“αŸ’αžαŸ‚αž˜αžαŸ’αžšαžΌαžœαžαŸ‚αž”αžΌαž€, αž‚αž»αžŽαžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαž‚αž»αžŽ, αž€αžΆαžšαž αŸ…αž˜αž»αžαž„αžΆαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž‡αžΆαž˜αž»αžαž„αžΆαžšαž αŸ…, αž…αŸ’αž”αžΆαž”αŸ‹αž…αž˜αŸ’αž›αž„αžαŸ’αžšαžΌαžœαžαŸ‚αž…αž˜αŸ’αž›αž„, αž™αž€αžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“, αž€αž»αž„αžαžΊαž“αŸαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž’αžΆαž…αž”αŸ’αžšαžΎαž”αžΆαž“, αž’αŸ’αž“αž€αžŸαžšαžŸαŸαžšαžαŸ’αžšαžΌαžœαžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž•αŸ’αžŸαž–αŸ’αžœαž•αŸ’αžŸαžΆαž™ ++ αž“αž·αž„αž€αžΆαžšαž™αŸ„αž„ *. αž αžΎαž™αžŠαžΌαž…αŸ’αž“αŸαŸ‡αž“αŸ…αž›αžΎαž‡αžΆαžŠαžΎαž˜αŸ”

αžαŸ’αž‰αž»αŸ†αž‚αž·αžαžαžΆαž‚αŸ†αž“αž·αžαž‚αžΊαž…αŸ’αž”αžΆαžŸαŸ‹αŸ” αž˜αžΆαž“β€‹αž’αž“αž»αžŸαž‰αŸ’αž‰αžΆβ€‹αžŠαŸ‚αž›β€‹αž”αžΆαž“β€‹αž”αž„αŸ’αž€αžΎαžβ€‹αž‘αžΎαž„β€‹αžŠαŸ‚αž›β€‹αž˜αž·αž“β€‹αž‡αžΆαž”αŸ‹β€‹αž€αžΆαžαž–αŸ’αžœαž€αž·αž…αŸ’αž… αž”αŸ‰αž»αž“αŸ’αžαŸ‚β€‹αž’αŸ’αž“αž€β€‹αž”αŸ’αžšαžΎβ€‹αž“αž·αž„β€‹αž’αŸ’αž“αž€β€‹αž’αžΆαž“β€‹αž€αžΌαžŠβ€‹αž‘αžΆαŸ†αž„αž’αžŸαŸ‹β€‹αžšαŸ†αž–αžΉαž„β€‹αžαžΆβ€‹αž“αžΉαž„β€‹αžƒαžΎαž‰αŸ” αž€αž»αŸ†β€‹αž–αŸ’αž™αžΆαž™αžΆαž˜β€‹αž˜αžΎαž›αž„αžΆαž™β€‹αž’αŸ’αž“αž€β€‹αžŠαž‘αŸƒ αž”αžΎβ€‹αž˜αž·αž“β€‹αžŠαžΌαž…αŸ’αž“αŸαŸ‡β€‹αž‘αŸ αž’αŸ’αž“αž€β€‹αž“αžΉαž„β€‹αž αž½αžŸβ€‹αž…αž·αžαŸ’αžβ€‹αžαŸ’αž›αž½αž“αž―αž„αŸ”

αžŸαžšαžŸαŸαžšαž€αžΌαžŠαžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž‚αŸ’αž“αžΆαŸ”

αž‡αžΆαžŠαŸ†αž”αžΌαž„αžαŸ’αž‰αž»αŸ†αž˜αžΆαž“αž“αŸαž™αžαžΆ αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” αžœαžΆαž‡αžΆαž€αžΆαžšαž…αž„αŸ‹αž”αžΆαž“αž™αŸ‰αžΆαž„αžαŸ’αž›αžΆαŸ†αž„αžŠαŸ‚αž›αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹αž“αŸƒαžαŸ’αž“αžΆαž€αŸ‹ αž“αž·αž„αž˜αž»αžαž„αžΆαžšαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž‡αžΆαž˜αž½αž™αž”αžŽαŸ’αžŽαžΆαž›αŸαž™αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžš αž“αž·αž„αž•αŸ’αžŸαŸαž„αž‘αŸ€αž (αž§αž‘αžΆαž αžšαžŽαŸ Boost)αŸ”

αžŸαžΌαž˜αž€αŸ’αžšαž‘αŸαž€αž˜αžΎαž›αž…αŸ†αžŽαž»αž…αž”αŸ’αžšαž‘αžΆαž€αŸ‹ STL αž“αž·αž„ Boost αŸ” αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž€αžšαžŽαžΈαž›αžΎαž€αž›αŸ‚αž„αžŠαŸαž€αž˜αŸ’αžš αž’αŸ’αž“αž€αž“αžΉαž„αžƒαžΎαž‰αž‚αŸ†αžšαžΌαžŠαŸαžŸαž€αŸ’αžŠαž·αžŸαž˜αž“αŸ…αž‘αžΈαž“αŸ„αŸ‡αŸ”

αž‘αž‘αž½αž›αž”αžΆαž“αž’αžαŸ’αžαž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž…αŸ’αžšαžΎαž“αž”αŸ†αž•αž»αžαž–αžΈαž§αž”αž€αžšαžŽαŸαž”αŸ’αžšαž—αž–αž”αžΎαž€αž…αŸ†αž 

αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαžŠαžΌαž…αž‚αŸ’αž“αžΆ αž™αŸ‰αžΆαž„αž αŸ„αž…αžŽαžΆαžŸαŸ‹αž˜αžΆαž“αž§αž”αž€αžšαžŽαŸαž₯αžαž‚αž·αžαžαŸ’αž›αŸƒαž…αŸ†αž“αž½αž“αž–αžΈαžšαžŠαŸ‚αž›αž’αžΆαž…αž—αŸ’αž‡αžΆαž”αŸ‹αž”αžΆαž“αžαŸ‚αž˜αŸ’αžαž„αž‘αŸ…αž‚αž˜αŸ’αžšαŸ„αž„αžŽαžΆαž˜αž½αž™αž‡αžΆαž˜αž½αž™αž“αžΉαž„αž”αŸ’αžšαž–αŸαž“αŸ’αž’αžŸαŸ’αžαžΆαž”αž“αžΆ CMake αŸ”

αž’αŸ’αž“αž€αž’αžΆαž…αž’αžΆαž“αž”αž“αŸ’αžαŸ‚αž˜αž’αŸ†αž–αžΈαžšαžΏαž„αž“αŸαŸ‡αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΆαžšαž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž•αŸ’αžŸαžΆαž™αžαŸ’αž˜αžΈαŸ—αžšαž”αžŸαŸ‹αžαŸ’αž‰αž»αŸ†.

Afterword

αž‡αžΆαž…αž»αž„αž€αŸ’αžšαŸ„αž™ αžαŸ’αž‰αž»αŸ†αž…αž„αŸ‹αž”αž‰αŸ’αž‡αžΆαž€αŸ‹αžαžΆ αžαŸ’αž‰αž»αŸ†αž˜αž·αž“αžαžŸαŸŠαžΌαž˜αžαž·αž˜αž·αž“αž”αŸ’αžšαžΎ PVS αž¬αž§αž”αž€αžšαžŽαŸαžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαž•αŸ’αžŸαŸαž„αž‘αŸ€αžαž‘αŸαŸ” αž”αŸ‰αž»αž“αŸ’αžαŸ‚αžαŸ’αž‰αž»αŸ†αž›αžΎαž€αž‘αžΉαž€αž…αž·αžαŸ’αžαž’αŸ’αž“αž€αž±αŸ’αž™αž‚αž·αžαž’αŸ†αž–αžΈαžšαž”αŸ€αž”αžŠαŸ‚αž›αžœαžΆαž”αžΆαž“αž€αžΎαžαž‘αžΎαž„αžŠαŸ‚αž›αž’αŸ’αž“αž€αžœαž·αž—αžΆαž‚αž‹αž·αžαž·αžœαž“αŸ’αžαžšαž€αžƒαžΎαž‰αž€αŸ†αž αž»αžŸαžŸαŸ†αžαžΆαž“αŸ‹αŸ—αž“αŸ…αž€αŸ’αž“αž»αž„αž€αžΌαžŠαžšαž”αžŸαŸ‹αž’αŸ’αž“αž€αŸ”

αž“αŸαŸ‡αž‚αŸ’αžšαžΆαž“αŸ‹αžαŸ‚αž‡αžΆαž•αž›αžœαž·αž”αžΆαž€αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αŸ” αž™αžΎαž„αžαŸ’αžšαžΌαžœαžŸαŸ’αžœαŸ‚αž„αžšαž€ αž“αž·αž„αž›αž»αž”αž”αŸ†αž”αžΆαžαŸ‹αž˜αžΌαž›αž αŸαžαž»αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹