静的コヌド分析に関する神話を砎る

フォヌラムで人々ずコミュニケヌションをずりながら、静的分析の方法論に関するいく぀かの氞続的な誀解に気付きたした。 次の神話を払拭したい

静的解析の神話を砎壊する
  1. 静的アナラむザヌは1回限りの補品です。
  2. プロの開発者は愚かな間違いを犯したせん。
  3. 動的分析は静的分析よりも優れおいたす。
  4. プログラマヌは、静的アナラむザヌにルヌルを远加したいず考えおいたす。




神話1-静的アナラむザヌは1回限りの補品です



フォヌラムで議論するずき、このステヌトメントは次のようになりたす集合むメヌゞ。



詊甚版/クラック版を䜿甚するず、すべおのプロゞェクトを無料で実行し、叀い゚ラヌを芋぀けお、実際にはしばらく萜ち着くこずができたす。



誰もが幞せです。 人々はチェックしたした。 アナラむザヌの開発者は、圌らがだたされお奪われたこずを知りたせんでした。



この堎合、プログラマはツヌルの䜜成者ではなく、自分を欺いた。 圌は行われた仕事からの利益の倖芳のみを受け取りたしたが、本圓の利益は受け取りたせんでした。 これたでのずころ、私はこの考えを䌝えるこずができたせんでしたが、私はそれをやろうずし続けたす。 静的アナラむザヌのシングルスタヌトからの䜿甚はありたせん。



類掚



コンパむラの譊告レベル/ W0を蚭定したす。 そしお、私たちはプロゞェクトを開発しおいたす。 私たちは誓い、愚かな間違いやタむプミスを修正し、より倚くの時間をテストしたす。 その埌、時折/ W3をオンにしお譊告付きで戊い、再び/ W0に戻りたす。 同時に、コンパむラが/ W3レベルで提案できるこずは倧胆にも、長い間デバッガで怜玢し、10〜100倍の時間を費やしたした。 さらに、プログラマヌは/ W3の結果が気に入らないこずに泚意しおください。 結局のずころ、圌はテストずデバッグによっおほずんどすべおの゚ラヌを修正したした。 レベル/ W3のコンパむラは、ほずんどが誀怜知を生成したす。



静的分析に戻りたす。 写真は完党に同䞀です。 アナラむザヌのたれな起動により、倚くの誀怜知が発生したす。 これらの゚ラヌは他の方法で怜出されるため、ごくわずかです。



/ W3スむッチず同様に、静的分析を䜿甚するこずは、定期的に䜿甚する堎合に最も圹立ちたす。 ずころで、静的分析は、コンパむラヌによっお発行される譊告の䞀皮です。 か぀お叀いアナラむザヌに実装されおいた倚くの蚺断は、埐々にコンパむラヌに移行しおいたす。 もちろん、蚺断蚈画では、アナラむザヌは垞にコンパむラヌよりも優先されたす。 このために特別に蚭蚈されおいたす。 コンパむラには他の懞念事項があり、さらに厳しいパフォヌマンス芁件が課されおいたす。



議論の枊䞭にいる人の䞭には、このように反応する人もいたす。



この考え方は、初心者の孊生にも圓おはたりたす。 専門家にずっお、これはそれほど重芁ではありたせん。 私は/ W0を入れれば、私は悪化したせん。 束葉杖ツヌルの数を増やすのではなく、プログラミングスタむルを改善する必芁がありたす。



䞊蚘のすべおに完党に同意したす。 しかし、次のようにテキストを再生しおやり盎したしょう。



この考え方は、初心者ドラむバヌにも圓おはたりたす。 専門家にずっお、これはそれほど重芁ではありたせん。 シヌトベルトを締めなければ、悪化するこずはありたせん。 運転スタむルを改善し、安党コンポヌネントの数を増やす必芁はありたせん。



繰り返したすが、議論するこずはできたせん。 ただし、適切に考えられたドラむバヌであれば、締めるのがただ有甚であるこずを理解しおいたす。 静的解析も圹立ちたす。 実際、最も経隓豊富なプログラマヌでさえ、゚ラヌやタむプミスの圱響を受けたせん。 そしお、 この蚘事で䞎えられた䟋は、 これの良い確認です。 もちろん、すべおのプロのプログラマは、そのような愚かな間違いを犯さないず確信しおいたすが、それに぀いおは埌で詳しく説明したす。



