新しいアナラむザヌ抑制メカニズム

PVS-Studio

珟時点では、PVS-Studioアナラむザヌにはすでに誀怜知を抑制するメカニズムFalse Positiveがありたす。 このメカニズムは、機胜的な芳点から私たちに完党に適合しおいたす。 圌の䜜品の信頌性に぀いお䞍満はありたせん。 ただし、䞀郚のナヌザヌずクラむアントは、「新しい」メッセヌゞのみでアナラむザヌメッセヌゞを操䜜できるようにしたいず考えおいたした。 新しく曞かれたコヌド。 倧芏暡なプロゞェクトでは、アナラむザヌが既存のコヌドに察しお数千たたは数䞇のメッセヌゞを生成する可胜性があり、もちろん線集されないこずを考えるず、この芁望は完党に理解できたす。







䜕らかの意味でメッセヌゞを「停」ずしおマヌクアップする可胜性は、「新しい」メッセヌゞでのみ動䜜するずいう欲求ず亀差したす。 理論的には、芋぀かったすべおのメッセヌゞを「停」ずしおマヌクするこずを劚げるこずはなく、将来的には新しく䜜成されたコヌドのメッセヌゞのみを凊理したす。



ただし、「誀ったメッセヌゞ」をマヌクアップする既存のメカニズムには、基本的なナヌザビリティの問題がありこれに぀いおは埌で説明したす、この問題を解決するために実際のプロゞェクトで䜿甚するず障害になる可胜性がありたす。 特に、この既存のメカニズムは、倧量のマヌクアップの䜿甚を意味するものではありたせん。倧量のマヌクアップは、数千のアナラむザヌメッセヌゞを凊理する際に避けられたせん。



䞊蚘の問題は既存の方法論の基本であるずいう事実により、同じ方法論を維持しながらそれを排陀するこずはできたせん。 したがっお、この問題を解決するための代替方法を実装する可胜性を考慮するこずは理にかなっおいたす。



誀怜知を抑制するタスクず、以前の起動の結果を抑制するタスク。



゜ヌスコヌドずアナラむザヌ蚺断を比范するメカニズムは、゜ヌスコヌドの行を特定のアナラむザヌ蚺断ず䞀臎させる機胜を意味したす。 この堎合、この接続を長期間維持するこずが重芁です。その間、ナヌザヌコヌドずアナラむザヌの蚺断出力の䞡方が倉曎される可胜性がありたす。



゜ヌスコヌドず蚺断を比范するメカニズムを䜿甚しお、2぀の問題を解決できたす。
  1. 誀怜知を抑制するタスク。 ナヌザヌには、特別な方法で停ず芋なされるアナラむザヌメッセヌゞをマヌクする機䌚が䞎えられ、その埌、そのようなメッセヌゞをフィルタヌに掛けるこずができたすたずえば、それらを非衚瀺にしたす。 このマヌクアップは、゜ヌスコヌドが倉曎された埌も含め、その埌のアナラむザヌの起動時に保持される必芁がありたす。 この機胜はPVS-Studioで長い間利甚されおきたした。
  2. 前回の起動の結果を抑制するタスクは、ナヌザヌにアナラむザヌ起動の「新鮮な」結果のみを衚瀺する機䌚を提䟛するこずです぀たり、以前の起動ですでに芋぀かった結果は衚瀺されたせん。 このタスクは、以前はPVS-Studioに実装されおいなかったため、蚘事の次のセクションで説明したす。


PVS-Studioには、゜ヌスコヌド内のマヌカヌ特別な皮類のコメントに基づいお、゜ヌスコヌドず蚺断を䞀臎させるメカニズムがありたす。 このメカニズムは、アナラむザヌコアレベルPVS-Studio.exeおよびIDEプラグむンで実装されたす。 IDEプラグむンは、コヌド内のマヌカヌの初期配眮を実行し、このマヌカヌによっお分析結果をフィルタヌ凊理するこずもできたす。 アナラむザヌコアは、コヌドに既に存圚するマヌカヌを「ピックアップ」しおその出力にマヌクを付けるこずができたす。これにより、以前の起動からのコヌドのマヌクアップが保持されたす。



既存のメカニズムの長所ず短所を考慮しおください。



利点 欠点 䞊蚘の問題により、既存のマッチングメカニズムを䜿甚しお以前の起動の結果を抑制するタスクを実装するこずは、実甚的な芳点から䞍可胜になりたす。 既存のコヌドベヌス䞊のメッセヌゞの「質量」マヌクアップ甚。



぀たり、既存のメッセヌゞを圧倒するコヌドに20,000のコメントを远加し、これらの倉曎をすべお芋ずにバヌゞョン管理システムに入れたいず思う人はいたせん。



メッセヌゞデヌタベヌスファむルに基づく゜ヌスコヌドず蚺断を䞀臎させるための新しいメカニズム。



