今回のブログ担当の渋谷と申します。
今回は「ソースコードの静的解析」というテーマでブログを書かせていただきます。
ソースコード静的解析とは
ソースコードの文脈だけを見て機械的に問題を指摘してくれるツールです。
なぜこれを使う?
バグや意図しない動作の原因になる問題の検出を行うためですね。
とくに、コンパイルエラーや警告にはならないが結果的に未定義の動作になる場合はデバッグしにくいバグを生む原因になってしまいやすいです。
それの検出を行い、修正をするのが主な目的になります。
どんなものがある?
自分の知っているもので有名どころを幾つか挙げてみます。
無料
・cppcheck
・clang Static Analyzer
・splint(C++ では使えません…)
有料
・Coverity(オープンソースのプロジェクトに限り、無料で使える Coverity Scan というものがあります。また、C#なども対応されているようです。)
・Klocwork
以下、自分で使ったことがあるものを紹介いたします。(自分の所感を大いに含みます)
cppcheck
名前の通り、C++のソースコードの静的解析を行うことに特化したオープンソースのツールです。
Windows 番は GUI もあったり、 mac だと Homebrew で楽にインストールできたりと、導入も使用も楽で使いやすいです。その上静的解析ツールの中ではかなり高速に動作するのも特長です。
コンパイラに依存しないスタンドアローンのツールなので C++ を使用しているプロジェクトなら簡単に導入できるのもいいところですね。
clang Static Analyzer(scan-build)
clang に付属している静的解析ツールです。
cppcheck がテキストでの出力であるのに対して、 HTML のリッチな形式で出力してくれるのが大きなポイントです。どのようにしてどんなことが起こるかも手順を一緒に出力してくれるので、レポートを確認した後に修正を行いやすいです。
また、Objective-C の静的解析にも対応しています。
コマンドラインから使える他、 Xcode からも使えます(Product -> Analyze)。また、 Xcode で設定したオプションを保持したままコマンドラインから使うことも可能です。(mac では Xcode の Analyze 機能を使うことが推奨されていますが…)
検出の例
以下のコードは C++ を使う人なら問題大有りだとわかりますが、コンパイルエラーになりません。
(本番のコードはこんなに単純じゃないとかいうツッコミはなしでお願いいたします…)
#include <iostream> int main() { using namespace std; int* a = nullptr; cout << *a << endl; }
cppcheck だと以下のように出力してくれます。
[nullptr.cpp:7]: (error) Null pointer dereference: a
最後に
これらのツールは必ずしも完璧なものではありませんが、起こりがちなヒューマンエラーなども検出してくれます。
うまく使用すれば、効率良く品質の良いコードを書いていけると思います。 jenkins おじさんに組み込んでみるのも良いと思います。
こうしたツールを利用したりして質の高いコードを書くことが、質の高いプロダクトにつながっていくと思っています。
おまけ
より安全性の高いソースコードを書くためのコーディングルールがあります。
https://www.jpcert.or.jp/sc-rules/
どちらかというと業務用ソフトウェアに適用されるものかもしれませんが、私たちが作成しているプロダクトにも応用しても効果が大きいものと思っています。