規則を選択しよう
VSTSのコード分析には11種類の規則に分類された200種類以上の規約が提供されています。規則違反はビルドエラー、もしくは警告として検出するするように設定できます。先程の操作でもお分かりかと思いますが、すべての規約を使用することは、現実的ではありません。表1に11種類の規則を紹介します。
| 規則名 | 説明 | 規約例 |
| グローバリゼーション規則 | 多国間で使用されるライブラリやアプリケーションの作成に必要な規則 | CA1302:メソッドで、特殊なシステムフォルダのパスの一部を表すリテラル文字列を使用している場合に場合にエラーもしくは警告とする |
| セキュリティ規則 | セキュアなライブラリやアプリケーションの作成に必要な規則 | CA2121:プライベートではない静的コンストラクタがある場合にエラーもしくは警告とする |
| デザイン規則 | .NET Frameworkデザインガイドラインに沿ったコード作成に必要な規約 | CA1062:publicなメソッドで引数がnull(Visual BasicではNothing)であるかどうかを確認せずに引数に操作を行った場合にエラーもしくは警告とする |
| パフォーマンス規則 | パフォーマンスの良いライブラリやアプリケーションの作成に必要な規則 | CA1822:インスタンスデータにアクセスしないメソッドがstatic(Visual Basicではshared)になっていない場合にエラーもしくは警告とする |
| モビリティ規則 | CPUを有効に使うために必要な規則 | CA1601:タイマが1秒ごとに複数回発生するように設定されている場合にエラーもしくは警告とする |
| 移植性の規則 | 異なるプラットフォーム間での対応に必要な規則 | CA1901:プラットフォームに依存するポインタサイズの変数が必要な場所に、固定サイズの整数を渡したりした場合にエラーもしくは警告とする |
| 使い方の規則 | .NET Frameworkを適切に使用するために必要な規則 | CA2214:オーバーライドできるメソッドをコンストラクタで呼び出した場合にエラーもしくは警告とする |
| 信頼性の規則 | 適切なメモリやスレッドの使用のために必要な規則 | CA2000:System.IDisposable型のローカルオブジェクトに対するすべての参照がスコープ外になる前に、オブジェクトが破棄されていない場合にエラーもしくは警告とする |
| 相互運用性の規則 | COMのクライアントとの使用のために必要な規則 | CA1406:VB6クライアントに対してint64の引数を使用している場合にエラーもしくは警告とする |
| 保全性の規則 | ライブラリやアプリケーションのメンテナンスのために必要な規則 | 継承階層内が5つ以上のクラスがある場合にエラーもしくは警告とする |
| 名前指定の規則 | .NET Frameworkデザインガイドラインに沿った命名規約 | CA1705:メンバの名前に3字以上の英大文字の頭字語が含まれた場合にエラーもしくは警告とする |
どの規約を適応すればいいのかはプロジェクトによって異なるでしょうが、ここまで規約が多いと何か指針が欲しくなります。
これさえ守っていれば大丈夫! といった指針は示せませんが、例えばグローバリゼーション規則を意識しないといけない局面はあまりないのではないでしょうか。また名前指定の規則もプロジェクトで使用するには少し不便な規則が含まれていそうです。それとは逆にセキュリティ規則やパフォーマンス規則は積極的に使用した方がよさそうです。これらは違反時にビルドエラーとなるように設定しても良いかもしれません。
それぞれの規則に含まれる規約を1つ1つ解説することは今回はできませんが、規約の詳細はVSTS上から[F1]キーで表示できます。コード分析を実際に使用する場合は規約の内容をよく確認したうえで、開発の初期から使用する事を強くお勧めします。
VSTSのコード分析には200以上の規約が用意されていますが、これで満足できない場合は独自の規約を作成することもできます。VSTSのマネージコード分析の実体は無償配布されているFxCopとほとんど同様で、FxCopのカスタム規約の作成と同じ要領で独自の規約を作成することができます。VSTSに含まれるFxCopはデフォルトインストールの場合「C:\Program Files\Microsoft Visual Studio 8\Team Tools\Static Analysis Tools\FxCop」にインストールされています。ここに含まれている「FxCopSdk.dll」と「Microsoft.Cci.dll」を使用してカスタム規約を作成することができますので興味がある方はお試しください。ただ、ここで解説したカスタム規約の作成方法の概要や具体的な作成方法についてはMSDNライブラリなどでは公開されていません。またGotDotNetでのFxCopの開発はphase-outしていたりと、今後コード分析のカスタマイズがどうなっていくのかは分かりません。ルールのカスタマイズは十分注意して行ってください。
ルールをソリューション全体に適用しよう
ここで述べるルールとは、適用する規約の集合を指しています。ルールの設定はプロジェクトのプロパティ画面から行いますから、プロジェクトごとに最適な規約を選択することができます。でも見方を変えるとプロジェクトごとにルールの設定作業を行うのは面倒だなと思われるかもしれません。そこでTeam Foundation Server(以下、TFS)を用いて、すべてのプロジェクトに同じ規約を適用する方法を解説します。
手順ですが、次のようにまずTFSのソースコードのチェックインポリシーにコード分析を追加し、次にソリューションに設定を反映させます。
- 「チームエクスプローラ」からソースコードが含まれるチームプロジェクトを右クリックし、[チームプロジェクトの選択]-[ソース管理]を選択。
- ソース管理の設定画面で「チェックインポリシー」タブの中の[追加]-[コード分析]を選択。
- コード分析ポリシーエディタで[マネージコードの分析を強制]を選択し、使用する規約を選択。
- ソリューションエクスプローラからソリューションを右クリックし、[コード分析ポリシーの設定をソリューションに移行]を選択。

これで全プロジェクトに同じルールが適用されました。ただし、この方法には一つだけ落とし穴があります。それはチームプロジェクトのチェックインポリシーで定義されているコード分析ルールがプロジェクトに存在しない場合には追加する設定を行いますが、チームプロジェクトのコード分析ポリシーで定義されていないコード分析ルールがプロジェクトに存在していた場合には、それはそのままにするという点です。
この機能は、本来の用途としては個々のプロジェクトがチームプロジェクトに定義されているコード分析のチェックインポリシーを満すために使うものです。ですからプロジェクトに定義されているコード分析ルールに足りないものを足す、という動きをします。

なお、この方法を使うにはあらかじめTFSのソースコード管理に対象となるソリューションを登録しておく必要があります。
ではTFSを持ってない場合はどうすればいいの? という人も心配いりません。コード分析ルールはプロジェクトファイルに次のように記載されます。
<CodeAnalysisRules> -Microsoft.Globalization#CA1301;-Microsoft.Globalization#CA1302;-Microsoft.Globalization#CA1303 (中略) </CodeAnalysisRules>
「Microsoft.Globalization#CA1301」は「重複するアクセラレータを使用しません」という規約です。「-」が付いていることから、この規約は使用されないという意味であることが直感的に分かるかと思います。使用される規約については記述がなく、使用しない規約のみが列挙されています。1つのプロジェクトでUIからコード分析ルールを設定した後、<CodeAnalysisRules>部分をコピー&ペーストすればUIから設定を行わなくても同じルールを適用することができます。ただ少し手間がかかるので、できればTFSを使用したいところです。

#CA1302;-Microsoft.Globalization#CA1303 (中略)
</CodeAnalysisRules>