コンテンツにスキップ

A critical comparison on six static analysis tools: Detection, agreement, and precision

アブストラクト

  • 開発者は、静的解析ツールを使用して、欠陥や技術的負債などのソースコードの潜在的な品質問題を制御する
  • ツールベンダーは非常に多くのツールを考案しており、実践者が自分のニーズに最も適したツールを選択することを困難にしている
  • これまで研究が行われてきたが、研究者が何に合意しているか、研究者の勧告はどのくらい正確であるのかについての知識が不足している
  • Better Code Hub, CheckStyle, Coverity Scan, FindBugs, PMD, SonarQubeの6つの一般的な静的解析ツールの大規模な比較を提案することによって、このギャップを埋めることを目的としている
  • 6つの静的解析ツールを適用して47のJavaプロジェクトを分析する
  • それらの合意を評価するために、それらが同じ問題を識別するかどうかを行レベルとクラスレベルで手動で分析することによって比較した
  • 主要な結果は、ツール間の一致がほとんど、または全くなく、精度が低いことを示している

はじめに

  • 静的解析ツールは、潜在的なソースコードの品質問題を発見するために、ソースコードを実行せずに分析する手段である
  • これらのツールは、特に継続的インテグレーションパイプラインで使いやすくなるにつれて人気が高まっており、幅広い選択肢がある
  • しかし、利用可能なツールの数が増加するにつれて、実践者が自分のニーズに最も適したツールを選択することが困難になる
  • この選択プロセスで実践者を支援するために、研究者は既存の静的解析ツールの能力を比較するための経験的研究を実施してきた
  • 既存の研究では、3つの側面が十分に調査されていない
    1. 静的解析ツールによって実際に検出できるソース品質の問題
    2. 潜在的に問題があるとマークされたソースコードに関して異なるツール間の一致は何か
    3. 多種多様な利用可能なツールが推奨事項を提供する精度は何か
  • これらの側面に関する知識が改善されれば、実践者が使用するツールを選択する際に情報に基づいた決定を下せるだけでなく、研究者/ツールベンダーがツールを強化し、開発者に提供されるサポートのレベルを向上させることができる
  • 本論文では、最も広く使用されている6つの静的解析ツール、すなわちSonarQube, Better Code Hub, Coverity Scan, FindBugs, PMD, およびCheckStyleの検出能力に関する大規模な経験的調査を提案
    • 具体的には、Qualitas Corpusデータセットからの47のプロジェクトのコーパスに対して検討されたツールを実行し、(1) ツールによって検出されたソースコードの品質問題の機能と分布を示し、(2) ツールによって与えられた推奨事項間の一致を行レベルで計算し、(3) ツールの精度を手動で計算
  • 本研究の主な結果は、検討されたツールの中でSonarQudeが、他の静的解析ツールで検出できるほとんどの品質問題を検出できるツールであることを示している
    • しかし、検出された特定の品質問題を考慮すると、ツール間の一致はほとんどまたは全くなく、異なるツールが異なる形態の品質問題を識別できることを示している

関連研究

  • 異なる言語で開発されたプロジェクトにおいて、どの 静的解析ツールが使用されているか、および効果的な解決時間を調査してきた
  • その結果、最も違反された規則は、コーディング標準の遵守とライセンスの欠落に関連していることが示された
  • 問題のうち平均13%がシステムによって解決されている
  • いくつかの研究では、静的解析ツールによって検出されたルールが、コード内の問題を特定するのに効果的であることが示されている

静的解析ツールの選択

  • この研究のために選択した静的解析ツールと、このツールが持つ問題検出機能について説明する
    • 特に、2つの主な観察に基づいて6つの静的解析ツールを選択した
    • その採用に関してこの分野の研究者によって以前に調査され、実際に最も広く使用されていることが判明したツールを選択した
    • 著者にとって馴染のあるツールを選択した

