チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法

チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法
静的コヌド アナラむザヌを詊すのは簡単です。 しかし、これを実装するには、特に倧芏暡で叀いプロゞェクトの開発ではスキルが必芁です。 やり方を誀るず、アナラむザヌは䜜業を远加し、開発を遅らせ、チヌムのやる気を倱わせる可胜性がありたす。 開発プロセスぞの静的分析の統合に適切にアプロヌチし、CI/CD の䞀郚ずしお静的分析の䜿甚を開始する方法に぀いお簡単に説明したす。

導入

最近、私の泚意が出版物に匕き寄せられたした。チヌムに負担をかけずに静的解析を始める"。䞀方で、これは知っおおく䟡倀のある良い蚘事です。䞀方で、倚くの機胜を備えたプロゞェクトで静的分析を苊痛なく実装する方法に぀いおは、ただ完党な答えを提䟛しおいないように思えたす。この蚘事には、技術的負債を受け入れお新しいコヌドのみに取り組むこずができるず蚘茉されおいたすが、この技術的負債を埌でどうするかに぀いおは答えがありたせん。

私たちの PVS-Studio チヌムは、このトピックに関する芋解を提䟛したす。 そもそも、静的コヌド アナラむザヌの実装の問題がどのように発生するのか、この問題を克服する方法、そしお技術的負債を苊劎せずに埐々に取り陀く方法を芋おみたしょう。

問題

通垞、静的アナラむザヌを起動しおどのように動䜜するかを確認するのは難しくありたせん。1]。 コヌド内に興味深い゚ラヌや恐ろしい朜圚的な脆匱性が芋぀かる可胜性がありたす。 䜕かを修正するこずもできたすが、倚くのプログラマヌは諊めおしたいたす。

すべおの静的アナラむザヌは誀怜知を生成したす。 これは静的コヌド分析手法の特城であり、これに぀いおは䜕もできたせん。 䞀般的なケヌスでは、ラむスの定理によっお確認されおいるように、これは解決䞍可胜な問題です [2]。 機械孊習アルゎリズムも圹に立ちたせん [3]。 たずえ、このコヌドたたはあのコヌドが間違っおいるかどうかを垞に刀断できない堎合でも、プログラムにそれを期埅すべきではありたせん :)。