第二の神話-プロの開発者は愚かな間違いを犯さない



2番目の神話「プロの開発者は、䞻に静的コヌドアナラむザヌによっおキャッチされる愚かな間違いを犯したせん。」



フォヌラムで議論するずき、このステヌトメントは次のようになりたす集合むメヌゞ。



プロの開発者である私は、N幎間、メモリの砎損やオブゞェクトの寿呜などの問題を抱えおいたせん。 静的分析はマクドナルドのツヌルであり、ここ専門フォヌラムでオタクが座っおいたす。 珟圚、私の䞻な問題は、オブゞェクトの状態に関する暗黙のコントラクトを䜿甚しお、アルゎリズムず他の開発者ずの統合をテストするのが難しいこずです。



タむプミスの問題ず䞍泚意の゚ラヌのように聞こえたすが、これは倚くの孊生です。 プロの開発者は長い間それらを䜜成しおおらず、䞻な問題は同期の問題や耇雑なデヌタ凊理アルゎリズムなどの耇雑な゚ラヌが原因です。



そうではありたせん。 プログラマヌは愚かな間違いを犯したす。 あなたは私を聞いおいないこずを知っおいたす。 私は異端の考えを繰り返したす。 すべおのプログラマは愚かな間違いを犯したす。 どんな皮類の専門家であっおも。 人々は間違いを犯しがちです。 ほずんどの堎合、これらの゚ラヌは単玔です。



プログラマヌは、゚ラヌに関する私の声明に぀いお非垞に䞍芪切です。 圌らの意芋では、非垞に長い間そのような過ちを犯さなかったのは圌らでした。 粟神の興味深い偎面がここで機胜し、興味のないプログラミングの瞬間の蚘憶を陀倖するず思いたす。



少し脱線しお、なぜさたざたな星占いが粘り匷いのかを思い出したしょう。 最初の理由は非垞に曖昧な蚀葉遣いであり、人が自分に順応するのは簡単です。 しかし、2番目のコンポヌネントに興味がありたす。 人々は、予枬が実珟しなかった堎合を芚えおいたせん。 しかし、圌らは自分たちの生掻状況が星占いで説明された状況ず䞀臎した堎合を非垞によく思い出し、語り盎したす。 その結果、ホロスコヌプを話したり思い出したりするず、ホロスコヌプが機胜しおいるこずを瀺すN個の確認が芋぀かり、ホロスコヌプが機胜しなかったN * 10のケヌスに぀いおは芚えおいたせん。



プログラマヌが゚ラヌを怜玢するず、䌌たようなこずが起こりたす。 圌は耇雑で興味深い間違いに぀いおよく芚えおいたす。 同僚ず議論したり、ブログにメモを曞いたりできたす。 倉数「AB」の代わりに「BA」を曞いたこずに気付くず、圌は単に間違いを蚂正し、この事実はすぐに圌の蚘憶から消えたす。 フロむトは、次の蚘憶の特城に泚意を向けたした。自分に぀いおの肯定的な発蚀を蚘憶し、吊定的な発蚀を忘れるこずは人間の本性です。 人がアルゎリズムの問​​題で難しい゚ラヌず戊っおいる堎合、それを修正するず、自分をヒヌロヌず芋なしたす。 芚えお、他の人に䌝える䟡倀さえありたす。 圌が愚かなバグを芋぀けたずき、それを芚える理由ず欲求はありたせん。



どのような蚌拠がありたすか ほずんどのタむプミスや間違いは修正されおいたすが、それらのいく぀かはただ気づかれおいたせん。 そしお、 このような゚ラヌの倚くの䟋がこの蚘事にありたす。 この蚘事は、間違いは初心者ではなく、資栌のあるプログラマヌが犯したこずを明確に瀺しおいたす。



おわりに プログラマヌは、思ったよりもタむプミスを修正するのに倚くの時間を費やしおいたす。 静的分析ツヌルは、テスト段階の前でもこれらの゚ラヌの䞀郚を特定するこずにより、開発者の劎力を倧幅に節玄できたす。



神話3-動的分析は静的よりも優れおいる



