7

私は最近、行っていた Java ビルドで findbugs 静的分析ツールを使い始めました。最初のレポートには、優先度の高い警告が大量に含まれていました。強迫的なタイプの人なので、私はそれらをすべてノックアウトする準備ができていました. しかし、私は何かが欠けているに違いありません。物事を比較すると、ほとんどの警告が表示されます。次のコードのように:

   public void setSpacesPerLevel(int value)
   {
      if( value >= 0)
      {
         spacesPerLevel = value;
      }
      else
      {
         spacesPerLevel = 0;
      }
   }

読み取る if ステートメントで優先度の高い警告を生成します。

ファイル: Indenter.java、行: 60、タイプ: BIT_AND_ZZ、優先度: 高、カテゴリ: CORRECTNESS sample.Indenter.setSpacesPerLevel(int) で ((...) & 0) == 0 かどうかを確認します

int と int を比較していますが、よくあることのようです。同様の単純な比較で、そのタイプのエラーがかなり発生します。

単純なコードブロックのように見えるものについて、他にも多くの優先度の高い警告があります。ここで何か不足していますか?静的分析では誤検知が発生する可能性があることは理解していますが、私が見ているエラーは、あまりにも些細なケースで誤検知とは思えません。

これも頭を悩ませています。

    for(int spaces = 0;spaces < spacesPerLevel;spaces++)
    {
       result = result.concat(" ");
    }

これにより、次の findbugs 警告が表示されます。

File: Indenter.java, Line: 160, Type: IL_INFINITE_LOOP, Priority: High, Category: CORRECTNESS

There is an apparent infinite loop in sample.Indenter.indent()

This loop doesn't seem to have a way to terminate (other than by perhaps throwing an exception).

何か案は?

したがって、基本的には、少数のファイルと、上記のような優先度の高い警告が 50 ~ 60 個あります。私はfindbugs 1.3.9を使用しており、findbugs antタスクから呼び出しています

更新: このビルドは hudson サーバーによって実行され、コード カバレッジのために Clover によってコードがインストルメント化されました。それをオフにすると、優先度の高い警告がすべて消えました。それは今では理にかなっています。フィードバックをお寄せいただきありがとうございます。

4

3 に答える 3

7

更新: このビルドは hudson サーバーによって実行され、コード カバレッジのために Clover によってコードがインストルメント化されました。それをオフにすると、優先度の高い警告がすべて消えました。それは今では理にかなっています。フィードバックをお寄せいただきありがとうございます。

于 2010-06-01T17:07:25.020 に答える
3

補足:

for(int spaces = 0;spaces < spacesPerLevel;spaces++)
{
   result = result.concat(" ");
}

resultが の場合java.lang.String、スペース文字ごとに次の手順を実行するため、これは非効率的である可能性があります。

  1. char[]連結の結果を保持するためにnew を作成します
  2. java.lang.String文字配列をラップする新しいインスタンスを作成します

これを繰り返し行うと、特にresultがすでに長い場合、これには多くの時間がかかります。

そのメソッドのパフォーマンス (時間とメモリの両方) が重要な場合は、 (スレッドStringBuilderセーフではない) またはStringBuffer(スレッドセーフである) の使用を検討する必要があります。

于 2010-06-01T18:00:48.650 に答える
1

Eclipse プラグイン、ant、または gui を介して Findbugs を実行していますか? コードを実行してから (変更を加える前に) コードが再コンパイルされていない可能性はありますか?

setSpacesPerLevel が長すぎない場合は、出力を投稿してください

javap -v TheClassThatContainssetSpacerPerLevel

2 番目のバグについては、問題があるかどうかを判断する前に、ループ全体を表示する必要があります。

于 2010-06-01T16:01:34.333 に答える