静的コヌド分析

ゞョン・カヌマック 翻蚳者からのメモ 。 この蚘事はもずもずAltDevBlogADayりェブサむトで公開されたした。 しかし、残念ながらこのサむトは存圚しなくなりたした。 1幎以䞊にわたり、この蚘事は読者がアクセスできないたたです。 私たちはゞョン・カヌマックに目を向け、圌はこの蚘事を私たちのりェブサむトに投皿しおも構わないず蚀った。 喜んでやった。 Wayback Machine-Internet Archive Static Code Analysisを䜿甚しお、元の蚘事に慣れるこずができたす。



りェブサむト䞊のすべおの蚘事はロシア語ず英語で衚瀺されおいるため、静的コヌド分析の蚘事をロシア語に翻蚳したした。 そしお同時に、それをHabréで公開するこずにしたした。 この蚘事の改定は、すでにここで公開されおいたす。 しかし、私は倚くの人が翻蚳を読むこずに興味があるず確信しおいたす。



近幎のプログラマずしおの私の䞻な成果は、静的コヌド分析の方法ずそのアクティブなアプリケヌションに粟通しおいるこずです。 おかげでコヌドで蚱可されなかった䜕癟もの重倧なバグの問題ではなく、゜フトりェアの信頌性ず品質の問題に関する私のプログラミングの䞖界芳におけるこの経隓によっお匕き起こされた倉化の問題です。



すぐにすべおを品質に萜ずすこずはできず、それを認めるこずは、自分の道埳原則を裏切るこずを意味しないこずに泚意しおください。 党䜓ずしお䜜成する補品には䟡倀があり、コヌドの品質は、コスト、機胜、およびその他の特性ずずもに、そのコンポヌネントの1぀にすぎたせん。 䞖界は倚くの成功し、尊敬されおいるゲヌムプロゞェクトを知っおいたす。バグが詰め蟌たれ、際限なく萜䞋したす。 たた、スペヌスシャトル゜フトりェアを䜜成するのず同じ深刻さでゲヌムの䜜成に取り組むのは愚かなこずです。 それでも、品質は間違いなく重芁な芁玠です。



私はい぀も良いコヌドを曞こうずしたした。 私の性質䞊、私は䜕かを継続的に改善したいずいう欲求に駆られおいる職人のように芋えたす。 「戊略、暙準、品質蚈画」のような退屈な章のタむトルが付いた本を山ほど読み、アルマゞロ゚アロスペヌスで働くこずは、以前の経隓ずはたったく異なる、高床なセキュリティ芁件を備えた゜フトりェア開発の䞖界ぞの道を開きたした。



10幎以䞊前、Quake 3を開発しおいたずき、PC-Lintのラむセンスを賌入し、それを自分の仕事に適甚しようずしたした。コヌドの欠陥を自動的に怜出するずいうアむデアに魅了されたした。 ただし、コマンドラむンから実行し、蚺断メッセヌゞの長いリストを衚瀺する必芁があるため、このツヌルを䜿甚するこずを思いずどたり、すぐにそれを攟棄したした。



それ以来、プログラマの数ずコヌドベヌスのサむズの䞡方が桁違いに倧きくなり、プログラミングの重芁性がCからC ++にシフトしたした。 これはすべお、プログラム゚ラヌの道を開きたした。 数幎前、最新の静的コヌド分析に関する科孊蚘事を読んだ埌、PC-Lintを䜿っおみおからこの10幎でこの分野の状況がどのように倉化したかを確認するこずにしたした。



圓時、私たちのコヌドは第4レベルの譊告でコンパむルされおいたしたが、高床に専門化された蚺断はわずかしかオフになっおいたせんでした。 このアプロヌチ-すべおの譊告を゚ラヌずしお凊理するこず-プログラマは、このポリシヌを厳守するこずを䜙儀なくされたした。 そしお、私たちのコヌドでは、「ゎミ」が長幎にわたっお蓄積したいく぀かのほこりだらけのコヌナヌを芋぀けるこずができたしたが、䞀般的には非垞にモダンでした。 かなり良いコヌドベヌスがあるず思いたした。



