2009-11-04 1 views
5

私は、ソースコードから決して使用されていないコードを削除するための努力を少なくとも必要としている状況にあります。一般的には静的コード解析ツールを使用します。私たちは他のプロジェクトでこれに大きな幸運をもたらしましたが、私が知る人は、デバイスレベルのコードを扱うC/C++開発者のほとんどです。静的コード解析はSpringやその他の抽象化とどのくらいうまく機能しますか?

私はJava EEシステムで働いているウェブ開発者です。私が開発している技術にとってより適切であると確信できるのであれば、おそらく他の何かを主張することができるかもしれませんが、分析のために好まれるツールはCoverity Preventです。

抽象的なものがたくさんあるシステムに対して実行しているときに、デッドコードに対する静的コード分析の有効性はどうですか?たとえば、Springの依存性注入と、JSFを使用します。どちらの場合でも、フロントエンドからバックエンドへの関数呼び出しをトレースし、呼び出されるものと呼び出されないものとを完全に把握する方法はありません。

デッドコードチェックの誤検出が、最初にツールを実行する価値を上回ることに非常に懸念しています。

このシナリオではどのような経験がありますか?あなたのアーキテクチャが多くの抽象化を使用していたときに静的コード解析ツールから価値を得ることはできましたか?あなたが最低限の偽陽性で動作させるために必要なことはありましたか?

+0

これは、コミュニティのwikiタイプの質問によく似ています。 –

答えて

4

以前はJava静的解析製品のCoverityで働いていました。

デッドコードを検出するこの特定のタスクは、スタティックアナライザのヒットミスとなることがあります。特にデッドメソッド(実行時に呼び出すことができないメソッド)では、静的アナライザーにすべての動的エントリポイントについて通知することなく、誤検出率が非常に高くなります。

メソッド内のデッドコードの場合、アナライザでその機能が使用されている場合、解析では入力データについての前提はありませんので、結果はかなり良いはずです。全ての可能な入力を仮定しても、相関した論理が特定の分岐が取られないようなデッドコードを見つけることは可能です。

0

すべての場合のスタティックコード分析は、分析プロセスとコードを完全に理解している場合にのみ行う必要があります。問題は単純に、大まかで仮定を提示していることです。解決策も、脆弱性の完全な正確なチェックもありません。他のテスト方法では、誤検出率を判断できなければなりません。

スタティックコードアナライザの値はコードレビューではありません。死んだコードを取り除くために、コードカバレッジを使ってプロファイルします。 - あなたのケースでは、多くの抽象化について言及しています...私は静的コード分析では十分ではないと考えています。

+1

これは非常に厳しいアドバイスのようです。データフロー分析の限界を理解していない限り、誰もFindbugを使用しないでください。抽象解釈の詳細を読むまで、Coverityの製品は制限されていませんか? 結果が気に入ったら、それに行ってください。分析の仕方を正確に理解する必要はありません。 –

+0

しかし、それはまさに私が意味していたことです。データフロー分析に精通していない限り、FindBugs、PMD、または静的コード解析に関連するものは誰も使用してはいけません。 それ以外の人は、検出を回避しようとする傾向がありますが、とにかく同じバグが生成されます。非常に洗練されたプログラマだけが静的コード分析を効率的に使用して、コード内の脆弱性を排除できます。問題を発見した製品はパッチを作成しませんし、モデルを認識していません。 – wishi

2

テストカバレッジツール(動的分析)を使用して、のコードをとすることができます。補完とは、死んでいる可能性のあるコード(実行されていない!)であり、検査が必要である(例えば、誤検出があるかもしれない)。運動量が増えるほど、偽陽性率は低くなります。

このデータを収集できるJavaテストカバレッジツールはhereです。

偽陽性を最小限に抑えたい場合は、静的解析ツールを実行してカバレッジをテストし、交差点をとることを検討してください。

一般に、デッドコードXを検出するには、Xが呼び出される条件がないことを証明する必要があります。静的解析ツールは、このため高い偽陽性率を持っている理由であるフォーム

if (Turing(..)) then call X(); 

の文チューリングマシンでのIFと直面した場合には(理論的に不可能)難しいです。

しかし、多くの場合、「デッドコード」は実際にはそれを呼び出すことができないコード(FAA用語では「非アクティブコード」)です。つまり、Xが定義されている間は、システムの任意の場所(直接的または間接的)でXの呼び出し(またはXがデータ項目の場合はアクセス)はありません。静的解析ツールでは、動的なクラスローディングとリフレクション(不明ではあるがロード可能なクラスにもかかわらず、非アクティブなコード解析の問題を不可能にする)というJavaの面倒な複雑さを検出する方が簡単です。

これらの複雑さを無視して、大きなJavaシステムで非アクティブなコードを検出し報告する静的解析ツールを見つけることができます。このようなツールは、Javaシステム全体を一度に処理する必要があります。そうしないと、分析に含まれていない1つのモジュールに参照が存在する可能性があります。我々は"deactive" code detector and removerを構築して、あなたのソースコードを自動的に削除されたすべての非アクティブなコードと、参照されていないものについて報告することさえできます。レポートを調べ、クリーンアップされたコードを使用するのか、または使用されていないエンティティへのアクセス権を追加するかを決定します。

+0

静的解析ツールに関しては、プログラムに関する不可能な理論は崩壊しています。停止問題はTuring()メソッドで参照されているように大きな問題ですが、コンパイラの最適化にも適用され、最適化コンパイラのユーティリティには疑問はありません。分析ツールはユーザーに証拠を提供する必要があり、ユーザーは複雑な証拠チェーンを信じることはありません。これは比較的平凡ではありませんが、それは興味深いことです。これは、ツールがコードベースで広く異なる問題を見つけることができます。人間が特定するのは非常に困難ですが、人間が確認するのは非常に簡単です。 –

+0

私は静的解析ツールをフォールトさせていません(私もそれらに触れました!)、その理論がすべての状況で正しい答えを生み出すことはできません。正しい回答は静的分析ツールを使用することであると私は同意します。なぜなら、人々よりも複雑さを扱う際にgeneratlではるかに優れているが、回答を確認するためです。 "信頼するが、確認する"。 –

1

静的解析では、抽象化で実際に動作する静的解析ツールは認識していません。抽象を使用する方法についてのプロセスと理由を分析するためのモジュールを書く必要があります。

デッドコードの存在にはこれ以上のコストがかかりません。

関連する問題