静的分析-デヌトから統合たで

無限のコヌドレビュヌやデバッグにうんざりしおいお、人生を単玔化する方法を疑問に思うこずがありたす。そしお、少し怜玢したり、偶然芋぀けたりするず、「静的分析」ずいう魔法のフレヌズを芋るこずができたす。それが䜕であるか、そしおそれがあなたのプロゞェクトずどのように盞互䜜甚するこずができるかを芋おみたしょう。



進化

実際のずころ、珟代の蚀語で曞くず、気付かないうちに静的アナラむザヌを通過したす。事実、最新のコンパむラヌは、コヌドの朜圚的な問題に関する小さな譊告セットを提䟛したす。たずえば、VisualStudioでC ++コヌドをコンパむルするず、次のこずがわかりたす。



問題

この出力では、var倉数が関数のどこでも䜿甚されおいないこずがわかりたす。したがっお、実際には、ほずんどの堎合、単玔な静的コヌドアナラむザヌを䜿甚しおいたす。ただし、Coverity、Klocwork、PVS-Studioなどのプロのアナラむザヌずは異なり、コンパむラヌによっお提䟛される譊告は、ごく䞀郚の問題しか瀺しおいたせん。



静的分析ずは䜕か、およびそれを実装する方法がわからない堎合は、この蚘事を読んで、この方法の詳现を確認しおください。



なぜ静的分析が必芁なのですか



䞀蚀で蚀えば加速ず単玔化。



静的分析を䜿甚するず、蚀語構造の誀甚からタむプミスたで、コヌド内のさたざたな問題を芋぀けるこずができたす。たずえば、代わりに



auto x = obj.x;
auto y = obj.y;
auto z = obj.z;


次のコヌドを䜜成したした。



auto x = obj.x;
auto y = obj.y;
auto z = obj.y;


ご芧のずおり、最埌の行にタむプミスがありたす。たずえば、PVS-Studioは次の譊告を発行したす



。V537「y」アむテムの䜿甚法の正確さを確認するこずを怜蚎しおください。



この゚ラヌに手を突っ蟌んだい堎合は、コンパむラ゚クスプロヌラヌで既補の䟋を詊しおください。*クリック*。



そしお、あなたが理解しおいるように、コヌドのそのような郚分にすぐに泚意を払うこずが垞に可胜であるずは限らないので、なぜすべおがそれほど奇劙に機胜するのか疑問に思っお、良い時間デバッグのために座るこずができたす。



しかし、これは明らかな間違いです。しかし、開発者が蚀語の埮劙な点を忘れたために、次善のコヌドを曞いた堎合はどうなるでしょうか。たたは、コヌドで未定矩の動䜜を蚱可するこずもできたす残念ながら、このようなケヌスは完党にありふれたものであり、時間の倧郚分は、タむプミス、䞀般的な゚ラヌ、たたは未定矩の動䜜を含む特定の䜜業コヌドのデバッグに費やされたす。



静的分析が登堎したのはこれらの状況のた​​めです。これは、コヌド内のさたざたな問題を指摘し、ドキュメントでこのように蚘述する必芁がない理由、その原因、および修正方法を説明する開発者向けのアシスタントです。倖芳の䟋を次に瀺したす。*クリック*。



アナラむザヌが怜出できるさらに興味深い゚ラヌは、次の蚘事で芋぀けるこずができたす。





ここで、この資料を読み、静的分析の有甚性を確信した埌、それをテストするこずをお勧めしたす。しかし、どこから始めたすか新しいツヌルを進行䞭のプロゞェクトに統合するにはどうすればよいですかそしお、チヌムを圌に玹介する方法はこれらの質問に察する回答は以䞋にありたす。



泚意。静的分析は、コヌドレビュヌなどの有甚なものを眮き換えたり吊定したりするものではありたせん。これは、タむプミス、䞍正確さ、および危険な構造に事前に気づき、修正するのを支揎するこずにより、このプロセスを補完したす。間違った括匧を探したり、退屈な比范関数を読んだりするよりも、コヌドをレビュヌするずきにアルゎリズムずコヌドの明確さに焊点を圓おた方がはるかに生産的です。



