小さい頃はエラ呼吸

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


#ifdef _MSC_VER >= nみたいなコードの意味

はじめに

昔のコードを眺めていたら、_MSC_VERを使った以下のようなコードに出会いました。

#ifdef _MSC_VER >= n
  #pragma once
#endif

_MSC_VERってなんだろうと思ったら、開発環境のバージョンでした。

プログラミングメモ _MSC_VERプログラミングメモ _MSC_VER

_MSC_VERの意味

_MSC_VERは、マイクロソフトのコンパイラのバージョンを返す定義済みマクロです。
返ってくる値によって、コンパイラのバージョンを判断することができます。

Microsoft Compiler
#ifdef _MSC_VER
#if _MSC_VER >=600 // C Compiler 6.0以降 VC++含む
#if _MSC_VER >=700 // C/C++ Compiler 7.0以降 VC++含む
#if _MSC_VER >=800 // VC++1.0以降
#if _MSC_VER >=900 // VC++2.0以降
#if _MSC_VER >=1000 // VC++4.0以降
#if _MSC_VER >=1010 // VC++4.1以降
#if _MSC_VER >=1020 // VC++4.2以降
#if _MSC_VER >=1100 // VC++5.0以降
#if _MSC_VER >=1200 // VC++6.0以降
#if _MSC_VER >=1300 // VC2002(VC7.0)以降
#if _MSC_VER >=1310 // VC2003(VC7.1)以降
#if _MSC_VER >=1400 // VC2005(VC8.0)以降
#if _MSC_VER >=1500 // VC2008(VC9.0)以降
#if _MSC_VER >=1600 // VC2010(VC10.0)以降
ディレクティブ - MoonWing はてなブックマーク - ディレクティブ - MoonWing

昔は、#pragma onceは処理系によって警告が出たりしたみたいですね。
今はあんまり関係なさそう。

Visual Studio 2013 ExpressでC言語の静的コード解析を行う

f:id:replication:20140418002048p:plain

はじめに

マイクロソフトが無償で公開しているVisual Studio 2013 Express(Visual Studio 2013 Express for Windows Desktop)では、C++コードの静的コード解析ができます。
この記事では、Visual Studio 2013 ExpressでC++コードのコード解析を行ってみます。

Microsoft Visual Studio Professional 2013 DVD
マイクロソフト (2013-11-29)
売り上げランキング: 377

Visual Studio 2013 Expressの入手

Visual Studio 2013 Expressは、以下のページからダウンロードすることができます。

ケース1 初期化漏れ

以下のコードにおいて、戻り値i は引数valが1でないときに初期化されません。

int func1(int val)
{
   int i;
   if ( val == 1)
   {
      i = 1;
   }
   return i; // i は 引数valが1でないときに初期化されない
}

上記のコードをコード分析にかけてみます。
コード分析を実行するには、ビルドメニューから「ソリューションでコード分析を実行(Y)」を選択します。
f:id:replication:20140418002858p:plain
コード分析が完了すると、分析結果が画面に表示されます。
f:id:replication:20140418002925p:plain
分析結果をクリックすると、ソースコード上のどこが問題なのかハイライトされ、コード分析の詳細な内容が表示されます。
f:id:replication:20140420232736p:plain

ケース2 バッファサイズオーバ

以下のコードは、5バイトのバッファ領域に6バイト書き込みにいきます。

int _tmain(int argc, _TCHAR* argv[])
{
	char tmp[5];
	char tmp2[6];

	memset(tmp, 0x00, sizeof(tmp2));
	return 0;
}

上記のコードをコード分析にかけてみます。
f:id:replication:20140420232149p:plain
確かにバッファオーバランの可能性を検出しています。クリックすると、該当箇所がハイライトされます。
f:id:replication:20140420232221p:plain

おわりに

無料で使えるので、プログラムのレビュー時などの活用してみてください。