静的アナラむザヌはどのように、そしおなぜ停陜性ず戊うのか

静的アナラむザヌが停陜性ず戊う理由






前回の蚘事で、静的コヌドアナラむザヌが合成テストを䜿甚しお評䟡されるアプロヌチが気に入らないず曞きたした。 この蚘事では、譊告が意識的に発行されない特別なケヌスずしおアナラむザヌによっお認識された䟋を匕甚したした。 正盎に蚀うず、このトピックに関するコメントが急増するこずはほずんどありたせんでしたが、アナラむザヌに実装されおいる誀ったアラヌムカットオフメカニズムが原因で゚ラヌに関する譊告を出すこずはありたせんでした。 誀怜知ずの闘いは静的アナラむザヌの非垞に倧きなコンポヌネントであるため、ここで䜕を議論するのかさえ明確ではありたせん。 これを行う必芁があり、それだけです。 このようなメカニズムは、アナラむザヌだけでなく、他のアナラむザヌ/コンパむラにも存圚したす。 それにもかかわらず、この瞬間はそのような激しい議論を匕き起こしたので、それに泚意を払う䟡倀があるず思うので、この説明蚘事を曞きたした。



はじめに



それはすべお、「 なぜ合成テストが奜きではないのか 」 ずいう出版物から始たりたした。 この蚘事は控えめに曞かれたず蚀えるでしょう。 ディスカッションでは、特定の暡擬テストが奜きではない理由を説明する必芁がある堎合がありたす。 毎回長い答えを曞くのは難しいので、私は長い間、蚘事ぞの回答を準備するこずを蚈画しおいたした。 itc-benchmarksを芋たずき、テキストを曞く良い時期であるこずに気付きたした。私の印象は新鮮で、蚘事に含めるこずができるいく぀かのテストを遞択できたす。



私はプログラマヌのコミュニティによるこの蚘事のそのような拒吊や、さたざたなサむトやメヌルでのコメントを期埅しおいたせんでした。 この理由は、おそらく、私が静的アナラむザヌを10幎間開発しおおり、いく぀かの質問が非垞に明癜に思えるため、それらをあたりにも簡朔か぀カテゎリヌ的に考えるためです。 誀解を排陀し、停陜性ずの闘いが行われおいる方法ず理由を説明したす。



蚘事のテキストは任意のツヌルを参照できたすが、PVS-Studioはそれずは䜕の関係もありたせん。 同様の蚘事は、GCC、Coverity、たたはCppcheckの開発者の1人が䜜成できたす。



誀怜知を䌎う手動操䜜



メむントピックに着手する前に、誀ったメッセヌゞのマヌクアップを明確にしたいず思いたす。 䜕が起こっおいるのか理解せず、倚くの人が吊定的なコメントを曞き始めたずいう印象を受けたした。 私は次の粟神でコメントに䌚いたした



あなたは間違った方法で行った。 誀怜知を抑制するメカニズムを提䟛する代わりに、誀怜知をできる限り排陀しようずするため、倚くの堎合誀解されたす。



このトピックの議論に戻らないように説明をしたす。 PVS-Studioは、どのような堎合でも避けられない誀怜知を排陀するためのいく぀かのメカニズムを提䟛したす。





これらの機胜はすべお、「 誀譊告の抑制 」ドキュメントセクションで詳现に説明されおいたす。 蚭定ファむルを䜿甚しお、譊告をオフにしたり、マクロ内の譊告を抑制したりするこずもできたすpvsconfigを参照。



それずは別に、特別なデヌタベヌスを䜿甚しおアラヌトの倧量マヌキングのシステムを匷調する必芁がありたす。 これにより、倧芏暡プロゞェクトの開発プロセスにアナラむザヌを迅速に統合できたす。 このプロセスのむデオロギヌに぀いおは、蚘事「 PVS-Studioアナラむザヌの䜿甚方法 」で説明しおいたす。



これはすべお、゚ラヌず芋なすべきでないものの明瀺的な指瀺を指したす。 ただし、特別な䟋倖を䜿甚しお譊告を最小化するずいうタスクは削陀されたせん。 アナラむザヌの䟡倀は、すべおを誓うこずではなく、誓う必芁がない状況をどれだけ知っおいるかずいうこずです。



理論的背景



今少し理論。 各アナラむザヌの蚺断メッセヌゞは、次の2぀の特性によっお評䟡されたす。





各蚺断のこれら2぀の基準は、任意の割合で組み合わせるこずができたす。 したがっお、蚺断の皮類を説明し、それらを2次元グラフに配眮するこずが理想的です。







図1.蚺断は、重芁床ず信頌性によっお評䟡䟡できたす。










図1.蚺断は、重芁床ず信頌性によっお評䟡できたす。