Better Code Hub

  • コードの品質を評価するために一般的に使用される静的解析ツール
  • 分析は、GitHubのリポジトリを分析するWebサイトのAPIを通じて行われる
  • デフォルトの構成ファイルをカスタマイズできる
  • コードの品質は、一般に、構造、編成、変更可能性、理解可能性に基づいて測定される
  • これは、10個のガイドラインに対してコードを評価することによって行われる
  • 静的解析は、ヒューリスティクスと一般的に採用されているコーディング規約に対するソースコードの分析に基づいている
  • 10個のルールのうち、8個のルールは3つのタイプと3つの重大度に分類される

Checkstyle

  • Javaコードの品質を評価するオープンソースのツール
  • 分析はAntのサブ機能として使用するか、コマンドラインツールとして使用して行われる
  • 一連のチェックに従って構成された特定のコーディング標準に従ってコードを評価
  • ユーザーの好みに応じてカスタマイズされた構成ファイルも使用できる
  • 種類と重大度に基づいてグループ化された合計173個のルールが検出される
  • 173個のルールは14個の種類と4個の重大度レベルに分類される

Coverity Scan

  • オープンソースの静的解析ツール
  • コードビルドは、パブリックAPIを介してサーバーにビルドを送信することによって分析される
  • このツールは、カテゴリー別にグループ課された欠陥と脆弱性を検出
  • これらのカテゴリーごとに、欠陥の詳細を説明する様々な問題タイプがある
  • 問題タイプに加えて、問題は3つの影響度に基づいてグループ化される
  • 静的解析は、プログラムが取る可能性のある全てのパスを決定することによるソースコードの検査に基づいている

FindBugs

  • Javaバイトコードを評価するための静的解析ツール
  • バイトコードを分析しても、ソースコードもツールに提供されていれば、ツールは問題の正確な位置をハイライトできる
  • 分析はコマンドラインを介して行われる
  • ツールによって適用される分析はバグパターンの検出に基づいている
  • バグパターンは9個の異なるカテゴリーに分類され、1から20までの範囲でランク付けされる
  • 種類と重大度に基づいてグループ化された合計424個のルールが検出される

PMD

  • 主にJavaとApexを評価するために使用される静的解析ツール
  • 分析は、ツールのバイナリディストリビューションを使用してコマンドラインで実行される
  • ルールを使用してコードの品質を評価する
  • Javaプロジェクトには、合計33の異なるルールセット構成がある
  • ルールセットは、ユーザーの好みに応じてカスタマイズできる
  • ルールの違反は、1から5までの優先度で測定される
  • 種類と重大度に基づいてグループ化された合計305個のルールを検出し、8個の種類に分類する

SonarQube

  • コード品質の問題を測定するたの最も人気のあるオープンソースの静的解析ツールの1つ
  • sonarcloud.ioプラットフォームによってサービスとして提供されるか、プライベートサーバーにダウンロードして実行できる
  • コードの行数やコードの複雑さなどのメトリクスを計算し、最も一般的な開発言語に対して定義された特定のコーディングルールセットへのコードの準拠を検証する
  • 分析されたソースコードがコーディングルールに違反している場合に、ツールは問題を報告する
  • これらの問題を削除するために必要な時間は、修復作業と呼ばれる
  • SonarQubeには、信頼性、保守性、セキュリティのルールが含まれている
  • バグとも呼ばれる信頼性のルールは、コード内の何かが間違っていることを表す品質の問題を生み出し、それはすぐにバグに反映される
  • コードの臭いは、コードの可読性とコードの修正可能性を低下させるコード内の保守性に関連する問題と考えられている
  • SonarQube 6.7.7は、種類と重大度に基づいてグループ化された合計413のルールを検出する
  • これら413のルールのうち、107個のルールがバグ、272個のルールがコードの臭い、34個のルールが脆弱性に分類されている
  • ルールを、Blocker, Critical, Major, Minor, Infoの5つの重大度にグループ化している
  • 36個のBlocker、61個のCritical、170個のMajor, 141個のMinor, 5個のInfoルールを検出する

実証的研究デザイン