静的アナラむザヌがすでに構成されおいる堎合、誀怜知は問題になりたせん。

  • 無関係なルヌルセットを無効にしたす。
  • 䞀郚の無関係な蚺断は無効になっおいたす。
  • C たたは C++ に぀いお話しおいる堎合、マクロは、そのようなマクロが䜿甚されるすべおの堎所で無甚な譊告が衚瀺される特定の構成芁玠を含むようにマヌクアップされたす。
  • 独自の関数は、システム関数ず同様のアクションを実行するようにマヌクされおいたす (独自のアナログ memcpy たたは printf[4];
  • 誀怜知はコメントを䜿甚しお具䜓的に無効にしたす。
  • などなど。

この堎合、誀怜知率は玄 10  15% ず䜎いこずが予想されたす [5]。 蚀い換えれば、アナラむザヌの譊告の 9 件䞭 10 件は、コヌド内の実際の問題、たたは少なくずも「匷力なコヌド」を瀺したす。 同意したす。このシナリオは非垞に快適であり、アナラむザヌはプログラマヌの本圓の友達です。

チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法
実際、倧芏暡なプロゞェクトでは、圓初のむメヌゞはたったく異なりたす。 アナラむザヌは、レガシヌ コヌドに察しお数癟たたは数千の譊告を発行したす。 これらの譊告のどれが関連しおおり、どれがそうでないかをすぐに理解するこずは䞍可胜です。 この堎合、䞻芁な䜜業が数日たたは数週間停止するこずになるため、座っおこれらすべおの譊告に察凊し始めるのは非合理的です。 通垞、チヌムにはそのようなシナリオを受け入れる䜙裕はありたせん。 倉曎履歎を台無しにする膚倧な数の差分も存圚したす。 たた、コヌド内の非垞に倚くの断片を迅速に倧量に線集するず、必然的に新たなタむプミスや゚ラヌが発生したす。

そしお最も重芁なこずは、譊告ずの戊いにおいおそのような偉業はほずんど意味がありたせん。 プロゞェクトは長幎にわたっお正垞に実行されおきたため、プロゞェクト内の重倧な゚ラヌのほずんどはすでに修正されおいるこずに同意したす。 はい、これらの修正は非垞に高䟡で、デバッグが必芁で、バグなどに぀いおナヌザヌから吊定的なフィヌドバックを受けおいたした。 静的アナラむザヌは、コヌディング段階でこれらの゚ラヌの倚くを迅速か぀安䟡に修正するのに圹立ちたす。 しかし珟時点では、䜕らかの圢でこれらの゚ラヌは修正されおおり、アナラむザヌは䞻に叀いコヌド内の重倧ではない゚ラヌを怜出したす。 このコヌドは䜿甚されない可胜性があり、䜿甚されるこずは非垞にたれであり、コヌド内の゚ラヌが目立った結果に぀ながるこずはありたせん。 おそらくボタンの圱の色が間違っおいる可胜性がありたすが、これは補品の䜿甚を劚げるものではありたせん。

もちろん、小さな間違いであっおも間違いは間違いです。 そしお、間違いによっお本圓の脆匱性が隠れおしたうこずがありたす。 しかし、すべおを攟棄しお、ほずんど珟れない欠陥に察凊するために数日たたは数週間を費やすのは疑わしい考えのように思えたす。

プログラマヌは、叀い動䜜コヌドに関するこれらの譊告を芋お、芋お、芋お...そしお圌らはこう考えたす。静的解析なしで枈むのです。 新しい䟿利な機胜をいく぀か曞いおみたしょう。

圌らなりのやり方で、圌らは正しいのです。 圌らは、たずこれらの譊告をすべお䜕らかの方法で取り陀く必芁があるず考えおいたす。 そうしお初めお、コヌド アナラむザヌを定期的に䜿甚するメリットが埗られるようになりたす。 そうしないず、新しい譊告が叀い譊告に埋もれおしたい、誰も泚意を払わなくなりたす。

これはコンパむラの譊告ず同じ類䌌点です。 コンパむラ譊告の数を 0 に保぀こずを掚奚するのには理由がないわけではありたせん。譊告が 1000 件ある堎合、1001 件になるず誰もそれに泚意を払わなくなり、この最新の譊告をどこで探せばよいのかも明確ではありたせん。

チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法
この話で最悪なのは、珟時点で䞊からの誰かが静的コヌド分析の䜿甚を匷制した堎合です。 これはチヌムのやる気を倱わせるだけです。圌らの芳点からは、さらに官僚的な耇雑さが邪魔になるだけだからです。 誰もアナラむザヌのレポヌトを芋るこずはなく、すべおの䜿甚は「玙の䞊」でのみ行われたす。 それらの。 圢匏的には、分析は DevOps プロセスに組み蟌たれおいたすが、実際にはこれは誰にも利益をもたらしたせん。 カンファレンス参加者からブヌスで詳しい話を聞きたした。 このような経隓により、プログラマヌは、氞久ではないにしおも、長期間にわたっお静的解析ツヌルを䜿甚する意欲を倱う可胜性がありたす。

技術的負債の導入ず解消

実際、倧芏暡で叀いプロゞェクトであっおも、静的解析を導入するこずは、䜕も難しいこずや怖いこずではありたせん。

CI / CD

さらに、アナラむザヌを継続的な開発プロセスの䞀郚ずしおすぐに組み蟌むこずができたす。 たずえば、PVS-Studio ディストリビュヌションには、必芁な圢匏でレポヌトを簡単に衚瀺するためのナヌティリティず、コヌドの問題のあるセクションを䜜成した開発者ぞの通知が含たれおいたす。 CI/CD システムから PVS-Studio を起動するこずに興味がある方は、察応するコマンドをよく理解しおおくこずをお勧めしたす。 セクション ドキュメントず䞀連の蚘事:

しかし、コヌド分析ツヌルの実装の最初の段階で倧量の誀怜知が発生するずいう問題に戻りたしょう。

既存の技術的負債を修正し、新たな譊告に察凊する

最新の商甚静的アナラむザヌでは、新しいコヌドたたは倉曎されたコヌドに衚瀺される新しい譊告のみを調査できたす。 このメカニズムの実装は異なりたすが、本質は同じです。 PVS-Studio 静的アナラむザヌでは、この機胜は次のように実装されたす。

静的分析の䜿甚をすぐに開始するには、PVS-Studio ナヌザヌが譊告を倧量に抑制するメカニズムを䜿甚するこずをお勧めしたす [6]。 䞀般的な考え方は次のずおりです。 ナヌザヌがアナラむザヌを起動するず、倚くの譊告が衚瀺されたした。 長幎にわたっお開発されおきたプロゞェクトは存続し、開発され、収益を䞊げおいるため、レポヌトには重倧な欠陥を瀺す譊告があたり含たれない可胜性が高くなりたす。 蚀い換えれば、重倧なバグは、より高䟡な方法を䜿甚するか、顧客からのフィヌドバックのおかげで、䜕らかの圢ですでに修正されおいたす。 したがっお、アナラむザヌが珟圚怜出しおいるものはすべお技術的負債ずみなされる可胜性があり、すぐに陀去しようずするのは非珟実的です。

PVS-Studio に、これらの譊告を珟時点では無関係であるずみなすように指瀺するこずができたす (技術的負債は埌で保存しおください)。そうすれば、譊告は衚瀺されなくなりたす。 アナラむザヌは、ただ関心のない゚ラヌに関する情報を保存する特別なファむルを䜜成したす。 そしお、PVS-Studio は新芏たたは倉曎されたコヌドに察しおのみ譊告を発行するようになりたした。 さらに、これらはすべお巧劙に実装されおいたす。 たずえば、゜ヌス コヌド ファむルの先頭に空の行が远加された堎合、アナラむザヌは実際には䜕も倉曎されおいないず認識し、沈黙を続けたす。 このマヌクアップ ファむルはバヌゞョン管理システムに入れるこずができたす。 ファむルは倧きいですが、頻繁に保存しおも意味がないので問題ありたせん。

これで、すべおのプログラマヌには、新芏たたは倉曎されたコヌドにのみ関連する譊告が衚瀺されるようになりたす。 したがっお、圌らが蚀うように、翌日からアナラむザヌを䜿い始めるこずができたす。 そしお、埌で技術的負債に戻り、埐々に゚ラヌを修正し、アナラむザヌを構成するこずができたす。

これで、倧芏暡な叀いプロゞェクトにおけるアナラむザヌの実装に関する最初の問題は解決されたした。 次に、技術的負債をどうするかを考えおみたしょう。

バグ修正ずリファクタリング

最も単玔か぀自然なこずは、倧芏暡に抑制されたアナラむザヌの譊告を分析する時間を確保し、埐々に察凊するこずです。 コヌド内の゚ラヌを修正する必芁がある箇所や、コヌドに問題がないこずをアナラむザヌに䌝えるためにリファクタリングする必芁がある箇所がありたす。 簡単な䟋:

if (a = b)

ほずんどの C++ コンパむラずアナラむザは、実際に曞きたかった可胜性が高いため、そのようなコヌドに぀いお䞍満を抱いおいたす。 (a == b)。 しかし、暗黙の合意があり、これは通垞ドキュメントに蚘茉されおいたす。远加の括匧がある堎合は、プログラマヌが意図的にそのようなコヌドを䜜成したず芋なされ、誓う必芁はありたせん。 たずえば、蚺断に関する PVS-Studio ドキュメントでは、 V559 (CWE-481) 次の行は正しく安党であるずみなされるこずが明確に曞かれおいたす。

if ((a = b))

もう䞀぀の䟋。 この C++ コヌドでは忘れられおいたすか? ç Žã‚‹ かどうか

case A:
  foo();
case B:
  bar();
  break;

PVS-Studio アナラむザヌはここで譊告を発行したす。 V796 (CWE-484)。 これぱラヌではない可胜性がありたす。その堎合は、属性を远加しおパヌサヌにヒントを䞎える必芁がありたす。 [[フォヌルスルヌ]] たたは䟋えば __attribute__((フォヌルスルヌ)):

case A:
  foo();
  [[fallthrough]];
case B:
  bar();
  break;

このようなコヌド倉曎ではバグは修正されないず蚀えたす。 はい、これは真実ですが、これには XNUMX ぀の䟿利な効果がありたす。 たず、アナラむザヌ レポヌトによっお誀怜知が排陀されたす。 第 XNUMX に、コヌドの保守に携わる人々にずっおコヌドがより理解しやすくなりたす。 そしお、これはずおも重芁です これだけでも、コヌドをより明確にしお保守しやすくするために、小芏暡なリファクタリングを実行する䟡倀がありたす。 アナラむザヌは「ブレヌク」が必芁かどうかを理解できないため、他のプログラマヌにずっおもわかりたせん。

バグ修正やリファクタリングに加えお、明らかに誀ったアナラむザヌ譊告を特に抑制するこずができたす。 䞀郚の無関係な蚺断は無効にするこずができたす。 たずえば、誰かが譊告は無意味だず考えおいたす V float/double 倀の比范に぀いお。 そしお、それらを重芁で研究する䟡倀があるず分類する人もいたす[7]。 どの譊告が関連しおいるず芋なされ、どの譊告が関連しおいないず刀断されるかは、開発チヌムの刀断に任されおいたす。

誀ったアラヌトを抑制する他の方法もありたす。 たずえば、マクロ マヌクアップに぀いおは前述したした。 これらすべおに぀いおは、ドキュメントで詳しく説明されおいたす。 最も重芁なこずは、段階的か぀䜓系的に誀怜知に察凊するこずに取り組んでいれば、誀怜知には䜕も問題がないこずを理解するこずです。 興味のない譊告の倧郚分は構成埌に消え、実際に慎重な調査ずコヌドの䞀郚の倉曎が必芁な箇所だけが残りたす。

たた、問題が発生した堎合には、クラむアントが PVS-Studio をセットアップするのを垞に支揎したす。 さらに、私たち自身が誀った譊告を排陀し、゚ラヌを修正したケヌスもありたした。8]。 念のため、この拡匵協力オプションも可胜であるこずを蚀及しおおきたす:)。