いく぀かの実䟋を瀺したす。 * .cppファむルにコメントの芋出しがないず刀断する蚺断Aは 、右䞋隅に配眮されたす。 コメントを忘れおも、プログラムでクラッシュするこずはありたせんが、コマンドで受け入れられる゚ンコヌディング暙準の芳点からぱラヌです。 この堎合、コメントがあるかどうかを非垞に正確に刀断できたす。 したがっお、゚ラヌの信頌性は高くなりたす。



クラスのメンバヌの䞀郚がコンストラクタヌで初期化されおいないこずを瀺す蚺断Bは、䞊郚の䞭倮に配眮されたす。 この゚ラヌの信頌性はあたり高くありたせん。アナラむザヌは、このメンバヌが初期化される方法ず堎所を理解できなかったためです これは困難です 。 プログラマヌは、コンストラクタヌの完了埌に初期化を実行できたす。 したがっお、コンストラクタヌ内の初期化されおいないメンバヌは必ずしも゚ラヌではありたせん。 しかし、この蚺断はグラフの䞀番䞊にありたす。これが本圓に間違いである堎合、プログラムのパフォヌマンスに重倧な圱響を䞎えるからです。 初期化されおいない倉数の䜿甚は重倧な欠陥です。



アむデアが明確であるこずを願っおいたす。 ただし、グラフ䞊のこのような゚ラヌの分垃は認識しにくいこずに読者は同意するず思いたす。 したがっお、䞀郚のアナラむザヌは、このグラフを9個たたは4個のセルの衚に単玔化したす。







図2.簡略化された分類オプション。4぀のセルが䜿甚されおいたす。










図2.簡略化された分類オプション。 4぀のセルが䜿甚されたす。



たずえば、Goannaアナラむザヌの䜜成者は、Coverityが買収するたで行動したしたが、Synopsysは埌に買収したした。 圌らは、アナラむザヌによっお発行された譊告を分類し、9぀のセルのいずれかに関連付けたした。







図3。 ゎアナリフレンスガむドドバヌゞン3.3の䞀郚。9個のセルが䜿甚されおいたす。










図3. Goannaリファレンスガむドバヌゞョン3.3の䞀郚。 9個のセルが䜿甚されたす。



ただし、この方法も珍しく、䜿甚するには䞍䟿です。 プログラマヌは、譊告を1次元グラフ䞊に配眮するこずを望んでいたす。それは重芁ではありたせん->重芁です。 特に、異なるレベルに分けられたコンパむラ譊告は同じ原則に基づいおいるため、これは䞀般的です。



2次元の分類を1次元に枛らすこずは簡単ではありたせん。 これは、PVS-Studioアナラむザヌで行ったこずです。 単玔に2次元グラフの䞋郚がありたせん。







図4.重倧床の高さをレむアップに投圱したす。゚ラヌは信頌性によっお分類され始めめたす。










図4.重倧床の高いアラヌトをラむン䞊に投圱したす。 ゚ラヌは信頌性によっお分類され始めたす。



䞍正なプログラム操䜜に぀ながる可胜性のある゚ラヌのみを特定したす。 ファむルの先頭にある忘れられたコメントは、プログラムのクラッシュに぀ながるこずはなく、興味深いものではありたせん。 しかし、これは重倧な゚ラヌであるため、クラスの初期化されおいないメンバヌを探しおいたす。



したがっお、信頌性のレベルに応じお゚ラヌを分類する必芁がありたす。 このレベルの信頌性は、3぀のグルヌプ高、䞭、䜎のアナラむザヌメッセヌゞの分垃にすぎたせん。







図5。 PVS-Studioむンタヌフェヌスりィンドりのファルメント。高およびレビ










図5. PVS-Studioむンタヌフェヌスりィンドりのフラグメント。 高および䞭レベルの䞀般的な蚺断の衚瀺が含たれおいたす。



さらに、アナラむザヌが゚ラヌを怜出しお誀怜知を䞎えなかったこずをどの皋床確信しおいるかに応じお、同じ譊告が異なるレベルに分類される可胜性がありたす。



同時に、すべおの譊告がプログラムにずっお重芁な゚ラヌを探すこずを繰り返したす。 アナラむザヌが自信を持っおいるこずもあれば、゚ラヌを芋぀けたこずが少ないこずもありたす。



ご泚意 もちろん、䞀定の盞察性がありたす。 たずえば、PVS-Studioには、V553ずいう譊告がありたす。アナラむザヌは、2000行を超えるコヌドの関数に遭遇したずきに生成したす。 このような関数に゚ラヌを含める必芁はありたせん。 しかし実際には、この関数が゚ラヌの原因である可胜性が非垞に高くなりたす。 このような関数は、単䜓テストではテストできたせん。 コヌド内にこのような関数が存圚するこずを欠陥ず芋なすこずができたす。 ただし、そのような蚺断はわずかであり、アナラむザヌの䞻なタスクは、配列境界の露出、未定矩の動䜜、およびその他の臎呜的な゚ラヌを怜玢するこずです 衚を参照。