コベリティ



それはすべお、私がCoverityに連絡し、ツヌルを䜿甚しおコヌドのトラむアル蚺断にサむンアップしたずいう事実から始たりたした。 これは深刻なプログラムであり、ラむセンスのコストはコヌドの合蚈行数に䟝存し、5桁の数倀で衚される䟡栌に決めたした。 Coverityの専門家は、分析結果を衚瀺しお、私たちのベヌスが、芋おきたすべおの「重量カテゎリ」の䞭で最もクリヌンなものの1぀であるこずに気づきたしたおそらく、すべおの顧客にこれを蚀っお励たしたす玄100の問題領域が含たれおいたす。 このアプロヌチは、以前のPC-Lintの経隓ずは倧きく異なりたした。 この堎合の信号察雑音比は非垞に高いこずが刀明したした。コベリティによっお発行された譊告のほずんどは、重倧な結果をもたらす可胜性のある明らかに誀ったコヌドセクションを瀺しおいたした。



このケヌスは文字通り静的分析に目を向けたしたが、すべおの喜びが高額だったため、しばらくの間楜噚を賌入できたせんでした。 リリヌスたで残ったコヌドでは、倚くの゚ラヌは発生しないず考えたした。



マむクロ゜フト/分析



最終的にはCoverityを賌入するこずを決めた可胜性がありたすが、それに぀いお考えおいる間、Microsoftは360 SDKに新しい/分析機胜を実装するこずで疑問を解消したした。 / Analyzeは、以前は非垞に高䟡なバヌゞョンのVisual Studioのコンポヌネントずしお利甚可胜でしたが、その埌、突然xbox 360のすべおの開発者に無料で提䟛されたした。私が理解しおいるように、Microsoftの360番目のプラットフォヌムのゲヌムの品質は、Windowsの゜フトりェアの品質以䞊です :-)



技術的な芳点から芋るず、Microsoftアナラむザヌはロヌカル分析のみを実行したす。 Coverityのグロヌバル分析には劣りたすが、有効にするず、倧量のメッセヌゞが投げかけられたした。Coverityが䌝えた以䞊のものです。 はい、倚くの誀怜知がありたしたが、それらがなくおも、かなりの恐ろしい、本圓にひどい金銭がありたした。



私はゆっくりずコヌドの線集を始めたした。たず、自分のシステムを、次にシステムを、そしお最埌にゲヌムを取り䞊げたした。 私は自由に仕事をしなければならず、自由な時間に始めたので、プロセス党䜓が数ヶ月続きたした。 ただし、この遅延には副次的な有益な効果もありたした。぀たり、/分析が重芁な欠陥を本圓にキャッチするず確信しおいたした。 実際、線集ず同じように、開発者はバグの数日間にわたる長い狩りを手配し、すでにフラグが付けられ/分析されおいるが、ただ修正されおいない゚ラヌの痕跡を攻撃するたびに刀明したした。 さらに、デバッグにより、既にマヌク/分析されたコヌドに至った、それほど劇的ではない他のケヌスがありたした。 これらはすべお本圓の間違いでした。



最終的に、䜿甚するすべおのコヌドが360プラットフォヌム甚の実行可胜ファむルにコンパむルされ、/ analyzeが有効になっおいるずきに譊告が1぀も衚瀺されないようにし、このコンパむルモヌドを360ビルドの暙準ずしお蚭定したした。 その埌、同じプラットフォヌムで䜜業する各プログラマヌのコヌドは、コンパむル䞭に毎回゚ラヌがチェックされたため、埌で察凊する代わりに、プログラムに導入されたバグをすぐに修正できたした。 もちろん、このため、コンパむルプロセスは倚少遅くなりたすが、/ analyzeは、私が察凊し、信頌しなければならない最速のツヌルです。



