photo credit: iLikeSpoons via photopin cc
はじめに
コードレビュー時にレビューアの方はどんなことに気をつけてレビューしていますか?
シンプルなコードになっているか、バグはないか、メンテナンス性は悪くないかなど、様々な観点でコードをレビューする必要があります。
ロジックの妥当性に注力してレビューしたいけど、コーディング上のささいな誤りも見逃せないから大変です。そこで、機械的にコードをチェックできる部分はツールを活用して、それ以外の部分を人間がレビューするという方法で、効率的にソースコードの品質を向上させようという話です。
環境
- Visual C/C++
1.Visual Studioの警告レベルを4にする
最も簡単な方法は、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のコード分析機能を使う
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のコード分析機能で誤りを検出することができます。
3.CppCheckを使って静的コード解析を行う
フリーの静的コード解析ツールの1つにCppCheckというツールがあります。無料で利用することができる上、なかなかの優れものです。
たとえば、以下のコード。メモリアロケートを行ったあと、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の外部ツールとして登録しておけば、いつでもコード解析が手軽に行うことができます。
おわりに
上記で紹介したツールを使って機械的にチェックできる部分は、ツールに任せて、それ以外の観点でコードレビューすると効率的にレビューができるのではないでしょうか。
ただし、これらのツールも万能ではありませんので、警告の内容などはしっかり吟味して、直すべきか否かを考える必要があります。