誀怜知ず信頌氎準



PVS-Studioの譊告は、それが倚かれ少なかれ重倧なプログラムの誀動䜜に぀ながるず蚀えるコヌドフラグメントを怜出したす。 したがっお、PVS-Studioの譊告レベルぱラヌの重倧床ではなく、゚ラヌの信頌性です。 ただし、レベルごずの分垃に぀いおは重芁床を考慮するこずもできたすが、党䜓像が重芁であるため、このような小さな詳现に぀いおは説明したせん。



簡単に説明するず、レベルは特定された゚ラヌの信頌性です 。



前の蚘事で衚明された批刀は、誀った譊告ず戊う際に、有甚な譊告を倱う可胜性があるずいう事実に芁玄されたした。 実際、譊告は通垞消えるこずはなく、信頌レベルに沿っおのみ移動したす。 そしお、読者が心配するこれらのたれな゚ラヌオプションは、原則ずしお䜎レベルで蓄積するだけであり、衚瀺するこずはお勧めしたせん。 たったく意味のない譊告のみが、完党に消えおしたいたす。







図6.䜕かを準備しおくださいおのは良いこずです。しかし、ある時点で停止する必芁がありたす。










図6.䜕かを準備しおおくのは良いこずです。 しかし、ある時点で停止する必芁がありたす。



読者は有甚なメッセヌゞが消える可胜性があるず私の蚀葉で明らかに譊告された。 それを吊定する理由はありたせん。 このような確率は存圚したすが、あたり重芁ではないので心配する必芁はありたせん。 これらのケヌスを考慮するこずは意味がないこずを䟋で瀺したす。 しかし、さたざたなレベルでメッセヌゞを投皿するトピックから始めたしょう。



堎合によっおは、どのレベルの信頌床で譊告を発すべきかがすぐに明らかになりたす。 䟋ずしお、次の゚ラヌパタヌンを怜出する簡単なV518蚺断を考えたす。



char *p = (char *)malloc(strlen(src + 1));
      
      





最も可胜性が高いのは、ブラケットを誀っお配眮したこずです。 タヌミナル0を配眮する堎所ができるように、1を远加したかったのです。 しかし、それらは誀っおおり、その結果、メモリは必芁以䞊に2バむト割り圓おられおいたせん。



理論的には、プログラマヌがたさにそのようなコヌドを曞きたいず思っおいたず想像できたすが、この可胜性は非垞に小さいです。 したがっお、この譊告の信頌性は非垞に高く、垞に高レベルのメッセヌゞに配眮されたす。



ずころで、この蚺断には、単䞀の䟋倖さえありたせん。 そのようなパタヌンが芋぀かった堎合は、゚ラヌです。



その他の堎合、゚ラヌの信頌性が䜎く、メッセヌゞが垞に䜎レベルに送信されるこずがすぐに明らかになりたす。 このような蚺断はほずんどありたせん。これは、蚺断が倱敗したこずが刀明したこずを意味したす。 これらの愚かな蚺断の1぀はV608であり、明瀺的なキャストで構成される重耇シヌケンスを怜出したす。 フォヌムの匏が怜玢されたす



 y = (A)(B)(A)(B)x;
      
      





なぜこの蚺断をしたのか芚えおいたせん。 これたでのずころ、この蚺断が本圓の間違いを明らかにするのを芋たこずはありたせん。 圌女は冗長なコヌド通垞は耇雑なマクロを芋぀けたしたが、゚ラヌは芋぀けたせんでした。



ほずんどの蚺断は、実際のバグが芋぀かったずいうアナラむザヌの信頌床に応じお、レベルごずに「倉動」したす。



レベルを次のように解釈したす。



高最初のレベル。 これはおそらく間違いです。 必ずこのコヌドをチェックしおください これが間違いでもない堎合は、コヌドの蚘述が䞍十分である可胜性が高いため、アナラむザヌや開発チヌムの他のメンバヌを混乱させないように修正する必芁がありたす。 䟋で説明したす。



 if (A == B) A = 1; B = 2;
      
      





おそらくここにぱラヌはなく、ブレヌスは必芁ありたせん。 プログラマヌが垞に倉数Bを2に蚭定したかったずいう可胜性はわずかです。しかし、゚ラヌがなくおも、そのようなコヌドを曞き盎すこずに誰もが同意するず思いたす。



 if (A == B) A = 1; B = 2;
      
      





䞭第2レベル 。 このコヌドにぱラヌが含たれおいるようですが、アナラむザヌにはわかりたせん。 すべおの高レベルの譊告を修正した堎合、䞭レベルの譊告を行䜿するず䟿利です。



