「優先度スコア」による通知の数の調整

「要確認コード」と「優先度スコア」とは?

Sider Scan では、検出されたクローンのペア間におけるコードの一貫性の欠如を検出し、これを「要確認コード」として通知します。要確認コードとは、変更漏れのバグの可能性がある、あるいはバグではないが可読性の観点から修正したほうがよいと思われるコードになります。

さらにSider Scan は、検出された要確認コードを、様々な観点から一つ一つ評価し、総合的に確認すべき「優先度スコア」を算出しています。優先度は高い順にHigh, Mid, Low でランク分けされます。優先度スコアが高い要確認コードは、バグなどの深刻な問題を持つ可能性が高いため、早急に確認していただきたいコードになります。 優先度スコアの評価アルゴリズムは、継続的に最適化されています。アルゴリズムの詳細に関してはこちらの節を参照下さい。

優先度スコア “MID” の指摘の例

通知の数の調整方法

要確認コードのうち、優先度スコアが極端に低いものはバグではなく誤検知(いわゆるFalse-Positive)である可能性が高いため、ユーザーに通知されることはありません。しかし、優先度スコアは、使用しているプログラミング言語や、リポジトリ内部の重複コードの量、あるいはソフトウェアの種類(アプリケーション、ライブラリ、フレームワーク、等)によっても変わります。前述のとおり、スコア評価アルゴリズムは日々改善されていますが、すべてのリポジトリで誤検知を減らし、適切な通知の量に調整することは容易ではなく、リポジトリによっては通知の数が多すぎて、確認が困難になることもあります。

そのような場合、優先度スコアを閾値として、報告する通知の数を制限することが可能です。設定は、.siderscan.json に記載することで有効になります。.siderscan.json ファイルに、report オブジェクトの子オブジェクトとして、notificationThreshold オブジェクトを記載します。取りえる値は以下のとおりです。

  • キー名: notificationThreshold
  • 値: “high”, “mid”, “low”
  • 既定値: “mid”

値の意味は、それぞれ

high: 優先度スコアがHigh のもののみ通知
mid: 優先度スコアがMid 以上のものを通知
low: 全ての指摘を通知

となります。以下は、優先度スコアがHigh 以上のもののみ通知するように設定した例です。

{
  "report": {
    "notificationThreshold": "high",
    "mail": {
      "to": ["alice@siderlabs.com", "bob@siderlabs.com", "carol@siderlabs.com"],
      "useBuiltInProvider": true
    }
  }
}

優先度スコアの評価アルゴリズム について

優先度スコアの評価アルゴリズムは、多数のオープンソースソフトウェアプロジェクトや、ご協力いただいた顧客の実際のリポジトリを分析した結果として得られた15種以上のヒューリスティックなルールと、機械学習の技術を使って開発された誤検知を落とすノイズフィルターを組み合わせたSider Scan 独自のものです。

アルゴリズムは毎回のリリース毎にアップデートされていて、常に新しい要素が含まれますが、現時点の評価アルゴリズムで、優先度の算出に使用している基準の一例は以下のようなものです。

  • 指摘箇所がリテラルトークンであるか否か
  • 指摘された単語(変数、関数名、定数、引数など)の重複コード内での出現頻度
  • 同一重複コードでの指摘の数
  • パターン辞書に利用した単語と、パターンに違反している単語の数の比率
  • 一致した単語と一致していない単語のクローン内でのスコープ
  • 自動生成されたコードか否か

今後、算出アルゴリズムの追加・修正、あるいは、すでにある要素の重みの変更などにより、優先度が入れ替わる可能性があります。