目的とリサーチクエスチョン

  • 目的
    1. 実際に特定できる問題の種類を比較
    2. 静的解析ツール間における、実際に特定できる問題の類似性を評価
    3. ソースコード品質の問題を検出する際の能力を評価するために、静的解析ツールが実際に特定できる問題の精度を比較
  • リサーチクエスチョン
    • RQ1. 検討されている静的解析ツールは、機能と、ソースコードの品質問題の分布に関してどのように比較されるか?
    • RQ2. ソースコード品質の問題を検出する際の、様々な静的解析ツール間の共通点は何か?
    • RQ3. 静的解析ツールの精度はどの程度か?

調査の背景

  • Qualitas Corpusのコンパイル版を使用して、ソフトウェアシステムのQualitas Corpusコレクション(リリース20130901)からプロジェクトを選択した
  • Qualitas Corpusデータセットを選択した主な理由
    • ソフトウェアシステムのコンパイル版を提供してくれるから
      • 調査で検討した静的解析ツールのほとんどはコンパイルされたコードを実行する必要があるため、これは重要な要件である
      • ビルドフェーズは非常に時間がかかり、エラーが発生しやすく、異なるデータセットに依存する必要があった
    • 公開されており、十分に確立されているソースで分析を実行することができ、ソフトウェア品質調査のベンチマークとしてよく使用されているから
      • 同じデータセットを使用して他の研究者が異議を唱えることができる洞察と発見を研究者に提供するために、このデータセットで調査を実施することにした
  • データセットには754のバージョン、1800万以上のLOC(Lines of Code)、16,000個のパッケージ、200,000個のクラスを持つ112個のJavaシステムが含まれている
  • さらに、データセットには、IDE、データベース、プログラミング言語コンパイラーなどの異なる種類のプロジェクトが含まれている
  • 調査では、利用可能な112の各システムの最近の(r)リリースを検討した
  • 検討された2つの静的解析ツール(Coverity ScanとBetter Code Hub)はGitHubプロジェクトの権限や設定ファイルのアップロードを必要とするため、分析を可能にするために、112個の全てのプロジェクトをGitHubアカウントにアップロードした

データ収集

  • 112個のシステムのデータセットで利用可能なリリースを考慮して、各プロジェクトの単一のスナップショットを分析した

データ分析

  • RQ1. ツールによって特定されるソースコード品質の問題
    • このRQに対処するために、まずはツールによって検出される機能と問題の概要を提供する
    • この目的のために、ツールの主な機能を抽出するためにツールのドキュメントを参照した
    • 具体的には、各ツールでサポートされているプログラミング言語のリストと、それらがカバーする問題の類型を収集した
    • ツールの機能の概要を提供した後は、ツールが持つ検出機能の重複を判断するために、参照データセットで違反されたルールによって生成される問題の数も計算した
    • 本論文では、静的解析ツールによって実行されるルールと分析チェックの全てのカテゴリーと種類を「ルール」と呼び、コード内で違反されたルールの具体例を「問題」と呼ぶ
  • RQ2. ツール間の共通点
    • ツールの類似性
      • 6つのツール間の類似性を比較するためには15のツールペアの比較が必要になる
      • ツールペアの類似性を判断するために、検出された問題のうち、両方のツールでソースコード内の同じ位置が強調表示された問題の割合を計算した
        • 定義
          • tool agreement(t1, t2) = 同じ位置にある問題の数 / ツール1(t1)やツール2(t2)のルールによって検出された問題の合計数のどちらか小さい方
    • ルールの類似性
      • 定義
        • rule agreement(rm, rn) = 同じ位置において違反されたルールrmとrnの回数 / ルールrmの違反回数
    • クラスレベルと行レベルの2つの粒度で、「同じ位置」に問題があるかどうかを比較した
  • RQ3. ツールの精度
    • ツールの精度は、ツールによって特定された真陽性の問題とツールが検出した問題の総数、すなわち真陽性(TP)と偽陽性(FP)の比率として定義される
      • 定義
        • 適合率 = TP / (TP + FP)