䜎第3レベル 。 䞀般に孊習に掚奚しない䜎信頌床の譊告。 プロゞェクトのチェックに関する蚘事を䜜成するずきは、高レベルず䞭レベルのみを考慮し、䜎レベルには連絡しないこずに泚意しおください。



Unreal Engineプロゞェクトに取り組んだずきも、たったく同じこずをしたした。 私たちの目暙は、䞀般目的の第1レベルず第2レベルのすべおの譊告を排陀するこずでした。 私たちは第䞉レベルを芋たせんでした。



前述したように、ほずんどの蚺断には、症状のセットに応じお異なるレベルを割り圓おるこずができたす。 䞀郚の症状は枛少するかもしれたせんが、他の症状は自信を高めたす。 これらは、100を超えるオヌプンプロゞェクトでの蚺断の実行に基づいお経隓的に遞択されたす。



蚺断がさたざたなレベルにどのように移行できるかを怜蚎しおください。 たずえば、疑わしい明瀺的な型倉換を譊告するV572蚺断を䜿甚したす。 new挔算子を䜿甚しお、クラスのオブゞェクトが䜜成され、そのポむンタヌが別の型にキャストされたす。



 T *p = (T *)(new A);
      
      





これは奇劙なデザむンです。 クラスAが Tから継承される堎合、型倉換は䞍芁であり、単玔に削陀できたす。 継承されない堎合、これはおそらく間違いです。 ただし、アナラむザヌはこれが間違いであるこずを完党に確信しおいないため、最初に䞭皋床の信頌レベルを割り圓おたす。 このデザむンがどんなに奇劙であっおも、正しく動䜜するコヌドに察応するこずがありたす。 䟋を挙げるこずはできたせん。なぜなら、それがどんな状況なのか芚えおいないからです。



芁玠の配列が䜜成されおから基本クラスぞのポむンタヌに倉換される堎合、これははるかに危険です。



 Base *p = (Base *)(new Derived[10]);
      
      





ここで、アナラむザヌは高譊告を衚瀺したす。 基本クラスのサむズは盞続人よりも小さくするこずができたす。その埌、 p [1]芁玠にアクセスするずきに、「どこに行かないで取埗し」、䞍正なデヌタを凊理したす。 基本クラスず盞続人のサむズが同じ堎合でも、このコヌドを線集する必芁がありたす。 プログラマヌは幞運になれたすが、盞続人クラスに新しいメンバヌを远加するこずですべおを簡単に砎るこずができたす。



同じ型ぞの倉換が発生するず、逆の状況が発生したす。



 T *p = (T *)(new T);
      
      





このようなコヌドは、誰かがCを長時間䜿甚しおいお、 malloc関数の呌び出しずは異なり、必須の型倉換が䞍芁であるこずを忘れたずきに衚瀺されるこずがありたす。 たたは、叀いコヌドをリファクタリングした結果、CプログラムがC ++プログラムに倉わりたす。



ここにぱラヌはなく、メッセヌゞは完党に省略できたす。 念のため、それは残りたすが、䜎レベルに移動したす。 このメッセヌゞを芋おコヌドを線集する必芁はありたせんが、誰かがコヌドに矎しさをもたらしたい堎合は気にしたせん。



前の蚘事ぞのコメントで、人々は譊告が誀っお消えるこずを心配しおいたした。これは、䜎い確率ではあるが、゚ラヌを瀺しおいる可胜性がありたす。 原則ずしお、そのようなメッセヌゞは消えたせんが、䜎レベルに移動したす。 調べた䟋の1぀は、「T * p =T *新しいT;」です。 ここには間違いはありたせんが、突然䜕かが間違っおいたす...垌望する人はコヌドを勉匷できたす。



別の䟋を芋おみたしょう。 V531蚺断1぀のsizeofを別のsizeofで乗算したす



 size_t s = sizeof(float) * sizeof(float);
      
      





これは無意味な衚珟であり、おそらく、タむプミスなど、ここで䜕らかの間違いが行われた可胜性がありたす。 アナラむザヌは、このコヌドに察しお高譊告を発行したす。



ただし、譊告レベルが[䜎]に眮き換えられる堎合がありたす。 これは、芁因の1぀がsizeofcharの堎合に発生したす。



100を超えるプロゞェクトで芳察されたすべおの匏「sizeofT* sizeofchar」ぱラヌではありたせんでした。 ほずんど垞に、それらはある皮のマクロであり、そのような乗算は、あるマクロを別のマクロに眮き換えるために埗られたした。



これらの譊告は芋るこずができないため、䜎譊告セクションでナヌザヌの目から隠されおいたす。 しかし、垌望する人はただそれらを勉匷するこずができたす。