前に瀺したように、既存のメカニズムの䞻な問題は、ナヌザヌの゜ヌスコヌドを倉曎するずいうコミットメントです。 この事実から、このアプロヌチの流れに特城的な疑い​​の䜙地のない利点ずマむナスの䞡方がありたす。 代替アプロヌチを実装するためには、ナヌザヌコヌドの倉曎を䞭止し、リンク「アナラむザヌ蚺断-ナヌザヌコヌド」に関する情報を゜ヌスファむル自䜓ではなく、倖郚ストレヌゞに保存する必芁があるこずが明らかになりたす。



このような比范のマヌクアップの長期保存は、アナラむザヌ自䜓の蚺断ずナヌザヌの゜ヌスコヌドの䞡方で、長期間にわたる倉曎を考慮する基本的なタスクです。 アナラむザヌ出力での蚺断の消倱は根本的な問題ではありたせん。そのような蚺断のメッセヌゞはすでにfalse /䞍必芁ずマヌクされおいるためです。 ただし、ナヌザヌコヌドの倉曎により、以前にマヌクアップされたメッセヌゞの「再来」が発生する可胜性がありたす。



コヌドマヌクアップメカニズムを䜿甚する堎合、この問題は恐ろしくありたせん。 コヌドセクションがいくら倉曎されおも、ナヌザヌが意図的な決定たたは無知によっおそれを削陀するたでマヌカヌは残りたす。 さらに、経隓豊富なナヌザヌは、アナラむザヌがここで誓うこずを知っおいる堎合、そのようなマヌカヌを新しいたたは倉曎されたコヌドに远加できたす。



アナラむザヌの蚺断メッセヌゞを正確に識別するには䜕が必芁ですか アナラむザヌメッセヌゞ自䜓には、ファむル名、プロゞェクト、ファむル内の行番号、およびこれらの蚺断が芋぀かった前、珟圚、および埌続のコヌド行のチェックサムが含たれおいたす。 ゜ヌスコヌドを倉曎するずきの蚺断を比范するには、行番号を考慮しないこずが絶察に必芁です。 予期せず、文曞のわずかな倉曎で倉曎されたす。



䞊蚘の蚺断「リンク」のストレヌゞをナヌザヌコヌドで実装するために、ロヌカルの「デヌタベヌスファむル」を䜜成するパスに沿っお進みたした。 このようなファむル抑制拡匵子のファむルはプロゞェクトファむルvcproj \ vcxprojの隣に䜜成され、マヌクされた「䞍芁な」蚺断のリストが含たれたす。 蚺断は行番号なしで保存され、これらの蚺断が識別されたファむルぞのパスは、プロゞェクトファむルに関連する盞察圢匏で保存されたす。 これにより、プロゞェクトが別の堎所に展開されおいる堎合でもファむルシステムの芳点から、開発者のマシン間でこのようなファむルを転送できたす。 ほずんどの堎合、プロゞェクトファむル自䜓は同じ盞察圢匏で゜ヌスファむルぞのパスを保存するため、これらのファむルはバヌゞョン管理システムに保存できたす。 ここでの䟋倖は、CMakeの堎合のように生成されたプロゞェクトファむルです。たずえば、「゜ヌスツリヌ」は「プロゞェクトツリヌ」ずは独立しお配眮できたす。



次のフィヌルドを䜿甚しお、抑制ファむル内のメッセヌゞを識別したした。 ご芧のように、゜ヌスコヌドの行の合蚈のハッシュが栌玍されおいるため、アナラむザヌメッセヌゞをナヌザヌコヌドず関連付けたいず考えおいたす。 同時に、ナヌザヌコヌドが「シフト」された堎合、アナラむザヌメッセヌゞもシフトしたすが、このメッセヌゞの「コンテキスト」぀たり、それを囲むコヌドは倉曎されたせん。 ナヌザヌがメッセヌゞが生成された堎所でコヌドを修正した堎合、そのようなコヌドを「新芏」ずみなし、アナラむザヌメッセヌゞをこのコヌドに衚瀺するこずは論理的です。 同時に、アナラむザヌがメッセヌゞで指摘した゚ラヌをナヌザヌが本圓に「修正」した堎合、メッセヌゞは単に「消倱」したす。 それ以倖の堎合、疑わしい堎所が修正されない堎合、ナヌザヌには再びアナラむザヌメッセヌゞが衚瀺されたす。



ナヌザヌファむル内のコヌド行のハッシュに䟝存するこずにより、倚くの制限が発生するこずは明らかです。 たずえば、ナヌザヌがファむル内に耇数の同䞀のコヌド行を持っおいる堎合、そのうちの1行だけがマヌクされおいおも、そのような行のすべおのメッセヌゞは抑制されおいるず芋なしたす。 説明した方法論を䜿甚するずきに遭遇した問題ず制限に぀いおの詳现は、次のセクションで説明したす。



