japan.internet.com
japan.internet.com メンバーID
Twitter
Facebook
RSS
ピックアップ
2006年10月25日 11:00

FxCopとカスタムルールを使って.NETコードの品質を監視する

著者Joydip Kanjilalオリジナル版を読む海外海外発

はじめに

 FxCopは、Microsoftが提供している、マネージド.NETアセンブリを分析するための無料のコード分析ツール(オープンソース)です。.NETアセンブリは、アセンブリと、含まれているすべてのデータ型を表すメタデータのエントリで構成されています。FxCopは、アセンブリメタデータを読み取り、それが推奨のコーディング標準やプラクティスを記述しているビルトインルールおよびカスタムルールに準拠しているかどうかをチェックします。

 FxCopは、アセンブリを分析した後に、ローカライゼーション、パフォーマンス、およびセキュリティの分野におけるルール違反をレポートします。コードのチェックは、埋め込みxmlファイルに格納されている一連のルールとメッセージに対して行われ、ルール違反が発生する場合は、実行時に該当のメッセージが表示されます。ビルトインルールを、自分で作成するカスタムルールで拡張できます。本稿では、FxCopの使用方法と、このようなカスタムルールを作成し、適用する方法について説明します。

 本稿で説明する方法を実装するには、FxCop Version 1.32、.NET Framework Version 1.1以上のインストール、およびWindows XP/2000以上のOSが必要です。

FxCopとは?

 FxCopは「Framework Police」の略であり、マネージドコードアセンブリがMicrosoft .NET Frameworkのデザインガイドラインおよびカスタムガイドラインに準拠しているかどうかをチェックする、ルールベースのエンジンです。アセンブリに対するチェックは、アセンブリに含まれるMSILを解析し、ルールに一致しないコードを調べてレポートすることによって行われます。FxCopによるテストは、.NET対応言語のソースコードでなく、マネージドアセンブリに対して行われます。つまり、Microsoft.NETマネージド環境対応の言語を使って作成された任意のアセンブリに対して、FxCopを適用することができます。

FxCopを使用する理由

 FxCopは、特に複数の.NET言語を使用する会社に、次のような直接的な利益をもたらします。

  • Microsoft .NET Framework上で動作する.NET準拠言語によって作成されたマネージドアセンブリと連携します。
  • 事前定義された多くのルールセットを備えています。
  • カスタムルールを作成できます。
  • 適切な形式のXMLテストレポートを生成します。
  • オープンソースツールなので、必要に応じて拡張したり変更したりできます。

 一方、現時点のFxCopには、次のような制限があります。

  • ソースではなくアセンブリメタデータとのみ連携するため、ソースコード分析ツールほど具体的ではありません。
  • フラットなルール構造に従うため、大量のポリシーセットの実装は困難です。
  • カスタムレポートタイプはサポートされません。

FxCopの入手方法

 FxCopはMicrosoftが開発したツールであり、無料でダウンロードできます。

 問題や質問がある場合は、FxCopチームまたはMSDNフォーラムにメッセージを送ることができます。

重要なFxCop用語

 ターゲットとは、FxCopを使って標準への準拠性を調べる対象となるマネージドアセンブリのことです。

 FxCopは、分析時に実行するチェックをルールとして表現します。FxCopルールはpublicクラスとして実装されます。どのルールも、FxCop SDKのProblemCollectionクラスのオブジェクトへの参照を返すCheckメソッドを実装します。この値によって、違反が発生しているかどうかが決まります。ルールは、ターゲットを分析するマネージドコードで構成され、検出した内容を示すメッセージを返します。このメッセージは、標準違反を表示するだけでなく、ソースコード内で違反を修正する方法に関するガイダンスも提供します。

 FxCop内のルールは、既定ルールカスタムルールに分けられます。既定ルールは、カテゴリに基づいてグループ化されています。FxCopのいくつかの重要なビルトインルール、その目的、および例を以下に示します。

  • デザインルール
  • .NETのデータ型とアセンブリのデザインに関するルール。
    例: 抽象型にはコンストラクタを指定できない。
  • グローバリゼーションルール
  • グローバリゼーションとローカライゼーションに関するルール。
    例: ロケール固有の文字列をハードコード化してはならない。
  • 命名ルール
  • 命名規約に関するルール。
    例: データ型の名前をパラメータで使用してはならない。
  • パフォーマンスルール
  • コードのパフォーマンスの向上または障害の可能性をチェックするルール。
    例: 文字列長を使って空の文字列をテストする。
  • セキュリティルール
  • セキュアなコードをチェックするルール。
    例: ポインタが認識可能であってはならない。
  • 使用ルール
  • 標準的な.NET Frameworkの使用に関するガイダンスを提供するルール。
    例: ファイナライザは保護する必要がある。