図7.読み取り者は、䜎レベルのアラヌトの広倧な領域をい぀でも航行できるこずを知っおいす










図7.読者は、䜎レベルのアラヌトの広倧な領域をい぀でも航行できるこずを知っおいたす。



蚺断の䟋倖



䟋倖は、個々の蚺断ず、蚺断のグルヌプの䞡方に䜜甚したす。 「倧量砎壊の陀倖」から始めたしょう。 プログラムには実行されないコヌドがありたす。 実際、その䞭で゚ラヌを探すこずはできたせん。 コヌドが実行されないず、゚ラヌは珟れたせん。 したがっお、倚くの蚺断は非実行可胜コヌドには適甚されたせん。 これを䟋で説明したす。



 int *p = NULL; if (p) { *p = 1; }
      
      





ポむンタヌを間接参照する堎合、可胜な唯䞀の倀はNULLです。 倉数「p」に栌玍できる他の倀はもうありたせん。 ただし、逆参照は実行されないコヌド内にあるずいう䟋倖がスロヌされたす。 そしお、実行されないため、間違いはありたせん。 NULL以倖の倀が倉数pに蚭定されおいる堎合にのみ、逆参照が実行されたす。



条件は垞にfalseであるこずが通知されるので、誰かが譊告が圹立぀ず蚀うかもしれたせん。 しかし、これは他の蚺断、たずえばV547の懞念事項です。



䞊蚘のコヌドでnullポむンタヌが逆参照されおいるこずをアナラむザヌが譊告し始めたら、誰かに圹立぀でしょうか いや



次に、蚺断の特定の䟋倖に目を向けたす。 以前にレビュヌしたV572蚺断に戻りたしょう。



 T *p = (T *)(new A);
      
      





このメッセヌゞが発行されない堎合は䟋倖がありたす。 そのようなケヌスの1぀は、 voidぞのキャストです。 䟋



 (void) new A();
      
      





オブゞェクトが䜜成され、プログラムの最埌たで意識的に生きたす。 このデザむンは、タむプミスにより偶然に衚瀺されるこずはありたせん。 これは、ビュヌの蚘録に関するコンパむラヌずアナラむザヌの譊告を抑制するための意識的なアクションです。



 new A();
      
      





倚くのツヌルは、そのような蚭蚈を誓いたす。 コンパむラヌ/アナラむザヌは、人がnewオペレヌタヌが返すポむンタヌを曞くのを忘れたこずを疑いたす。 したがっお、人々は意図的に void型にキャストを远加するこずで譊告抑制を䜿甚したした。



はい、このコヌドは奇劙です。 しかし、このコヌドをそのたたにしおおくように求められるので、これがあなたがする必芁があるこずです。 アナラむザヌのタスクぱラヌを探すこずであり、コンパむラヌ/アナラむザヌを混乱させお譊告を取り陀くために、さらに掗緎された構造を曞くように匷制するこずではありたせん。



ずにかく誰かが譊告を出すこずは有甚でしょうか いや このコヌドを曞いた人は誰にでも感謝したせん。



V531の蚺断に戻りたす。



 sizeof(A) * sizeof(B)
      
      





䜎レベルであっおも、メッセヌゞを送信しない堎合がありたすか はい、ありたす。



兞型的なタスクバッファヌのサむズを蚈算する必芁がありたすが、そのサむズは別のバッファヌのサむズの倍数です。 int型の125芁玠の配列があり、 double型の125芁玠の配列を䜜成する必芁があるずしたしょう。 これを行うには、配列芁玠の数にオブゞェクトのサむズを掛ける必芁がありたす。 それは、芁玠の数を蚈算するのが間違いを犯しやすい堎合です。 したがっお、プログラマヌは特別なマクロを䜿甚しお、芁玠の数を安党に蚈算したす。 これを行う理由ず方法の詳现に぀いおは、さたざたな蚘事に繰り返し曞いおいたす ここで arraysizeマクロの説明を参照しおください。



マクロを展開するず、フォヌムの構造が取埗されたす。



 template <typename T, size_t N> char (*RtlpNumberOf( __unaligned T (&)[N] ))[N]; .... size_t s = sizeof(*RtlpNumberOf(liA->Text)) * sizeof(wchar_t);
      
      





最初のsizeofは 、芁玠の数を蚈算するために䜿甚されたす。 2番目のsizeofは、オブゞェクトのサむズを蚈算したす。 その結果、すべおが正垞であり、配列のサむズをバむト単䜍で正しく蚈算したす。 おそらく読者は実際に議論されおいるこずを理解しおいないでしょう。 謝眪したすが、物語の本質から逞脱しお説明をしたくありたせん。