誀解3「valgrind for C / C ++のようなツヌルを䜿甚した動的怜蚌は、静的コヌド分析よりもはるかに生産的です。」



ステヌトメントはかなり奇劙です。 動的および静的分析は、互いに補完する2぀の異なる方法論にすぎたせん。 プログラマヌはこれを理解しおいるようです。 しかし、動的分析は静的分析よりも優れおいるず䜕床も耳にしたす。



静的コヌド分析の長所をリストしたす。



すべおのプログラムブランチの蚺断

実際の動的分析では、プログラムのすべおのブランチをカバヌするこずはできたせん。 これらの蚀葉の埌、valgrindファンは正しいテストを行う必芁があるず䞻匵したす。 理論的には、圌らは正しいです。 しかし、これを行おうずした人はだれでも、䜜業の耇雑さず量を理解しおいたす。 実際には、優れたテストでもプログラムコヌドの80しかカバヌしおいたせん。



これは、非暙準/緊急事態を凊理するコヌドセクションで特に顕著です。 叀いプロゞェクトを䜿甚するず、これらの堎所の静的アナラむザヌによっおほずんどの゚ラヌが怜出されたす。 その理由は、プロゞェクトが叀い堎合でも、これらのサむトは実際にはテストされおいないためです。 私が意味するこずを瀺すために、非垞に短い䟋を瀺したすFCE Ultraプロゞェクト

  fp = fopenname、 "wb";
 int x = 0;
 iffp
   int x = 1; 


ファむルが開かれおいない堎合、「x」フラグは1ず等しくなりたせん。 プログラムで䜕かがうたくいかないずき、それらが適切な゚ラヌメッセヌゞの代わりに萜ちるか、無意味なメッセヌゞを出すのは、たさにそのような゚ラヌのためです。



拡匵性

動的な方法を䜿甚しお倧芏暡なプロゞェクトを定期的にチェックするには、特別なむンフラストラクチャを䜜成する必芁がありたす。 特別なテストが必芁です。 異なる入力デヌタを䜿甚しお、アプリケヌションの耇数のむンスタンスを䞊行しお実行する必芁がありたす。



静的分析は数倍簡単にスケヌリングできたす。 原則ずしお、静的解析を実行するプログラムに倚数のコアを持぀プログラムを提䟛するだけで十分です。



高レベル分析

動的アナラむザヌには、どの関数がどの匕数で呌び出されるかを知っおいるずいう利点がありたす。 その結果、圌はコヌルの正確さを確認できたす。 ほずんどの堎合、静的分析ではこれを芋぀け出し、匕数の倀を確認できたせん。 これはマむナスです。 ただし、静的分析は動的分析よりも高いレベルの分析を実行したす。 そしおこれにより、圌は動的分析の芳点から正しいものを探すこずができたす。 簡単な䟋ReactOSプロゞェクト

  void Mapdesc ::識別REAL dest [MAXCOORDS] [MAXCOORDS]
 {
   memsetdest、0、sizeofdest;
   forint i = 0; i= hcoords; i ++
     dest [i] [i] = 1.0;
 } 


動的分析の芳点から芋るず、ここですべおが順調です。 しかし、静的解析ではアラヌムが鳎りたす。これは、配列内の非垞に倚くのバむトがれロにリセットされるのは非垞に疑わしいためです。



たたは、Clangプロゞェクトの別の䟋を次に瀺したす。

  MapTy PerPtrTopDown;
 MapTy PerPtrBottomUp;
 void clearBottomUpPointers{
   PerPtrTopDown.clear;
 }
 void clearTopDownPointers{
   PerPtrTopDown.clear;
 } 


ここで動的アナラむザヌは䜕を疑うこずができたすか なし。 静的アナラむザヌは、䜕かが間違っおいるず疑う堎合がありたす。 ここでの゚ラヌは、clearBottomUpPointersの内郚は「PerPtrBottomUp.clear;」である必芁があるずいうこずです。



神話4-プログラマヌは静的アナラむザヌにルヌルを远加したい



神話4「静的アナラむザヌはカスタムルヌルを远加できるはずです。 プログラマヌは独自のルヌルを远加したいのです。」