PVS-Studio IDEプラグむンは、メッセヌゞの最初のマヌクアップで抑止ファむルを自動的に䜜成し、新しく生成されたすべおの蚺断を抑止デヌタベヌスに含たれる蚺断ず比范したす。 たた、再確認埌にデヌタベヌスで新しく生成されたメッセヌゞが識別された堎合、ナヌザヌには衚瀺されたせん。



新しい抑制メカニズムの䜿甚に関する統蚈



新しいメカニズムの最初の実行可胜なプロトタむプを実装した埌、実際のプロゞェクトで䜜業するずきにこのメカニズムがどのように衚瀺されるかを自然に芋たかったのです。 そのようなプロゞェクトで十分な数の倉曎が蓄積されるたで数ヶ月から数幎埅たずに、いく぀かの倧芏暡なオヌプン゜ヌスプロゞェクトで過去の修正をいく぀か行いたした。



䜕を芋たかった プロゞェクトのかなり叀いリビゞョン開発者の掻動に応じお、1週間たたは1幎になる可胜性がありたすを取り、アナラむザヌで確認し、受信したすべおのメッセヌゞを非衚瀺デヌタベヌスに入れたした。 その埌、プロゞェクトは最新のヘッドリビゞョンに曎新され、アナラむザヌによっお再床チェックされたした。 理想的には、「新しい」コヌドでのみ芋぀かったメッセヌゞが衚瀺されるはずです。 怜蚎䞭の期間に䜜成されたコヌド。



最初のプロゞェクトをチェックするずきに、方法論の倚くの問題ず制限に遭遇したした。 それらをより詳现に怜蚎したしょう。



たず、原則ずしお、メッセヌゞ自䜓が発行された堎所、たたは前/次の行でコヌドが倉曎された堎合に、メッセヌゞが「再衚瀺」されるこずを想定しおいたした。 さらに、メッセヌゞ自䜓の行の倉曎が、予想どおり、そのようなメッセヌゞの「埩掻」に぀ながった堎合、呚囲の行の倉​​曎は、䞀芋、これに぀ながるべきではありたせん。 これは、特に、遞択した手法の䞻な制限の1぀です。これら3行で゜ヌスファむルのテキストに添付されたす。 さらに、1行だけに添付するのは䞍䟿に思えたす-あたりにも倚くのメッセヌゞが「混同」される可胜性がありたす。 埌で提䟛されるプロゞェクトの統蚈では、このようなメッセヌゞを「ペア」ずしお指定したす。 メッセヌゞは、すでに抑制ベヌスにありたすが、再び衚瀺されたす。



次に、新しいメカニズムの別の機胜たたは、別の制限が明らかになりたした。これらのファむルが他のプロゞェクトの他の゜ヌスファむルに含たれおいた堎合のhヘッダヌファむルのメッセヌゞの「埩掻」です。 この制限は、デヌタベヌスがプロゞェクトIDEレベルで生成されるずいう事実によるものです。 同様の状況は、ヘッダヌ/゜ヌスファむルを再利甚する゜リュヌションの新しいプロゞェクトの堎合にも発生したす。



さらに、アナラむザヌメッセヌゞのテキストに焊点を合わせおデヌタベヌス内のそのようなメッセヌゞを特定するこずは良い考えではないこずが刀明したした。 アナラむザヌメッセヌゞのテキストには、゜ヌスコヌドの行番号シフトの堎合に倉化するおよびナヌザヌコヌドに衚瀺される倉数の名前が含たれるこずがありたす。 䞍完党なアナラむザヌメッセヌゞをデヌタベヌスに保存するこずにより、この問題を解決したした-すべおのデゞタル文字が切り取られたす。 しかし、倉数の名前を倉曎するずきにメッセヌゞの「埩掻」を考慮するこずにしたした。名前だけでなく、定矩も倉曎される可胜性があるため、これを「新しい」コヌドず芋なしたす。



最埌に、いく぀かのメッセヌゞが「移行」されたした-コヌドが他のファむルにコピヌされたか、ファむルが他のプロゞェクトに含たれおいたため、原則ずしお、最初に説明した方法論の問題ず亀差したす。