FxCopインターフェイス

 FxCopには、GUIベースのユーザーインターフェイスとコマンドラインインターフェイスの2種類があります。FxCop GUIは、3つのウィンドウから成ります(図1を参照)。

図1 FxCopユーザーインターフェイス: 構成ペイン、メッセージペイン、およびプロパティペインを示すFxCop UIの画面ショット
図1 FxCopユーザーインターフェイス: 構成ペイン、メッセージペイン、およびプロパティペインを示すFxCop UIの画面ショット

 構成ペインには、現在のFxCopプロジェクトのターゲットとルールがツリービュー形式で表示されます。この構成ペインを使って、ターゲットアセンブリと、ターゲットアセンブリの分析に使用するルールを選択します(複数のアセンブリを同時に分析できます)。

 メッセージペインには、検査後のターゲットアセンブリに関する分析レポートが表示されます。これらのメッセージは、その重要度と危険度に基づいて次のレベルで表示されます。

  • 重大エラー
  • エラー
  • 警告
  • 重大警告
  • 情報

 図2は、典型的なFxCop分析レポートです。

 プロパティタブには、名前空間、型と型メンバー、ルールグループ、ルール、メッセージなどを含む、ターゲットアセンブリに関する情報が表示されます。ルールやルールグループを選択したり、一部のルールを破棄したりして、FxCopがアセンブリをテストする基準となるルールセットを構築できます。

図2 FxCop分析レポート: さまざまなメッセージタイプが含まれているFxCop分析レポートのサンプル
図2 FxCop分析レポート: さまざまなメッセージタイプが含まれているFxCop分析レポートのサンプル

FxCopでカスタムルールを作成する

 FxCopでは、カスタムルールを作成して、独自の標準を適用することができます。このためには、FxCop SDKを使ってカスタムルールを開発し、それをビルトインの既定ルールに追加します。カスタムクラスは、FxCop SDK内のBaseIntrospectionRuleクラスを継承するクラスです。XMLドキュメント内でカスタムクラスを記述し、これをリソースとしてアプリケーション内に埋め込みます。

FxCop SDKを使ってカスタムルールを実装する

 詳しい例は後で示しますが、FxCopでカスタムルールを作成するために従う必要がある手順の概要を以下に示します。

 最初に、クラスライブラリプロジェクトを作成し、「FxCopSdk.dll」および「Microsoft.Cci.dll」アセンブリへの参照を追加します。

 次に、クラスを作成してルールを実装します。このクラスは、BaseIntrospectionRuleクラスから継承する必要があります。

 次のusing文をカスタムルールクラスに追加します。

using Microsoft.Cci;
using Microsoft.Tools.FxCop.Sdk;
using Microsoft.Tools.FxCop.Sdk.Introspection;

 次に示すような、カスタムルールクラスのコンストラクタを作成します。

public MyCustomRule() : base( "MyCustomRule",
    "ProjectName.RuleCategory.RuleDefinitions",
    typeof(MyCustomRule).Assembly )
{

}

 XMLドキュメントファイルでルールを記述し、これを埋め込みリソースとしてメインアセンブリに保存する必要があります(このファイルの"Build Action"を"Embedded Resource"に変更)。このプロセスについては、以下で詳しく説明します。

 保存およびコンパイルして、アセンブリをビルドします。

 最後に、FxCop IDEを使って新しいルールを追加します。このアセンブリがFxCopルールエンジンに追加されることに注意してください。この時点で、FxCopを使って、事前定義のルールと新しいカスタムルールの両方に基づいてターゲットアセンブリを評価できます。

カスタムルールの例

 この例ではBaseRuleクラスを作成しますが、後でこのクラスを継承してカスタムルールクラスを作成します。必要なファイルは次のとおりです。

  • NamingRules.xml
  • 実装するすべてのルールの説明が含まれています。
  • NamingRules.cs
  • すべてのカスタム命名ルールのC#コードが含まれています。
  • BaseRule.cs
  • BaseRuleクラスが含まれているC#コードファイル。

 「NamingRules.xml」ファイル内の、XML形式のサンプルカスタムルールのルール定義を以下に示します。