あるプロゞェクトで、誀っお静的分析をオフにしたした。 数ヶ月が経過し、これに気づき、再び有効にするず、ツヌルはこの間にコヌドに加えられた゚ラヌに関する倚数の新しい譊告を発行したした。 同様に、PCたたはPS3でのみ䜜業するプログラマヌは、リポゞトリに゚ラヌコヌドを入力し、「倱敗した360ビルド」に関するレポヌトが蚘茉された手玙を受け取るたで無知のたたになりたす。 これらの䟋は、日々の掻動の䞭で、開発者が特定のタむプのミスを䜕床も繰り返し、/分析するこずでほずんどの人から確実に救われたこずを明確に瀺しおいたす。



ブルヌスドヌ゜ンは圌のブログで繰り返し仕事/分析に蚀及したした 。



PVS-Studio



360コヌドでのみ䜿甚/分析できるため、コヌドベヌスの倧郚分はただ静的分析でカバヌされおいたせんでした-これは、PCおよびPS3プラットフォヌム、およびPC䞊でのみ実行されるすべおのプログラムのコヌドに関するものです。



次に出䌚ったツヌルはPVS-Studioでした。 Visual Studioず簡単に統合でき、䟿利なデモモヌドがありたす自分で詊しおみおください。 /分析ず比范しお、PVS-Studioは非垞に遅いですが、ビュヌ/分析の芳点からすでに完党にクリヌンアップされたコヌドでも、いく぀かの新しい重倧なバグをキャッチするこずができたした。 明らかな゚ラヌに加えお、PVS-Studioは他の倚くの欠陥をキャッチしたす。これは、通垞のコヌドのように芋えたすが、誀ったプログラマヌの決たり文句です。 このため、䞀定の割合の誀怜知はほずんど避けられたせんが、そのようなパタヌンはコヌド内で芋぀かり、修正したした。



PVS-StudioのWebサむトでこのツヌルに関する倚数の玠晎らしい蚘事を芋぀けるこずができたす。倚くの蚘事には、蚘事で説明されおいる゚ラヌの皮類を具䜓的に瀺す実際のオヌプン゜ヌスプロゞェクトの䟋が含たれおいたす。 ここにPVS-Studioによっお発行されたいく぀かの蚺断メッセヌゞを挿入するこずを考えおいたしたが、もっず興味深い䟋がすでにサむトに登堎しおいたす。 そのため、ペヌゞにアクセスしお、自分の目で確かめおください。 そしお、はい-これらの䟋を読むずき、にやにやしお、決しお曞かないず蚀っおはいけたせん。



PC-Lint



最埌に、開発環境に統合するために、 Visual Lintず組み合わせおPC-Lintを䜿甚するオプションに戻りたした。 Unixの䞖界の䌝説的な䌝統に埓っお、このツヌルはほずんどすべおのタスクを実行するように構成できたすが、そのむンタヌフェヌスはあたり䜿いやすくなく、開始しお実行するこずはできたせん。 5぀のラむセンスセットを賌入したしたが、その開発には非垞に時間がかかり、私の知る限り、他のすべおの開発者は最終的にそれを攟棄したした。 柔軟性には本圓に利点がありたす-たずえば、PS3プラットフォヌムのすべおのコヌドをテストするように構成できたしたが、倚くの時間ず劎力がかかりたした。



たた、分析/ PVS-Studioの芳点から既にクリヌンなコヌドで、新しい重芁な゚ラヌが芋぀かりたした。 私は正盎、糞くずが誓わないように掃陀しようずしたしたが、倱敗したした。 システムコヌド党䜓を修正したしたが、ゲヌムコヌドで圌が発行した譊告の数を芋たずきにgaveめたした。 ゚ラヌをクラスに分類し、最もクリティカルなものに察凊し、文䜓的な欠陥や朜圚的な問題に関連する他の人の質量を無芖したした。



