小さい頃はエラ呼吸

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


C++のコードレビューで使いたい、コードの品質を向上させる3つの方法

f:id:replication:20140806005519j:plain
photo credit: iLikeSpoons via photopin cc

はじめに

コードレビュー時にレビューアの方はどんなことに気をつけてレビューしていますか?
シンプルなコードになっているか、バグはないか、メンテナンス性は悪くないかなど、様々な観点でコードをレビューする必要があります。

ロジックの妥当性に注力してレビューしたいけど、コーディング上のささいな誤りも見逃せないから大変です。そこで、機械的にコードをチェックできる部分はツールを活用して、それ以外の部分を人間がレビューするという方法で、効率的にソースコードの品質を向上させようという話です。

環境
  • Visual C/C++
1.Visual Studioの警告レベルを4にする

f:id:replication:20140806002045p:plain
最も簡単な方法は、Visual Studioの警告レベルを4にすることです。これだけで、コーディング上のミスを検出することができます。

たとえば、以下のコード。変数retが-1かどうか比較しようとしたのですが、謝ってret = 1とコーディングしてしまいました。こんなミスも警告レベル4であれば、「warning C4706: 条件式の比較値は、代入の結果になっています。」と警告してくれます。

#include "stdafx.h"

int func1();

int _tmain(int argc, _TCHAR* argv[])
{
  int ret = 0;
  
  ret = func1();
  if (ret = -1)     // NG warning C4706: 条件式の比較値は、代入の結果になっています。
  // if (ret == -1) // OK
  {
    // エラー処理
  }
  return 0;
}
2.Visual Studioのコード分析機能を使う

f:id:replication:20140806004049p:plain
2つ目は、Visual Studioのコード分析機能を使います。コード分析機能は、対象のソリューションに対して静的解析を実行し、問題のあるコードを検出することができます。
たとえば、以下のコード。5バイトのバッファ領域に6バイト書き込みにいきます

#include "stdafx.h"
#include <Windows.h>

int func1();

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

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

}

このようなコードもVisual Studioのコード分析機能で誤りを検出することができます。
f:id:replication:20140806004051p:plain

3.CppCheckを使って静的コード解析を行う

フリーの静的コード解析ツールの1つにCppCheckというツールがあります。無料で利用することができる上、なかなかの優れものです。

Cppcheck - A tool for static C/C++ code analysisCppcheck - A tool for static C/C++ code analysis
たとえば、以下のコード。メモリアロケートを行ったあと、freeをしていません。cppcheckを書けると、「(error) Memory leak: pointer」という警告で知らせてくれます。

#include "stdafx.h"
#include <stdlib.h>

int _tmain(int argc, _TCHAR *argv[])
{
  char *pointer = (char *)malloc(100);

  if (pointer == NULL)
  {
    printf("%s", "メモリアロケート失敗");
    return EXIT_FAILURE;
  }

  //free(p);  //->(error) Memory leak: pointer

  return 0;
}

CppCheckをVisual Studioの外部ツールとして登録しておけば、いつでもコード解析が手軽に行うことができます。
f:id:replication:20140806005105p:plain

おわりに

上記で紹介したツールを使って機械的にチェックできる部分は、ツールに任せて、それ以外の観点でコードレビューすると効率的にレビューができるのではないでしょうか。
ただし、これらのツールも万能ではありませんので、警告の内容などはしっかり吟味して、直すべきか否かを考える必要があります。