コード検査ツールで組み込み開発の品質を高める
ソフトウエア製品は、分野によっては、リリース当初から高い品質を求められます。不具合の修正を反映するのにコストがかかる、システムを停止させられない、生命にかかわる、といったケースです。組み込み開発は、これらの条件に当てはまります。そうでなくても、質の悪いソース・コードは、不具合の連鎖やリリースの遅れなど、開発元/流通元に大きな負担をかけます。
そこで今回は、ソフトウエアの品質を確保する手法の中でもっとも基本的なものとして、静的コード・チェックについて解説します。静的コード・チェックによって、どのような問題を解決できるのかを、開発現場で発生する問題を例に説明します。
組み込み開発現場での問題点
組み込み開発の現場では、ソフトウエアの品質に絡む、どのような問題に直面するのでしょうか。いくつかピック・アップしてみます。
- 余裕が無い、人と時間
-
品質(Q: Quality)/コスト(C: Cost)/納期(D: Delivery)の観点から見ると、おのおのはトレード・オフの関係にあります。しかし、実際の現場では、決まっているC(コスト)とD(納期) の中で、Q(品質)を求める作業指示が行われます。
- 質の悪いソース・コード
-
組み込み開発では、エンハンスのベースとなるソース・コードが存在することがあります。そして、その作りがどんなに悪くても、不具合が摘出されていないという理由だけで、正常なコードとみなされ、修正することができなくなります。ベースの作りの悪さに引きずられ、エンハンス部分の品質も、確保が難しくなります。ともすればデグレードすら引き起こしてしまいます。
- 読みにくいソース・コード
-
ソース・コードの記述は、人それぞれです。読みやすいコードもあれば、逆に非常に読みにくいコードもあります。例えば、必要な空白が入っていない、なかなか改行しない複文、どこからどこまでが処理なのか分からない条件式、などです。過去に書いたソース・コードは、他人どころか自分自身ですら解読に時間がかかることがあります。可読性の低いソース・コードは、不具合を作り込みやすくなり、問題発生時の解析にも障害となります。
- 難しいコーディング・ルール
-
ソース・コードの品質/可読性を確保するためにコーディングのルールが存在していたとして、どれくらいルールを覚えているでしょうか。問題が発生するたびに追加され、つもり積もって100ページ。これでは、ドキュメントを読んでいるうちに、開発期間が終わってしまいます。ルールが守られているかどうかは、人の手でチェックすることは困難です。
- 後回しにされる異常系テスト
-
「まずは正常系を通して」というのは、よく聞くセリフです。反対に、異常系など、あまり実行されない部分のテストは、後回しにされがちです。そして、後回しにしたテスト・ケースは、いつの間にか、テストされずにリリースされてしまいます。
いくつか挙げましたが、心当たりがあるものが含まれていなかったでしょうか。ここに挙げたような問題を、静的コード・チェック・ツールを使用することで、軽減することができます。
静的コード・チェックとは何か
先ほどから静的コード・チェックと呼ぶ名前が出てきていますが、何のことでしょうか。一般的に、静的コード・チェックとは、実行ファイルを実行することなく解析して、問題点を洗い出す手法のことです。必要なソース・ファイルとヘッダー・ファイルが存在すればよいため、シミュレータや実際の動作環境がなくても解析が可能です。
図1: 静的コード・チェック |
検査の内容は、システム停止やセキュリティの欠陥につながる不具合をチェックしたり、保守性や可読性の低いコードを改善する目的でコーディングの記述形式をチェックしたりすることです。
静的コード・チェックは、開発の早期から使うことができます。コーディング開始前の段階で、エンハンスのベースとなるソース・コードをチェックできます。コーディング工程では、新規開発部分のチェックを行えます。テスト工程で問題が出てから使うというものではありません。コンパイルが通るようになる開発早期から静的コード・チェックを繰り返すことは、ソース・コードの品質改善に大きく貢献します。
早い段階で不具合を見つけることができれば、コスト削減にも貢献します。具体的には、不具合を発見した工程と対策コストの関係を見てみると、コーディング工程で不具合を発見した場合は、テスト工程で発見した場合と比べて、対策コストは5分の1程度(筆者が所属する日立ソフトウェアエンジニアリング内での統計)で済みます。
では、静的コード・チェック・ツールを使うことで、どのように問題を解決できるのでしょうか。市場には、さまざまなツールがありますが、ここでは日立ソフトウェアエンジニアリング(日立ソフト)の「anyWarp CodeDirector for C/C++」(以下、CodeDirector)を使った解決方法を紹介します。