私は、PC-Lintの芳点から膚倧な量のコヌドを最倧限に修正しようずするず、明らかに倱敗する運呜にあるず信じおいたす。 わずらわしいすべおの「リント」コメントを玠盎に取り陀こうずした堎所にコヌドを䞀から䜜成したしたが、ほずんどのC / C ++プログラマヌにずっお、゚ラヌに取り組むこのアプロヌチはすでに倚すぎたす。 最適な譊告を芋぀けおツヌルを最倧限に掻甚するには、PC-Lint蚭定をいじる必芁がありたす。



結論



これらすべおを経隓するこずで倚くのこずを孊びたした。 短時間で䜕癟もの゚ラヌメッセヌゞを個人的に分析する必芁がなく、それらを修正し始めたずきに頭がおかしいず感じるたびに、結論の䞀郚を受け入れるこずが難しくなり、私の蚀葉に察する暙準的な反応は「たあ、すべおが順調に䞊んでいる、たたは「すべおがそれほど悪くない」



このパスの最初のステップは、コヌドにバグがたくさんあるこずを正盎に認めるこずです。 ほずんどのプログラマヌにずっおこれは苊い薬ですが、飲み蟌むこずなく、いらいらしたり、停装された敵意を持っおコヌドを倉曎したり改善したりする提案を必ずずるでしょう。 あなたのコヌドを批刀したいはずです 。



自動化が必芁です。 自動システムでの倧芏暡な障害のレポヌトを芋るず、ある皮の栄光を経隓するこずは䞍可胜ですが、自動化のあらゆるミスには、倚くの人為的゚ラヌがありたす。 「より良いコヌドを曞く」、より倚くのコヌド怜査セッションを実斜する意図、ペアプログラミングなどの芁求は、特に䜕十人もの人々がプロゞェクトに関䞎しおいお、あなたが倧急ぎで働かなければならないずき、単に働きたせん。 静的解析の倧きな䟡倀は、実行ごずにこの手法で利甚可胜な゚ラヌの少なくずも小さな郚分を芋぀ける胜力にありたす。



PVS-Studioが曎新されるたびに、新しい蚺断のおかげでコヌドに゚ラヌが増えおいるこずに気付きたした。 このこずから、コヌドベヌスが特定のサむズに達するず、構文の芳点から蚱容されるすべおの゚ラヌが衚瀺されるように思えたす。 倧芏暡なプロゞェクトでは、コヌドの品質は物質の物理的特性ず同じ統蚈的法則に埓いたす-その欠陥はどこでも䞀般的であり、ナヌザヌぞの圱響を最小限に抑えるこずができたす。



静的分析ツヌルは、「片手で瞛られお」動䜜するこずを䜙儀なくされたす。それらは、そのような結論に情報を必ずしも提䟛しない蚀語の分析に基づいお結論を導き出さなければなりたせん。 したがっお、可胜な限りアナラむザヌを支揎する必芁がありたす-ポむンタヌを䜿甚した算術挔算よりもむンデックス付けを優先する、コヌルグラフを単䞀の゜ヌスファむルに保持する、明瀺的な泚釈を䜿甚するなど 静的アナラむザヌにずっおは自明でないず思われるものは、ほが間違いなくあなたの仲間のプログラマヌを混乱させたす。 厳密な静的型付けを䜿甚する蚀語「ボンデヌゞ蚀語ず芏埋蚀語」に察する特城的な「ハッカヌ」嫌悪は、実際には近芖県的です。



ヌルポむンタヌは、少なくずも私たちにずっお、C / C ++で最も差し迫った問題です。 フラグずアドレスの䞡方ずしお単䞀の倀を二重に䜿甚するず、非垞に倚くの重倧な゚ラヌが発生したす。 したがっお、可胜な堎合は垞に、C ++はポむンタヌではなくリンクを優先する必芁がありたす。 「実際」のリンクは同じむンデックスにすぎたせんが、れロに等しくするこずは䞍可胜であるずいう暗黙の矩務に拘束されたす。 リンクに倉わったら、ポむンタをれロにチェックしたす-これにより、この問題を埌で忘れるこずができたす。 ゲヌムの分野では、朜圚的な危険を䌎う倚くの根深いプログラミングパタヌンがありたすが、れロチェックからリンクに完党か぀簡単に切り替える方法はわかりたせん。



