(57)【要約】【課題】カバレッジの測定時間を短縮すること。【解決手段】カバレッジ測定装置は、コンパイラ部と、実行環境部と、カバレッジ算出部とを備えている。コンパイラ部は、カバレッジ測定対象のプログラムから第１オブジェクトコードを生成するとともに、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第１オブジェクトコードに挿入する。実行環境部は、前記第１オブジェクトコードを実行し、第２オブジェクトコードを生成する。カバレッジ算出部は、前記第１オブジェクトコードおよび第２オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出する。【選択図】図１
2013008277.tif 000002
【特許請求の範囲】
【請求項１】
カバレッジ測定対象のプログラムから第１オブジェクトコードを生成するとともに、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第１オブジェクトコードに挿入するコンパイラ部と、
前記第１オブジェクトコードを実行し、第２オブジェクトコードを生成する実行環境部と、
前記第１オブジェクトコードおよび第２オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出部と、
を備えることを特徴とするカバレッジ測定装置。
【請求項２】
前記コード書き換え処理への移行命令はソフトウェアブレーク命令であって、
前記実行環境部は、前記挿入されたソフトウェアブレーク命令に基づく割込み処理を実行し、当該割込み処理を発生させた原因のソフトウェアブレーク命令を無演算命令に書き換える割込み処理部を備える、
ことを特徴とする請求項１に記載のカバレッジ測定装置。
【請求項３】
前記コンパイラ部は、前記プログラムのソースコードの基本ブロックを特定し、前記特定した基本ブロックの夫々に前記コード書き換え処理への移行命令を挿入する、
ことを特徴とする請求項１に記載のカバレッジ測定装置。
【請求項４】
前記コンパイラ部は、前記プログラムのソースコードの分岐元および分岐先の基本ブロックを特定し、前記特定した基本ブロック間の分岐部分に、コード書き換え処理への移行命令を含む基本ブロックを挿入する、
ことを特徴とする請求項１に記載のカバレッジ測定装置。
【請求項５】
カバレッジ測定対象のプログラムから第１オブジェクトコードを生成するとともに、前記第１オブジェクトコードを生成する際に、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第１オブジェクトコードに挿入するコンパイルステップと、
前記第１オブジェクトコードを実行して第２オブジェクトコードを生成する実行ステップと、
前記第１オブジェクトコードおよび第２オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出ステップと、
を含むことを特徴とするカバレッジ測定方法。
【請求項６】
カバレッジ測定対象のプログラムがコンパイルされて第１オブジェクトコードが生成される際に、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第１オブジェクトコードに挿入するコード挿入ステップと、
前記第１オブジェクトコードが実行された場合、当該第１オブジェクトコードに含まれるコード書き換え処理への移行命令が実行されたとき、当該実行されたコード書き換え処理への移行命令を無演算命令に書き換えて第２オブジェクトコードを生成するコード書き換えステップと、
前記第１オブジェクトコードおよび第２オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出するカバレッジ算出ステップと、
をコンピュータに実行させることを特徴とするカバレッジ測定プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、カバレッジ測定装置、方法およびプログラムに関する。
【背景技術】
【０００２】
あるプログラムをある実プロセッサ上で実行して当該プログラムのカバレッジを測定する方法としては、対象プログラムにカバレッジを取得するためのインスツルメンテーションコードを挿入し、プログラムの実行時にカバレッジの情報を収集する方法がある。インスツルメンテーションコードとは、主にソースコード上のある位置を通過したことをメモリ上に記録するコードであり、プログラム中のさまざまな箇所に埋込んで各箇所を実行した記録を集めてプログラム中で実行された箇所を把握することで、プログラムのカバレッジを測定できる。
【０００３】
例えば、カバレッジ測定ツールとして、コンパイルを実行する際にカバレッジ測定対象のプログラムにインスツルメンテーションコードを埋込むgcovがある。gcovによって埋め込まれたインスツルメンテーションコードは、プログラム中の各行の通過の有無や、通過回数など、さまざまな情報を収集する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平２−７７９４６号公報
【特許文献２】特開２００５−３０２０２８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
このように、カバレッジを測定するためにインスツルメンテーションコードを用いることは有用であるが、一方で、インスツルメンテーションコードの挿入によるプログラムの実行時間の増大が問題になる。
【０００６】
本発明の一つの実施形態は、カバレッジの測定時間を短縮したカバレッジ測定装置、方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００７】
本発明の一つの実施形態によれば、カバレッジ測定装置は、コンパイラ部と、実行環境部と、カバレッジ算出部とを備えている。コンパイラ部は、カバレッジ測定対象のプログラムから第１オブジェクトコードを生成するとともに、自命令が実行されたときに自命令を無演算命令に書き換えるコード書き換え処理への移行命令を前記第１オブジェクトコードに挿入する。実行環境部は、前記第１オブジェクトコードを実行し、第２オブジェクトコードを生成する。カバレッジ算出部は、前記第１オブジェクトコードおよび第２オブジェクトコードに基づいて前記カバレッジ測定対象のプログラムのカバレッジを算出する。
【図面の簡単な説明】
【０００８】
【図１】第１の実施形態のカバレッジ測定装置の構成を説明する図
【図２】第１の実施形態のカバレッジ測定装置のハードウェア構成の一例を説明する図
【図３】第１の実施形態のカバレッジ測定方法の全体を説明するフローチャート
【図４】コンパイル処理を説明するフローチャートで
【図５】第１の実施形態のインスツルメンテーションコード挿入の概念を説明する図
【図６】第１の実施形態のインスツルメンテーションコード表の概念を説明する図
【図７】割込みハンドラによる処理を説明するフローチャートで
【図８】割込みハンドラによる処理の概念を説明する図
【図９】カバレッジ算出処理を説明するフローチャート
【図１０】カバレッジ算出処理の概念を説明する図
【図１１−１】カバレッジ測定結果の表記例を説明する図
【図１１−２】カバレッジ測定結果の表記例を説明する図
【図１２】第２の実施形態のコンパイル処理を説明するフローチャート
【図１３】第２の実施形態のインスツルメンテーションコード挿入の概念を説明する図
【発明を実施するための形態】
【０００９】
以下に添付図面を参照して、実施形態にかかるカバレッジ測定装置、方法およびプログラムを詳細に説明する。なお、これらの実施形態により本発明が限定されるものではない。
【００１０】
（第１の実施形態）
まず、本発明の第１の実施形態の特徴を概略的に説明する。
第１の実施形態によれば、インスツルメンテーションコードをカバレッジ計測対象のプログラムに挿入し、そのプログラムをターゲットプロセッサで実行する。ターゲットプロセッサは、プログラムに埋め込まれたインスツルメンテーションコードを実行すると、実行中のプログラムにおける当該インスツルメンテーションコードが埋込まれている箇所を書き換え、次回にその箇所を実行しても、同じインスツルメンテーションコードが呼び出されないように無効化する。プログラムの実行後、インスツルメンテーションコードの挿入位置について実行前のプログラムと実行後のプログラムとで比較することでカバレッジ測定結果を得る。具体的には、実行の前後で変化があるインスツルメンテーションコードはその箇所を通過したと判断し、変化がないインスツルメンテーションコードは通過しなかったと判断し、全インスツルメンテーションコードの通過の有無の結果を集計して、プログラムのカバレッジを計測する。
【００１１】
図１は、第１の実施形態のカバレッジ測定装置の構成を説明する図である。カバレッジ測定装置１００は、コンパイラ（コンパイラ部）１、実行環境部２、およびカバレッジ算出部３を備えている。
【００１２】
コンパイラ１は、カバレッジ計測対象のプログラムである、高級汎用言語で記述されたソースコード２１が入力される。コンパイラ１は、入力されたソースコード２１をターゲットプロセッサで実行可能な第１オブジェクトコード２２に変換する。コンパイラ１には、第１オブジェクトコード２２にインスツルメンテーションコード（コード書き換え処理への移行命令）を埋め込むインスツルメンテーションコード挿入部４が実装されている。また、コンパイラ１は、挿入されたインスツルメンテーションコードに関する情報をインスツルメンテーションコード表２３に出力する。
【００１３】
実行環境部２は、カバレッジ計測対象のプログラムの実行環境として機能し、第１オブジェクトコード２２を格納するメモリ領域および当該メモリ領域に格納されている第１オブジェクトコード２２を実行するターゲットプロセッサを有している。実行環境部２にはプロセッサシステムの実機やシミュレータを採用することができる。
【００１４】
実行環境部２は、インスツルメンテーションコードが実行されたとき、当該実行されたインスツルメンテーションコードを無効化する割込みハンドラ５が実装されている。割込みハンドラ５は、該当するインスツルメンテーションコードの無効化を、第１オブジェクトコード２２の実行中に当該第１オブジェクトコード２２に対して実行する。その結果、実行環境部２は、第１オブジェクトコード２２を実行した後、実行したインスツルメンテーションコードが無効化された第２オブジェクトコード２４を生成することとなる。
【００１５】
なお、第１オブジェクトコード２２を実行する際には、第１オブジェクトコード２２内のインスツルメンテーションコードを書換えられるように実行環境部２を設定しておく必要がある。例えば、第１オブジェクトコード２２はＲＡＭ（Random  Access  Memory）などの書換え可能なメモリに格納しなければならない。また、プログラムを書換えから保護する機能がプロセッサやメモリに実装されている場合、その機能を無効化しなければならない。
【００１６】
カバレッジ算出部３は、第１オブジェクトコード２２と第２オブジェクトコード２４とを比較してソースコード２１のカバレッジを求め、カバレッジ測定結果２５として出力する。より詳しくは、カバレッジ算出部３は、第１オブジェクトコード２２に含まれるインスツルメンテーションコードのうち、第２オブジェクトコード２４において無効化されないで残っているコードおよび無効化されたコードを夫々集計して、カバレッジを算出する。
【００１７】
図２は、第１の実施形態のカバレッジ測定装置のハードウェア構成の一例を説明する図である。カバレッジ測定装置１００は、ＣＰＵ（Central  Processing  Unit）６、ＲＡＭ７、ＲＯＭ（Read  Only  Memory）８、入力装置９、表示装置１０を備えるコンピュータ構成となっている。各々は、バスを介して夫々接続されている。
【００１８】
ＲＯＭ８は、記録媒体として、第１の実施形態のカバレッジ測定装置を実現するためのカバレッジ測定プログラム１１が記録されている。ＣＰＵ６は、ＲＡＭ７をワークエリアとして使用して、カバレッジ測定プログラム１１を実行する。表示装置１０は、液晶モニタなどの表示装置であり、操作画面などのユーザに対する出力情報を表示する。入力装置９は、マウスやキーボードなどで構成され、ユーザからの操作が入力される。入力装置９から入力された操作情報は、ＣＰＵ６へ送られる。
【００１９】
カバレッジ測定プログラム１１は、コンパイラ１、実行環境部２、カバレッジ算出部３、インスツルメンテーションコード挿入部４、および割込みハンドラ５を含むモジュール機能を有する。カバレッジ測定プログラム１１は、ＲＡＭ７にロードされることによってカバレッジ測定装置１００を生成する。なお、カバレッジ測定プログラム１１にコンパイラ１を生成するモジュールを含めないようにし、カバレッジ測定プログラム１１が備えるインスツルメンテーションコード挿入部４のモジュールを一般に入手可能なコンパイラにインストールできるように構成してもよい。また、カバレッジ測定プログラム１１に実行環境部２を含めないようにし、別途用意された実機または別途作成されたシミュレータにカバレッジ測定プログラム１１が備える割込みハンドラ５のモジュールをインストールできるようにしてもよい。
【００２０】
カバレッジ測定プログラム１１は、バスを介してＲＯＭ８からＲＡＭ７へロードされる。ＣＰＵ６はＲＡＭ７内にロードされたカバレッジ測定プログラム１１を実行する。これにより、外部記憶装置などから入力されたソースコード２１に対し、第１オブジェクトコード２２、第２オブジェクトコード２４およびカバレッジ測定結果２５が生成される。第１オブジェクトコード２２、第２オブジェクトコード２４およびカバレッジ測定結果２５は、ＲＡＭ７内に形成されるデータ格納領域に一時的に記憶される。カバレッジ測定結果２５は表示用の画像データに整形されて表示装置１０に出力される。
【００２１】
なお、カバレッジ測定プログラム１１は、ＣＤ−ＲＯＭや外部記憶装置などの記録媒体に格納しておいてもよい。また、カバレッジ測定プログラム１１を、インターネット等のネットワークに接続されたコンピュータ上の記録媒体に格納し、ネットワーク経由でダウンロードさせることにより提供または配布するように構成しても良い。
【００２２】
次に、カバレッジ測定装置１００を用いて実現される第１の実施形態のカバレッジ測定方法を具体的なコードの例を交えて説明する。
【００２３】
図３は、第１の実施形態のカバレッジ測定方法を説明するフローチャートである。カバレッジ測定対象のソースコード２１が入力されると、該ソースコード２１をコンパイルする（コンパイル処理、Ｓ１）。続いて、第１オブジェクトコード２２を実行し、第２オブジェクトコード２４を生成する（実行処理、Ｓ２）。そして、第１オブジェクトコード２２および第２オブジェクトコード２４に基づいてカバレッジを算出する（カバレッジ算出処理、Ｓ３）。
【００２４】
図４は、コンパイル処理（Ｓ１）を説明するフローチャートである。ソースコード２１が入力されると、インスツルメンテーションコード挿入部４は、ソースコード２１を解析し、ソースコード２１中の基本ブロックを特定する（Ｓ１１）。基本ブロックとは、分岐のない連続したコード列、すなわちプログラム中の分岐および合流点間のコード列である。分岐および合流点を特定することで基本ブロックが特定できる。
【００２５】
続いて、インスツルメンテーションコード挿入部４は、特定された各基本ブロックにインスツルメンテーションコードを挿入し、インスツルメンテーションコードを挿入した位置を示すインスツルメンテーションコード表２３を作成する（Ｓ１２）。なお、第１の実施形態では、ラインカバレッジの計測が行われるものとする。ラインカバレッジを測定するためには、ターゲットプロセッサがプログラムを実行した際に、プログラム中の各行の実行の有無を取得する必要がある。基本ブロックにおいてそのコード列中のどこか一箇所を実行したことを知ることができれば、その基本ブロックを構成するコード列を全て実行したことがわかる。したがって、Ｓ１２の処理においては、基本ブロック一つあたりに一つのインスツルメンテーションコードを挿入する。なお、基本ブロックに挿入するインスツルメンテーションコードの数は特に限定されないが、インスツルメンテーションコードの数に応じて割込み処理にかかるオーバヘッドが増大するので、基本ブロックに挿入するインスツルメンテーションコードの数は１個とするとよい。また、インスツルメンテーションコード挿入部４は、カバレッジ算出のために、インスツルメンテーションコードを挿入すると同時にコード挿入箇所をインスツルメンテーションコード表２３に記録する。インスツルメンテーションコード表２３には、インスツルメンテーションコードのオブジェクト内の位置、対応するソースコードのファイルと行が記録される。
【００２６】
図５は、第１の実施形態のインスツルメンテーションコード挿入の概念を説明する図である。ソースコード２１ａは、インスツルメンテーションコード挿入後のソースコードを示す。ソースコード２１は破線で示す３つの基本ブロックを備えており、ソースコード２１ａは、夫々の基本ブロックにインスツルメンテーションコードとしての「break()」が挿入されている。「break()」は、実行されたときに割込み処理を発生するソフトウェアブレーク命令である。当該ソフトウェアブレーク命令によって制御がカバレッジ測定対象のプログラムから割込みハンドラ５へと移るようになっている。割込みハンドラ５に制御が移る際には、ソフトウェア割込みを発生させた命令が配置されているメモリアドレスが記録される。割込みハンドラ５は、当該メモリアドレスを読み出すことができる。
【００２７】
図６は、第１の実施形態のインスツルメンテーションコード表２３の概念を説明する図である。インスツルメンテーションコード表２３は、オブジェクト名、番地、ファイル名、ファイル行の項目を持ち、一個のインスツルメンテーションコードにつき一ラインの項目が記載される。オブジェクト名は、第１オブジェクトの名前である。番地は、ＲＡＭ７におけるインスツルメンテーションコードが配置されたアドレスを示す。ファイル名は、ソースコードの名前であり、ファイル行は、ソースコード中の行を示す。インスツルメンテーションコード表２３によりオブジェクトに挿入されたインスツルメンテーションコードの数と位置を把握でき、第２オブジェクト内のインスツルメンテーションコードの挿入位置を確認することにより、カバレッジを算出できる。
【００２８】
インスツルメンテーションコードが挿入された後、コンパイラ１は、インスツルメンテーションコード挿入後のソースコードをコンパイルして第１オブジェクトコード２２を生成し（Ｓ１３）、コンパイル処理が終了となる。
【００２９】
なお、ここでは分かりやすくするために、ソースコード２１に対してインスツルメンテーションコードが挿入され、インスツルメンテーションコードが挿入されたソースコード２１がコンパイルされることで第１オブジェクトコード２２が生成される、として説明したが、インスツルメンテーションコードはアセンブリコードやオブジェクトコードに変換されてから挿入されるようにしても構わない。
【００３０】
実行環境部２が実行処理（Ｓ２）の際にインスツルメンテーションコード「break()」を実行したとき、ソフトウェア割込みにより割込みハンドラ５に制御が移る。図７は、割込みハンドラ５による処理を説明するフローチャートである。実行処理中に割込みが発生すると、割込みハンドラ５は割込み時のプログラムカウンタを参照し、割込み原因の命令、すなわち、実行されたインスツルメンテーションコードの場所を特定する（Ｓ２１）。そして、割込みハンドラ５は、特定されたインスツルメンテーションコードを無演算命令に書換える（Ｓ２２）。割込みハンドラ５による書換え処理が終わると、第１オブジェクトコード２２の割込み発生前の箇所に制御が戻る。
【００３１】
図８は、割込みハンドラ５による処理の概念を説明する図である。実行中の第１オブジェクトコード２２に含まれる「break()」が実行された際、割込みが発生し、割込みハンドラ５が割込みを発生させた「break()」を無演算命令「nop()」に書き換えている。このように、割込みハンドラ５は、割込みの原因となった「break()」を「nop()」に書き換えることで、同一基本ブロックが再度実行されたときに割込みが発生することを抑制する。
【００３２】
図９は、カバレッジ算出処理（Ｓ３）を説明するフローチャートである。すべての実行処理が終了すると、カバレッジ算出部３は、インスツルメンテーションコード表２３を用い、基本ブロック中のインスツルメンテーションコードを特定する（Ｓ３１）。そして、カバレッジ算出部３は、Ｓ３２〜Ｓ３６のループ処理を各基本ブロックに対して実行し、カバレッジ算出処理が終了となる。第２オブジェクトコード２４においては、第１オブジェクトコード２２と比較すると、実行された基本ブロックに配置されていたインスツルメンテーションコードが無演算命令に書き換わっている。カバレッジ算出部３は、基本ブロックに含まれるインスツルメンテーションコードが第１オブジェクトコード２２と第２オブジェクトコード２４との間で書き換わっているか否かを判定する（ステップＳ３３）。書き換わっている場合（Ｓ３３、Ｙｅｓ）、カバレッジ算出部３は、当該基本ブロック内のコード列を実行されたコード列として集計する（ステップＳ３４）。書き換わっていない場合（Ｓ３３、Ｎｏ）、カバレッジ算出部３は、当該基本ブロック内のコード列を実行されていない（未実行の）コード列として集計する（Ｓ３５）。実行された行数と実行されていない行数とが夫々集計され、集計結果はカバレッジ測定結果２５として出力される。
【００３３】
なお、ここでは、実行されたコード列の数と実行されていないコード列の数とを夫々集計するようにしているが、インスツルメンテーションコード表２３を参照することによってインスツルメンテーションコードの総数を知ることができるので、どちらか一方のみを集計し、インスツルメンテーションコードの総数から他方の数を算出するようにしてもよい。
【００３４】
図１０は、カバレッジ算出処理の概念を説明する図である。図１０では、第１オブジェクトコードに挿入されている３つの「break()」のうちの２つが「nop()」に書き換えられている。この場合、３つの基本ブロックの行数が夫々等しいとすると、ラインカバレッジ測定結果２５は６６％となる。
【００３５】
図１１は、カバレッジ測定結果２５の表記例を説明する図である。図１１−１は、カバレッジ測定結果２５は、ソースコード２１に記述されているコード列が記述されており、カバレッジ算出処理により実行したことが判別されたコード列が識別できるように色づけ表示されている例である。このように、ソースコードに色をつけることによって、直感的にカバレッジを確認することができるようになる。また、図１１−２は、カバレッジ測定結果２５は、実行された行数がファイルや関数ごとに記述されるテーブル構成の例である。このように、カバレッジ対象の異なる単位で表示することによって、より注目する箇所のカバレッジを把握できるようになる。
【００３６】
なお、以上の説明においては、第１オブジェクトコードに含まれるインスツルメンテーションコードの書き換えを割込みハンドラ５が実行することとしたが、インスツルメンテーションコード挿入部４は、インスツルメンテーションコードによって呼び出され、呼び出し元のインスツルメンテーションコードを書き換えるプログラムを第１オブジェクトコード２２に埋め込むようにしてもよい。これにより、実行環境部２は割込みハンドラ５の実装を必要とすることなく、第１オブジェクトコード２２を実行するだけでインスツルメンテーションコードの書き換えを実行できるようになる。
【００３７】
また、インスツルメンテーションコード挿入部４は、インスツルメンテーションコードを挿入したソースコードを出力する。そして、割込みハンドラ５は、第１オブジェクトコード２２のインスツルメンテーションコードを書き換える際、ソースコードの対応するインスツルメンテーションコードも無演算命令に書き換えるようにする。カバレッジ算出部３は、インスツルメンテーションコードが書き換えられる前後のソースコードをカバレッジ測定結果２５とともに出力するようにしてもよい。
【００３８】
また、カバレッジ算出部３は、インスツルメンテーションコード表２３を用いることで第１オブジェクトコード２２と第２オブジェクトコード２４とを間接的に比較するようにしたが、第１オブジェクトコード２２と第２オブジェクトコード２４とを直接的に比較するようにしてもよい。
【００３９】
このように、第１の実施形態によれば、カバレッジ測定対象のソースコード２１から第１オブジェクトコード２２が生成される際に、自命令が実行されたときに自命令を無演算命令に書き換えるインスツルメンテーションコードを前記第１オブジェクトコード２２に挿入するインスツルメンテーションコード挿入部４と、生成された第１オブジェクトコード２２を実行する実行環境部２と、実行環境部２により出力された第２オブジェクトコード２４に含まれるインスツルメンテーションコードおよび無演算命令に基づいてソースコード２１のカバレッジを算出するカバレッジ算出部３と、を備えるように構成したので、一度実行されたインスツルメンテーションコードが再度実行されることを防止することができるので、カバレッジの測定時間を短縮することができる。
【００４０】
また、インスツルメンテーションコード挿入部４は、ソースコード２１の基本ブロックを特定し、特定した基本ブロックの夫々にインスツルメンテーションコードを１つ挿入する、ように構成したので、ラインカバレッジを効率的に測定することができる。すなわち、基本ブロック単位でインスツルメンテーションコードを挿入するので、少ない演算でカバレッジの測定を効率的に行うことができる。
【００４１】
また、カバレッジ算出部３は、第２オブジェクトコード２４において、インスツルメンテーションコードが残っている基本ブロックを実行されていない基本ブロックとして集計し、または、インスツルメンテーションコードが無演算命令に書き換えられた基本ブロックを実行された基本ブロックとして集計し、集計結果に基づいてカバレッジを算出する、ように構成したので、ラインカバレッジを効率的に測定することができる。
【００４２】
（第２の実施形態）
第２の実施形態は、ブランチカバレッジを測定することができる。第２の実施形態のカバレッジ測定装置は、第１の実施形態と同様の構成により実現される。また、第２の実施形態のカバレッジ測定装置の機能構成要素はインスツルメンテーションコード挿入部４の動作が異なるのみで第１の実施形態とほぼ同様であるので、以降、第１の実施形態と異なる部分のみ説明し、重複する説明を省略する。
【００４３】
ブランチカバレッジはプログラム中の分岐に対するカバレッジである。ブランチカバレッジを計測するためには、ラインカバレッジのようなコード列中の実行箇所ではなく、コード列間の実行箇所を特定する必要がある。このため、インスツルメンテーションコード挿入部４は、プログラム中の分岐部分にインスツルメンテーションコードを挿入する。
【００４４】
図１２は、第２の実施形態のコンパイル処理を説明するフローチャートである。ソースコード２１が入力されると、インスツルメンテーションコード挿入部４は、ソースコード２１を解析し、ソースコード２１中の基本ブロックを特定する（Ｓ４１）。そして、インスツルメンテーションコード挿入部４は、ソースコード２１中の分岐について、分岐元と分岐先の基本ブロックを特定し、それら基本ブロック間に追加のインスツルメンテーションコード用基本ブロックを挿入する（Ｓ４２）。そして、インスツルメンテーションコード挿入部４は、インスツルメンテーションコード用基本ブロックにインスツルメンテーションコード（コード書き換え処理への移行命令）を挿入し、インスツルメンテーションコードを挿入した位置を示すインスツルメンテーションコード表２３を作成する（Ｓ４３）。インスツルメンテーションコードが挿入された後、コンパイラ１は、インスツルメンテーションコード挿入後のソースコードをコンパイルして第１オブジェクトコード２２を生成し（Ｓ４４）、コンパイル処理が終了となる。
【００４５】
その後、第１実施形態と同様に、第１オブジェクトコード２２を実行し、第２オブジェクトコード２４を生成する。第１オブジェクトコード２２と第２オブジェクトコード２４を解析し、カバレッジを測定する。
【００４６】
図１３は、第２の実施形態のインスツルメンテーションコード挿入の概念を説明する図である。破線で囲まれたコード列は、第１オブジェクトコード２２に含まれている基本ブロックを示しており、実線で囲まれたコード列はインスツルメンテーションコード用基本ブロックを示している。図示するように、基本ブロック間の分岐、即ちＬ１−Ｌ２間とＬ１−Ｌ３間に新たに基本ブロックが挿入され、それらの基本ブロックにインスツルメンテーションコードとしての「break()」が挿入されている。
【００４７】
このように、第２の実施形態によれば、コンパイラ１は、ソースコード２１の基本ブロックを特定し、特定した基本ブロック間の分岐部分に、インスツルメンテーションコードを挿入した基本ブロックを挿入する、ように構成したので、ブランチカバレッジを効率的に測定することができる。また、第２の実施形態によれば、第１の実施形態と同様に、一度実行されたインスツルメンテーションコードが再度実行されることを防止することができる。したがって、カバレッジの測定時間を短縮することができる。
【００４８】
また、カバレッジ算出部３は、第２オブジェクトコード２４に含まれる基本ブロックのうち、インスツルメンテーションコードが残っている基本ブロックを実行されていない基本ブロックとして集計し、または、インスツルメンテーションコードが無演算命令に書き換えられた基本ブロックを実行された基本ブロックとして集計し、集計結果に基づいてカバレッジを算出する、ように構成したので、ブランチカバレッジを効率的に測定することができる。
【００４９】
なお、実施形態では、書き換えるインスツルメンテーションコードとしてbreak()を例に説明したが、コード書き換え処理を通常の関数にして、インスツルメンテーションコードを関数呼び出し命令にしてもよい。また、書き換えられるインスツルメンテーションコードとしてnop()を例に説明したが、実質的にnop()と同等の効果のあるコード（無意味に演算する命令、例えば０をたす、等）に書き換えてもよい。
【００５０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００５１】
１  コンパイラ、２  実行環境部、３  カバレッジ算出部、４  インスツルメンテーションコード挿入部、５  割込みハンドラ、６  ＣＰＵ、７  ＲＡＭ、８  ＲＯＭ、９  入力装置、１０  表示装置、１１  カバレッジ測定プログラム、２１  ソースコード、２２  第１オブジェクトコード、２３  インスツルメンテーションコード表、２４  第２オブジェクトコード、２５  カバレッジ測定結果、１００  カバレッジ測定装置。
【図１】
2013008277.tif 000003
【図２】
2013008277.tif 000004
【図３】
2013008277.tif 000005
【図４】
2013008277.tif 000006
【図５】
2013008277.tif 000007
【図６】
2013008277.tif 000008
【図７】
2013008277.tif 000009
【図８】
2013008277.tif 000010
【図９】
2013008277.tif 000011
【図１０】
2013008277.tif 000012
【図１１−１】
2013008277.tif 000013
【図１１−２】
2013008277.tif 000014
【図１２】
2013008277.tif 000015
【図１３】
2013008277.tif 000016