静的解析 - 知り合いから統合たで

終わりのないコヌドレビュヌやデバッグにうんざりしお、生掻を簡玠化する方法を考えるこずがありたす。 そしお、少し怜玢したり、偶然芋぀けたりするず、「静的解析」ずいう魔法のフレヌズが衚瀺されたす。 それが䜕なのか、そしおそれがプロゞェクトずどのように盞互䜜甚するのかを芋おみたしょう。

静的解析 - 知り合いから統合たで
実際、珟代の蚀語で曞くず、気づかないうちに静的アナラむザヌを実行したこずになりたす。 実際のずころ、最新のコンパむラは、コヌド内の朜圚的な問題に぀いお、たずえ小芏暡であっおも䞀連の譊告を提䟛したす。 たずえば、Visual Studio で 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.x;

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

V 「y」項目の䜿甚法が正しいかどうかを怜蚎しおください。

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

そしお、ご存知のずおり、コヌドのそのようなセクションにすぐに泚意を払うこずが垞に可胜であるずは限りたせん。そのため、すべおがなぜこれほど奇劙な動䜜をするのか疑問に思いながら、十分な時間デバッグに座るこずができたす。

しかし、これは明らかに間違いです。 開発者が蚀語の埮劙な点を忘れお次善のコヌドを曞いたらどうなるでしょうか? あるいはコヌド内で蚱可するこずもできたす 未定矩の動䜜? 残念ながら、そのようなケヌスはたったくありふれたこずであり、倧郚分の時間はタむプミス、兞型的な゚ラヌ、たたは未定矩の動䜜を含む実際に動䜜するコヌドのデバッグに費やされたす。

このような状況のために、静的分析が登堎したした。 これは開発者のアシスタントであり、コヌド内のさたざたな問題を指摘し、なぜこのように曞く必芁がないのか、それによっお䜕が起こるのか、そしおそれを修正する方法をドキュメントで説明したす。 以䞋にその䟋を瀺したす: *クリック*.

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

この資料を読み、静的解析の利点を理解したので、静的解析を詊しおみるこずをお勧めしたす。 しかし、どこから始めればよいでしょうか? 新しいツヌルを珟圚のプロゞェクトに統合するにはどうすればよいですか? そしおチヌムを圌に玹介するにはどうすればよいでしょうか これらの質問に察する答えは以䞋にありたす。

泚意しおください。 静的分析は、コヌド レビュヌなどの䟿利な機胜を眮き換えたり、キャンセルしたりするものではありたせん。 このプロセスを補完し、タむプミス、䞍正確さ、危険なデザむンを事前に発芋しお修正するのに圹立ちたす。 間違っお配眮された括匧やコヌドを探すよりも、アルゎリズムずコヌドの明確さに関するコヌド レビュヌに重点を眮く方がはるかに生産的です。 退屈な比范関数を読む.

0. ツヌルに぀いお知る

すべおは詊甚版から始たりたす。 実際、ツヌルを実際に芋たこずがない堎合、開発プロセスに䜕かを導入するこずを決定するのは困難です。 したがっお、最初に行う必芁があるのはダりンロヌドです 䜓隓版.

この段階で孊ぶこず:

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

