PVS-Studioの別のテスト

約6年前にKlocworkに初めて会って以来、私は長い間静的コードアナライザーに興味がありました。 彼以外にも、しばらくの間PCLintで仕事をする機会がありました。 そして今、私はPVS-Studioを少しテストしました。 (そして次に並んでいるのはParasoftとCoverityです)。



私は芸術の愛のためだけにテストを実施しました-別のアナライザーを試すのは面白かったです。



PVS-StudioはVisual Studioでの作業にのみ焦点を当てているようです。 インストール後、インストールされたバージョンのスタジオに自動的に統合されます。 これで、必要な統合手順はすべて終了します。 スタジオ自体を起動するために残ります-そして、それはすでに新しいPVS-Studioメニュー項目を持っています。 このような透過的な統合は賞賛に値しません!



アナライザーを開始するには、たとえば、このメニューから「ソリューションの確認」を選択します。 このプロセスは高速ではありません。あまり大きくないプロジェクトでは18分かかりました(比較のため、プロジェクトの完全なアセンブリは約2分かかります)。 長所から-アナライザーは、適切な進行状況バーと残り時間を表示します!



しかし、コード分析が自動的にアセンブリに追加されるという事実に、私は少し驚いた。 特に、小さなトレイアイコン以外に、これは表示されなくなったためです。 一見、何も起こらず、アセンブリが完了し、何らかの理由でPVS-Studioメニューですべてのメニュー項目が灰色になりました。 何らかの理由で、進行状況バーのある美しいウィンドウが表示されませんでした。



分析結果は、PVS-Studioの別のタブに表示されます。 すべてが非常に便利に行われました:見つかった問題(潜在的)ごとに、説明、場所(ファイルと行)、およびこのタイプの問題の詳細な説明へのリンクが表示されます:これが問題である理由、修正方法など 説明は非常に詳細に、高品質で行われます!



マウスをダブルクリックすると、スタジオは問題のある場所に正しく移動します。 ただし、問題が複数の場所に影響する場合は、2番目の場所を手動で見つける必要があります。



また、問題ごとに、この場合は誤検知が発生したことを示すか、このクラスの問題の表示をオフにすることもできます。



私の意見では、メニュー項目「ビルド後のインクリメンタル分析」は、私が期待するものとはまったく異なります。 この項目を有効にすると、プロジェクトの変更された部分に対してのみ分析が行われます(変更の単位はファイルです。つまり、1つのファイルの1つの関数の1行を変更すると、このファイルで見つかったすべての問題が表示されます)。 上記の操作モードも理にかなっているかもしれませんが、「そうだった-なった」間の状態の比較を見ることを期待しています。



「40件の問題があり、6件の問題が修正された後、2件の新しい問題が追加された」など、次のビルド/修正の結果を見る機会はないようです(少なくとも私は見ていません)。 これがなければ、プロジェクトのダイナミクスを追跡することは非常に困難です。



レポートは、内部形式またはプレーンテキストで保存できます。 保存してテキストエディターで開くと、最初は、レポートがスタジオで見られるよりもはるかに多くの問題を抱えていたことに非常に驚きました。 しかし、問題が何であるかを認識しました-デフォルトでは、スタジオで「一般的な分析結果」のみがオンになっており、それに加えて、デフォルトでオフになっているが保存されたレポートに含まれる「64ビット分析結果」もありました。



さて、私はスタジオに戻り、64ビットの準備の問題を調べました。 感動した。 64ビットプラットフォームへの移行を計画している人には絶対にお勧めできます。アナライザーは、32ビットシステムでプログラミングするときでも考えられないが、64ビットに切り替えると問題につながる多くの非自明な瞬間を見つけます。 たとえば、「V104。 算術式「または」V102のmemsize型への暗黙的な型変換。 一見したところ完全に無害なコードの場合、ポインター演算用の非memsize型の使用法:



uint8 * pRecv; int cur = 0; // somewhere later... pRecv += cur;
      
      





好きではないから-Visual Studioとの緊密な統合。 ドキュメントは非常に明確に書かれているため、クロスプラットフォームコンパイラでの作業は非常に複雑でサポートされていないため、試してさえいませんでした。 理論的には、コンパイラオプションとファイルのリストを指定することにより、コマンドラインからPVS-Studioを起動することができますが、まず、多くのファイルがある場合はそれほど簡単ではなく、次に、ドキュメントではgnuコンパイラのサポートが欠落していると宣言されていますある程度の努力をすれば、アナライザーに、クロスプラットフォームコンパイラーのプロジェクトで何かを強制的に発行させることができます。