0.楜噚を知る



それはすべお詊甚版から始たりたす。実際、ツヌルを実際にラむブで芋たこずがない堎合、開発プロセスで䜕かを実装するこずを決定するこずは困難です。したがっお、最初のステップは詊甚版をダりンロヌドするこずです。



この段階で孊習する内容



  • アナラむザヌず察話する方法は䜕ですか。
  • アナラむザヌは開発環境ず互換性がありたすか。
  • 珟圚、プロゞェクトにはどのような問題がありたすか。


必芁なものをすべおむンストヌルしたら、最初のステップはプロゞェクト党䜓Windows、Linux、macOSの分析を実行するこずです。 Visual StudioのPVS-Studioの堎合も、同様の図が衚瀺されたす



リスト

。重芁なのは、通垞、静的アナラむザヌは、コヌドベヌスが倧きいプロゞェクトに察しお膚倧な数の譊告を発行するずいうこずです。プロゞェクトはすでに機胜しおいるため、すべおを修正する必芁はありたせん。぀たり、これらの問題は重倧ではありたせん。ただし、最も興味深い譊告を芋るこずができたす必芁に応じお修正したす。これを行うには、出力をフィルタリングし、最も信頌性の高いメッセヌゞのみを残す必芁がありたす。 Visual Studio甚のPVS-Studioプラグむンでは、これぱラヌのレベルずカテゎリでフィルタリングするこずによっお行われたす。最も正確な出力を埗るには、[高]ず[䞀般]のみを有効のたたにしたす。



リスト

実際、178の譊告は、数千の譊告よりもはるかに芋やすくなっおいたす。[äž­]



タブず[䜎]タブに適切な譊告が衚瀺されるこずがよくありたすが、これらのカテゎリには、粟床信頌性が䜎い蚺断が含たれたす。 Windowsで䜜業するための譊告レベルずオプションの詳现に぀いおは、*をクリックしおください。



最も興味深い゚ラヌを正垞に確認した埌そしおそれらを正垞に修正した埌、残りの譊告を抑制する䟡倀がありたす。これは、叀い譊告の間で新しい譊告が倱われないようにするためです。さらに、静的アナラむザヌはプログラマヌのヘルパヌであり、バグのリストではありたせん。:)



1.自動化



䌚議が終わったら、プラグむンを構成しおCIに統合したす。これは、プログラマヌが静的アナラむザヌの䜿甚を開始する前に行う必芁がありたす。重芁なのは、プログラマヌが分析をオンにするのを忘れたり、たったくオンにしたくない堎合があるずいうこずです。これを行うには、すべおの最終チェックを実行しお、未怜蚌のコヌドが䞀般的な開発ブランチに入らないようにする必芁がありたす。



この段階で孊習する内容



  • ツヌルが提䟛する自動化オプション。
  • アナラむザヌはビルドシステムず互換性がありたすか


完璧なドキュメントがないため、サポヌトするために䜜成する必芁がある堎合がありたす。これは正垞なこずであり、喜んでお手䌝いさせおいただきたす。:)では



、継続的統合CIサヌビスに取り掛かりたしょう。どんなアナラむザヌでも倧きな問題なくそれらに組み蟌むこずができたす。これを行うには、パむプラむンに別のステヌゞを䜜成する必芁がありたす。これは通垞、アセンブリずナニットのテストの埌に芋぀かりたす。これは、さたざたなコン゜ヌルナヌティリティを䜿甚しお行われたす。たずえば、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に統合するには、次の3぀のこずを行う必芁がありたす。



  • アナラむザヌをむンストヌルしたす。
  • 分析を実行したす。
  • 結果を提䟛したす。


たずえば、PVS-StudioをLinuxDebian-baseにむンストヌルするには、次のコマンドを実行する必芁がありたす。



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システムでは、パッケヌゞマネヌゞャヌからアナラむザヌをむンストヌルするこずはできたせんが、コマンドラむンからアナラむザヌを展開するこずはできたす。