<Rule TypeName="ObjectNamingRule"
    Category="FxCopCustomRules.CustomRules" CheckId="Rule0001">
    <Name>
        Objects of the Object class should be properly named.</Name>
    <Description>
        Objects of the Object class should be prefixed with obj’.
    </Description>
    <GroupOwner>Joydip</GroupOwner>
    <DevOwner>Self</DevOwner>
    <Owner>Self</Owner>
    <Url>http://localhost</Url>
    <Resolution>Change the name of the object {0} so
        that it starts with a prefix of ’obj’.</Resolution>
    <Email>joydipkanjilal@yahoo.com</Email>
    <MessageLevel Certainty="50">Warning</MessageLevel>
    <FixCategories>Breaking</FixCategories>
</Rule>

 上記のコードのルール名はInterfaceNamingRuleであり、カテゴリはNamingRulesです。

 BaseRuleクラスのコードを以下に示します。このコードはダウンロードサンプルの「BaseRule.cs」ファイル内にあります。なお、後でこのクラスを継承してカスタムルールクラスを作成します。

using System;
using Microsoft.Cci;
using Microsoft.Tools.FxCop.Sdk;
using Microsoft.Tools.FxCop.Sdk.Introspection;

[CLSCompliant(false)]

namespace FxCopCustomRulesLibrary
{
    public abstract class BaseRule : BaseIntrospectionRule
    {
        protected BaseRule(string name) : base(name,
            "FxCopCustomRulesLibrary.NamingRules.NamingRules",
            typeof(BaseRule).Assembly)
        {
        }
    }
}

 上記のコードのBaseRuleクラスは、コードの再利用性を促進し、コードのメンテナンスを簡単化する、共通機能を提供します。例えば、クラスコンストラクタは、要求されたパラメータを使ってBaseIntrospectionRuleコンストラクタへの呼び出しを行います。

 リスト1は、BaseRuleクラスを継承するカスタムルールを示しています。これは、ダウンロードサンプルの「NamingRules.cs」ファイルに含まれています。

リスト1 カスタムルールクラスの例:このObjectNamingRuleクラスはBaseRuleクラスを継承
public class ObjectNamingRule : BaseRule
{
    public ObjectNamingRule() : base("ObjectNamingRule")
    {
    }

    public override ProblemCollection Check(Member member)
    {
        Method method = member as Method;
        bool problem = false;

        if (method != null)
        {
            InstructionList instructions = method.Instructions;
            if (instructions.Length == 0)
                return null;

            LocalList localList = instructions[0].Value as LocalList;
            if (localList == null)
                return null;

            Local local;

            string strName = String.Empty;
            string strType = String.Empty;

            for (int index = 0, length = localList.Length;
                index < length ; index++)
            {
                local = localList[index];

                strName = local.Name.Name;
                strType = local.Type.FullName.ToString();

                if (strType.Equals("System.Object") &&
                    !strName.StartsWith("CS$"))
                {
                    problem = (strName.Length < 3 ||
                        !strName.Substring(0,3).Equals("obj"));
                }
                if (problem)
                {
                    Problems.Add ( new Problem (
                        GetResolution (strName) ) ) ;
                }
            }
        }
        else
        {
            Field field = member as Field;
            if (field == null)
                return null;
            else
            {
                if (field.Type.FullName.ToString()
                    .Equals("System.Object"))
                {
                    problem = ((member.Name.ToString().Length < 3 ||
                        !member.Name.ToString().Substring(0,3)
                        .Equals("obj")));
                }
                if (problem)
                {
                    Problems.Add ( new Problem (
                        GetResolution (member.Name.Name))) ;
                }
            }
        }
        return Problems;
    }
}

FxCopを使ってアセンブリを分析する

 FxCopを使ってアセンブリを分析するには、次の一連の手順に従う必要があります。

  • FxCopアプリケーションを開始します。
  • プロジェクトで分析するターゲット(アセンブリ)を選択し、追加します(FxCopメニューシステムの[Project]-[Add Targets])。
  • カスタムルール(ある場合)をFxCopアプリケーションに追加します(FxCopメニューシステムの[Project]-[Add Rules])。
  • [Analyze]ボタンをクリックします。