最後に、PVS-StudioとPC-LintおよびKlocworkの簡単な比較。



PVS-StudioはPC-Lintよりもはるかに使いやすいです。 PC-Lintの主な問題は、潜在的な問題が多すぎることです。デフォルト設定の同じプロジェクトでは、23,000以上のメッセージが表示されます。 (PVS-Studio-42のみ)。 同時に、PC-Lintは繰り返し発生する問題を隠すことはできません(同じ.hファイルが2つの.cファイルから接続されている場合、PC-Lintは.hファイルに問題を2回表示し、PVS-Studioは1回だけ表示します)。 また、PC-Lintでは、1つの問題を誤検知としてマークすることはできません。問題のクラス全体を「オフ」にすることしかできません。



さらに、PC-Lintが発行する「ガベージ」の山を掘り下げてみると、PVS-Studioが見つけるよりも実際の潜在的な問題を見つけることができます(たとえば、いくつかのクラスで仮想デストラクタが存在せず、明確に定義されていないコンストラクタとデフォルトのコンストラクタをコピーします)。 もう1つのことは、PC-Lintでは、これらの有用なグレインは通常、あまり重要ではないメッセージの中で「 "れ」ます。



同時に、PC-Lintはより使いやすく、Visual Studioとの統合も非常に簡単ですが、使用するのははるかに困難です。



しかし、一般的に、ここでPVS-Studioは議論の余地のないリーダーです。 ただそれを受け取って作業を始めることができるからです。PC-Lintについては言えませんが、発行されたすべてのメッセージを表示するには数日かかることがあります。



しかし、Klocwork PVS-Studioと比較すると、残念ながら負けています。 まず、使いやすさ(ビルドごとのステータスモニタリング-修正された問題の数、残っている数、追加された数、便利なレポートのみ)、汎用性、および重大な潜在的な問題のより良い識別に注目します。 さらに、Klocworkはサーバーベースのマルチユーザーシステムであり、検出された各問題に責任を割り当て、複数のプロジェクトを一度に処理して、それぞれのステータスを簡単に追跡できます。



価格で比較すると、そのようなレイアウトが得られます(開発者のWebサイトからの情報)。



まあ、価格は機能にほぼ対応しており、PVS-Studioは安価であるが重くて不便なPC-Lintと便利で美しいが高価なKlocworkの中間に位置しています。



そして最後に、プロジェクトで実際に見つかったエラーのいくつかの例があります。KlocworkとPC-Lintは既に「モック」を管理しており、すでに運用中です。



ちなみに、私はこれらすべてを実際の商用プロジェクトでテストしたため、スクリーンショットを提供しません。スクリーンショットには「閉じた」情報が多すぎます。



たとえば、PVS-Studioはこのタイプの問題をよく報告します(そして、気づいたように、上記のアナライザーはこれを行いません!):



V519。 「x」変数には、連続して2回値が割り当てられます。 おそらくこれは間違いです



私の場合、これらの特定された問題の1つがこのコードにつながりました。



  Year = Payload[1]; Month = Payload[2]; Year = Payload[3];
      
      





もちろん、これは次のようになります。



  Year = Payload[1]; Month = Payload[2]; Day = Payload[3];
      
      





ちなみに、これはかなり確立され、テストされており、すでに長い間運用製品に組み込まれています! そして一般に、他のすべては同様の問題を識別しましたが、それらは明らかなエラーではありませんでしたが、少なくとも、いわば、最も高品質で、理解可能で、美しいコードではありませんでした:



  txtL = _T("None"); txtL = _T("Not found");
      
      





または



  POSITION pos = m_items.GetHeadPosition(); pos = m_ownedItems.GetHeadPosition();
      
      





PVS-Studioは、コード内のそのような場所も適切に検出します(エラーではありませんが、コード内にない方が望ましいです)。



  if (m_sc) { result = DoubleToString(m_highLimit,3); } else { result = DoubleToString(m_highLimit,3); }
      
      





「then」ステートメントは「else」ステートメントと同等です」



または、ここにあります(m2とm1はfloat型です):



  if ((m2 - m1) == 0.0) { doSomethingHere(); }
      
      





「奇妙な正確な比較。 定義された精度の比較を使用することをお勧めします:fabs(A-B)<Epsilon or fabs(A-B)> Epsilon»



一般に、部署に約30人の開発者がいて、主にVisual Studioで作成し、Klocworkに3万ユーロがない場合、PVS-Studioは非常に良い選択です。



All Articles