á¡áá¯á¶ážáááŸá áá¯ááºááŒááºáááºáá¯á¶ážáááºááŒááºáž ááá¯á·ááá¯áẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážá¡ááœáẠááŒá®ážááœá±á·áá¬áá±á¬á¡áá«ááœáẠááá·áºááááᯠááá¯ážááŸááºážá¡á±á¬áẠáááºááá¯á·áá¯ááºáá±á¬ááºááááºááᯠááœá±ážáá±á¬áá±áááºáááºá á¡áááºážáááºááŸá¬ááœá±ááŒá®ážáá±á¬áẠááá¯á·ááá¯áẠáááºážááᯠááá±á¬áºáá ááááá ááŸá±á¬áºáááºáá±á¬ á áá¬ážá á¯- "áááºááŒáááºááŸá¯ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯" ááᯠáááºááœá±á·ááŒááºááá¯ááºáá«áááºá á¡á²áá«á áá¬áá²ááá¯áá¬áá²á· ááá·áºááá±á¬áá»ááºáá²á· áááºááᯠáá¯á¶á·ááŒááºááá¯ááºááá²ááá¯áᬠááŒáá·áºááŒáá¡á±á¬ááºá
ááááºáá±á¬á· áááºáᬠáá±ááºáá®áá¬áá¬á
áá¬ážáá
áºáá¯áá¯áá²á· áá±ážáááºááá¯ááẠá¡á²áá«ááᯠááááá±á¬ááºááá¬ážáááá²á static analyzer áá²á· ááẠrun ááá¯ááºáá«á á¡ááŸááºááŸá¬ áááºááá·áºáá±ááºáá® compiler áááᯠáá¯ááºááŸá ááŒá
áºááá¯ááºáá»á±ááŸááá±á¬ ááŒá¿áá¬áá»á¬ážá¡ááŒá±á¬ááºáž ááááá±ážáá»áẠá¡áá±ážá¡ááœáŸá¬ážáá»á¬áž áá±ážáá¬ážáá±á¬áºáááºážá á¥ááá¬á¡á¬ážááŒáá·áºá Visual Studio ááœáẠC++ áá¯ááºááᯠááŒá¯á
á¯áá±á¬á¡áá«ááœáẠá¡á±á¬ááºáá«ááá¯á·ááᯠáááºááœá±á·ááá¯ááºáááº-
áá® output ááŸá¬ variable ááá¯ááœá±á·áááŸá¬áá«á var áá¯ááºáá±á¬ááºáá»ááºááᯠáááºááá·áºáá±áá¬ááœááºá០á¡áá¯á¶ážáááŒá¯áá²á·áá«á ááá¯á·ááŒá±á¬áá·áº áááºááœá±á·ááœáẠáááºááẠááá¯ážááŸááºážáá±á¬ static code analyzer ááᯠá¡ááŒá²áááºážáá®ážáá«áž á¡áá¯á¶ážááŒá¯áá²á·áááºá ááá¯á·áá¬ááœááºá Coverityá Klocwork ááá¯á·ááá¯áẠPVS-Studio áá²á·ááá¯á·áá±á¬ ááá±á¬áºáááºááŸááºááẠááœá²ááŒááºážá
áááºááŒá¬áá°áá»á¬ážááŸáá·áº ááá°áá²á compiler á០áá±ážáá±á¬ááºáá±á¬ ááááá±ážáá»ááºáá»á¬ážááẠááŒá¿áá¬á¡áá±ážá¡ááœáŸá¬ážáá»á¬ážááá¯áᬠááœáŸááºááŒááá¯ááºáááºá
static analysis á áá¬áá² ááá¯áá¬ááᯠáá±áá»á¬ááááááºá
á¡áááºááŒá±á¬áá·áº static analysis ááá¯á¡ááºááááºážá
á¡ááá¯áá»á¯ááºááŒá±á¬áááẠá¡ááŸáááºáá²á· ááá¯ážááŸááºážááŸá¯á
Static analysis ááẠááá·áºá¡á¬áž áá¯ááºááœáẠááá°áá®áá±á¬ ááŒá¿áá¬áá»á¬ážá áœá¬ááᯠááŸá¬ááœá±ááá¯ááºá á±áááº- áá¬áá¬á áá¬ážáááºáá±á¬ááºáá¯á¶áá»á¬ážááᯠááŸá¬ážááœááºážá áœá¬á¡áá¯á¶ážááŒá¯ááŒááºážá០á á¬ááá¯ááºááŒááºážá¡ááá á¥ááá¬á¡á¬ážááŒáá·áºá
auto x = obj.x;
auto y = obj.y;
auto z = obj.z;
áááºááẠá¡á±á¬ááºáá«áá¯ááºááᯠáá±ážáá¬ážáá²á·áááº-
auto x = obj.x;
auto y = obj.y;
auto z = obj.x;
áááºááŒááºááá·áºá¡ááá¯ááºážá áá±á¬ááºáá¯á¶ážá á¬ááŒá±á¬ááºážááœáẠtypo áá áºáá¯ááŸááááºá á¥ááá¬á¡á¬ážááŒáá·áºá PVS-Studio ááẠá¡á±á¬ááºáá«ááááá±ážáá»ááºááᯠáá¯ááºááŒááºáááº-
ááá·áºáááºááᯠá€á¡ááŸá¬ážááá¯á· ááœááºážááá¯á·ááá¯áá«á Compiler Explorer ááœáẠá¡áááºááá·áºáá¯ááºáá¬ážáá±á¬ á¥ááá¬ááᯠá
ááºážááŒáá·áºáá«- *
áááºáá¬ážáááºááá·áºá¡ááá¯ááºážá áá¯ááºáá€á¡ááá¯ááºážáá»á¬ážááá¯áá»ááºáá»ááºážá¡á¬áá¯á¶á áá¯ááºááẠá¡ááŒá²áááºážáááŒá áºááá¯ááºáá«á áááºážááŒá±á¬áá·áºá áááºááẠáá±á¬ááºážáá±á¬ááºážáá áºáá¬áá®ááŒá¬á¡á±á¬áẠá¡ááŸá¬ážááŸá¬ááŒááºááŒááºážááᯠááá¯ááºááá¯ááºááŒá®áž á¡áá¬á¡á¬ážáá¯á¶ážááẠá¡áááºááŒá±á¬áá·áº á€áá»áŸáá°ážáá°ážááŒá¬ážááŒá¬ážá¡áá¯ááºáá¯ááºáááááºážáᯠááœá±ážáá±á¬ááá¯ááºáá«áááºá
ááá¯á·áá±á¬áº á€áááºááŸá¬ ááŸááºážááŸááºážáááºážáááºáž á¡ááŸá¬ážáá
áºáá¯ááŒá
áºáááºá áá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬ááẠáá¬áá¬á
áá¬ážá ááááºááœá±á·ááŸá¯á¡áá»áá¯á·ááᯠáá±á·ááœá¬ážáá±á¬ááŒá±á¬áá·áº ááá·áºáá»á±á¬áºáá±á¬áá¯ááºááᯠáá±ážáá²á·áá»áŸááºáá±á¬á áá«ááŸááá¯áẠáá¯ááºáá²ááŸá¬áá±á¬áẠááœáá·áºááŒá¯áááºá
á€á¡ááŒá±á¡áá±áá»á¬ážá¡ááœáẠstatic analysis áá±á«áºáá¬áááºá áááºážááẠáá¯ááºááŸá ááŒá¿áá¬áá»áá¯ážá
á¯á¶ááᯠáá±á¬ááºááŒááŒá®áž á€áááºážááŒáá·áº áá±ážáá¬ážááẠá¡áááºááŒá±á¬áá·áº áááá¯á¡ááºááááºážá áááºážááᯠááŒá
áºáá±á«áºáá¬ááá¯ááºááá·áº á¡ááŒá±á¬ááºážáááºážááŸáá·áº áááºáá²á·ááá¯á· ááŒá±ááŸááºážááááºááᯠá
á¬ááœááºá
á¬áááºážááœáẠááŸááºážááŒááá·áº áá±á¬á·ááºáá²áá±ážáá¬ážáá°á¡ááœáẠáááºáá±á¬ááºááŒá
áºáááºá áá«á áááºááá¯áá¯á¶ááá¹áá¬ááºááŸáááá¯ááºáá²ááá¯áᬠááá°áá¬áá
áºáá¯áá«-*
áá±á¬ááºážáá«ážáá»á¬ážááœáẠááœá²ááŒááºážá áááºááŒá¬áá°á០ááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºááá·áº ááá¯ááá¯á áááºáááºá á¬ážááœááºáá±á¬ááºážáá±á¬ á¡ááŸá¬ážáá»á¬ážááᯠáááºááŸá¬ááœá±á·ááá¯ááºáááº-
10 áá¯ááŸá áºá¡ááœáẠC++ ááá±á¬áá»ááºáá»á¬ážááœáẠááááºáááºážá¡ááŸá¬áž 2019 áᯠ10 áá¯ááŸá áºá¡ááœáẠC# ááá±á¬áá»ááºáá»á¬ážááœáẠááááºáááºážá¡ááŸá¬áž 2019 áᯠ10 áá¯ááŸá áºá¡ááœáẠJava ááá±á¬áá»ááºáá»á¬ážááœáẠááááºáááºáž áá»áœááºááœááºážáá»áẠ2019 áá¯
ááᯠá€á¡ááŒá±á¬ááºážá¡áá¬ááᯠáááºáááºááŸá¯ááŒá®áž áááºááŒáááºááŸá¯ááá¯ááºáᬠááœá²ááŒááºážá áááºááŒá¬ááŒááºážá á¡áá»áá¯ážáá»á±ážáá°ážáá»á¬ážááᯠá áááºáá»áá¯á¶ááŒááºáá«á áááºážááᯠá ááºážáá¯á¶ážááŒáá·áºááá¯áá±áááºá áá«áá±ááá·áº áááºááŸá¬á áááá²á ááá·áºáááºááŸáááá±á¬áá»ááºááœáẠáááááá¬á¡áá áºáá áºáá¯ááᯠáááºááá¯á·áá±á«ááºážá ááºááááºáááºážá ááŒá®ážáá±á¬á· á¡áááºážááᯠáááºááᯠááááºáááºáá±ážáááá²á á€áá±ážááœááºážáá»á¬ážá¡ááœáẠá¡ááŒá±áá»á¬ážááᯠá¡á±á¬ááºááœáẠááœá±á·ááá«áááºá
ááŸááºáá»ááºá Static analysis ááẠáá¯ááºááŒááºáááºáá¯á¶ážáááºááŒááºážáá²á·ááá¯á· á¡áá¯á¶ážáááºáá±á¬á¡áá¬ááᯠá¡á
á¬ážááá¯ážááŒááºáž ááá¯á·ááá¯áẠáááºáá»ááºááŒááºážááá¯ááºáá«á áááºážááẠá€áá¯ááºáááºážá
ááºááᯠááŒáá·áºá
áœááºážáá±ážáᬠá¡ááŸá¬ážá¡ááœááºážáá»á¬ážá ááŸá¬ážááœááºážááŸá¯áá»á¬ážááŸáá·áº á¡áá¹ááá¬ááºááŸááá±á¬ áá®ááá¯ááºážáá»á¬ážááᯠááŒáá¯áááºáááááŒá¯áááááºááŸáá·áº ááŒááºáááºááẠáá°áá®áá±ážáááºá áá±áá¬ááœá²ááŸá¬ážáá±áá±á¬ááœááºážá
á¥áºááá¯ááŸá¬ááœá±ááŒááºážááẠalgorithms ááŸáá·áº áá¯ááºááŸááºážáááºážááŒááºáá¬ážááŸá¯á¡áá±á«áº áá¯ááºááŒááºáááºáá¯á¶ážáááºááŒááºážá¡áá±á«áº á¡á¬áá¯á¶á
áá¯ááºááŒááºážá ááá¯ááá¯á¡áá»áá¯ážááŒá
áºááœááºážá
á±áá«áááºá
0. tool ááᯠáááá¬ááŒááºáž
áááºážááẠá¡á
ááºážáá¯á¶ážáá¬ážááŸááºážááŒáá·áº á
áááºáááºá á¡ááŸááºááŸá¬á áááºááẠáááááá¬ááᯠááááºá áááŒááºáá°ážáá«á ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±áž áá¯ááºáááºážá
ááºááœáẠáá
áºá
á¯á¶áá
áºáá¬ááᯠá¡áá±á¬ááºá¡ááẠáá±á¬áºááẠáá¯á¶ážááŒááºááẠáááºáá²áááºá ááá¯á·ááŒá±á¬áá·áº ááááá¯á¶ážáá¯ááºááá·áºáááºááŸá¬ áá±á«ááºážáá¯ááºáá¯ááºáááºááŒá
áºáááºá
á€á¡ááá·áºááœáẠáááºáá±á·áá¬áááá·áºá¡áá¬áá»á¬áž
- ááœá²ááŒááºážá áááºááŒá¬áá°ááŸáá·áº á¡ááŒááºá¡ááŸááºáá¯á¶á·ááŒááºááẠáááºážáááºážáá»á¬ážáá¬áž á¡áááºáááºážá
- ááœá²ááŒááºážá áááºááŒá¬áá°ááẠááá·áºááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áááºáááºážáá»ááºááŸáá·áº ááá¯ááºáá®ááŸá¯ááŸááá«ááá¬ážá
- ááá·áºááá±á¬áá»ááºáá»á¬ážááœáẠáááºááŸáááŒá¿áá¬áá»á¬ážááŸááá±áá«ááá¬ážá
áááºááá¯á¡ááºááá»áŸááᯠinstall áá¯ááºááŒá®ážáá±á¬ááºá áááºáá¯ááºááá·áºááá·áºá¡áá¬ááŸá¬ ááá±á¬áá»ááºáá
áºáá¯áá¯á¶ážáááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºááŒááºážááŒá
áºááẠ(
á¡ááŸááºááŸá¬ static ááœá²ááŒááºážá
áááºááŒá¬áá°áá»á¬ážááẠáá»á¬ážáá±á¬á¡á¬ážááŒáá·áº áá¯ááºá¡ááŒá±áá¶ááŒá®ážáá¬ážáá±á¬ ááá±á¬áá»ááºáá»á¬ážá¡ááœáẠááááá±ážáá»ááºá¡áá»á¬ážá¡ááŒá¬ážáá¯ááºáá±ážáá±á·ááŸááá«áááºá ááá·áºááá±á¬áá»ááºááẠá¡áá¯ááºááŒá
áºáá±ááŒá®ááŒá
áºáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·á¡á¬ážáá¯á¶ážááᯠááŒá¯ááŒááºáááºáááá¯á¡ááºáá«á ááá¯ááá¯áááºááŸá¬ á€ááŒá¿áá¬áá»á¬ážááẠáá
áá¯ážááááºááá«á ááá¯á·áá±á¬áºáááº
á¡ááŸááºááŸá¬á ááááá±ážáá»áẠ178 áááºáá±á¬ááºáá±á«ááºážáá»á¬ážá
áœá¬áááºááá¯ááá¯ááœááºáá°ááẠ...
áááºááºáá»á¬ážááœáẠá¡áááºá¡ááẠО á¡áááá·áº áááŒá¬áá ááááá±ážáá»ááºáá±á¬ááºážáá»á¬áž ááŸááá±á¬áºáááºáž á€á¡áá»áá¯ážá¡á
á¬ážáá»á¬ážááœáẠáááá»ááŸá¯ (áá¯á¶ááŒááºá
áááºáá»áááŸá¯) áááºážáá«ážáá±á¬ áá±á¬áá«ááŸá¬ááœá±áá±ážáá»á¬áž áá«áááºáááºá ááááá±ážáá»ááºá¡ááá·áºáá»á¬ážááŸáá·áº Windows á¡á±á¬ááºááœáẠá¡áá¯ááºáá¯ááºááẠááœá±ážáá»ááºá
áá¬áá»á¬ážá¡ááŒá±á¬ááºáž áá±á¬ááºáááºá¡áá»ááºá¡áááºáá»á¬ážááᯠá€áá±áá¬ááœáẠááœá±á·ááá¯ááºáááº- *
á
áááºáááºá
á¬ážá
áá¬á¡áá±á¬ááºážáá¯á¶áž á¡ááŸá¬ážáá»á¬ážááᯠá¡á±á¬ááºááŒááºá
áœá¬ áá¯á¶ážáááºááŒá®áž (áááºážááá¯á·ááᯠá¡á±á¬ááºááŒááºá
áœá¬ ááŒá¯ááŒááºááŒááºáž) ááẠáááºááá¯ážááŸááá«áááºá
1. á¡ááá¯á¡áá»á±á¬ááºá áá áº
áááá»áœááºážááŒá®ážáá±á¬ááºá ááááºá¡ááºáá»á¬ážááᯠááŒááºáááºáááºááŸááºááŒá®áž CI ááœáẠáá±á«ááºážá ááºážááẠá¡áá»áááºáááºááŒá®á áááá¯ááááºáá¬áá»á¬ážááẠstatic analyzer ááᯠá¡áá¯á¶ážáááŒá¯áá® áááºážááᯠáá¯ááºáá±á¬ááºááá«áááºá á¡ááŸááºááŸá¬ áááá¯ááááºáá¬ááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááœáá·áºááẠáá±á·ááœá¬ážááŒááºáž ááá¯á·ááá¯áẠáá¯á¶ážááááŒá¯áá¯ááºááá¯ááŒááºážááá¯á·ááŒá±á¬áá·áº ááŒá áºáááºá áááºážááá¯áá¯ááºáá±á¬ááºáááºá áááºáá á áºáá±ážááá±ážáá±á¬áá¯ááºááẠá¡ááœá±ááœá±ááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážáá¬áááœá²ááá¯á·ááááºáá±á¬ááºááá¯ááºá á±áááºá¡áá¬á¡á¬ážáá¯á¶ážááᯠá¡ááŒá®ážáááºá á áºáá±ážááẠááá¯á¡ááºáááºá
á€á¡ááá·áºááœáẠáááºáá±á·áá¬áááá·áºá¡áá¬áá»á¬áž
- áááááá¬ááẠáááºááá·áº á¡ááá¯á¡áá»á±á¬ááºá áá Ạááœá±ážáá»ááºá áá¬áá»á¬áž áá±ážáá±á¬ááºááááºážá
- ááœá²ááŒááºážá áááºááŒá¬áá°ááẠáááºáá á¯áá±ážááŸá¯á áá áºááŸáá·áº ááá¯ááºáá®ááŸá¯ááŸááá«ááá¬ážá
ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬á
á¬ááœááºá
á¬áááºážáááŸááá±á¬ááŒá±á¬áá·áºá áá
áºáá«áá
áºáá¶ááœááºáááºáá±ážáááºááá¯á¡ááºáááºá
ááᯠá ááºáááºáááŒááºáá±á«ááºážá ááºážááŒááºáž (CI) áááºáá±á¬ááºááŸá¯áá»á¬ážááá¯á· áááºááœá¬ážááŒáá«á áá¯á·á áááºááá·áºááœá²ááŒááºážá áááºááŒá¬áá°áááᯠááŒá®ážáá±ážáá±á¬ááŒá¿áá¬áá»á¬ážáááŸááá² áááºážááá¯á·ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºá ááá¯ááá¯á·áá¯ááºáá±á¬ááºáááºá áááºáá±á¬ááºááŒááºážááŸáá·áº áá°áá áºá ááºážáááºááŸá¯áá»á¬ážá¡ááŒá®ážááœáẠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááºááŸááá±á¬ ááá¯ááºááá¯ááºážááœáẠáá®ážááŒá¬ážá¡ááá·áºáá áºáᯠáááºáá®ážááẠááá¯á¡ááºáááºá áááºážááᯠconsole utilities á¡áá»áá¯ážáá»áá¯ážááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá PVS-Studio ááẠá¡á±á¬ááºáá«á¡áá¯á¶ážá¡áá±á¬ááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááº-
PVS-Studio_Cmd.exe (Windows ááŸá ááŒá±ááŸááºážáá»ááºáá»á¬ážá C#á C++ ááá±á¬áá»ááºáá»á¬ážááᯠáá±á·áá¬ááŒááºáž)CLMonitor.exe (á á¯á ááºážá á±á¬áá·áºááŒáá·áºááŒááºáž)pvs-studio-analyzer ( Linux / macOS ááœáẠC++ ááá±á¬áá»ááºáá»á¬ážááᯠáá±á·áá¬ááŒááºáž)pvs-studio-dotnet (ááŒá±ááŸááºážáá»ááºááœá²ááŒááºážá áááºááŒá¬ááŸá¯á Linux / macOS ááŸá C# ááá±á¬áá»ááºáá»á¬áž)pvs-studio.jar (Java ááá±á¬áá»ááºáá»á¬ážááᯠáá±á·áá¬ááŒááºáž)PlogConverter (ááá¯ááºááŒá±á¬ááºážáá°á¡á á®áááºáá¶áááº)
ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠCI ááœáẠáá±á«ááºážá ááºáááºá áááºááẠá¡áá¬áá¯á¶ážáá¯ááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
- ááœá²ááŒááºážá áááºááŒá¬áááááá¬ááá¯áááºáááºáá«á
- ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯áá¯ááºáá±á¬ááºáááº;
- ááááºáá»á¬ážáá±ážááá¯á·áá«á
á¥ááá¬á¡á¬ážááŒáá·áºá Linux (Debian-base) ááœáẠPVS-Studio ááᯠááá·áºááœááºážááẠá¡á±á¬ááºáá« command áá»á¬ážááᯠáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááº-
wget -q -O - https://files.viva64.com/etc/pubkey.txt
| sudo apt-key add -
sudo wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
sudo apt-get update -qq
sudo apt-get install -qq pvs-studio
Windows á¡áá¯á¶ážááŒá¯ááá·áº á áá áºáá»á¬ážááœááºá package manager á០ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá·áºááœááºážááẠáááºážáááºážáááŸááá±á¬áºáááºážá ááœá²ááŒááºážá áááºááŒá¬áá°ááᯠcommand line á០á¡áá¯á¶ážáá»ááẠááŒá áºááá¯ááºáááº-
PVS-Studio_setup.exe /verysilent /suppressmsgboxes
/norestart /nocloseapplications
Windows á¡áá¯á¶ážááŒá¯ááá·áºá
áá
áºáá»á¬ážááœáẠPVS-Studio á¡áá¯á¶ážáá»ááŒááºážá¡ááŒá±á¬ááºáž ááá¯ááá¯áááºááŸá¯ááá¯ááºáááº
áááºáááºááŒá®ážáá±á¬ááºá áááºááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠááá¯ááºááá¯ááºáá¯ááºáá±á¬ááºááẠááá¯á¡ááºáááºá ááá¯á·áá±á¬áºáááºáž á á¯á ááºážááŒá®áž á ááºážáááºááŸá¯áá»á¬ážááŒá®ážááŸáᬠáááºážááᯠááŒá¯áá¯ááºááẠá¡ááŒá¶ááŒá¯áá¬ážáááºá á¡áááºááŒá±á¬áá·áºááá¯áá±á¬áº áááºááŒáááºááŸá¯ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááẠáá¯á¶ááŸááºá¡á¬ážááŒáá·áº á á¯á ááºážááŸá¯ááẠááŸá áºáááŒá¬áá±á¬ááŒá±á¬áá·áº ááŒá áºáááºá
ááœáŸáá·áºáááºáááºážáááºážááẠááááºáá±á¬ááºážááŸáá·áº ááá±á¬áá»ááºá¡ááºá¹áá«áááºáá»á¬ážáá±á«áºááœááºáá°áááºáá±á¬ááŒá±á¬áá·áºá C++ (Linux) á¡ááœáẠááœá±ážáá»ááºááœáá·áºááᯠá¥ááá¬áá áºáá¯á¡áá±ááŒáá·áº ááŒáá«áááºá
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w
ááá command ááẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠáá¯ááºáá±á¬ááºáááºááŒá
áºááŒá®ážá
ááŸááºáá»ááºá á á¬áá¬ážáá±á¬áºáááºá á¡áááºáááŒá±áá°ážá á¥ááá¬áá áºáá¯á¡áá±áá²á· ááá¯ážááá¯ážááŸááºážááŸááºážáá²á· ááŒáá¬ážáá«áááºá ááá¯á áááºáááºá á¬ážá áá¬áá±á¬ááºážáá²á· á¡á á®áááºáá¶á á¬áá±á¬áºáááºááᯠá¡á¬áá¯á¶á áá¯ááºáá« - FullHtmlá áááºážááẠááá·áºá¡á¬áž áá¯ááºááŸáááá·áº ááœá¬ážáá¬ááẠááœáá·áºááŒá¯áááºá
áá±á¬ááºážáá«ážááœáẠCI ááá¯ááºáᬠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ áááºááŸááºááŒááºážá¡ááŒá±á¬ááºáž ááá¯ááá¯áááºááŸá¯ááá¯ááºáááº"
áá±á¬ááºážááŒá®á áááºáá±á¬ááºááá·áºáá¬áá¬ááœáẠááœá²ááŒááºážá áááºááŒá¬áááááá¬ááᯠáááºááŒááºáááºááŒá®ážááŒá áºáááºá ááá¯á áá áºá á¯á¶áá áºáŠážááẠá ááºážáááºááá¬ážáá±á¬áá¯ááºááᯠá¡ááºáá¯ááºáá¯ááºáá«áá á¡áááºááŒá¯ááŒááºážá¡ááá·áºááẠáá»ááŸá¯á¶ážáááºááŒá áºááŒá®áž ááŒá¿áá¬ááᯠáááºááŸá¬ááœá±ááœá±á·ááŸáááá¯ááºáááºááŒá áºááŒá®ážá ááá¯á·áá±á¬áº á¡ááá¯ááºážá¡áááºáá»á¬ážááᯠáá±á«ááºážá ááºážááŒá®ážáá±á¬ááºááœááºááá¯ááºáá² ááá±á¬áá»ááºááᯠá á áºáá±ážááẠááá¯ááá¯áááá±á¬ááºáá±á¬ááŒá±á¬áá·áºá áááºážááẠáá¯á¶ážáá¡áááºááŒá±áááºááá¯ááºáá±á¬ááŒá±á¬áá·áºá áááºážáááá¯ááºáá®á ááœá²áááºáááºáá±á¬ááºážááá¯ááŸá¯á¡ááá·áº A ááœááºá
áá±áá¯áá»á¡á¬ážááŒáá·áºá ááœá²áááºáá±á¬ááºážááá¯ááŸá¯ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáááºááŸááºááŒááºážááẠCI ááœáẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡á¬áž áá¯á¶ááŸááºáá¯ááºááœáŸááºááŒááºážááẠáá»á¬ážá áœá¬ááœá¬ááŒá¬ážááŸá¯áááŸááá«á ááŒá±á¬ááºážáá²áá¬ážáá±á¬ááá¯ááºáá»á¬ážá á¬áááºážááᯠááá°ááẠááá¯á¡ááºáááºááŸááœá²á git ááᯠá¡áá¯á¶ážááŒá¯á á¡ááá¯ááºážá¡áááºáá»á¬ážááŒá¬áž ááŒá¬ážáá¬ážáá»ááºáá»á¬ážááᯠáá±ážááŒááºážááŒááºážááŒáá·áº áááºážááá¯á·ááᯠá¡áá»á¬ážá¡á¬ážááŒáá·áº áááŸáááá¯ááºáá«áááºá
git diff --name-only HEAD origin/$MERGE_BASE > .pvs-pr.list
ááᯠáááºááẠá€ááá¯ááºáá»á¬ážá á¬áááºážááᯠááœá²ááŒááºážá áááºááŒá¬áá°áᶠááá·áºááœááºážááẠááá¯á¡ááºáá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá PVS-Studio ááœáẠáááºážááẠá¡áá¶ááᯠá¡áá¯á¶ážááŒá¯á áá¯ááºáá±á¬ááºáááºá -S:
pvs-studio-analyzer analyze -j8
-o PVS-Studio.log
-S .pvs-pr.list
ááœá²áááºáá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠááœá²ááŒááºážá
áááºááŒá¬ááá¯ááºááẠ*
ááœá²áá°áá±á¬ááºážááá¯ááŸá¯áá»á¬ážáááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááá¯áááºááŸááºááŒááºážááŒáá·áºá áááºáááºááááá±ážáá»ááºáá»á¬ážáá« á ááºáá±á¬áá¯ááºáá»á¬ážááá¯ááááºááá¯á·ááá¯ááºááŒá®ážá ááºážáááºááá¬ážáá±á¬áá¯ááºááá¯ááŒááºáá»á±á¬áºááááá±á¬áááºááááááºááá¯áááºáá®ážááá¯ááºáááºá
áá«ááœá±á¡á¬ážáá¯á¶ážá áá±áá»á¬áá±á«áẠáá±á¬ááºážáá«áááºá áá«áá±ááá·áº ááááá±ážáá»ááºá¡á¬ážáá¯á¶ážááᯠáá
áºáá±áá¬áááºážááŸá¬ ááŒááºáá»ááºáá«áááºá static analyzer ááŸáá¬áá áá°áá
áºá
ááºážáááºááŸá¯áá»á¬áž ááá¯á·ááá¯áẠdynamic analyzer ááŸáááºážááŒá
áºáááºá á€á¡ááœáẠáááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áº ááááºá¡ááºáá»á¬áž á¡áá»áá¯ážáá»áá¯ážááŸááááºá á¥ááᬠPVS-Studio ááŸááááºá
2. developer á ááºáá»á¬ážááœáẠáá±á«ááºážá ááºážááŒááºážá
ááá¯á¡áá« áá±á·á ááºááœá¶ááŒáá¯ážááá¯ážáááºááŸá¯á¡ááœáẠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠááœá²ááŒááºážá áááºááŒá¬áááááá¬ááᯠááá·áºááœááºážááŒá®áž áá»áááºááŸáááẠá¡áá»áááºáá»áá±á¬ááºááŒá®ááŒá áºáááºá á€á¡áá»ááºááœáẠáááºááẠá¡áá¯ááºáááºážáááºážá¡áá»á¬ážá á¯ááᯠá¡áá»áœááºážááááºááŸááá±ááŒá®ááŒá áºáá±á¬ááŒá±á¬áá·áº áááºážááᯠá¡ááœááºáá¯á¶ážá¡ááá¯ááºážáᯠáá±á«áºááá¯ááºáááºá
á¡ááá¯ážááŸááºážáá¯á¶ážááœá±ážáá»ááºááŸá¯á¡áá±ááŒáá·áºá developer áá»á¬ážááẠááá¯á¡ááºáá±á¬ááœá²ááŒááºážá
áááºááŒá¬á
ááºááᯠááá¯ááºááá¯ááºááá·áºááœááºážááá¯ááºáááºá ááá¯á·áá±á¬áºá áááºážááẠá¡áá»áááºáá»á¬ážá
áœá¬áá°áááŒá®áž áááºážááá¯á·ááᯠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯á០á¡á¬áá¯á¶ááŒá±á¬ááºážá
á±áááºá ááá¯á·ááŒá±á¬áá·áº áááºááẠááá·áºááœááºážáá°ááŸáá·áº ááá¯á¡ááºáá±á¬á¡áá¶áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á€áá¯ááºáááºážá
ááºááᯠá¡ááá¯á¡áá»á±á¬ááºáá¯ááºáá±á¬ááºááá¯ááºáááºá PVS-Studio á¡ááœáẠá¡áá»áá¯ážáá»áá¯ážááŸááá«áááºá
ááá¯á·áá±á¬áẠááá¯á¡ááºáá±á¬ ááááºá¡ááºáá»á¬ážááᯠá¥ááá¬á¡á¬ážááŒáá·áº ááá·áºááœááºážááẠááá¯á¡ááºáááºááŒá
áºáááºá
3. áá±á·á ááºá¡áá¯á¶ážááŒá¯áá«á
á€á¡ááá·áºááœááºá áá±á·á
ááºá¡áá¯á¶ážááŒá¯áá±á
ááºá¡ááœááºáž ááœá²ááŒááºážá
áááºááŒá¬á
ááºááᯠá¡ááŸáááºááŒáŸáá·áºááẠáááºážáááºážáá»á¬ážá¡ááŒá±á¬ááºáž á
áá¬ážáá¯á¶ážá¡áá»áá¯á·ááᯠááŒá±á¬áááºá¡áá»áááºááŒá
áºáááºá ááá±á¬áá»ááºáá
áºáá¯áá¯á¶ážá ááŒá®ážááŒáá·áºá
á¯á¶áá±á¬ ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá
áºáá¯ááẠá¡áá»áááºáá»á¬ážá
áœá¬áá°ááá±á¬áºáááºáž ááá±á¬áá»ááºáá
áºáá¯áá¯á¶ážááœáẠáá»áœááºá¯ááºááá¯á·ááẠáá¯ááºááᯠáá
áºááŒáááºáááºážáááºáá»áŸáááŒá¬áá ááŒá±á¬ááºážáá²ááá¯ááºááááºážá á€áá»áŸááŒá®ážáá¬ážáá±á¬ refactoring ááẠáá¯ááºá¡ááŒá±áá¶áá
áºáá¯áá¯á¶ážááᯠáá»ááºáá»ááºážá¡áá»áá¯ážáááºáá±á¬ááºá
á±ááá·áº ááá¬ááááŸááá±á áá
áºááŒáááºááœáẠááŒá±á¬ááºážáá²áá±áá±á¬ ááá¯ááºá¡áá±á¡ááœááºááẠáá
áºáá«áááºááẠáááºážáá«ážáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááᯠááœá²ááŒááºážá
áááºááŒá¬ááẠááá·áºáá»á±á¬áºáá«áááºá á¡á²áá®ááᯠá¡ááŒá±á¡áá±áá»áá¯ážáá±á¬á· ááŸááááºá
ááœá²ááŒááºážá áááºááŒá¬áá°ááẠáááŒá¬áá±ážáá®á ááŒá±á¬ááºážáá²áá¬ážáá±á¬ áá¯ááºááœáẠááŒá¿áá¬áá»á¬ážááᯠááœá±á·ááŸááá«áá áááºážááᯠááœááºáááºá áœá¬ ááááºážááá¯á·áá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá PVS-Studio ááẠááááá±ážáá»ááºáá áºáá¯ááᯠá¡áá¯á¶ážááŒá¯á áááºážá¡ááŒá±á¬ááºážááᯠááá·áºá¡á¬áž ááŒá±á¬ááŒáá«áááº-
áá±á¬á·ááºáá²ááᯠá¡áá¯á¶ážááŒá¯ááẠdeveloper áá»á¬ážá¡á¬áž ááŒá±á¬ááŒááºážááẠááá¯á¶áá±á¬ááºáá«á á¡á²áá«á áá¬áá²ááá¯áá¬áá²á· á¡á²áá«ááᯠáá
áºáááºážáááºážáá²á· ááŒá±á¬ááŒááá¯á·ááá¯áááºá á¥ááá¬á á€ááœááºá PVS-Studio á¡ááœáẠá¡ááŒááºá
áááºááŒááºážá¡ááŒá±á¬ááºáž áá±á¬ááºážáá«ážáá»á¬ážááŒá
áºáááºá ááá¯á·áá±á¬áº áááºááŸá
áºáááºááá·áº áááºááá·áºáááááá¬á¡ááœáẠá¡áá¬ážáá°áááºáááºážá
á¬áá»á¬ážááᯠáááºááŸá¬ááœá±á·ááá¯ááºáááº-
Windows (C, C++, C#) ááœáẠPVS-Studio ááᯠáááºááá¯ááœáá·áºáááá²á Linux ááŸáá·áº macOS (Cá C++) ááœáẠPVS-Studio ááá¯áááºááá¯á·ááœáá·áºááááºáááºážá PVS-Studio Java ááᯠáááºááá¯ááœáá·áºááá²á
ááá¯ááá¯á·áá±á¬ áá±á¬ááºážáá«ážáá»á¬ážááẠáá±á·á á¥áºá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠááá¯á¡ááºáá±á¬ á¡áá»ááºá¡áááºá¡á¬ážáá¯á¶ážááᯠáá±ážá áœááºážááŒá®áž á¡áá»áááºá¡áá»á¬ážááŒá®ážááá°áá«á ð
áááááá¬ááᯠááááœáá·áºáááá·áºá¡ááá·áºááœááºáááºá ááááá¯á¶áž ááœáŸááºáááºááŸá¯áá áºáá¯á¡ááœááºáž ááááá±ážáá»ááºá¡áá»á¬ážá¡ááŒá¬ážááᯠáá»áœááºá¯ááºááá¯á· áá¬ážááŒá áºáá¬ážáááºá áá¶ááá±á¬ááºážá áœá¬áá²á static ááœá²ááŒááºážá áááºááŒá¬áá°áá»á¬ážááẠáááŒáá·áºá á¯á¶áá±á¬ááŒá±á¬áá·áº áá áºáá«áá áºáᶠáááºážááá¯á·ááẠááŸá¬ážááœááºážáá±á¬á¡ááŒá¯ááá±á¬áá»á¬ážááᯠáá±ážááŒáááºá á¥ááá¬á¡á¬ážááŒáá·áºá Visual Studio á¡ááœáẠPVS-Studio ááááºá¡ááºááœáẠáááºážááá¯á·ááᯠááááŸáááºááẠááœááºáá°áááº-
ááá¯á·áá±á¬áº áá°ááá¯á·ááᯠááááŸáááºáá¯á¶áááºáá áááºáá¯ááºááá¯ááºááẠá á¥ááá¬á¡á¬ážááŒáá·áºá áááºááẠá¡áá°á¡áá®áá±ážááẠááŒá¿áá¬áá
áºáá¯ááᯠááá¯ááºááŒá¬ážááá¯ááºáááºá á¡áááºá false positive ááᯠááŒá¯ááŒááºááá¯ááºáá«áá ááá¯á·áá±á¬áẠááá·áº codebase ááœáẠáááºááŸááºáá¬ážáá±á¬ false positive áá»á¬áž áááºážáá«ážááŒá®áž áááºážáá«ážáá¬áááºááᯠáááááŒá¯ááááá¯ááºáááºááŒá
áºáááºá
áá±á«ááºážá ááºážááŒá®ážáá±á¬ááº
ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯ááºáááºážá ááºááœáẠáááºááŒáááºááŸá¯ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá±á«ááºážá ááºááŒááºážá á¡ááá·áºá¡á¬ážáá¯á¶ážááᯠááŒááºáááºážááŒá®ážáá«ááŒá®á CI ááœááºááá¯áá²á·ááá¯á·áá±á¬áááááá¬áá»á¬ážááá¯áááºáááºáááºá¡áá±ážááŒá®ážáá±á¬áºáááºážá áááºážááá¯á·ááá¯áááºáááºáááºá¡áá±ážááŒá®ážáá¯á¶ážáá±áá¬ááŸá¬ developer áááœááºáá»á°áá¬ááŒá áºáááºá á¡ááŸááºáá±á¬á·á static analyzer ááẠcode ááá±á¬ááºážáá°ážáᯠááá·áºááŸáá·áºáá±ážáá±á¬áá áºáá±áá¬ááœááºááŒá±á¬áá±á¬ááá¬ážáá°ááŒá®ážááá¯ááºáá«á ááá·áºáá»ááºáááºá¡áá±ááŸáá·áº áááºááẠáááºáááºážáá±áá«á ááá·áºááá¯ááŒá±á¬ááŒááŒá®áž áá áºáá¯áá¯áá±á·ááœá¬ážáá«á ááá·áºááá¯ááááá±ážááá·áº áááºáá±á¬ááºááŒá áºáááºá
ááŸááºáá«áááºá áá¯á¶ááŸááºá¡áá¯á¶ážáááŒá¯áá²á static analysis ááẠááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯ááᯠáááááá¬áᬠááá¯ážááŸááºážááœááºáá°á á±áááºááá¯ááºáá±á áá±á¬ááºáá¯á¶ážááœááºá developer áá áºáŠážá¡ááœáẠáááºážáá¡áááá¡áá»áá¯ážáá»á±ážáá°ážááŸá¬ áá¯ááºá ááŸá¯ááºááœá±ážááŒá®áž á¡ááŒááºážááœá¬ážááœááºáᬠá¡ááá¯ááºážáá»á¬ážááᯠááŸá¬ááœá±ááŒááºážááœáẠááá¯ááºáá² áááºážááá¯á·á á á±á¬á á®ážá áœá¬ ááŸá¬ááœá±ááœá±á·ááŸáááŸá¯ááœáẠáá»á¬ážá áœá¬ áááºáá±á¬ááºááŸá¯ááŸááá«áááºá á ááºážáááºáááºá¡ááœáẠáááºážááŒááºááŸá¯áá»á¬áž áá±ážááá¯á·ááŒá®ážáá±á¬áẠááŒá¿áá¬áá áºáá¯ááᯠááŸá¬ááœá±ááœá±á·ááŸáááŒááºážááẠáááŸá áºááŒáá¯á·ááœááºáá±á¬ááºážáá¯á¶áá¬áá á¡áá»áááºáá¯ááºáááºáž áááºáá¬á á±ááŒá±á¬ááºáž ááá±á¬áá°áá«áááºá áááºááŒáááºáá±á¬ ááœá²ááŒááºážá áááºááŒá¬ááŸá¯ááᯠáá¯á¶ááŸááºá¡áá¯á¶ážááŒá¯áá±á¬á¡áá«ááœááºá ááá·áºááœááºáá»á°áá¬áá±á«áºááœáẠááŒá±á¬ááºážáá²ááŸá¯ááá¯ááºážááᯠááá¯ááºááá¯ááºááŒáá·áºááŸá¯ááŒá®áž áá¯ááºáá±á«áºááœáẠáá¯ááºáá±á¬ááºáá±á áẠáá¶ááááŒá áºááœááºáá±áá¬áá»á¬ážááᯠá¡á á®áááºáá¶áá«áááºá
á¡áááºá ááẠááá¯á·ááá¯áẠááá·áºáá¯ááºáá±á¬áºááá¯ááºáááºáá»á¬ážá áááºážááẠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠááá¯ááºáááºááŸá¯ ááŸáá áááŸá ááá±áá»á¬áá«áá áá±á¬ááºážáá«ážááᯠááᯠá
áááºáááºááŸá¯ááẠáá»áœááºá¯ááºá¡ááŒá¶ááŒá¯ááá¯áá«áááºá
á€áá±á¬ááºážáá«ážááᯠá¡ááºá¹áááááºá
áá¬ážááŒá±á¬ ááááááºááŸáá·áº áá»áŸáá±ááá¯áá«áá áá¬áá¬ááŒááºááá·áºááº- Maxim Zvyagintsev ááᯠá¡áá¯á¶ážááŒá¯áá«á
source: www.habr.com