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, ඒකට තමයි මෝටර් රථ. නමුත් 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 එකේ මෝඩ කුණුහරුප ගොන්නක්

මා විශ්ලේෂණය කළ ව්‍යාපෘති තුනෙන් දෙකක් ඒකක පරීක්ෂණ පුස්තකාලයක් භාවිතා කරයි අල්ලා 2. පණිවිඩවල සිංහ කොටස (!!! එකක 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

ඒවා ඔබේ ව්‍යාපෘතියේ සබල කර ඔබේ කේතය ගැන බොහෝ දේ ඉගෙන ගන්න.

සම්මතයට ඇලී සිටින්න

සම්මත ප්‍රතිසම තිබේ නම් වේදිකා මත රඳා පවතින දේවල් භාවිතා නොකිරීමට උත්සාහ කරන්න, ඔබට ඒවා නොමැතිව කළ නොහැකි නම්, ඒවා මැක්‍රෝස් (හෝ වෙනත් දෙයක්) සඳහා විශේෂ කොටස්වල ඔතා සහය නොදක්වන කොන්දේසි යටතේ ඔබේ කේතය සම්පාදනය කිරීමට ඉඩ නොදෙන්න.

සම්මත මෙහෙයුම් අර්ථ ශාස්ත්‍රයට ඇලී සිටින්න

එකතු කිරීම එකතු කිරීම විය යුතුය, ගුණ කිරීම ගුණ කිරීම විය යුතුය, ශ්‍රිත ඇමතුම ක්‍රියාකාරී ඇමතුම විය යුතුය, පිටපත පිටපත විය යුතුය, රැගෙන යා යුතුය රැගෙන යා යුතුය, බහාලුම් පුනරාවර්තනය විය යුතුය, පුනරාවර්තකයාට ප්‍රවර්ධනය තිබිය යුතුය ++ සහ dereferencing *. සහ එසේ ය.

මම හිතන්නේ අදහස පැහැදිලියි. බන්ධනය නොවන නමුත් ඔබගේ කේතයේ සියලුම පරිශීලකයින් සහ පාඨකයින් දැකීමට අපේක්ෂා කරන ස්ථාපිත සම්මුතීන් තිබේ. අන් අයව අභිබවා යාමට උත්සාහ නොකරන්න, එසේ නොමැතිනම් ඔබ ඔබම අභිබවා යනු ඇත.

අනුකූල කේතයක් ලියන්න

මුලින්ම, මම අදහස් කරන්නේ සම්මත පුස්තකාලය. ඔබගේ පන්ති සහ කාර්යයන් වල අතුරුමුහුණත් සම්මත සහ අනෙකුත් පුස්තකාල සමඟ භාවිතා කළ හැකි වීම ඉතා යෝග්‍ය වේ (උදාහරණයක් ලෙස, Boost).

STL සහ Boost අතුරුමුහුණත් දෙස බැලීමට නිදහස් වන්න. දුර්ලභ ව්යතිරේක සමඟ, ඔබ එහි වටිනා ආදර්ශයක් දකිනු ඇත.

විවෘත මූලාශ්‍ර මෙවලම්වලින් උපරිම ප්‍රයෝජන ගන්න

එකම ස්ථිතික විශ්ලේෂණය සඳහා, CMake ගොඩනැගීමේ පද්ධතිය සමඟ ඕනෑම ව්‍යාපෘතියකට එක් වරක් සම්බන්ධ කළ හැකි අවම වශයෙන් විවෘත නිදහස් මෙවලම් දෙකක් තිබේ.

මගේ මෑත ප්‍රකාශනයෙන් ඔබට මේ ගැන වැඩිදුර කියවිය හැකිය.

පසු පදය

අවසාන වශයෙන්, PVS හෝ වෙනත් ස්ථිතික විශ්ලේෂක භාවිතා නොකිරීමට මා යෝජනා නොකරන බව අවධාරණය කිරීමට කැමැත්තෙමි. නමුත් ස්ථිතික විශ්ලේෂකය ඔබේ කේතයේ සැලකිය යුතු දෝෂ නිරන්තරයෙන් සොයා ගන්නේ කෙසේද යන්න ගැන සිතා බැලීමට මම ඔබව දිරිමත් කරමි.

මෙය ප්රතිවිපාකයක් පමණි. අපි හේතුව සොයා බලා ඉවත් කළ යුතුයි.

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න