GitLab වලට ආදරය කරන අතර දෝෂ වලට වෛර කරනවාද? ඔබේ මූලාශ්ර කේතයේ ගුණාත්මකභාවය වැඩි දියුණු කිරීමට අවශ්යද? එවිට ඔබ නියම ස්ථානයට පැමිණ ඇත. ඒකාබද්ධ ඉල්ලීම් පරීක්ෂා කිරීම සඳහා PVS-Studio C# විශ්ලේෂකය වින්යාස කරන්නේ කෙසේදැයි අද අපි ඔබට කියමු. සියලු දෙනාටම යුනිකෝන් මනෝභාවයක් සහ ප්රීතිමත් කියවීමක් ලබා ගන්න.
මාර්ගය වන විට, අපි PVS-Studio 7.08 නිකුත් කළෙමු, එහි අපි බොහෝ දේ කළෙමු
- Linux සහ macOS සඳහා C# විශ්ලේෂකය;
- රයිඩර් සඳහා ප්ලගිනය;
- නව ගොනු ලැයිස්තු පරීක්ෂා කිරීමේ මාදිලිය.
ගොනු ලැයිස්තුව පරීක්ෂා කිරීමේ මාදිලිය
මීට පෙර, ඇතැම් ගොනු පරීක්ෂා කිරීම සඳහා, විශ්ලේෂකය වෙත ගොනු ලැයිස්තුවක් සමඟ .xml යැවීමට අවශ්ය විය. නමුත් මෙය එතරම් පහසු නොවන බැවින්, අපි .txt මාරු කිරීමේ හැකියාව එකතු කර ඇත, එය ජීවිතය ඉතා සරල කරයි.
නිශ්චිත ගොනු පරීක්ෂා කිරීම සඳහා, ඔබ ධජය සඳහන් කළ යුතුය --sourceFiles (-f) සහ ගොනු ලැයිස්තුවක් සමඟ .txt මාරු කරන්න. එය මෙසේ පෙනේ:
pvs-studio-dotnet -t path/to/solution.sln -f fileList.txt -o project.json
ඔබ කැපවීම පරීක්ෂා කිරීම හෝ ඇද ගැනීමේ ඉල්ලීම් පිහිටුවීමට කැමති නම්, ඔබට මෙම ප්රකාරය භාවිතයෙන්ද එය කළ හැක. වෙනස වනුයේ විශ්ලේෂණය කිරීමට ගොනු ලැයිස්තුවක් ලබා ගැනීම සහ ඔබ භාවිතා කරන පද්ධති මත රඳා පවතී.
ඒකාබද්ධ ඉල්ලීමක් පරීක්ෂා කිරීමේ මූලධර්මය
චෙක්පතේ ප්රධාන සාරය නම් ඒකාබද්ධ කිරීමේදී විශ්ලේෂකය විසින් අනාවරණය කරන ලද ගැටළු වලට වැටෙන්නේ නැති බව සහතික කිරීමයි. ස්වාමියා ශාඛාව. සෑම අවස්ථාවකදීම සම්පූර්ණ ව්යාපෘතිය විශ්ලේෂණය කිරීමට අපට අවශ්ය නැත. එපමණක් නොව, ශාඛා ඒකාබද්ධ කිරීමේදී, අපි වෙනස් කළ ගොනු ලැයිස්තුවක් ඇත. එබැවින්, ඒකාබද්ධ ඉල්ලීම් චෙක්පතක් එක් කිරීමට මම යෝජනා කරමි.
ස්ථිතික විශ්ලේෂකය ක්රියාත්මක කිරීමට පෙර ඒකාබද්ධ ඉල්ලීමක් පෙනෙන්නේ මෙයයි:
එනම්, ශාඛාවේ තිබූ සියලු දෝෂ වෙනස්කම්, ප්රධාන ශාඛාව වෙත ගමන් කරනු ඇත. අපට මෙය අවශ්ය නොවන බැවින්, අපි විශ්ලේෂණය එකතු කරන්නෙමු, දැන් රූප සටහන මේ ආකාරයට පෙනේ:
අපි විශ්ලේෂණය කරන්නෙමු වෙනස්කම්2 සහ, දෝෂ නොමැති නම්, අපි ඒකාබද්ධ කිරීමේ ඉල්ලීම පිළිගනිමු, එසේ නොමැතිනම් අපි එය ප්රතික්ෂේප කරමු.
මාර්ගය වන විට, ඔබ C/C++ සඳහා කැපවීම් සහ අදින්න ඉල්ලීම් විශ්ලේෂණය කිරීමට කැමති නම්, ඔබට ඒ ගැන කියවිය හැක.
GitLab
ඔබ ඒකාබද්ධ ඉල්ලීම් විශ්ලේෂණය ආරම්භ කිරීමට පෙර, ඔබ ඔබේ ව්යාපෘතිය ලියාපදිංචි කර උඩුගත කළ යුතුය. ඔබ මෙය කරන්නේ කෙසේදැයි නොදන්නේ නම්, මම යෝජනා කරමි
අදහස් දැක්වීම්. පහත විස්තර කර ඇති පරිසරය සැකසීමේ ක්රමය විය හැකි එකකි. ඉලක්කය වන්නේ විශ්ලේෂණයට සහ විශ්ලේෂකය දියත් කිරීමට අවශ්ය පරිසරය සැකසීමේ පියවර පෙන්වීමයි. සමහර විට ඔබේ නඩුවේදී පරිසරය සකස් කිරීමේ (නිධිය එකතු කිරීම, විශ්ලේෂකය ස්ථාපනය කිරීම) සහ විශ්ලේෂණයේ අදියර වෙන් කිරීම වඩාත් ප්රශස්ත වනු ඇත: නිදසුනක් ලෙස, අවශ්ය පරිසරය සමඟ ඩොකර් රූප සකස් කර ඒවා භාවිතා කිරීම හෝ වෙනත් ක්රමයක්.
දැන් සිදුවන්නේ කුමක්ද යන්න වඩා හොඳින් අවබෝධ කර ගැනීම සඳහා, පහත රූප සටහන දෙස බැලීමට මම යෝජනා කරමි:
විශ්ලේෂකය ක්රියාත්මක වීමට .NET Core SDK 3 අවශ්ය වේ, එබැවින් විශ්ලේෂකය ස්ථාපනය කිරීමට පෙර ඔබ විශ්ලේෂකය සඳහා අවශ්ය පරායත්තතා ස්ථාපනය කරන Microsoft ගබඩාවන් එක් කළ යුතුය. විවිධ ලිනක්ස් බෙදාහැරීම් සඳහා Microsoft ගබඩා එකතු කිරීම
පැකේජ කළමනාකරු හරහා PVS-Studio ස්ථාපනය කිරීමට, ඔබට PVS-Studio ගබඩාවන් එක් කිරීමටද අවශ්ය වනු ඇත. විවිධ බෙදාහැරීම් සඳහා ගබඩා එකතු කිරීම වඩාත් විස්තරාත්මකව විස්තර කෙරේ
විශ්ලේෂකය ක්රියාත්මක කිරීමට බලපත්ර යතුරක් අවශ්ය වේ. ඔබට අත්හදා බැලීමේ බලපත්රයක් ලබා ගත හැකිය
අදහස් දැක්වීම්. විස්තර කර ඇති මෙහෙයුම් ආකාරය (ඒකාබද්ධ ඉල්ලීම් විශ්ලේෂණය) සඳහා ව්යවසාය බලපත්රයක් අවශ්ය බව කරුණාවෙන් සලකන්න. එබැවින්, ඔබට මෙම මෙහෙයුම් ආකාරය උත්සාහ කිරීමට අවශ්ය නම්, ඔබට ව්යවසාය බලපත්රයක් අවශ්ය බව “පණිවිඩ” ක්ෂේත්රයේ සඳහන් කිරීමට අමතක නොකරන්න.
ඒකාබද්ධ කිරීමේ ඉල්ලීමක් සිදුවුවහොත්, අපට අවශ්ය වන්නේ වෙනස් කළ ගොනු ලැයිස්තුව විශ්ලේෂණය කිරීම පමණි, එසේ නොමැතිනම් අපි සියලුම ගොනු විශ්ලේෂණය කරමු. විශ්ලේෂණයෙන් පසුව, අපට අවශ්ය ආකෘතියට ලොග් පරිවර්තනය කළ යුතුය.
දැන්, ඔබේ ඇස් ඉදිරිපිට වැඩ කිරීමේ ඇල්ගොරිතමයක් තිබීම, ඔබට පිටපතක් ලිවීමට ඉදිරියට යා හැකිය. මෙය සිදු කිරීම සඳහා, ඔබ ගොනුව වෙනස් කළ යුතුය .gitlab-ci.yml හෝ, එය නොපවතියි නම්, එය නිර්මාණය කරන්න. එය සෑදීමට, ඔබ ඔබේ ව්යාපෘතියේ නම මත ක්ලික් කළ යුතුය -> CI/CD සකසන්න.
දැන් අපි පිටපත ලියන්න සූදානම්. විශ්ලේෂකය ස්ථාපනය කර බලපත්රය ඇතුළු කරන කේතය පළමුව ලියන්න:
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
අනෙකුත් සියලුම ස්ක්රිප්ට් වලට පෙර ස්ථාපනය සහ සක්රිය කිරීම සිදු විය යුතු බැවින්, අපි විශේෂ ලේබලයක් භාවිතා කරමු පෙර_ස්ක්රිප්ට්. මම මේ කොටස පොඩ්ඩක් පැහැදිලි කරන්නම්.
විශ්ලේෂකය ස්ථාපනය කිරීමට සූදානම් වෙමින්:
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
PVS-Studio ගබඩාවන් සහ විශ්ලේෂකය එකතු කිරීම:
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
බලපත්ර සක්රිය කිරීම:
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
$PVS_NAME - පරිශීලක නාමය.
$PVS_KEY - නිෂ්පාදන යතුර.
ව්යාපෘති පරායත්තතා නැවත ලබා ගැනීම $CI_PROJECT_DIR - ව්යාපෘති නාමාවලිය වෙත සම්පූර්ණ මාර්ගය:
- dotnet restore "$CI_PROJECT_DIR"/Path/To/Solution.sln
නිවැරදි විශ්ලේෂණය සඳහා, ව්යාපෘතිය සාර්ථකව ගොඩනගා ගත යුතු අතර, එහි පරායත්තතා ප්රතිසාධනය කළ යුතුය (උදාහරණයක් ලෙස, අවශ්ය NuGet පැකේජ බාගත කළ යුතුය).
ක්ලික් කිරීමෙන් බලපත්ර තොරතුරු අඩංගු පරිසර විචල්ය ඔබට සැකසිය හැක සැකසුම, සහ පසු - මත CI/CD.
විවෘත වන කවුළුව තුළ, අයිතමය සොයා ගන්න විචල්යයන්, දකුණු පස ඇති බොත්තම මත ක්ලික් කරන්න දිගු කරන්න සහ විචල්ය එකතු කරන්න. ප්රතිඵලය මේ ආකාරයෙන් විය යුතුය:
දැන් ඔබට විශ්ලේෂණය වෙත යා හැකිය. පළමුව, සම්පූර්ණ විශ්ලේෂණයක් සඳහා ස්ක්රිප්ට් එකක් එකතු කරමු. කොඩියට -t අපි ධජයට විසඳුම සඳහා මාර්ගය පසු කරමු -o විශ්ලේෂණ ප්රතිඵල ලියා ඇති ගොනුව වෙත මාර්ගය ලියන්න. ආපසු එන කේතය ගැනද අපි උනන්දු වෙමු. මෙම අවස්ථාවෙහිදී, විශ්ලේෂණය අතරතුර අනතුරු ඇඟවීම් නිකුත් කරන ලද තොරතුරු ආපසු කේතයේ අඩංගු වන විට මෙහෙයුම නතර කිරීම ගැන අපි උනන්දු වෙමු. මෙම කොටස පෙනෙන්නේ මෙයයි:
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
ආපසු එන කේත වැඩ කරන්නේ ටිකක් මාස්ක් මූලධර්මය මතය. උදාහරණයක් ලෙස, විශ්ලේෂණයේ ප්රතිඵලයක් ලෙස අනතුරු ඇඟවීම් නිකුත් කළේ නම්, ප්රතිලාභ කේතය 8 ට සමාන වනු ඇත. බලපත්රය මාසයක් ඇතුළත කල් ඉකුත් වුවහොත්, ප්රතිලාභ කේතය 4 ට සමාන වේ. විශ්ලේෂණය අතරතුර දෝෂ අනාවරණය වුවහොත්, සහ බලපත්රය මාසයක් ඇතුළත කල් ඉකුත් වේ, කේත ප්රතිලාභය, අගයන් දෙකම ලියා ඇත: අංක එකට එකතු කර අවසාන ප්රතිලාභ කේතය ලබා ගන්න - 8+4=12. මේ අනුව, අනුරූප බිටු පරීක්ෂා කිරීමෙන්, විශ්ලේෂණය අතරතුර විවිධ තත්වයන් පිළිබඳ තොරතුරු ලබා ගත හැකිය. ප්රතිලාභ කේත ලේඛනයේ "pvs-studio-dotnet (Linux / macOS) Return Codes" කොටසේ වඩාත් විස්තරාත්මකව විස්තර කර ඇත "
මෙම අවස්ථාවෙහිදී, 8 දිස්වන සියලුම ආපසු කේතයන් ගැන අපි උනන්දු වෙමු.
- exit_code=$((($exit_code & 8)/8))
ආපසු එන කේතයේ අප උනන්දුවක් දක්වන අංකයේ බිට් එක අඩංගු වන විට අපට 1 ලැබෙනු ඇත, එසේ නොමැතිනම් අපට 0 ලැබෙනු ඇත.
ඒකාබද්ධ ඉල්ලීම් විශ්ලේෂණය එක් කිරීමට කාලයයි. අපි මෙය කිරීමට පෙර, අපි පිටපත සඳහා ස්ථානයක් සකස් කරමු. අපට එය ක්රියාත්මක කිරීමට අවශ්ය වන්නේ ඒකාබද්ධ කිරීමේ ඉල්ලීමක් සිදු වූ විට පමණි. එය මෙසේ පෙනේ:
merge:
script:
only:
- merge_requests
අපි පිටපතටම යමු. අතථ්ය යන්ත්රය කිසිවක් නොදන්නා බවට මට මුහුණ දීමට සිදු විය සම්භවය / මාස්ටර්. ඉතින් අපි ඇයට ටිකක් උදව් කරමු:
- git fetch origin
දැන් අපි අතු අතර වෙනස ලබාගෙන ප්රතිඵලය සුරකින්න txt ගොනුව:
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
කොහෙද? $CI_COMMIT_SHA - අවසාන කැපවීමේ හැෂ්.
ඊළඟට, අපි ධජය භාවිතයෙන් ගොනු ලැයිස්තුව විශ්ලේෂණය කිරීමට පටන් ගනිමු -f. අපි කලින් ලැබුණු .txt ගොනුව එයට මාරු කරමු. හොඳයි, සම්පූර්ණ විශ්ලේෂණය සමඟ ප්රතිසමයෙන්, අපි ප්රතිලාභ කේත දෙස බලමු:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
ඒකාබද්ධ කිරීමේ ඉල්ලීමක් පරීක්ෂා කිරීම සඳහා සම්පූර්ණ ස්ක්රිප්ටය මේ ආකාරයෙන් පෙනෙනු ඇත:
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
සියලුම ස්ක්රිප්ට් සැකසීමෙන් පසු ලොග් පරිවර්තනය එකතු කිරීම පමණක් ඉතිරිව ඇත. අපි ලේබලය භාවිතා කරමු පසු_ස්ක්රිප්ට් සහ උපයෝගීතාව ප්ලොග්-පරිවර්තකය:
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
උපයෝගීතාව
මාර්ගය වන විට, ඔබට IDE වෙතින් දේශීයව .json වාර්තා සමඟ පහසුවෙන් වැඩ කිරීමට අවශ්ය නම්, මම යෝජනා කරන්නේ අපගේ
පහසුව සඳහා, මෙන්න එයයි .gitlab-ci.yml සම්පුර්ණයෙන්:
image: debian
before_script:
- apt-get update && apt-get -y install wget gnupg
- apt-get -y install git
- wget https://packages.microsoft.com/config/debian/10/
packages-microsoft-prod.deb -O packages-microsoft-prod.deb
- dpkg -i packages-microsoft-prod.deb
- apt-get update
- apt-get install apt-transport-https
- apt-get update
- wget -q -O - https://files.viva64.com/etc/pubkey.txt | apt-key add -
- wget -O /etc/apt/sources.list.d/viva64.list
https://files.viva64.com/etc/viva64.list
- apt-get update
- apt-get -y install pvs-studio-dotnet
- pvs-studio-analyzer credentials $PVS_NAME $PVS_KEY
- dotnet restore "$CI_PROJECT_DIR"/Test/Test.sln
merge:
script:
- git fetch origin
- git diff --name-only origin/master $CI_COMMIT_SHA > pvs-fl.txt
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -f
pvs-fl.txt -o PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
only:
- merge_requests
job:
script:
- exit_code=0
- pvs-studio-dotnet -t "$CI_PROJECT_DIR"/Test/Test.sln -o
PVS-Studio.json || exit_code=$?
- exit_code=$((($exit_code & 8)/8))
- if [[ $exit_code == 1 ]]; then exit 1; else exit 0; fi
after_script:
- plog-converter -t html -o eLog ./PVS-Studio.json
ඔබ ගොනුවට සියල්ල එකතු කළ පසු, ක්ලික් කරන්න වෙනස්කම් කරන්න. සෑම දෙයක්ම නිවැරදි බව බැලීමට, යන්න සීඅයි / සීඩී -> නල මාර්ග -> ධාවන. අතථ්ය යන්ත්ර කවුළුවක් විවෘත වනු ඇත, අවසානයේ පහත සඳහන් දෑ තිබිය යුතුය:
දැක්කා රැකියාව සාර්ථක විය - සාර්ථකත්වය, හැම දෙයක්ම හොඳයි. දැන් ඔබට ඔබ කළ දේ පරීක්ෂා කළ හැකිය.
වැඩ උදාහරණ
වැඩ පිළිබඳ උදාහරණයක් සඳහා, අපි සරල ව්යාපෘතියක් නිර්මාණය කරමු (in ස්වාමියා) ගොනු කිහිපයක් අඩංගු වේ. ඊට පස්සේ, වෙනත් ශාඛාවක අපි එක ගොනුවක් පමණක් වෙනස් කර ඒකාබද්ධ ඉල්ලීමක් කිරීමට උත්සාහ කරමු.
අපි අවස්ථා දෙකක් සලකා බලමු: වෙනස් කරන ලද ගොනුවේ දෝෂයක් ඇති විට සහ එය නොමැති විට. පළමුව, දෝෂයක් සහිත උදාහරණයක්.
අපි හිතමු මාස්ටර් ශාඛාවේ ෆයිල් එකක් තියෙනවා කියලා Program.cs, එහි දෝෂ අඩංගු නොවේ, නමුත් වෙනත් ශාඛාවක සංවර්ධකයා වැරදි කේතයක් එක් කර ඇති අතර ඒකාබද්ධ ඉල්ලීමක් කිරීමට අවශ්ය වේ. ඔහු කුමන ආකාරයේ වැරැද්දක් කළේද යන්න එතරම් වැදගත් නොවේ, ප්රධාන දෙය නම් එය පවතින බවයි. උදාහරණයක් ලෙස, ක්රියාකරුට අමතක විය විසි (ඔව්,
void MyAwesomeMethod(String name)
{
if (name == null)
new ArgumentNullException(....);
// do something
....
}
දෝෂයක් සමඟ උදාහරණයක් විශ්ලේෂණය කිරීමේ ප්රතිඵලය දෙස බලමු. එක් ගොනුවක් පමණක් විග්රහ කර ඇති බව සහතික කර ගැනීමට, මම ධජය එක් කළෙමි -r pvs-studio-dotnet දියත් කිරීමේ රේඛාව වෙත:
විශ්ලේෂකය දෝෂයක් සොයාගෙන ඇති අතර ශාඛා ඒකාබද්ධ කිරීමට ඉඩ නොදුන් බව අපට පෙනේ.
දෝෂයකින් තොරව උදාහරණය පරීක්ෂා කර බලමු. කේතය නිවැරදි කිරීම:
void MyAwesomeMethod(String name)
{
if (name == null)
throw new ArgumentNullException(....);
// do something
....
}
ඉල්ලීම් විශ්ලේෂණ ප්රතිඵල ඒකාබද්ධ කරන්න:
අපට පෙනෙන පරිදි, කිසිදු දෝෂයක් සොයාගත නොහැකි වූ අතර, කාර්යය ක්රියාත්මක කිරීම සාර්ථක විය, එය අපට පරීක්ෂා කිරීමට අවශ්ය විය.
නිගමනය
ශාඛා ඒකාබද්ධ කිරීමට පෙර නරක කේතය ඉවත් කිරීම ඉතා පහසු සහ ප්රසන්න වේ. එබැවින් ඔබ CI/CD භාවිතා කරන්නේ නම්, පරීක්ෂා කිරීමට ස්ථිතික විශ්ලේෂකයක් කාවැද්දීමට උත්සාහ කරන්න. එපමණක්ද නොව, මෙය ඉතා සරලව සිදු කෙරේ.
ඔබේ අවධානය ඔබට ස්තුතියි.
ඔබට මෙම ලිපිය ඉංග්රීසි කතා කරන ප්රේක්ෂකයින් සමඟ බෙදා ගැනීමට අවශ්ය නම්, කරුණාකර පරිවර්තන සබැඳිය භාවිතා කරන්න: Nikolay Mironov.
මූලාශ්රය: www.habr.com