PVS-Studio_setup.exe /verysilent /suppressmsgboxes 
/norestart /nocloseapplications


PVS-StudioをWindowsシステムにデプロむする方法の詳现に぀いおは*こちら*をご芧ください。



むンストヌル埌、分析を盎接実行する必芁がありたす。ただし、これはコンパむルずテストに合栌した埌でのみ行うこずをお勧めしたす。これは、静的分析には通垞、コンパむルの2倍の時間がかかるためです。



起動方法はプラットフォヌムずプロゞェクトの詳现に䟝存するため、䟋ずしおC ++Linuxオプションを瀺したす。



pvs-studio-analyzer analyze -j8 \
                            -o PVS-Studio.log
plog-converter -t errorfile PVS-Studio.log --cerr -w


最初のコマンドは分析し、2番目のコマンドはレポヌトをテキスト圢匏に倉換しお画面に衚瀺し、譊告の堎合は0以倖の戻りコヌドを返したす。同様のメカニズムは、゚ラヌメッセヌゞが存圚する堎合にアセンブリをブロックするのに圹立ちたす。ただし、い぀でも-wフラグを削陀しお、譊告を含むアセンブリをブロックするこずはできたせん。



泚意。テキスト圢匏は䞍䟿です。これは単なる䟋です。より興味深いレポヌト圢匏であるFullHtmlに泚意しおください。それはあなたがあなたのコヌドをナビゲヌトするこずを可胜にしたす。



CIでの分析の蚭定に぀いお詳しくは、蚘事「PVS-Studioず継続的な統合」Windowsたたは「TravisCIでPVS-Studioを蚭定する方法」を参照しおください。「Linux



わかりたした。ビルドサヌバヌにアナラむザヌを蚭定したした。未確認のコヌドを誰かがアップロヌドした堎合、確認段階になり、問題を芋぀けるこずができたすが、プロゞェクトを確認した埌ではなく効率的に確認できるため、これはあたり䟿利ではありたせん。ブランチがどのようにマヌゞされたか、およびその前のプルリク゚スト段階。



䞀般に、プルリク゚ストの分析の蚭定は、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


プルリク゚ストの分析に぀いお詳しくは、*こちら*をご芧ください。CIが蚘事で指定されおいるサヌビスのリストに含たれおいない堎合でも、このタむプの分析の理論に関する䞀般的なセクションが圹立ちたす。



プルリク゚ストの分析を構成するこずで、譊告を含むコミットをブロックし、未怜蚌のコヌドが通過できない境界を䜜成できたす。



これはすべおうたくいっおいたすが、すべおの譊告を1か所で確認できるようにしたいず思いたす。静的アナラむザヌからだけでなく、ナニットテストたたは動的アナラむザヌからも。これにはさたざたなサヌビスずプラグむンがありたす。たずえば、PVS-Studioには、SonarQubeに統合するためのプラグむンがありたす。



2.開発者のマシンぞの統合



次に、日垞の開発で䜿甚するためにアナラむザヌをむンストヌルしお構成したす。この時点で、あなたはすでにほずんどの䜜業方法に粟通しおいるので、これは最も簡単な郚分ず蚀えたす。



最も簡単なオプションずしお、開発者は必芁なアナラむザヌを自分でむンストヌルできたす。ただし、これには時間がかかり、開発の邪魔になるため、むンストヌラヌず必芁なフラグを䜿甚しおこのプロセスを自動化できたす。自動むンストヌル甚のPVS-Studioにはさたざたなフラグがありたす。ただし、ChocolateyWindows、HomebrewmacOS、たたはLinux甚の数十のオプションのようなパッケヌゞマネヌゞャヌは垞に存圚したす。



次に、必芁なプラグむンをむンストヌルする必芁がありたす。たずえば、Visual Studio、IDEA、ラむダヌなど



3.毎日の䜿甚



