2013年2月13日水曜日

[VS2012][gtest]コード分析警告に対応させる

Visual Studio 2012 では express でもコード分析が使えます。
NULL ポインタ参照とか検出してくれて非常にありがたいのですが、
こちらのコードでも警告が出てしまいます。

#include <gtest/gtest.h>

TEST(NullCheck, Sample)
{
    int* p = (int*)malloc(4);
    ASSERT_TRUE(p != NULL);
    *p = 1;
    ASSERT_EQ(1, *p);
}


p が NULL の場合、ASSERT_TRUE(p != NULL) に失敗し return します。
従って以降の処理が走る場合、p が NULL でないことは決定しています。

こんなことも分からないとは・・・

NULL でないことを教える
C6011 の対処をするために __analysis_assume を使います。
これはコード分析ツールのためのコードの追加情報を与えます。

上記コードはこのようになります。
#include <gtest/gtest.h>

TEST(NullCheck, Sample)
{
    int* p = (int*)malloc(4);
    ASSERT_TRUE(p != NULL);
    __analysis_assume(p != NULL);
    *p = 1;
    ASSERT_EQ(1, *p);
}

結果

警告消えました!

あーでも、ASSERT_TRUE(p != NULL); で分かりきってることを、もう一度書くのはダサいですよね・・・
ASSERT_TRUE にやらせる
#undef ASSERT_TRUE
#define ASSERT_TRUE(condition) \
    GTEST_AMBIGUOUS_ELSE_BLOCKER_ \
    if( bool b = true ) { \
        __analysis_assume(condition); \
        goto GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__); \
    } else \
        GTEST_CONCAT_TOKEN_(gtest_label_analysis_assume, __LINE__): \
        GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \
                GTEST_FATAL_FAILURE_)

ちょっと変わった書き方ですが、Google Test の機能である
if( int x = 1 ) // { 省略しても OK
    ASSERT_TRUE(x==1) << "message"; // << で失敗時のメッセージを追加できる
を潰さないようするためです。

これを使って最初のコードを分析させます。

結果


うまくいきました。
コード分析、便利なんで積極的に使いたいですね。
(あれ?でも解放してないのは警告されないのか。。。)

2013年2月11日月曜日

「勉強会勉強会」に参加して来ました

DevLOVE関西「勉強会勉強会」に参加して来ました。

勉強会勉強会は勉強会についての勉強会でございます。

勉強会の参加はいつも「行こうかなどうしようかな~」と悩みがちなのですが、
今回は反射的に参加ボタン押してました。

というのも、以前から「社内勉強会があまりうまくいっていない」「社内でもっと勉強会をしたい」と思っていました。
勉強会のことで悩んでいるときに、「勉強会勉強会」なんて知って迷っている暇はありません。しかも、関西。

参加ボタンはいつ押すか?
今でしょ!

社外勉強会にも・・・
セッションの内容については、他の方々の参加報告などを見ていただくとして、
(※こちら にリンクがまとまってます。)
ここでは、私個人のことについて書かせて頂きます。

当初、社内勉強会の悩み解決が主な目的でしたが、
ちょっとしたハプニングで皆さんの前で自己紹介することに。
お酒も入っていたのと突然のことで、何言ったのかハッキリ覚えてないのですが、
「ゲーム業界向けに Jenkins の勉強会やってみたい」的なことを口走ってしまいました。

正直、社外の勉強会はやったことがないし、会場探しどうすんの?とか、人が集まるの?とか、
分からないことだらけで自分にはまだ早いと思ってました。

しかし、
会場「じゃあやろうか」

って感じで、じゃあどうしようかって話し合い(個別相談会)がスタート。

「興味がある人は結構いるんじゃないかな?」
「Jenkins じゃなくて、 CI/CD にして範囲を広げるのがいいかも」
「会場なら貸せますよ~」
「お手伝いしますよ」
そんな感じで色々ご意見頂いて、いやホントありがとうございましたm(__)m

まとまったのかまとまってないのかわからないけど、
とりあえず、Doorkeeper でイベント作ります。(作ったらブログや twitter で報告します。)

2人いれば勉強会
社内勉強会の悩みは、勉強会勉強会に参加して
「こういうやり方もあったのか」「やってみよう」という気持ちに変わりました。
皆さんの話の中にたくさんヒントがあり、とても参考になりました。

特に、中村さんの発表にあった「1人でやるのは勉強。2人でやれば勉強会。」ってのはなるほどと思いました。
同じことに興味のある人を見つけて2人で勉強会ってのもありですね。

KPT
今回は KPT でまとめます。

Keep
  • 勉強会に出た。
  • 前で話せた。(たまたまだけど)
  • 色々な話が聞けてやる気が出た。

Problem
  • 個別相談中に他の話が聞けなかった。
  • あまり自分からしゃべれなかった。

Try
社外勉強会
  • 社外勉強会開く。
  • Doorkeeper 使ってみる。
社内勉強会
  • 2人でも勉強会やってみる。
  • 飲み会 + 勉強会。(プロジェクタとかある飲み屋探す)
  • スライドを借りて発表。

最後に
最後に、
スタッフ・参加者の皆さん、そして会場提供をして頂いた楽天さん、ありがとうございました。

2013年2月9日土曜日

[Jenkins][VS2012 UTF] VSTestRunner Plugin を使って実行

ちょっと前に、「Visual Studio 2012 C++ Unit Test Framework をコマンドライン実行 + Jenkins」というタイトルで、
テストの実行と Jenkins との連携について投稿をしたのですが、
ちょうど同じに日に「VsTestRunner Plugin」という、vstest の実行をするプラグインが公開されていました!

というわけで、使ってみました。

設定
Wiki にある通りに設定していきます。

まずは、システム設定で vstest.console.exe のパスを設定します。


次に、実際に実行したいプロジェクトの設定で、「VSTest実行」を選択します。


実行したいテストのパスを設定し、


あとは適当に設定します。
trx の結果ファイルが欲しいので「高度な設定」を開いて trx にチェックを付けてます。



テスト結果の収集は「Visual Studio 2012 C++ Unit Test Framework をコマンドライン実行 + Jenkins」で紹介したとおり、MSTest plugin を使います。
設定などはリンク先を見てください。
実行
あとは実行するだけです。
バッチファイル書くよりは幾分楽に実行できました。


自分でもプラグインを作ってみたいですね。(いつかやる、きっと)