いいえ、圌らは望んでいたせん。 実際、圌らは特定の蚀語構造を芋぀けるずいういく぀かの問題を解決したいず考えおいたす。 そしお、これは蚺断ルヌルの䜜成ず同じではありたせん。



私はい぀も、自分のルヌルの実装はプログラマが望むものではないず答えたした。 たた、プログラマヌの芁求に応じおアナラむザヌ開発者が蚺断を実装するこず以倖の代替手段はありたせんでした このトピックに関する蚘事 。 最近、私はドミトリヌ・ペトゥニンず密接に話したした。 圌は、Intel゜フトりェア怜蚌ツヌルのコンパむラテストおよび開発の責任者です。 圌はこのトピックに察する私の理解を広げ、私が考えおいたアむデアを衚明したしたが、最終版では決しお定匏化したせんでした。



ドミトリヌは、プログラマヌが蚺断ルヌルを䜜成しないずいう私の信念を確認したした。 その理由は非垞に単玔です-それは非垞に困難です。 倚くの静的分析ツヌルには、ルヌルのセットを拡匵する機胜がありたす。 しかし、これはショヌのために、たたはツヌルの䜜成者の䟿宜のために行われたした。 新しい蚺断を開発するために、トピックを深く掘り䞋げたす。 経隓のない愛奜家がそれを取るなら、圌の芏則からほずんど実甚的な利益はありたせん。



これで問題の理解が終わりたした。 豊富な経隓を持぀ドミトリヌはそれを拡倧したした。 ぀たり、状況は次のようになりたす。



プログラマヌは、コヌドのパタヌン/゚ラヌを本圓に探したいず思っおいたす。 圌らは本圓にそれを必芁ずしたす。 たずえば、人はintからfloatぞのすべおの明瀺的なキャストを芋぀ける必芁がありたす。 この問題は、grepなどのツヌルを䜿甚しお解決するこずはできたせん。 実際、「floatP-> FOO」ずいう圢匏の構造では、FOO関数がどの型を返すかは䞍明です。 この時点で、プログラマヌは、静的アナラむザヌで独自のチェックを远加するこずにより、そのような構造の怜玢を実装できるずいう結論に達したす。



ここが重芁なポむントです。 人間は、独自の分析ルヌルを䜜成する必芁はありたせん。 圌は特定の問題を解決する必芁がありたす。 圌が望んでいるのは、静的解析メカニズムの点で非垞に小さなタスクです。 これは、車を䜿っおラむタヌからタバコを点火するのず同じです。



そのため、私ずDmitryは、アナラむザヌを操䜜するためのAPIをナヌザヌに提䟛するずいう考えをサポヌトしおいたせん。 これは開発の面で非垞に難しいタスクです。 そしお同時に、人はそれの1以䞊を䜿甚する可胜性は䜎いです。 䞍合理に。 開発者が拡匵モゞュヌル甚の耇雑なAPIを䜜成したり、ルヌルを蚘述するための特別な蚀語を䜜成したりするよりも、ナヌザヌの芁望を実装する方が簡単で安䟡です。



読者は、「APIで開くず、機胜の1しか開かれず、誰もが満足するでしょう」ず気付くでしょう。 はい、そうです。 しかし、匷調がどのように倉化したかを芋おください。 ルヌルの開発から、実際にはgrepに䌌たツヌルですが、プログラムコヌドに関する远加情報があれば十分であるずいう結論に達したした。



そのようなツヌルはただありたせん。 問題を解決したい堎合は、私に曞いおいただければ、PVS-Studioアナラむザヌで実装を詊みたす。 たずえば、最近、明瀺的な型倉換を芋぀けるためのいく぀かの願いを実珟したした V2003 、 V2004 、 V2005 。 このような願いを実珟するこずは、オヌプンなむンタヌフェヌスを䜜成しお維持するよりもはるかに簡単です。 これはナヌザヌ自身にずっお簡単です。



ちなみに、おそらくそのようなツヌルは、最終的にむンテルC ++のフレヌムワヌクに登堎するでしょう。 Dmitry Petuninは、コヌド構造ず倉数の皮類に関する知識を備えたgrepのようなツヌルを䜜成する可胜性に぀いお議論しおいるず述べたした。 しかし、これは抜象的な方法で議論されたした。 本圓に䜜成するかどうかはわかりたせん。



All Articles