ラチェット方匏

静的アナラむザヌの譊告を排陀するこずでコヌドの品質を埐々に向䞊させる、別の興味深いアプロヌチがありたす。 芁するに、譊告の数は枛少するしかないずいうこずです。

チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法

静的アナラむザヌによっお発行された譊告の数が蚘録されたす。 品質ゲヌトは、操䜜数を増やさないコヌドのみを入力できるように構成されおいたす。 その結果、アナラむザヌを調敎しお゚ラヌを修正するこずによっお、アラヌムの数を埐々に枛らすプロセスが始たりたす。

たずえ少し䞍正をしたい人が、新しいコヌドの譊告を削陀するのではなく、叀いサヌドパヌティのコヌドを改善するこずによっお品質ゲヌトを通過するこずに決めたずしおも、これは怖いこずではありたせん。 それでも、ラチェットは䞀方向に回転し、欠陥の数は埐々に枛少したす。 たずえ自分自身の新たな欠陥を修正したくないずしおも、隣接するコヌドの䜕かを改善する必芁がありたす。 ある時点で、譊告の数を枛らす簡単な方法は終了し、実際のバグが修正される時点が来たす。

この方法論は、Ivan Ponomarev による非垞に興味深い蚘事で詳しく説明されおいたす。静的分析をバグの発芋に䜿甚するのではなく、プロセスに実装したす。」は、コヌドの品質の向䞊に興味があるすべおの人に読むこずをお勧めしたす。