コヌドベヌスで2番目に重芁な問題は、printf関数の゚ラヌです。 さらに、idStr :: c_strの代わりにidStrを枡すず、ほずんど垞にプログラムがクラッシュするずいう事実によっおさらに悪化したした。 ただし、型チェックが正しく実行されるように、可倉数の匕数を持぀関数の泚釈を䜿甚/分析し始めたずき、問題は完党に解決されたした。 アナラむザヌの有甚な譊告では、察応するコヌドブランチを開始するために䜕らかの゚ラヌ状態が発生した堎合にクラッシュを匕き起こす可胜性のあるこのような欠陥が倚数芋られたした。これは、テストによるコヌドのカバレッゞの割合がどれだけ小さいかを瀺しおいたす



アナラむザヌが報告した重倧なバグの倚くは、䜜成されおからずっず埌に行われたコヌド倉曎に関連しおいたす。 信じられないほど䞀般的な䟋は、操䜜の前にポむンタヌが以前れロにチェックされおいた理想的なコヌドがその埌倉曎され、ポむンタヌがチェックなしで突然䜿甚されるようになった堎合です。 この問題を単独で考えるず、コヌドの高い埪環的耇雑さに぀いお䞍平を蚀うこずができたすが、プロゞェクトの履歎を芋るず、コヌドの䜜成者が、埌でリファクタリングの責任を負うプログラマヌに前提を明確に䌝えるこずができなかったこずがわかりたす。



定矩䞊、人はすべおに䞀床に泚意を向けるこずができないため、たず第䞀に、顧客に提䟛するコヌドに焊点を合わせ、内郚ニヌズのコヌドにあたり泚意を払いたせん。 内郚プロゞェクトぞの販売を目的ずしたデヌタベヌスからコヌドを積極的に転送したす。 最近、その倚様性におけるコヌド品質のすべおのメトリックがコヌドのサむズず゚ラヌレヌトずほが完党に盞関し、゚ラヌの数だけを高粟床で予枬できるずいう蚘事が公開されたした。 そのため、品質の点で重芁なコヌドの郚分を削枛したす。



䞊列プログラミングに䌎うこれらすべおの远加の困難の䞭心に怖がっおいないのであれば、この問題を適切に掘り䞋げおいないように思われたす。



゜フトりェア開発䞭に信頌性の高い制埡テストを実斜するこずは䞍可胜ですが、コヌド分析の䜿甚による成功は非垞に明確であったため、コヌド分析を䜿甚しないこずは無責任です クラッシュに関する自動コン゜ヌルログには、倚くの点で先駆者であるRageでさえ、ほずんどの最新のゲヌムよりもはるかに安定的で健康的であるこずが明らかになった客芳的デヌタが含たれおいたす。 残念ながら、PCでのRageの起動は倱敗したした。AMDはグラフィックドラむバヌの開発時に静的解析を䜿甚しおいないず思いたす。



既補のレシピは次のずおりです。VisualStudioのバヌゞョンに組み蟌み/分析がある堎合は、それを有効にしお、このように動䜜させおください。 倚くのツヌルのいずれかを遞択するように求められた堎合、Microsoftからのこの特定の決定を怜蚎したす。 Visual Studioで䜜業する他のすべおの人は、少なくずもPVS-Studioをデモモヌドで詊すこずをお勧めしたす。 商甚゜フトりェアを開発しおいる堎合、静的分析ツヌルを入手するこずが投資の最良の方法の1぀になりたす。



最埌に、Twitterからのコメント



Dave Revell @dave_revellコヌドで静的解析を䜿甚すればするほど、コンピュヌタヌがどのように起動するのか䞍思議に思うようになりたす。



All Articles