䞀般に、2぀のsizeof挔算子の乗算が完党に正垞で予想される堎合、いく぀かの魔法がありたす。 アナラむザヌは、バッファヌのサむズを蚈算するためのこのようなパタヌンを認識でき、譊告を生成したせん。



ずにかく誰かが譊告を出すこずは有甚でしょうか いや これは完党に正しく、適切に蚘述されたコヌドです。 だから曞く必芁がありたす。



続けたしょう。 アナラむザヌは、フォヌムのデザむンで譊告V559を発行したす。



 if (a = 5)
      
      





このようなコヌドの譊告を抑制するには、匏を二重括匧で囲む必芁がありたす。



 if ((a = 5))
      
      





これは、アナラむザヌずコンパむラヌに゚ラヌがなく、条件内の倀を意識的に適切にしたいずいうヒントです。 このようなヒントメ゜ッドを誰がい぀䜜成したかはわかりたせんが、倚くのコンパむラヌずアナラむザヌによっお広く認識されサポヌトされおいたす。



もちろん、PVS-Studioアナラむザヌは、このようなコヌドに぀いおも沈黙しおいたす。



おそらく、譊告を完党に抑制するのではなく、譊告を䜎に移動する䟡倀があったのでしょうか いや



人が間違った衚珟を誀っお䜙分な括匧で囲む可胜性はありたすか はい、ありたすが、非垞に小さいです。 ブラケットを远加したすか そうは思いたせん むしろ、 ifステヌトメントごずに1000回発生したす。 たたはさらに少ない頻床。 したがっお、䜙分なブラケットのために゚ラヌが芋萜ずされる可胜性は、1/1000未満です。



ずにかく譊告を出すほうがいいでしょうか いや したがっお、コヌドからの譊告を回避するための「合法的な機䌚」を人から奪いたすが、远加の゚ラヌを芋぀ける可胜性は非垞に小さいです。



前回の蚘事のコメントで既に同様の議論を行っおいたすが、皆を玍埗させるものではありたせんでした。 したがっお、このトピックにもう1぀の偎面からアプロヌチしようずしたす。



すべおの譊告を芋たいず䞻匵する人々に質問がありたす。 ナニットテストを100コヌドでカバヌしたしたか いや 間違いがあるかもしれないので、どうしお



サムは察戊盞手に答えたす。 テストでコヌドの100をカバヌするこずは非垞に難しく、高䟡です。 100の補償に察しお支払われる䟡栌は、時間ず劎力の投資を返枈したせん。



これは、静的解析でも同じです。 亀差点には、アナラむザヌの譊告を分析する時間が劥圓な制限を超える機胜がありたす。 したがっお、可胜な限り倚くの譊告を発行する実甚的な理由はありたせん。



è­Šå‘ŠV559が発行されない別のケヌスを芋おみたしょう。



 if (ptr = (int *)malloc(sizeof(int) * 100))
      
      





これは、メモリを割り圓お、同時にメモリが割り圓おられおいるこずを確認するための叀兞的なパタヌンです。 ここに間違いがないこずは明らかです。 男は明らかに曞きたくなかった



 if (ptr == (int *)malloc(sizeof(int) * 100))
      
      





この匏には実甚的な意味はなく、さらにメモリリヌクが発生したす。 したがっお、条件内での割り圓おは、プログラマヌがたさに望んでいたこずです。



アナラむザヌがそのような蚭蚈に぀いお譊告を発した堎合、有益でしょうか いや



この章を䟋倖の別の䟋で締めくくりたしょう。これは正圓化するのが難しいでしょうが、私たちの哲孊を読者に䌝えようず思いたす。



Diagnostics V501は、䟋倖の数におけるリヌダヌの1぀です。 ただし、これらの䟋倖は、蚺断が効果的に機胜するこずを劚げたせん 蚌明 。



蚺断は、次の圢匏の匏に関する譊告を発行したす。



 if (A == A) int X = Q - Q;
      
      





巊右のオペランドが同䞀の堎合、これは疑わしいです。



1぀の䟋倖は、挔算 '/'たたは '-'が数倀定数に適甚されおいる堎合、譊告を発行しないこずです。 䟋



 double w = 1./1.; R[3] = 100 - 100;
      
      





事実、プログラマヌはそのような匏を単玔化せずに具䜓的に曞くこずがよくありたす。 これにより、プログラムの意味を理解しやすくなりたす。 ほずんどの堎合、このような状況は、倚くの蚈算を実行するアプリケヌションで芋られたす。



同様の匏を持぀実際のコヌドの䟋



 h261e_Clip(mRCqa, 1./31. , 1./1.);
      
      





このような䟋倖が原因で䜕らかの゚ラヌをスキップできたすか はい、できたす。 ただし、誀怜知を枛らすこずの利点は、有甚な譊告を倱うこずの朜圚的な利点をはるかに䞊回りたす。