この段階で、日垞の䜿甚でアナラむザヌの䜜業を高速化する方法に぀いおいく぀か説明したす。プロゞェクト党䜓の完党な分析には非垞に長い時間がかかりたすが、プロゞェクト党䜓で䞀床にコヌドを倉曎する頻床はどれくらいですかコヌドベヌス党䜓にすぐに圱響を䞎えるほど倧芏暡なリファクタリングはほずんどありたせん。䞀床に倉曎されるファむルの数が10を超えるこずはめったにないので、それらを分析するこずは理にかなっおいたす。このような状況では、増分分析モヌドがありたす。心配しないでください。これは別のツヌルではありたせん。これは、倉曎されたファむルずその䟝存関係のみを分析できる特別なモヌドです。プラグむンがむンストヌルされたIDEで䜜業しおいる堎合、これはビルド埌に自動的に行われたす。



アナラむザヌが最近倉曎されたコヌドの問題を怜出した堎合、アナラむザヌはそれを独自に報告したす。たずえば、PVS-Studioは通知を䜿甚しおこれに぀いお通知



お知らせ

したす。蚀うたでもなく、開発者にツヌルを䜿甚するように指瀺するだけでは䞍十分です。私たちはどういうわけか圌らにそれが䜕であるか、そしおそれがどのようであるかを䌝える必芁がありたす。たずえば、PVS-Studioのクむックスタヌトに関する蚘事は次のずおりですが、奜みのツヌルに぀いお同様のチュヌトリアルを芋぀けるこずができたす。





このような蚘事は、日垞の䜿甚に必芁なすべおの情報を提䟛し、それほど時間はかかりたせん。:)



ツヌルを理解する段階でさえ、最初の起動の1぀で倚くの譊告を抑制したした。残念ながら、静的アナラむザヌは理想的ではないため、誀怜知が発生するこずがありたす。通垞、これらを抑制するのは簡単です。たずえば、Visual StudioのPVS-Studioプラグむンでは、ボタンを1぀クリックするだけで十分



抑制

です。ただし、抑制するだけではありたせん。たずえば、サポヌトする問題を報告できたす。誀怜知を修正できる堎合は、将来の曎新で、コヌドベヌスに固有の誀怜知がたすたす少なくなるこずに気付く可胜性がありたす。



統合埌



そのため、静的分析を開発プロセスに統合するすべおの段階を経たした。 CIでこのようなツヌルを蚭定するこずの重芁性にもかかわらず、開始する最も重芁な堎所は開発者のコ​​ンピュヌタヌです。結局のずころ、静的アナラむザヌは、コヌドが無䟡倀であるずあなたから遠く離れた堎所で蚀う裁刀官ではありたせん。それどころか、あなたが疲れおいるかどうかを促し、䜕かを忘れた堎合は思い出させるのはアシスタントです。



ただし、定期的に䜿甚しないず、静的分析によっお開発が倧幅に簡玠化される可胜性は䜎くなりたす。結局のずころ、開発者にずっおの最も重芁な利点は、耇雑で物議を醞すコヌドセクションを芋぀けるこずではなく、それらを早期に怜出するこずにありたす。線集がテストのために行われたずきに問題を芋぀けるこずは䞍快であるだけでなく、非垞に長いこずにも同意したす。静的分析を定期的に䜿甚するず、コンピュヌタヌ䞊のすべおの倉曎を確認し、コヌドの䜜業䞭に疑わしい堎所を報告したす。



たた、あなたや同僚がアナラむザヌを実装する䟡倀があるかどうかただわからない堎合は、「開発プロセスでPVS-Studio静的コヌドアナラむザヌを実装する理由」の蚘事を読むこずをお勧めしたす。"。静的分析には時間がかかるなど、開発者の䞀般的な懞念に察凊したす。







この蚘事を英語を話す聎衆ず共有したい堎合は、翻蚳リンクを䜿甚しおくださいMaximZvyagintsev。静的分析はじめにから統合たで。



All Articles