組み込みソフトウェア・バグの分類学,その傾向と対策 ――ツールを利用してバグ対策の手間を軽減
組み込みソフトウェアを開発していると,さまざまなタイプのバグに悩まされる.ここではバグの原因の典型例であるメモリ・リーク,バッファ・オーバラン,NULLポインタ参照,未初期化変数について,その症状と対策を説明する.また,静的解析ツールを用いてこれらのバグを検出した例も紹介する.最近では,ソース・コード・レビューの前のチェックに各種の静的解析ツールを利用する例が増えている. (編集部)
本稿では,いくつかの代表的なプログラム・バグを取り上げて,その欠陥を引き起こす原因やその対応策,レビュー時のポイントを解説します.
また,最近では,「実機動作テスト前の早い段階に,静的な注1解析手法を用いてソース・コードの品質を確保する」という考え方が注目を集めています.
注1:一般に,作成したコードを実行して検査する手法を"動的(dynamic)",コードを実行せずに検査する手法を"静的(static)"と分類する.
静的な解析手法として,以下の三つの方法が知られています.
- コーディング規約の適用――過去に発生した不具合や注意点を元に,ルールや規約として整理されたものに従ってコーディングを行うことで,ソース・コードの品質を確保する
- ソース・コード・レビューの実施――対象とするソース・コードに対して,その作成者やそれ以外の第三者が,仕様書や品質特性,コーディング規約の観点などから,コードの書き方に問題がないか,効率的に記述できているか,などをチェックする
- 静的解析ツールの利用――ソース・コード・レビューを行う前などに,ツールを使用して機械的にコードをチェックする
静的解析ツールには,コーディング・ルール・チェッカやバグ検出ツール,レビュー支援ツールなどがあります.ここではバグ検出ツールに分類される米国GrammaTech社の「CodeSonar」を利用します.コーディング・ルール・チェッカは原理的に,ファイル間をまたがる動的エラーについて,文脈を正確に理解して検出することが苦手とされています.これに対してCodeSonarのようなバグ検出ツールは,ソース・コードをビルドする際の情報を取得し,それを元にデータフロー解析を行うので,ファイル間をまたがる動的エラーを検出できるという特徴があります.また,トレース結果を図1のような形で出力し,ソース・コード・レビューの検討材料を提供します.図1の赤色部分はバグに至るまでの実行パスを,緑色部分はバグの原因を,そして黄色部分はバグの発生箇所を示しています.