このような陀算たたは枛算は、プログラミングの暙準的な䞀般的な慣行です。 行為を倱うリスクは正圓化されたす。



おそらく圌らはそこに別の衚珟を曞きたかったのでしょうか はい、これは陀倖されたせん。 しかし、そのような掚論はどこにも行かない道です。 「突然䜕か他のものを曞きたかった」ずいうフレヌズは、1/31に適甚できたす。 そしお、ここで私たちは、プログラムのすべおの行に察しお単玔に連続しお誓う理想的なアナラむザヌのアむデアに着きたす。 空のものにさえ。 突然、それが空であるのは間違っおいたす。 突然、関数fooを呌び出す必芁がありたした。







図8.停止できる必芁がありたす。そうしないず、蚺断の䟿利なりォヌクスルヌがゎミになりたす。










図8.停止できる必芁がありたす。 そうしないず、蚺断の䟿利なりォヌクスルヌがゎミになりたす。



䌚瀟にずっお圹に立たない1000を衚瀺するよりも、1぀の有甚なメッセヌゞを倱う方が良いです。 これに぀いお恐ろしいこずは䜕もありたせん。 ゚ラヌ怜出の完党性は、アナラむザヌの有甚性の唯䞀の基準ではありたせん。 同様に重芁なのは、有甚なメッセヌゞず圹に立たないメッセヌゞのバランスです。 泚意力はすぐに倱われたす。 倚数の誀怜知のあるレポヌトを芋るず、人は譊告に非垞に無頓着になり始め、倚くの゚ラヌをスキップし、゚ラヌではないずマヌクしたす。



もう䞀床簡単に䟋倖に぀いお



私はすべおを詳现に説明したように思えたすが、このタむプのコメントを再び聞くこずができるず思いたす



機胜ずそれに察応するオン/オフボタンを䜜成するだけでなく、誀解に぀いお文句を蚀うべき理由がわかりたせん。 必芁な堎合は䜿甚したす。䞍芁な堎合は必芁ありたせん。䜿甚しないでください。 はい、これは仕事です。 しかし、はい、それはあなたの仕事です。







図9.すべおのフィルタリングアラヌトを無効にする蚭定を䜜成したいずいうナニコヌンの反応。










図9.すべおのフィルタリングアラヌトを無効にする蚭定を䜜成したいずいうナニコヌンの反応。



䟋倖をオフにしお制限なしにすべおの譊告を衚瀺するボタンを䜜成するこずをお勧めしたす。



このようなボタンはすでにアナラむザヌにありたす ありたす 「䜎」ず呌ばれ、最小レベルの信頌性で譊告を衚瀺したす。



どうやら、倚くは単に「䟋倖」ずいう甚語を誀解しおいたす。 䟋倖ずしお、問題を適切に蚺断するために、絶察に必芁な倚くの条件が䜜成されたす。



これに぀いおは、 V519の蚺断に基づいお説明したす。 倀が同じオブゞェクトに連続しお2回割り圓おられるこずを譊告したす。 䟋



 x = 1; x = 2;
      
      





ただし、この圢匏でのみ、蚺断は適甚されたせん。 したがっお、次のような改良が始たりたす。



䟋倖N1。 オブゞェクトは、=挔算の右オペランドの䞀郚ずしお2番目の匏に参加したす。



この䟋倖が削陀されるず、アナラむザヌは完党に正垞なコヌドを誓いたす。



 x = A(); x = x + B();
      
      





誰かがこの皮のコヌドを芋るために時間ず゚ネルギヌを費やしたいですか いや そしお、私たちに反察を玍埗させるこずは倱敗したす。



䞻な考え



この蚘事では、誰かに䜕かを蚌明たたは正圓化する目的はありたせん。 その目的は、読者の考えを正しい方向に向けるこずです。 アナラむザヌから可胜な限り倚くの譊告を取埗しようずするず、逆効果になるず説明しようず思いたす。 これは、開発されたプロゞェクトの信頌性を高めるのには圹立ちたせんが、プログラムの品質を改善するための代替方法に費やすこずができる時間がかかりたす。



静的コヌドアナラむザヌは、すべおの゚ラヌを怜出するこずはできたせん。 たた、他の機噚も䜿甚できたせん。 特効薬はありたせん。 ゜フトりェアの品質ず信頌性は、さたざたなツヌルを適切に組み合わせるこずで実珟され、1぀のツヌルで可胜なこずず䞍可胜なこずをすべお絞り出そうずするこずではありたせん。



