小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


コマンドラインからcl.exeのコード分析(/analyze)を利用する

はじめに

Visual Studioのコード分析機能を使って、ソースコードの静的解析を行うことができます。
GUIから実行すると複数のソースコードを一度に分析にかけずらいので、コマンドラインから実行できないかと考えました。

環境
  • Windows 7 Pro(32bit)
  • Visual Studio Community 2013
Visual Studioの入手

以下のページから無料で利用できるVisual Studio Community 2013をダウンロードできます。

Visual Studio Community 2013 - Visual StudioVisual Studio Community 2013 - Visual Studio

コマンドラインからコード分析を利用する

以下のようなバッチファイルを用意します。
PATH=の部分は、cl.exeを呼び出せるように環境変数を一時的に追加してパスを通しています。
INCLUDE=の部分は、コンパイルするためにヘッダーファイルのパスを通しています。

@echo off

@set PATH=C:\Program Files\Microsoft Visual Studio 12.0\Common7\IDE;C:\Program Files\Microsoft Visual Studio 12.0\VC\BIN;C:\Program Files\Microsoft Visual Studio 12.0\Common7\Tools;C:\Windows\Microsoft.NET\Framework\v3.5;C:\Windows\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 12.0\VC\VCPackages;%PATH%
@set INCLUDE=C:\Program Files\Microsoft Visual Studio 12.0\VC\include;C:\Program Files\Microsoft SDKs\Windows\v7.1A\Include;%INCLUDE%
@set LIB=C:\Program Files\Microsoft Visual Studio 12.0\VC\lib;C:\Program Files\Microsoft SDKs\Windows\v7.1A\Lib;%LIB%
@set LIBPATH=C:\Windows\Microsoft.NET\Framework\v3.5;C:\Windows\Microsoft.NET\Framework\v2.0.50727;C:\Program Files\Microsoft Visual Studio 12.0\VC\lib;%LIBPATH%

cl.exe  /analyze:only "C:\Users\replication\Documents\Visual Studio 2013\Projects\HelloWorldApp\*.cpp" 

cl.exe /analyzeオプションをつけて、cppファイルを指定します。
アスタリスク(*)を指定することで、フォルダ配下すべてのcppファイルを対象にすることができます。

サンプルコード(HelloWorldApp.cpp)
#include "stdafx.h"


int _tmain(int argc, _TCHAR* argv[])
{
	char tmp[5];
	memcpy(tmp, "HelloWorld!", sizeof("HelloWorld!"));
	return 0;
}

上記のコードをコンパイルすると、解析結果がコンソールに出力されます。

HelloWorldApp.cpp
helloworldapp.cpp(10) : warning C6386: 'tmp' への書き込み中にバッファー オーバーランが発生しました: 書き込み可能なサイズは '5' バイトですが、'12' バイトを書き込む可能
性があります。: Lines: 9, 10

リダイレクトでテキストファイルに出力

以下のような感じで、cl.exeの結果をリダイレクトすることでテキストファイルにコード分析結果を一気に出力することができます。

cl.exe  /analyze:only "C:\Users\replication\Documents\Visual Studio 2013\Projects\HelloWorldApp\*.cpp"  > result.txt