FxCopとVS.NETの統合

 FxCopとVisual Studio IDEを統合することによって、開発者は、コーディング時にソースコードを分析できるようになります。FxCopが生成するレポートによって開発者はアプリケーションを展開する前にエラーを見つけて修正できるため、この統合は開発者にとってメリットがあります。

統合方法

 FxCopには「fxcopcmd.exe」という名前のコマンドラインツールがあり、これを使用することで、FxCopとVS.NET IDEを統合したり、または、FxCopの分析およびレポート生成機能をビルドプロセスに追加したりできます。統合するには、次の手順を実行します。

  • VSメニューの[Tools]-[External Tools]を選択します。ポップアップウィンドウが表示され、構成可能なオプションが表示されます。
  • [Title]フィールドに「FxCop」と入力します。
  • [Command]フィールドに「C:Program FilesMicrosoft FxCop 1.32FxCopCmd.exe」と入力します。
メモ
 これは既定のインストールパスです。FxCopを別の場所にインストールしている場合は、異なるパスを使用する必要がある可能性があります。
  • [Arguments]フィールドに「/f:$(TargetPath) /r:"C:Program FilesMicrosoft FxCop 1.32Rules" /c」と入力します。
  • [Initial Directory]フィールドを[$(ProjectDir)]に設定します。
  • [Use Output Window]をオンにします。

 変更を保存します。VS.IDEから、メニューシステムで[Tools]-[FxCop]をクリックします。FxCopによってルールがロードされ、VS.NET IDEの出力ウィンドウにレポートが表示されます。

 現代のIT業界におけるソフトウェアアプリケーションは、時間と共に複雑になり、高度になってきています。Microsoftがリリースした無料のFxCopコード分析ツールを使用することで、開発者は、事前に定義された標準に準拠する高品質なソフトウェアアプリケーションを設計するという目標を達成できます。本稿では、FxCopを使ってカスタムルールを作成し、要求される標準にマネージドアセンブリが準拠しているかどうかを分析する方法について説明しました。また、FxCopをVisual Studio IDEに統合する方法についても説明しました。この操作によって、開発者はアセンブリの問題点をオンデマンドで、または標準のビルドプロセスの一部として、簡単に分析することができます。

著者紹介

Joydip Kanjilal(Joydip Kanjilal)
業界で10年以上のキャリアを持ち、C、C++、Java、C#、VB、VC++、ASP.Net、XML、デザインパターン、UMLなどに携わる。現在は、インドのハイデラバードにある一流の多国籍企業のシニアプロジェクトリーダーを務めるかたわら、.NETおよび関連テクノロジに関する記事をAspAllianceに投稿している。

プリンター用
記事を転送
この記事をクリップ!
【特別連載企画】au 版「GALAXY」の実力は?--ISW11SC 速攻レビュー
【特別連載企画】au 版「GALAXY」の実力は?--ISW11SC 速攻レビュー KDDI(au)から、NTT ドコモの人気スマートフォン「GALAXY S II」を大幅に進展させた「GALAXY SII WiMAX ISW11SC」が発売される。サムスンがこれまでに蓄積してきたノウハウが詰まった本機の実力をレポートする。
⇒詳細記事はこちら
⇒連載記事一覧はこちら
注目のトピックス
最新コラム一覧
百式のネットビジネス研究
百式のネットビジネス研究
フリーランスな人が多い今だからこそ…「FREELANCE THANKS」
週刊-サイト別アクセス状況データ
週刊-サイト別アクセス状況データ
12月の主婦層、ベルメゾンが首位を維持(VRI 調査)
アウンのグローバルマーケティング動向
アウンのグローバルマーケティング動向
Web プロモーションにおいて大切なこと―年度末編―
多言語×Web×海外マーケティング情報
多言語×Web×海外マーケティング情報
海外発、注目 AR プロモーション
エンジニア転職ノウハウ開発室
エンジニア転職ノウハウ開発室
楽天が目指す変革──Globalization、Agile、Big Data
中国・台湾ネットビジネス情報最前線
中国・台湾ネットビジネス情報最前線
中国から Web を見てもらいたいならば
マーケティングに活用できる最新トレンド
マーケティングに活用できる最新トレンド
改めて、「導線」最適化に目を向ける
次世代マーケティングチェーンの視点
次世代マーケティングチェーンの視点
ソーシャル時代における BtoC 型 Eコマース成功のポイント
Copyright 2012 internet.com K.K. (Japan) All Rights Reserved.