НСзависимый ΠΎΠ±Π·ΠΎΡ€ PVS-Studio (Linux, C++)

Π£Π²ΠΈΠ΄Π΅Π» ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ PVS Ρ‚Π°ΠΊΠΈ научился Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ Линуксами, ΠΈ Ρ€Π΅ΡˆΠΈΠ» ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° своих ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ…. И Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ ΠΈΠ· этого ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ.


Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

  1. ΠŸΠ»ΡŽΡΡ‹
  2. ΠœΠΈΠ½ΡƒΡΡ‹
  3. Π˜Ρ‚ΠΎΠ³ΠΈ
  4. ПослСсловиС

ΠŸΠ»ΡŽΡΡ‹

ΠžΡ‚Π·Ρ‹Π²Ρ‡ΠΈΠ²Π°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°

Π― запросил ΠΏΡ€ΠΎΠ±Π½Ρ‹ΠΉ ΠΊΠ»ΡŽΡ‡, Π² Ρ‚ΠΎΡ‚ ΠΆΠ΅ дСнь ΠΌΠ½Π΅ Π΅Π³ΠΎ прислали.

Достаточно понятная докумСнтация

Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π±Π΅Π· особых ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Π‘ΠΏΡ€Π°Π²ΠΊΠ° ΠΊ ΠΊΠΎΠ½ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌ Ρ‚Π°ΠΊΠΆΠ΅ имССтся (хотя Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ нарСкания, см. Ρ€Π°Π·Π΄Π΅Π» ΠœΠΈΠ½ΡƒΡΡ‹).

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°

Π£ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ «ΡΡ‚андартная» опция -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, Π½Π° Ρ‚ΠΎ ΠΎΠ½ΠΎ ΠΈ auto. Но 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 Time-out.

Π―Π·Ρ‹ΠΊ

ВсС описания Π΅ΡΡ‚ΡŒ Π½Π° русском, это ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ. Но ссылки ΠΈΠ· ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π° всСгда Π²Π΅Π΄ΡƒΡ‚ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ язык, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ диагностики ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ сразу Π½Π° русском. Π’ интСрфСйсС Ρ‚Π°ΠΊΠΎΠΉ возмоТности я Π½Π΅ Π½Π°ΡˆΡ‘Π».

НСудобно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с уровнями диагностик Ρ‡Π΅Ρ€Π΅Π· консоль

Начнём с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρƒ Π΄Π²ΡƒΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠΌΠ°Π½Π΄ (это 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

Π”ΠΎΠ»Π³ΠΎ пытался ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΡƒΠ΄Π° ΠΆΠ΅ Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ («adding the values») ΠΊΠ»ΡŽΡ‡ΠΈ. ΠŸΡ‹Ρ‚Π°Π»ΡΡ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· Π·Π°ΠΏΡΡ‚ΡƒΡŽ:

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 Π½Π΅ Π½Π°ΡˆΡ‘Π» Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ настоящСй ошибки Π² ΠΌΠΎΠΈΡ… ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… Burst ΠΈ Proxima, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ€Π°Π±ΠΎΡ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я, ΠΏΠΎ понятным ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π°ΠΌ, ΠΏΡ€Π΅Π΄ΡŠΡΠ²ΠΈΡ‚ΡŒ Π½Π΅ ΠΌΠΎΠ³Ρƒ. ΠŸΡ€Π°Π²Π΄Π°, стоит ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠΈΠ΅ Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΎΡ‚Π»ΠΎΠ²Π»Π΅Π½Ρ‹ ΠΈ исправлСны Ρ€Π°Π½Π΅Π΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ 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

Π’ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΈΡ… Π² своём ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅, ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³ΠΎ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΎ своём ΠΊΠΎΠ΄Π΅.

ΠŸΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ стандарта

Π‘Ρ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ платформозависимыС Π²Π΅Ρ‰ΠΈ, Ссли Π΅ΡΡ‚ΡŒ стандартныС Π°Π½Π°Π»ΠΎΠ³ΠΈ, Π° Ссли ΡƒΠΆ Π±Π΅Π· Π½ΠΈΡ… совсСм Π½Π΅ ΠΎΠ±ΠΎΠΉΡ‚ΠΈΡΡŒ, Π·Π°Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΈΡ… Π² ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π±Π»ΠΎΠΊΠΈ ΠΏΠΎΠ΄ ΠΌΠ°ΠΊΡ€ΠΎΡΠ½ΡŽ (ΠΈΠ»ΠΈ ΠΊΠ°ΠΊ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘) ΠΈ просто Π½Π΅ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ Π² Π½Π΅ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… условиях.

ΠŸΡ€ΠΈΠ΄Π΅Ρ€ΠΆΠΈΠ²Π°ΠΉΡ‚Π΅ΡΡŒ стандартной сСмантики ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ

Π‘Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ слоТСниСм, ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ β€” ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ β€” Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, пСрСнос β€” ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ, ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΈΡ‚Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ, ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€ΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ++ ΠΈ Ρ€Π°Π·Ρ‹ΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ *. И Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅, ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

Π”ΡƒΠΌΠ°ΡŽ, ΠΌΡ‹ΡΠ»ΡŒ понятна. Π•ΡΡ‚ΡŒ ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠΈΠ΅ΡΡ соглашСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ ΠΊ исполнСнию, Π½ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ всС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈ Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ вашСго ΠΊΠΎΠ΄Π°. НС ΡΡ‚Π°Ρ€Π°ΠΉΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Ρ…ΠΈΡ‚Ρ€ΠΈΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ…, Π° Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΈΡ‚Ρ€ΠΈΡ‚Π΅ сами сСбя.

ΠŸΠΈΡˆΠΈΡ‚Π΅ совмСстимый ΠΊΠΎΠ΄

Π’ ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ я имСю Π² Π²ΠΈΠ΄Ρƒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. ΠžΡ‡Π΅Π½ΡŒ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ интСрфСйсы Π²Π°ΡˆΠΈΡ… классов ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Ρ‹ со стандартными ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Бустом).

НС ΡΡ‚Π΅ΡΠ½ΡΠΉΡ‚Π΅ΡΡŒ ΠΏΠΎΠ΄ΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π² интСрфСйсы STL ΠΈ Boost. Π—Π° Ρ€Π΅Π΄ΠΊΠΈΠΌΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ Ρ‚Π°ΠΌ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅ достойный ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для подраТания.

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΠΎ максимуму ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Π΅ инструмСнты

Для Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ статичСского Π°Π½Π°Π»ΠΈΠ·Π° ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π΄Π²Π° ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹Ρ… бСсплатных инструмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π° счёт «Ρ€Π°Π·» ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ΡΡ ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ с систСмой сборки CMake.

ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ ΠΎΠ± этом ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΉ Π½Π΅Π΄Π°Π²Π½Π΅ΠΉ ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

ПослСсловиС

НапослСдок ΠΏΠΎΠ΄Ρ‡Π΅Ρ€ΠΊΠ½Ρƒ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°ΡŽ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ PVS ΠΈΠ»ΠΈ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ статичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹. Но я ΠΏΡ€ΠΈΠ·Ρ‹Π²Π°ΡŽ Π·Π°Π΄ΡƒΠΌΠ°Ρ‚ΡŒΡΡ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ‚Π°ΠΊ Π²Ρ‹ΡˆΠ»ΠΎ, Ρ‡Ρ‚ΠΎ статичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ постоянно Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π² вашСм ΠΊΠΎΠ΄Π΅ сущСствСнныС ошибки.

Π­Ρ‚ΠΎ лишь слСдствиС. НуТно ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΈ ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com