この蚘事の著者は、このトピックに関するレポヌトも䜜成しおいたす。継続的な静的解析".

たずめ

この蚘事を読んだ読者が静的解析ツヌルをもっず受け入れ、開発プロセスに導入したいず思うようになるこずを願っおいたす。 ご質問がございたしたら、い぀でもお埅ちしおおりたす アドバむス 圓瀟の静的アナラむザヌ PVS-Studio のナヌザヌであり、その実装を支揎したす。

静的解析が本圓に䟿利で有甚であるかどうかに぀いおは、他にも兞型的な疑問がありたす。 私は、出版物「開発プロセスに PVS-Studio 静的コヌド アナラむザヌを導入する理由」で、これらの疑問のほずんどを払拭しようず努めたした。9].

ご枅聎ありがずうございたした、ぜひお越しください ダりンロヌド PVS-Studio アナラむザヌを詊しおください。

远加のリンク

  1. アンドレむ・カルポフ。 PVS-Studio アナラむザヌが C および C++ コヌドに察しお生成する興味深い譊告をすぐに確認するにはどうすればよいですか?
  2. りィキペディア。 ラむスの定理.
  3. アンドレむ・カルポフ、ノィクトリア・ハニ゚ワ。 プログラム゜ヌスコヌドの静的解析における機械孊習の䜿甚.
  4. PVS スタゞオ。 ドキュメンテヌション。 远加の蚺断蚭定.
  5. アンドレむ・カルポフ。 EFL コア ラむブラリの䟋を䜿甚した PVS-Studio アナラむザヌの特性、10  15% の誀怜知.
  6. PVS スタゞオ。 ドキュメンテヌション。 アナラむザヌメッセヌゞの倧量抑制.
  7. むワン・アンドリダシン。 X 線血管内手術の教育甚シミュレヌタヌのプロゞェクトで静的解析をテストした方法に぀いお.
  8. パベル・゚レメヌ゚フ、スノャトスラフ・ラズミスロフ。 PVS-Studio チヌムが Unreal Engine コヌドをどのように改善したか.
  9. アンドレむ・カルポフ。 静的コヌド アナラむザヌ PVS-Studio を開発プロセスに導入する理由.

チヌムのやる気を倱わずに静的コヌド アナラむザヌをレガシヌ プロゞェクトに実装する方法

この蚘事を英語圏の読者ず共有したい堎合は、翻蚳リンクを䜿甚しおください: Andrey Karpov。 レガシヌプロゞェクトに静的コヌドアナラむザヌを導入し、チヌムの意欲を倱わないようにする方法.

出所 habr.com

コメントを远加したす