類掚したす。 圌らはさたざたな芁玠の組み合わせを䜿甚しお、建蚭珟堎で安党を達成しようずしたす。安党トレヌニング、ヘルメットの着甚、酔っおいる間は仕事を始めるこずの犁止などです。 1぀のコンポヌネントのみを遞択し、すべおの問題を解決するこずを期埅するのは非効率的です。 内蔵のガむガヌカりンタヌず毎日の絊氎で、玠晎らしい装甲ヘルメットを䜜成できたす。 しかし、これはすべお、高地での䜜業を行うずきにあなたが萜䞋するこずからあなたを救うわけではありたせん。 ここでは、別のデバむスが必芁です-安党ケヌブル。 ヘルメットに組み蟌たれたパラシュヌトの方向から考え始めるこずができたす。 もちろん、これは興味深い゚ンゞニアリング䜜業ですが、そのようなアプロヌチは実甚的ではありたせん。 すぐに、ヘルメットの重量ずサむズが合理的な制限を超えたす。ヘルメットはビルダヌに干枉し始め、圌らを怒らせ、仕事のペヌスを遅くしたす。ビルダヌは䞀般的に、ひそかにヘルメットを脱ぎ、ヘルメットなしで䜜業を開始する可胜性がありたす。



ナヌザヌがアナラむザヌのすべおの譊告を無効にした堎合、信頌床がこれたでよりも䜎い譊告をできるだけ倚く衚瀺しようずするのは䞍合理です。ナニットテストを実行し、コヌドカバレッゞを最倧80にするず、さらに䟿利になりたす。100のカバレッゞを実装し、それを維持するのにかかる時間は、このアクションの利点を䞊回るため、100のカバレッゞを目指しお努力する必芁はありたせん。その埌、動的コヌドアナラむザヌの1぀をテストプロセスに远加できたす。動的アナラむザヌが怜出する䞀郚のタむプの欠陥は、静的アナラむザヌを怜出できたせん。そしおその逆。したがっお、動的および静的分析は互いに完党に補完したす。 UIテストを開発できたす。



このような統合されたアプロヌチは、プログラムの品質ず信頌性にはるかに良い圱響を䞎えたす。いく぀かのテクノロゞヌを䜿甚するず、テストでコヌド党䜓を100カバヌするよりも優れた品質を実珟できたす。同時に、コヌドの100のカバレッゞがはるかに倚く費やされたす。



実際、静的コヌドアナラむザヌからフィルタヌ凊理されおいないメッセヌゞをさらに必芁ずしおいるず曞いおいる人は誰も、同じコヌドアナラむザヌを䜿甚したこずはないず思いたす。たたは、゚ラヌの密床が䜎いおもちゃプロゞェクトで詊しおみた。実際のプロゞェクトでは、垞に問題、぀たり既存の誀怜知に察凊する方法がありたす。これは、アナラむザヌの開発者ずナヌザヌの䞡方が取り組む必芁がある倧きな課題です。さらに譊告はどこにありたすか



クラむアントから1぀たたは別の誀怜知を排陀するように䟝頌する手玙を定期的に受け取りたす。しかし、私たちは聞いたこずがない「より倚くのメッセヌゞを䞎える」。



おわりに



この蚘事から次のこずを孊びたした。



  1. PVS-Studioアナラむザヌは「臭い」を怜玢したせんが、プログラムの誀動䜜に぀ながる可胜性のある実際の゚ラヌを怜玢したす。
  2. 蚺断メッセヌゞは、3぀の信頌レベル高、䞭、䜎に分けられたす。
  3. 高および䞭レベルのみを孊習するこずをお勧めしたす。
  4. 䟋倖によっお有甚な゚ラヌが削陀されるのではないかず心配しおいる人には、これはたずありたせん。ほずんどの堎合、このような無効な譊告は䜎レベルに移動されおいたす。[䜎]タブを開いお、そのような譊告を調べるこずができたす。
  5. 蚺断の䟋倖は避けられたせん。そうでない堎合、ツヌルはヘルプ以䞊の干枉を開始したす。


このすばらしい蚘事を読むのに時間を割いおくれた皆さんに感謝したす。私自身、そんなに長くなるずは思っおいたせんでした。これは、トピックが䞀芋思われるよりも耇雑であるこずを瀺しおいたす。







写真11










ナニコヌンは、プログラムコヌドの品質を匕き続き保護したす。幞運をお祈りしたす。たた、「PVS-Studio 2017」のプレれンテヌションに぀いおもご理解ください。





この蚘事を英語圏の聎衆ず共有したい堎合は、翻蚳ぞのリンクを䜿甚しおくださいAndrey Karpov。 静的アナラむザヌが誀怜知ず戊う方法ず、なぜそうするのか



蚘事を読んで質問がありたすか
倚くの堎合、蚘事には同じ質問が寄せられたす。 ここで回答を収集したした PVS-Studioバヌゞョン2015に関する蚘事の読者からの質問ぞの回答 。 リストをご芧ください。



All Articles