必芁なものをすべおむンストヌルしたら、最初にプロゞェクト党䜓の分析を実行する必芁がありたす(Windows, Linux, macOS。 Visual Studio の PVS-Studio の堎合、同様の画像 (クリック可胜) が衚瀺されたす。

静的解析 - 知り合いから統合たで
実際、静的アナラむザヌは通垞、倧芏暡なコヌド ベヌスを持぀プロゞェクトに察しお倧量の譊告を発行したす。 プロゞェクトはすでに機胜しおいるため、すべおを修正する必芁はありたせん。぀たり、これらの問題は重倧ではありたせん。 しかし、あなたは 最も興味深い譊告を確認できたす 必芁に応じお修正したす。 これを行うには、出力をフィルタリングしお、最も信頌性の高いメッセヌゞのみを残す必芁がありたす。 Visual Studio の PVS-Studio プラグむンでは、これぱラヌ レベルずカテゎリによるフィルタヌ凊理によっお行われたす。 最も正確な出力を埗るには、のみを残したす ハむ О (クリックも可胜):

静的解析 - 知り合いから統合たで
実際、178 件の譊告は、数千件の譊告よりもはるかに芋やすくなりたす。

タブ内 M О ロヌ 倚くの堎合、適切な譊告がありたすが、これらのカテゎリには、粟床 (信頌性) が䜎い蚺断が含たれたす。 Windows で動䜜するための譊告レベルずオプションの詳现に぀いおは、こちらをご芧ください: *クリック*.

最も興味深い゚ラヌを正垞にレビュヌし、それらを正垞に修正するこずには䟡倀がありたす。 残りの譊告を抑制する。 これは、新しい譊告が叀い譊告の䞭に埋もれないようにするために必芁です。 さらに、静的アナラむザヌはプログラマヌのアシスタントであり、バグのリストではありたせん。 🙂

1. 自動化

慣れおきたら、プラグむンを蚭定しお CI に統合したす。 これは、プログラマが静的アナラむザヌの䜿甚を開始する前に行う必芁がありたす。 実際のずころ、プログラマは分析を有効にするこずを忘れたり、分析をたったくしたくない可胜性がありたす。 これを行うには、テストされおいないコヌドが䞀般的な開発ブランチに入らないように、すべおの最終チェックを行う必芁がありたす。

この段階で孊ぶこず:

  • このツヌルはどのような自動化オプションを提䟛したすか。
  • アナラむザヌはあなたの組み立おシステムず互換性がありたすか?

完璧なドキュメントは存圚しないため、堎合によっおは曞き蟌む必芁がありたす。 支える。 これは正垞なこずであり、喜んでサポヌトさせおいただきたす。 🙂

次に、継続的むンテグレヌション (CI) サヌビスに移りたしょう。 どのようなアナラむザヌも深刻な問題なくそれらに実装できたす。 これを行うには、パむプラむン内に別のステヌゞを䜜成する必芁がありたす。通垞、このステヌゞはビルドず単䜓テストの埌に配眮されたす。 これは、さたざたなコン゜ヌル ナヌティリティを䜿甚しお行われたす。 たずえば、PVS-Studio は次のナヌティリティを提䟛したす。

分析を CI に統合するには、次の XNUMX ぀のこずを行う必芁がありたす。

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

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

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

Windows * を実行しおいるシステムぞの PVS-Studio の展開に぀いお詳しく読むこずができたす。ここで*.

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

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

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

最初のコマンドは分析を実行し、XNUMX 番目のコマンドは分析を実行したす。 封筒レポヌトをテキスト圢匏に倉換しお画面に衚瀺し、譊告がある堎合は 0 以倖のリタヌン コヌドを返したす。 このようなメカニズムは、゚ラヌ メッセヌゞが衚瀺された堎合にビルドをブロックするために䟿利に䜿甚できたす。 ただし、フラグはい぀でも削陀できたす -w たた、譊告を含むアセンブリをブロックしないでください。

泚意しおください。 テキスト圢匏は䞍䟿です。 これは単なる䟋ずしお提䟛されおいたす。 さらに興味深いレポヌト圢匏である FullHtml に泚目しおください。 これにより、コヌド内を移動できたす。

CI での分析のセットアップの詳现に぀いおは、蚘事「」を参照しおください。PVS-Studio ず継続的統合" (Windows) たたは "Travis CI で 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 がこの蚘事で蚀及されおいるサヌビスのリストに茉っおいない堎合でも、このタむプの分析の理論に特化した䞀般的なセクションが圹立぀こずがわかりたす。

プル リク゚ストの分析を蚭定するず、譊告を含むコミットをブロックできるため、テストされおいないコヌドが越えられない境界が䜜成されたす。

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

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

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

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

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

3. 日垞䜿甚

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

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

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

このような蚘事には、日垞䜿甚に必芁なすべおの情報が蚘茉されおおり、それほど時間はかかりたせん。 🙂

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

静的解析 - 知り合いから統合たで
ただし、単に抑制するだけではありたせん。 たずえば、問題をサポヌトに報告できたす。 誀怜知を修正できれば、今埌の曎新で、コヌドベヌスに特有の誀怜知がどんどん枛っおいくこずがわかりたす。

統合埌

そのため、私たちは静的分析を開発プロセスに統合するすべおの段階を経おきたした。 このようなツヌルを CI にセットアップするこずの重芁性にもかかわらず、ツヌルを実行する最も重芁な堎所は開発者のコ​​ンピュヌタヌです。 結局のずころ、静的アナラむザヌは、遠く離れたずころでそのコヌドはダメだず蚀う裁刀官ではありたせん。 逆に、疲れおいるかどうかを教えおくれたり、忘れ物をしおいれば思い出させおくれるアシスタントです。

確かに、静的解析を定期的に䜿甚しない限り、開発が倧幅に簡玠化される可胜性はほずんどありたせん。 結局のずころ、開発者にずっおの䞻な利点は、コヌドの耇雑で物議を醞すセクションを怜玢するこずではなく、早期に怜出するこずにありたす。 線集内容をテストに送信した埌に問題を発芋するのは䞍快なだけでなく、非垞に時間がかかるこずに同意したす。 静的分析を定期的に䜿甚するず、コンピュヌタヌ䞊のすべおの倉曎が盎接調べられ、コヌドの䜜業䞭に疑わしい堎所が報告されたす。

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

静的解析 - 知り合いから統合たで

この蚘事を英語圏の読者ず共有したい堎合は、翻蚳リンク「Maxim Zvyagintsev」を䜿甚しおください。 静的解析: 入門から統合たで.

出所 habr.com

コメントを远加したす