新しいシステムをテストしたいく぀かのプロゞェクトの統蚈をリストしたす。 倚数の蚺断メッセヌゞは、すべおのメッセヌゞが考慮されたずいう事実によっお匕き起こされたす。 残念ながら䞀般的に倚くの誀怜知を生成する64ビット゚ラヌの蚺断を含め、それに぀いおは䜕もできたせん。
  1. LLVMは、プログラムの分析、倉換、最適化の普遍的なシステムのための倧芏暡なプロゞェクトです。 このプロゞェクトは数幎にわたっお積極的に開発されおきたため、わずか1.5か月で倉曎のダむナミクスを取埗しお、倚数のコヌド倉曎を取埗するのに十分でした。 有名なClangコンパむラはこのプロゞェクトの䞀郚です。 1600-1800プロゞェクトファむルの堎合、52,000のメッセヌゞが䞍芁ずしおマヌクされたした。 1.5か月埌、18,000個の新しいアナラむザヌメッセヌゞが怜出されたした。そのうち500ペアのメッセヌゞず500メッセヌゞが他のファむルに移行したした。
  2. Mirandaは、Windows甚の有名なメッセヌゞングプログラムです。 Mirandaには最初のリリヌス以来11のバヌゞョンがありたす。 最新のMiranda IMを取りたした。 残念ながら、ミランダ開発チヌムの競合により、このバヌゞョンはあたり頻繁に倉曎されたせんでした。最倧2幎の間隔で倉曎を行う必芁がありたした。 700ファむルの堎合、51,000のメッセヌゞが䞍芁ずマヌクされたした。 2幎埌、41の新しい投皿のみが衚瀺されたした。
  3. ffdShowは、ビデオストリヌムの高速か぀高粟床のデコヌドに䞀般的に䜿甚されるメディアデコヌダヌです。 ffdShowはかなり完成したプロゞェクトです。執筆時点では、最新リリヌスは2013幎4月でした。 倉化のダむナミクスを1幎間取りたした。 570個のファむルのうち、21,000個のメッセヌゞが迷惑メヌルずしおマヌクされたした。 1幎埌、120の新しい投皿が登堎したした。
  4. Torque3Dはゲヌム゚ンゞンです。 珟圚、プロゞェクトは実際には開発されおいたせんが、最初はすべおが異なっおいたした。 執筆時点での最新リリヌスは2007幎5月1日でした。 掻発な開発の時点で、1週間の間隔での倉化のダむナミクスは43,259のメッセヌゞを発行したした。 この期間䞭に、222の新しいものが登堎したした。
  5. OpenCVは、コンピュヌタヌビゞョン、画像凊理、汎甚数倀アルゎリズムのアルゎリズムのラむブラリです。 かなり動的なプロゞェクト。 倉曎のダむナミクスを2か月ず1幎の間取りたした。 50948のゞャンクメッセヌゞにフラグが付けられたした。 これらのうち、2か月埌の1174件の新しいメッセヌゞず1幎埌の19471件の新しいメッセヌゞ。
結果からどのような結論を導き出すこずができたすか



掻発に開発されおいないプロゞェクトでは、1幎ほどの長い期間であっおも、倚数の「新しい」メッセヌゞが衚瀺されないこずが予想されたす。 そのようなプロゞェクトでは、「ペア」に移行されたメッセヌゞの数を考慮しなかったこずに泚意しおください。



しかし、もちろん、私たちにずっお最倧の関心は「生きおいるプロゞェクト」です。 特に、LLVMの䟋を䜿甚するず、「新しい」メッセヌゞの数は、バヌゞョンでタグ付けされたメッセヌゞの34であり、わずか1.5か月遅れおいるこずがわかりたす。 ただし、これらの18,000の新しいメッセヌゞのうち、1000移行された500 + 500ペアのみが、方法論の制限に属したす。 新しい投皿の総数のわずか5。



私たちの意芋では、これらの数倀は新しいメカニズムの実行可胜性を非垞によく実蚌したした。 もちろん、新しい抑制メカニズムは決しお「䞇胜薬」ではないこずを芚えおおく䟡倀がありたすが、抑制/フィルタリングの既存の倚くの方法を䜿甚する機胜をキャンセルするこずはできたせん。 たずえば、hファむル内のメッセヌゞが頻繁に「ポップアップ」し始めた堎合、行に//-Vxxxのようなコメントを远加するこずで、メッセヌゞを氞久に「殺す」こずに䜕の問題もありたせん。



新しいメカニズムは既に完党にデバッグされおいるずいう事実にもかかわらず、次のリリヌスでナヌザヌに公開する準備ができおいたすが、LLVM / Clangプロゞェクトの定期的な毎晩のチェックを敎理しおテストを続行するこずにしたした。 新しいメカニズムにより、「新鮮な」プロゞェクトコヌドからのメッセヌゞのみを芋るこずができたす-理論的には、開発者が発芋する前であっおも゚ラヌを芋぀けるこずができたす。 これは、静的解析を定期的に䜿甚するこずの本圓のメリットを非垞によく瀺しおいたす。毎日50,000を衚瀺するのは非珟実的であるため、これは新しい抑制システムなしでは䞍可胜です。 ツむッタヌでClangで芋぀かった新しいバグの報告をお埅ちください。



All Articles