結果の分析

RQ1. 静的解析ツールで検出された問題

  • 静的解析ツールが最も一般的にサポートしているプログラミング言語はJava
  • 選択されたツールで高度にサポートされている他の言語は、JavaScript、C/C++/C#、Objective-C、Swift、Go、Kotlin
  • SonarQubeは上位15個のプログラミング言語に対して最高のサポートを提供しており、そのうち11個をカバーしている
  • 静的解析ツールは、構文、バグ、セキュリティ、デザイン、バッドプラクティスに関する問題を特定できる
  • 静的解析ツールは主に、デザインに関する問題の特定をサポートしている

RQ2. 静的解析ツールの共通点

  • クラスレベルでの検出の共通点
    • クラスレベルでの一致割合は非常に低い
  • 行レベルでの検出の共通点
    • 行レベルでの一致割合も非常に低い

RQ3. 静的解析ツールの精度

  • ほとんどの静的解析ツールの精度は非常に低い
    • 例えば、SonarQubeの精度は18%である
      • 問題を検出する際の感度が高すぎるため
    • 例外として、CheckStyleの精度は86%である
      • 主にソースコード内の非常に単純なチェックを行うため、偽陽性と見なされない問題が多い

議論と示唆

  • 銀の弾丸はない
    • 異なる静的解析ツールは、異なる品質問題をカバーでき、従って、異なる形式のソースコード品質問題を見つけられる
    • ソースコードの品質評価を単独で保証できる銀の弾丸はないと主張できる
  • 偽陽性に対処する方法を学ぶ
  • 静的解析ツールの補完

妥当性に対する脅威

  • 構成概念妥当性
    • 本研究では、ソフトウェアエンジニアリング研究で最も信頼できるデータソースの1つであるQualitas Corpusから112個のプロジェクトを選択した
    • このデータセットには2013年に収集されたデータが含まれているため、ラムダ式のような新たに導入された構成体を見逃した可能性がある
    • 本研究では、静的解析ツールを導入する際にツールのデフォルト構成を採用した
    • そのため、プロジェクトの開発者によって与えられた異なる構成が結果に影響を与える可能性がある
  • 内的妥当性
    • SonarQubeが同じクラスで同じ問題の違反の複数回報告したことがあった
    • この問題を軽減するために、これらの違反を手動で除外した
    • 検討されたプロジェクトが、静的解析ツールによって示される違反ルールの一部を無視するための規則を設けているかどうかを分析しなかった
  • 外的妥当性
    • 様々な特性、ドメイン、サイズ、アーキテクチャを持つプロジェクトの大規模なセットを考慮した
    • オープンソースプロジェクトのソースコードの品質は、クローズドソースまたは産業用アプリケーションに匹敵する
    • 従って、異なるプロジェクトを分析することによって同様の結果が得られた可能性がある
    • Javaプロジェクトの分析に限定したため、結果を異なるプログラミング言語のプロジェクトに一般化することはできない
  • 結論妥当性
    • RQ2では、ツールの精度をそれぞれ研究するために、反復的な手動分析を実施した
    • 不正確さの可能性を排除することはできないが、各段階で複数のインスペクターを関与させることによって、この脅威を軽減した

結論

  • 静的解析ルールの検出に関して、6つの一般的な静的解析ツールの大規模な比較を行った
  • Qualitas Corpusデータセットから47個のJavaプロジェクトを分析し、ツールで検出できる同様のルールを導出した
  • 行レベルとクラスレベルでの検出の一致を比較し、それらの精度を手動で分析した

引用情報

  • 著者: Valentina Lenarduzzi, Fabiano Pecorelli, Nyyti Saarimaki, Savanna Lujan, Fabio Palomba
  • タイトル: A critical comparison on six static analysis tools: Detection, agreement, and precision
  • 雑誌 / 会議名: Journal of Systems and Software
  • 巻号: vol. 198
  • ページ: p. 111575
  • 出版日: April 2023
  • DOI: https://doi.org/10.1016/j.jss.2022.111575