コード分析 (Code Analysis)

コードが分析され、マネージド コードのコード分析警告にあるような指摘を受けられます。

分析方法の設定

プロジェクトのプロパティの[コード分析]にあるルール セットで、コード分析での分析方法を指定します。該当するルール セットがないならば、[開く]から任意のコードを指定して分析できます。

ルール セット
規則セット 内容 使用目的 定義ファイル ※1
Microsoft マネージ最小規則 コード分析が最も厳密に行われる、コードの最も重大な問題に関するもの

(規則は少数で、限られたVisual Studioエディションだけで使用されることが意図されている。他のVisual Studioエディションでは、MinimumRecommendedRules.rulesetを使用する)

  ManagedMinimumRules
.ruleset
Microsoft マネージ推奨規則
  • セキュリティ ホール
  • アプリケーション クラッシュ
  • 重要な論理エラー
  • デザイン エラー
など、コードに含まれる最も重要な問題に関するもの
プロジェクトにカスタムの規則セットを作成する場合 (必ずこの規則セットを含める) MinimumRecommendedRules
.ruleset
Microsoft 基本デザイン ガイドライン規則 コードをわかりやすく、また使いやすくするためのベスト プラクティスに関するもの プロジェクトにライブラリ コードが含まれる場合や、コードをメンテナンスしやすくするためにべスト プラクティスを適用する場合 BasicDesignGuidelineRules
.ruleset
Microsoft 拡張デザイン ガイドライン規則 基本デザイン ガイドライン規則をさらに掘り下げて、
使用可能性と保守容易性に関する問題の検出範囲を最大化するためのもの
プロジェクトにライブラリ コードが含まれる場合や、コード記述の方法に最高レベルの基準を適用してメンテナンスを容易にしたい場合

命名に関するガイドラインに重点が置かれている

ExtendedDesignGuidelineRules
.ruleset
Microsoft 基本正確性規則 フレームワークAPIの使用の際の論理エラー、およびよくある失敗に関するもの 最小推奨規則で報告された警告の一覧から、さらに詳しい情報へと掘り下げる必要がある場合 BasicCorrectnessRules
.ruleset
Microsoft 拡張正確性規則 正確性に関する基本的な規則をさらに掘り下げて、
論理エラーやフレームワーク使用エラーの検出範囲を最大化するためのもの
COM 相互運用機能やモバイル アプリケーションなど、特定のシナリオに重点が置かれており、これらのシナリオのいずれかに該当するプロジェクトがある場合や、プロジェクト内の問題をさらに細かく探す必要がある場合 ExtendedCorrectnessRules
.ruleset
Microsoft 混合 (C++ /CLR) 最小規則 共通言語ランタイムをサポートする C++ プロジェクトの最も重大な問題に関するもの
  • 潜在的なセキュリティ ホール
  • アプリケーションのクラッシュ
など
共通言語ランタイムをサポートするC++プロジェクトにカスタムの規則セットを作成する場合 (必ずこの規則セットを含める) MixedMinimumRules
.ruleset
Microsoft 混合 (C++/CLR) 推奨規則 共通言語ランタイムをサポートする C++ プロジェクトの最も一般的で重大な問題に関するもの
  • 潜在的なセキュリティ ホール
  • アプリケーションのクラッシュ
  • その他の重要な論理エラーや設計エラー
など
共通言語ランタイムをサポートするC++プロジェクトにカスタムの規則セットを作成する場合 (必ずこの規則セットを含める)

(これはVisual Studio Professional Edition以上で構成するように設計されている)

MixedRecommendedRules
.ruleset
Microsoft グローバリゼーション規則 複数の言語、ロケール、およびカルチャが使用される環境において、データの正しい表示を妨げる問題に対処する規則 アプリケーションをローカライズまたはグローバル化する場合 GlobalizationRules
.ruleset
Microsoft セキュリティ規則 Microsoftのセキュリティ規則がすべて含まれる セキュリティ問題の検出範囲を最大化する場合 SecurityRules
.ruleset
Microsoft のすべての規則 すべての規則が含まれる

(この規則セットを実行すると、多数の警告が報告される可能性がある)

コード内のすべての問題を全体的に把握する場合

これは、用途を絞った各規則セットのうち、どれがプロジェクトに対して最も適切かを判断するのに役立つ

AllRules
.ruleset
Visual Studioのコード分析の設定画面での解説

※1 分析の定義ファイルは%PROGRAMFILES(X86)%\Microsoft Visual Studio *.*\Team Tools\Static Analysis Tools\Rule Setsにあります。

分析結果がどの規則セットに属するかは、[エラー一覧]ウィンドウの[カテゴリ]列か、[出力]ウィンドウの内容から確認できます。

分析の実行

自動で実行

プロジェクトのプロパティを開き、[コード分析]にある[ビルドに対するコード分析の有効化]をチェックします。こうするとビルド時に自動でコード分析が実行されるようになります。方法: マネージ コードの自動コード分析を有効/無効にする | MSDN

手動で実行

ソリューション エクスプローラーでプロジェクトのコンテキストメニューを開き、[分析] → [コード分析の実行]から手動で実行できます。方法: マネージ コードについて手動でコード分析を実行する | MSDN

もしくはメニューの【分析 → ProjectName でコード分析を実行】からでも実行できます。

分析結果の検証

分析結果は、[出力]と[エラー一覧]ウィンドウに表示されます。

カテゴリ

  • Design
  • Globalization
  • Maintainability
  • Performance
  • Reliability
  • Usage

コード

CA1002: ジェネリック リストを公開しません (Do not expose generic lists)

System.Collections.Generic.List<T>を返すことが問題視されます。

CA2000: スコープが失われる前にオブジェクトを破棄します (Dispose objects before losing scope)

Dispose()が呼ばれない可能性があることが問題視されます。

  • 「メソッド '***()' で、オブジェクト '***' が破棄されない例外パスがあります。オブジェクト '***' への参照がすべてスコープ外になる前に、このオブジェクトの System.IDisposable.Dispose を呼び出してください。」
  • 「メソッド '***()' で、オブジェクト '***' への参照がすべてスコープ外になる前に、そのオブジェクトの System.IDisposable.Dispose を呼び出してください。」
CA2000: Dispose objects before losing scope - Visual Studio 2015 | Microsoft Learn

そのオブジェクトがスコープ外では不要ならば、usingで生成するようにします。状況によって不要となるならば、finally句でDipose()を呼ぶようにします。

警告の抑制

不要な警告は、SuppressMessage属性で抑制できます。 コード分析の違反を抑制する - Visual Studio (Windows) | Microsoft Learn Visual Studioのコード分析機能を利用してコードの品質を上げよう (2/3)|CodeZine(コードジン) 高野将 (2015/02/05) c# - How to disable specific Code Analysis Warning for entire class - Stack Overflow

[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
Microsoft Learnから検索