(57)【要約】【課題】コンパイラが暗黙的に自動生成した処理単位を明示して、当該処理単位の動作検証を容易に実施可能にして、テスト担当者の作業量の軽減を図る。【解決手段】コンパイラが自動生成した分岐を伴う例外処理の処理単位に対して、各分岐先の処理単位を実行したか否かを測定するためのポイントを設け（１２０５、１２０９）、当該処理単位について、コンパイラが設定した処理内容を表す文字列を対応付け（１２０６、１２１１）、当該処理内容と共にカバレッジを取得可能にする。【選択図】図１２
2011221656.tif 000002
【特許請求の範囲】
【請求項１】
ＣＰＵと主記憶を含む計算機で実行コードを生成する実行コードの生成方法であって、
前記計算機が、ソースコードを読み込むステップと、
前記計算機が、前記ソースコードから中間語コードを生成するステップと、
前記計算機が、中間語コードから実行コードを生成するステップと、を含み、
前記中間語コードを生成するステップは、
前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加するステップと、
前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加するステップと、
を含むことを特徴とする実行コードの生成方法。
【請求項２】
請求項１に記載の実行コードの生成方法であって、
前記中間語コードを生成するステップは、
前記付加された分岐処理の内容を示す文字列をカバレッジ情報蓄積部に蓄積することを特徴とする実行コードの生成方法。
【請求項３】
請求項１又は２に記載の実行コードの生成方法であって、
前記予め設定された分岐処理を付加するステップは、
前記ソースコードに明示されていない分岐処理を付加することを特徴とする実行コードの生成方法。
【請求項４】
ＣＰＵと主記憶を含む計算機で実行コードを生成するコンパイラであって、
ソースコードを読み込む手順と、
前記ソースコードから中間語コードを生成する手順と、
前記中間語コードから実行コードを生成する手順と、を含み、
前記中間語コードを生成する手順は、
前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加する手順と、
前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加する手順と、
を前記計算機に実行させることを特徴とするコンパイラ。
【請求項５】
請求項４に記載のコンパイラであって、
前記中間語コードを生成する手順は、
前記付加された分岐処理の内容を示す文字列をカバレッジ情報蓄積部に蓄積することを特徴とするコンパイラ。
【請求項６】
請求項４又は５に記載のコンパイラであって、
前記予め設定された分岐処理を付加する手順は、
前記ソースコードに明示されていない分岐処理を付加することを特徴とするコンパイラ。
【請求項７】
演算処理を行う演算装置と、前記演算装置が利用する情報を格納する記憶部と、を備えて、ソースプログラムを読み込んで実行コードを生成するコンパイル装置であって、
前記ソースプログラムを読み込んで構文木を生成する構文解析部と、
前記構文木を読み込んで、中間語コードを生成する意味解析部と、
前記中間語コードから実行コードを生成するコード生成部と、を備え、
前記意味解析部は、
前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加し、前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加することを特徴とするコンパイル装置。
【請求項８】
請求項７に記載のコンパイル装置であって、
前記意味解析部は、
前記付加された分岐処理の内容を示す文字列を前記記憶部のカバレッジ情報蓄積部に蓄積することを特徴とするコンパイル装置。
【請求項９】
請求項７又は８に記載のコンパイル装置であって、
前記意味解析部は、
前記ソースコードに明示されていない前記分岐処理を付加することを特徴とするコンパイル装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンパイラが自動的に生成した処理単位のカバレッジ情報及びその処理内容を取得する方法及び装置に関するものである。
【背景技術】
【０００２】
従来からコンピュータプログラムの品質の評価をおこなうための指標として、カバレッジが知られている。カバレッジ（網羅率）とは、コンピュータプログラムの処理経路をどのくらい網羅しているかを示す単位で、一般的に、高級言語のソースコードレベルのカバレッジを測定する技術と、機械語レベルのカバレッジを測定する技術がある。
【０００３】
例えば、ソースコードレベルのカバレッジの測定では、図２０Ａのソースコードレベルの測定の例２００１に示すように、ソースコード上の文単位でカバレッジを測定することができるようになっている。この例２００１では、ソースコードにおいてＢをＣで除した結果Ａを求める演算を示している。
【０００４】
他方、機械語レベルのカバレッジの計測では、機械語レベルの基本ブロック（入口と出口をそれぞれ先頭と末尾に１つずつもち、その間に分岐を含まない機械語の列のこと。）の単位でカバレッジを計測することができるようになっている。またその改良方式として、特許文献１に開示されるように、ソースコードがないオブジェクトコードに対するカバレッジを測定できるような方法も提案されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−１４６６６９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、図２０Ａの従来例では、ソースコードレベルのカバレッジの測定結果が１００％であっても、機械語レベルでは１００％となっていないという問題がある。このような問題は、コンパイラが分岐を伴う処理を自動的に挿入することに起因する。コンパイラが自動生成する一般的な処理としては、分岐を伴う例外処理などがある。例えば、図２０Ｂの機械語レベルの測定の例２００２に示すように、コンパイラが自動的に挿入した処理に分岐がある場合は、実行される処理単位と実行されない処理単位が存在することになるが、ソースコードレベルのカバレッジではすべての経路が実行されたように表示されてしまう。すなわち、機械語レベルの測定の例２００２では、ＢをＣで除した結果Ａを求めるソースコードをコンパイルした結果、０による除算が発生したときの例外処理がコンパイラによって暗黙的に挿入されたことを示している。
【０００７】
その点、機械語レベルでカバレッジを測定する技術を用いれば、上述したような問題は生ずることなく、正確なカバレッジを測定することができる。しかし、機械語レベルのカバレッジ測定結果は、機械語レベルで表示され、高級言語のユーザは通常機械語を理解できない。
【０００８】
したがって、高級言語のユーザが機械語レベルのコード部分を読んで処理内容を理解して、そのコード部分を通過するための高級言語のソースコードレベルの条件を明確にすることは困難であり、その様なテストケースを設計するにはスキルと労力が要求されるという問題がある。
【０００９】
本発明は、コンピュータプログラムのテスト担当者が、コンパイラが自動生成した処理単位を把握して、当該処理単位の動作検証を容易に実施可能にし、テスト担当者の作業量の軽減を図ることを目的とする。
【課題を解決するための手段】
【００１０】
本発明は、ＣＰＵと主記憶を含む計算機で実行コードを生成する実行コードの生成方法であって、前記計算機が、ソースコードを読み込むステップと、前記計算機が、前記ソースコードから中間語コードを生成するステップと、前記計算機が、中間語コードから実行コードを生成するステップと、を含み、前記中間語コードを生成するステップは、前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加するステップと、前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加するステップと、を含む。
【００１１】
また、前記予め設定された分岐処理を付加するステップは、前記ソースコードに明示されていない分岐処理を付加する。
【発明の効果】
【００１２】
したがって、本発明によれば、コンピュータプログラムのテスト担当者が、コンパイラが暗黙的に自動生成した処理単位を把握することができ、当該処理単位の動作検証が容易に実施可能になり、テスト担当者の作業量の軽減を図ることができるようになる。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施の形態を示し、本発明を適用する計算機の計算機の一例を示すブロック図である。
【図２】本発明の実施の形態を示し、本発明の処理の原理を表す概要図である。
【図３】本発明の実施の形態を示し、本実施形態におけるコンパイラの動作を表す概要図である。
【図４】本発明の実施の形態を示し、コンパイラの入力データとなるソースコードの例を示す説明図である。
【図５】本発明の実施の形態を示し、構文解析により生成される構文木の一例を示す説明図である。
【図６】本発明の実施の形態を示し、構文解析により生成される構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す説明図である。
【図７】従来例を示し、カバレッジノード挿入済み構文木の一例を示す図である。
【図８】従来例を示し、カバレッジノード挿入済み構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す図である。
【図９】本発明の実施の形態を示し、コンパイラが自動的に挿入した例外処理の部分木に対してカバレッジノードを挿入した構文木の一例を示す図である。
【図１０】本発明の実施の形態を示し、コンパイラが自動的に挿入した例外処理の部分木に対してカバレッジノードを挿入した構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す図である。
【図１１】本発明の実施の形態を示し、例外処理の部分木及びカバレッジノードの挿入手順を示すフローチャートである。
【図１２】本発明の実施の形態を示し、例外処理の部分木及びカバレッジノードを挿入する処理におけるノード毎の処理手順を示すフローチャートである。
【図１３】本発明の実施の形態を示し、意味解析部が生成するカバレッジ情報蓄積テーブルの一例を示す説明図である。
【図１４】本発明の実施の形態を示し、カバレッジ情報蓄積テーブルの作成手順を示すフローチャートである。
【図１５】本発明の実施の形態を示し、カバレッジノード挿入後の中間語コード列の一例を表す説明図である。
【図１６】本発明の実施の形態を示し、解析済みカバレッジ情報の表示例を表す説明図である。
【図１７】本発明の実施の形態を示し、カバレッジ情報解析ツールで行われるカバレッジ情報蓄積テーブルの解析結果である解析済みカバレッジ情報の作成手順を示すフローチャートである。
【図１８】本発明の実施の形態を示し、解析済みカバレッジ情報の作成におけるリストに対する処理手順を示すフローチャートである。
【図１９】本発明の実施の形態を示し、コンパイラが自動生成した処理単位のカバレッジ情報の解析手順を示すフローチャートである。
【図２０Ａ】従来例を示し、ソースコードレベルのカバレッジ測定結果の一例を表す説明図である。
【図２０Ｂ】従来例を示し、機械語レベルのカバレッジ測定結果の一例を表す説明図である。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施形態を添付図面に基づいて説明する。
【００１５】
図１は、本発明を適用した実施形態における計算機１０１の構成例を示すブロック図である。計算機１０１は、バス１１４で接続された演算装置（またはＣＰＵ）１１３、主記憶装置１０２、補助記憶装置１０７及び出力装置１１２から構成される。
【００１６】
主記憶装置１０２には、本実施形態の主体となるコンパイラ１０３、カバレッジを測定するカバレッジツール１０４、コンパイラ１０３が採取したカバレッジ情報（検証情報）を解析するカバレッジ情報解析ツール１０５及びカバレッジ情報解析ツール１０５の解析結果を表示するエディタ１０６が展開され、これらのプログラム群を演算装置１１３が実行することにより種々の処理が提供される。補助記憶装置１０７には、カバレッジ計測対象のソースコード１０８、コンパイルの結果生成される実行可能プログラム（または実行コード）１０９、カバレッジポイントの位置やカバレッジ計測結果などを格納するために生成されるカバレッジ情報蓄積テーブル１１０及びカバレッジ情報の解析結果を格納するために生成される解析済みカバレッジ情報１１１が記憶されている。また、補助記憶装置１０７はコンパイラ１０３、カバレッジツール１０４、カバレッジ情報解析ツール１０５及びエディタ１０６からなるプログラム群を格納する記憶媒体として機能する。計算機１０１は、コンパイル装置及びカバレッジ情報解析装置として機能する。
【００１７】
図２は、本実施形態における計算機１０１で実行される処理の概要を示すものである。まず、コンパイラ１０３が予め補助記憶装置１０７に格納されたソースコード１０８をコンパイルして、実行可能プログラム１０９及びカバレッジ情報蓄積テーブル１１０を生成する。このコンパイラの動作概要は図３に示す。また、カバレッジ情報蓄積テーブル１１０の例は図１３に示す。
【００１８】
次に、カバレッジツール１０４は、カバレッジ情報蓄積テーブル１１０から取得したカバレッジポイントを実行可能プログラム１０９に対して設定し、実行可能プログラム１０９のカバレッジを測定する。カバレッジツール１０４の測定結果はカバレッジ情報蓄積テーブル１１０に蓄積する。そして、カバレッジ情報蓄積テーブル１１０に格納されたカバレッジ情報は、カバレッジ情報解析ツール１０５によって解析され、解析結果が解析済みカバレッジ情報１１１に格納される。この解析の流れは、後述の図１７〜図１９に示す。また、解析済みカバレッジ情報１１１の表示例は、図１６に示す。解析済みカバレッジ情報１１１は、エディタ１０６により出力装置１１２へ表示される。
【００１９】
図３は、本実施形態におけるコンパイラ１０３の処理の概要を示すものである。コンパイラ１０３は、ソースコード１０８が入力されると、コンパイルをおこない、実行可能プログラム１０９を出力する。コンパイラ１０３は、字句解析部２０６、構文解析部２０７、意味解析部２０８、コード生成部２０９を備える。
【００２０】
字句解析部２０６は、ソースコード１０８上の文字列を構文解析しやすい形に切り出して、トークン列２０１を生成する。構文解析部２０７は、字句解析部２０６により解析されたトークン列２０１から、トークンをノードとして有する構文木２０２を生成する。この構文木２０２の例は図５に示す。
【００２１】
意味解析部２０８は、構文解析部２０７により解析された構文木２０２の各ノードに従って、各ノードにデータ型などの情報を追加したり、シンボルテーブルを作成して変数や関数の定義箇所と参照箇所を結び付けたりして、構文木２０２に意味論的情報を追加する。
【００２２】
さらに、意味解析部２０８は、例外処理が必要な箇所には、例外処理のための部分木と、カバレッジポイントを構文木上で表現するためのノード（以下、「カバレッジノード」という。）を挿入し、カバレッジノード挿入済み構文木２０３を生成する。このカバレッジノード挿入済み構文木２０３を作成するフローチャートは、後述の図１１と図１２に示す。また、意味解析部２０８により作成されたカバレッジノード挿入済み構文木２０３の例は図９に示す。
【００２３】
そして、意味解析部２０８はカバレッジノード挿入済み構文木２０３から、カバレッジ情報蓄積テーブル１１０及び中間語コード列２０４を生成する。このカバレッジ情報蓄積テーブル１１０と中間語コード列２０４の例は、図１３と図１５に示す。また、このときのカバレッジ情報蓄積テーブル１１０の作成の流れを図１４に示す。
【００２４】
コード生成部２０９は、意味解析部２０８により解析された中間語コード列２０４から、カバレッジポイントに対応するアドレス情報をカバレッジ情報蓄積テーブル１１０に追加しながら、実行可能プログラム１０９を生成する。
【００２５】
以下、図４のＣＯＢＯＬ言語で書かれたソースコードを例にして、本実施形態におけるデータの流れ及び処理の流れの詳細を説明する。図４に示すソースコードにおいて、カバレッジの測定対象となる文４０１は、１４行目に示すように、変数Ｃを添え字として配列Ｂを参照し、配列Ｂ（Ｃ）の格納値を変数Ｄで除算した結果を、変数Ａに代入するものである。
【００２６】
図５は、図４のソースコードの文４０１から構築される構文木２０２を示している。このような構文木２０２は、プログラミング言語ごとに予めコンパイラ１０３に定義されている構文規則に従って、種々の態様が考えられるが、本実施形態では、例として下向き構文解析法などの構文解析手法を用いてソースコードを解析することで構築するものとする。
【００２７】
図５におけるノード「ＣＯＭＰＵＴＥ」５０１は、ソースコード１０８上の算術式「ＣＯＭＰＵＴＥ」に対応している。ノード「ＣＯＭＰＵＴＥ」５０１の子ノード「＝」５０３は、ソースコード１０８上の代入演算子「＝」に対応しており、子ノード５０３の左右の部分木は、それぞれ代入先と代入値を表している。ノード「＝」５０３の図中左の子ノード「Ａ」５０２はソースコード１０８上の変数「Ａ」に対応しており、右の子ノード「／」５０７はソースコード１０８上の除算演算子「／」に対応している。さらにノード「／」５０７の図中左と右の子ノードは、それぞれ除数と被除数を表している。ノード「／」５０７の左の子ノード「（）」５０５はソースコード１０８上の配列参照演算子「（）」に対応する配列参照ノードで、右の子ノード「Ｄ」５０８はソースコード１０８上の変数「Ｄ」に対応している。そして、ノード「（）」５０５の図中左と右の子ノードは、それぞれ配列とその添え字を表している。ノード「（）」５０５の左の子ノード「Ｂ」５０４はソースコード１０８上の配列「Ｂ」に対応し、右の子ノード「Ｃ」５０６はソースコード１０８上の変数「Ｃ」に対応している。
【００２８】
図６の構文木テーブルは、コンパイラ１０３の構文解析により生成され、上記図５に示した構文木の内容を示し、計算機１０１の主記憶装置１０２上に保持される。構文木テーブルをチャート化したものが図５の構文木２０２となる。構文木テーブルの各列について、ＩＤ欄６０１はノードを識別するための番号、名前欄６０２はノードの名前、親ＩＤ欄６０３は構文木における親ノードのＩＤ、子ＩＤ欄６０４は構文木２０２における図５の左の子ノードのＩＤから順に設定されている。行番号欄６０５、及び列番号欄６０６は、各ノードのソースコード１０８上の位置を示している。なお、本実施形態で示している構文木２０２を表すテーブル類は、説明上の例であり、計算機１０１における構文木の表現方法、及び構文木２０２が有するノードの内容は、これに限るものではない。
【００２９】
次いで、意味解析部２０８の説明を行う。以下の説明では、図７及び図８を用いて、従来のソースコードレベルのカバレッジ測定技術等で適用されていた処理等を説明し、その後、図９及び図１０を用いて本実施形態における意味解析部２０８の処理の説明を行う。
【００３０】
従来例のコンパイラの意味解析部では、構文解析部が生成した図５の構文木に対して、図７に示すように例外処理のための部分木及びカバレッジノードを挿入した構文木を作成する。従来の意味解析部では、例えば、図７において、除算の処理に、ゼロによる除算（以下、「ゼロ割」という。）が行われるか否かの判定を伴う例外処理の部分木７０２（除算ノード）を暗黙的に挿入する。この例外処理の部分木７０２は、条件分岐処理を表すノード「ｉｆ」７０４によって実現されており、ノード「ｉｆ」７０４の最左端の子ノード７０５が表すように「Ｄ」の値が０であるか否かを判定して、「Ｄ」が０であればノード「ｉｆ」７０４の左から２番目の子ノード７０６が表すように例外処理のための実行時ライブラリＬＩＢを呼び出し、「Ｄ」が０でなければノード「ｉｆ」７０４の最右端の子ノード７０７が表すように「Ｄ」による除算を行う。
【００３１】
また、図４に示したソースコード中の８、９行目の配列「Ｂ（Ｃ）」について、添え字の「Ｃ」が配列の範囲内であるか否かの判定を伴う例外処理の部分木７０３も同様に、ノード「ｉｆ」７０８の最左端ノード７０９が表すように「Ｃ」の値を判定して、「Ｃ」の値が添え字の範囲の１から１０２４の間でなければ、図中左から２番目の子ノード７１０が表すように例外処理のための実行時ライブラリＬＩＢを呼び出し、「Ｃ」の値が１から１０２４の範囲であれば最右端の子ノード７１１が表すように配列参照のための添え字のアドレス計算をおこなうようになっている。
【００３２】
図７に示す従来例のカバレッジノード７０１は、ソースコードレベルのカバレッジポイントの位置に対応して挿入されている。挿入されたカバレッジノードは、このカバレッジノードをルートとする部分木を１つの処理単位として考え、このカバレッジノードの通過記録をカバレッジツール１０４に測定させることを意味している。図５に示したノード「Ｃ」５０６が図７のようなノード「＊」７１１をルートとする部分木に変化している理由は、意味解析部の解析により、ノード「Ｃ」５０６が配列Ｂの添え字であると判断され、配列Ｂの各要素のサイズ分だけ乗じた値を表す部分木に展開されたためである。
【００３３】
図８のテーブルは、従来例による図７の構文木を計算機の主記憶装置上に保持する形態の一例である。ゼロ割等の例外処理のために暗黙的に挿入した部分木を構成する各ノードは、対応するトークンがソースコード上には存在していないため、図中行番号６０５、及び列番号６０６が空白となっている。一方、カバレッジノード８０１は、ソースコードレベルのカバレッジポイントとの対応が取れる必要があるため、子ノード８０２の行番号、及び列番号が設定されている。その他の構成は、図６に示した構文木テーブルと同様である。
【００３４】
図９は、本実施形態の特徴となる構文木を示している。本発明によるコンパイラ１０３の意味解析部２０８は、ゼロ割等の暗黙的に自動的に挿入した例外処理の部分木に対して、例外を判定する条件分岐のthen側の部分木とelse側の部分木のルートに、カバレッジノード９０１〜９０４を挿入する。これにより、条件分岐のthen側とelse側のそれぞれの通過記録を取得することが可能になる。
【００３５】
すなわち、本発明のコンパイラ１０３の意味解析部２０８では、まず、図７に示した前記従来例と同様に、除算の処理ではゼロ割が行われるか否かの判定を伴う例外処理の部分木７０２を暗黙的に生成し、条件分岐処理を表すノード「ｉｆ」７０４、子ノード７０５、「Ｄ」が０のときにライブラリを実行するノード７０６、「Ｄ」が０でなければ除算を行う子ノード７０７を生成する。
【００３６】
そして、本発明のコンパイラ１０３の意味解析部２０８は、ソースコードには無い例外処理の判定結果に対応する条件分岐処理のノード「ｉｆ」７０４からライブラリを実行するノード７０６の間に、カバレッジノード９０１を挿入する。また、意味解析部２０８は、条件分岐処理のノード「ｉｆ」７０４から除算を実行する子ノード７０７の間に、カバレッジノード９０２を挿入する。
【００３７】
コンパイラ１０３の意味解析部２０８は、配列「Ｂ（Ｃ）」について添え字の「Ｃ」が配列の範囲内であるか否かの判定を伴う例外処理の部分木７０３についても同様に、ノード「ｉｆ」７０８と、「Ｃ」の値が添え字の範囲外で例外処理のための実行時ライブラリＬＩＢを呼び出す子ノード７１０の間にカバレッジノード９０３を挿入する。また、意味解析部２０８は、ノード「ｉｆ」７０８と、添え字のアドレス計算を行う子ノード７１１の間にカバレッジノード９０４を挿入する。
【００３８】
図１０のテーブルは、本発明による図９のカバレッジ挿入済み構文木を計算機１０１の主記憶装置１０２上に保持する形態の一例である。図１０のカバレッジ挿入済み構文木のテーブルは、従来例の図８に示したテーブルにグループＩＤ欄１００１と処理内容欄１００２を加えたものであり、その他の構成は図８及び図５と同様である。グループＩＤ欄１００１は、コンパイラ１０３により自動的に挿入された例外処理の部分木の単位で設定される。また、処理内容欄１００２は、例外処理の部分木の正常処理及び例外処理の内容を表す文字列を設定する。図９で挿入されたカバレッジノード９０１〜９０４に対応するエントリ１００３〜１００６は、コンパイラ１０３が自動的に挿入した条件分岐を伴う処理単位のカバレッジポイントに対応するものであり、対応するソースコードはないため、行番号及び列番号は、空白となる。
【００３９】
図１１及び図１２は、コンパイラ１０３の意味解析部２０８が、暗黙的に挿入される例外処理の部分木及びカバレッジノードを挿入する処理の流れを示している。なお、コンパイラ１０３の字句解析部２０６、構文解析部２０７、コード生成部２０９については、公知ないし周知の技術を適用すればよいので、ここでは詳述しない。
【００４０】
図１１において、意味解析部２０８は、構文解析部２０７が生成した構文木２０２を読み込んで、以下の処理を実行する。
【００４１】
意味解析部２０８は、まず、現在着目しているノードが、ソースコードレベルのカバレッジポイントに対応するか否かを判定する（１１０１）。この判定は前記従来例と同様に行われる。現在のノードがソースコードレベルのカバレッジポイントに対応するならば、該当ノードの親ノードとしてカバレッジノードを挿入する（１１０２）。
【００４２】
次に、現在のノードが、リーフノード（以下、リーフとする）であるか否かを判定する（１１０３）。リーフである場合、処理を終了する。リーフでない場合は、ノードに対する処理を行う（１１０４）。このノードに対する処理１１０４は、図１２に後述する。ノードに対する処理１１０４が完了した後、現在のノードがもつ全ての子ノードに対して同様の処理を深さ優先（木構造のすべてのノードを辿るための一般的な手法の一つである。具体的には、ルートからリーフに行き着くまで深い方向に辿り、リーフまで辿り着いたら、最も近くの訪れていないノードまで戻り、再び深い方向を辿っていく。これを繰り返す。）で再帰的に適用する。具体的な処理の流れを説明する。
【００４３】
まず、意味解析部２０８は、現在のノードがもつ最初の子ノードを取り出して（１１０５）、この子ノードに対して再帰的処理を適用する（１１０６）。その後、現在のノードに次の子ノードがあるか否かを判定する（１１０７）。次の子ノードがある場合、その子ノードを取り出して（１１０８）、再帰的処理１１０６に処理の制御を戻す。次の子ノードがない場合は、処理を終了する。
【００４４】
次に、図１２は、図１１の例外処理の部分木及びカバレッジノードを挿入する処理におけるノードに対する処理（１１０４）の詳細を示すフローチャートである。
【００４５】
意味解析部２０８は、まず、どのような例外処理の部分木を挿入するかを、現在のノードの種類に従って判断する（１２０１）。例外処理の部分木を挿入するか否かを判断する条件は、公知ないし周知の技術を適用することができる、ここでの詳細な解説は割愛するが、ノードの種類の他にも該当ノードがもつ右左の部分木のそれぞれのデータ型による判断などが加わることがある。また、図１２においては部分木を挿入する例外処理として、除算ノードと配列参照ノードの例を示したが、ステップ１２０１で判定する例外処理の種類に応じて各処理のフローチャートを予め設定しておけばよい。
【００４６】
そして、意味解析部２０８は、例外処理を自動挿入するか否かを示すユーザから指定されたオプション値を判断する（１２０２、１２０７）。オプション値はソースコード１０８に含まれていてもよいし、コンパイル時にユーザからの入力を受け付けてもよい。例外処理を自動挿入しない場合、処理を終了する。例外処理を自動挿入する場合、例えば、除算ノードならばゼロ割のチェックの部分木を挿入し（１２０３）て、カバレッジ挿入済み構文木２０３を生成し、配列参照ノードならば配列の添え字範囲のチェックの部分木を挿入してカバレッジ挿入済み構文木２０３を生成する（１２０８）。
【００４７】
さらに、自動挿入した処理のカバレッジを測定するか否かを示すユーザから指定されたオプション値を判断する（１２０４、１２０９）。カバレッジを測定しない場合、処理を終了する。カバレッジを測定する場合、本実施形態の特徴となる処理の１つである例外処理の部分木の条件分岐についてthen側とelse側にカバレッジノードを挿入する処理（１２０５、１２１０）と、条件分岐のthen側とelse側の処理内容を表す文字列をカバレッジノードに設定する処理（１２０６、１２１１）を行い、カバレッジ挿入済み構文木２０３を生成する。どのような例外処理の部分木を挿入するかの判断（１２０１）において、挿入する例外処理の部分木は存在しないと判断した場合、ノードに対する処理を終了する。
【００４８】
以上の、図１１、図１２の処理により、ソースコード１０８の除算や配列参照に対して暗黙的に除算ノードと配列参照ノード等の例外処理を挿入したカバレッジ挿入済み構文木２０３が生成され、さらに、これら例外処理の部分木には条件分岐のthen側とelse側にカバレッジノードが自動的に挿入されたカバレッジ挿入済み構文木２０３が生成される。
【００４９】
図１３は、意味解析部２０８により生成されるカバレッジ情報蓄積テーブル１１０の例を示している。カバレッジ情報蓄積テーブル１１０には、カバレッジノードの情報（ＩＤ、グループＩＤ、親ＩＤ及び子ＩＤ）の欄１３０１〜１３０４と、ソースコードレベルの情報（行番号及び列番号）の欄１３０５、１３０６がある。親ＩＤ欄１３０３及び子ＩＤ欄１３０４は、図９の構文木におけるカバレッジノードのみの親子関係を表している。さらに、カバレッジ情報蓄積テーブル１１０には本実施形態で特徴となる処理内容欄１３０７がある。処理内容欄１３０７には例外処理の内容が格納される。アドレス欄１３０８は、カバレッジポイントに対応するカバレッジノードの実行可能オブジェクト内のアドレスを示す。アドレスの値は、コード生成部２０９によるコード生成時に設定される。カバレッジツール１０４の実行時に設定される通過記録欄１３０９は、カバレッジノードに対応する位置を何回通過したかを表している。
【００５０】
図１４は、意味解析部２０８によるカバレッジ情報蓄積テーブル１１０の作成の流れを示すフローチャートである。この処理は、上記図１１、図１２の処理でカバレッジ挿入済み構文木２０３を生成した後に実行される。
【００５１】
意味解析部２０８は、カバレッジ挿入済み構文木２０３を読み込んで、まず、現在のノードが、カバレッジノードであるか否かを判定する（１４０１）。カバレッジノードの判定は、図１０に示したカバレッジ挿入済み構文木２０３のテーブルにおいて、名前６０２が「Coverage」のエントリがカバレッジノードであると判定する。現在のノードがカバレッジノードでない場合、子ノードがあるか否かを判定（１４０２）して、子ノードがある場合はその子ノードに対する再帰的処理を行う（１４０３）。
【００５２】
一方、現在のノードがカバレッジノードである場合、カバレッジ情報蓄積テーブル１１０に新しいエントリを作成して（１４０４）、新しいエントリに現在のカバレッジノードの属性（ＩＤ、グループＩＤ、行番号、列番号及び処理内容）を設定する（１４０５）。親ＩＤに設定すべきカバレッジノードを記憶しておくためのスタックが、空であるか否かを判定し（１４０６）、空でない場合、新しいエントリと、スタックトップのカバレッジノードに親子関係のリンクを設定する。具体的には、新しいエントリの親ＩＤの欄にスタックトップのカバレッジノードのＩＤを設定し（１４０７）、スタックトップのカバレッジノードの子ＩＤ属性には、新しいエントリのＩＤ属性を追加する（１４０８）。
【００５３】
次に、意味解析部２０８は、現在のカバレッジノードをスタックにプッシュして（１４０９）、現在のカバレッジノードの子ノードに対して再帰的に同様の処理を実行する（１４１０）。最後に、スタックから現在のカバレッジノードをポップする（１４１１）。
【００５４】
上記処理により、図１３に示したカバレッジ情報蓄積テーブル１１０が生成され、処理の親子関係と処理内容１３０７等が設定される。
【００５５】
図１５は、意味解析部２０８が出力する図９の構文木に対する中間語コード列２０４の例を示すものである。中間語コード列２０４は、ＩＤ１５１０と、演算子１５１１と、被演算子１（１５１２）と、被演算子２（１５１３）から構成される。意味解析部２０８は、上記生成したカバレッジ挿入済み構文木２０３から公知または周知の技術により中間語コード列２０４を生成する。意味解析部２０８は、上記挿入したカバレッジノードを中間語コード列２０４の演算子１５１１に識別子とともに格納する。本実施形態の意味解析部２０８によりカバレッジ挿入済み構文木２０３に挿入したカバレッジノードに対応するカバレッジポイントには、カバレッジポイントを表すラベル（１５０１〜１５０５）が図示のように出力されている。
【００５６】
コード生成部２０９における各カバレッジポイントに対応するラベルに対する処理では、コード生成部２０９が中間語コード列２０４を読み込んで該当するラベル１５０１〜１５０５が示すアドレスを、ラベルに対応するカバレッジ情報蓄積テーブル１１０のエントリのアドレスの欄１３０８に設定する。この例では、各カバレッジポイントに対応するラベルと、カバレッジ情報蓄積テーブル１１０のエントリは、このラベルの名前の末尾にある数字がエントリのＩＤを表わしていることで対応をとることができるようになっている。例えば、図１５の中間語コード列２０４のラベル１５０２のカバレッジノードは、演算子１５１１＝「Coverage＿１６」となっており、「１６」がカバレッジ情報蓄積テーブル１１０のＩＤ１３０１の「１６」に対応する。コード生成部２０９は、ラベル１５０２の演算子１５１１に含まれるＩＤが一致するカバレッジ情報蓄積テーブル１１０のエントリのアドレス１３０８を設定する。
【００５７】
図１６は、解析済みカバレッジ情報１１１の表示例を示すものである。解析済みカバレッジ情報１１１は、カバレッジ情報解析ツール１０５によって解析された解析結果が格納され、エディタ１０６によって出力装置１１２へ出力される。
【００５８】
図１６の表示例において、１行目１６０１にカバレッジ測定対象となったソースコード１０８が表示される。ここでは、カバレッジ情報解析ツール１０５が通過した箇所には「＊」印が表示され、通過していない箇所には「．」印が表示されている。２行目〜５行目（１６０２〜１６０５）は、本実施形態の特徴となるカバレッジ情報の表示例であり、１行目のソースコード１０８に対してコンパイラ１０３が自動的に生成した処理単位のカバレッジ情報を示している。この例では、カバレッジ情報解析ツール１０５によって動作検証が行われた処理が、除算における正常処理１６０２、及び配列の添え字参照における正常処理１６０３であることがわかる。一方、動作検証が行われていない処理は、除算におけるゼロ割のときの処理１６０５及び配列参照における範囲外参照のときの処理１６０４であることがわかる。
【００５９】
図１７、図１８及び図１９は、カバレッジ情報解析ツール１０５で行われるカバレッジ情報蓄積テーブル１１０の解析結果である解析済みカバレッジ情報１１１の作成の流れを示すフローチャートである。
【００６０】
図１７は、カバレッジ情報解析ツール１０５で行われる解析済みカバレッジ情報１１１の全体的な処理の一例を示すフローチャートである。
【００６１】
カバレッジ情報解析ツール１０５は、まず、ソースコード１０８を読み込み（１７０１）、先頭の行を取得する（１７０２）。カバレッジ情報蓄積テーブル１１０から、ソースコード１０８の現在の行番号と一致する行番号１３０５が設定されている全てのエントリを取得して、リスト（図示省略）を作成する（１７０３）。その際、カバレッジ情報蓄積テーブル１１０の列番号１３０６が昇順になるように並び替えておく。
【００６２】
次に、カバレッジ情報解析ツール１０５は、作成したリストが空であるか否かを判定する（１７０４）。リストが空でなければ、ソースコードレベルの１行分の通過記録を印字するために、リスト内の全てのエントリの通過記録をリストの先頭から順に印字する（１７０５）。この印字処理はリストのエントリを通過していれば「＊」印を印字し、通過していなければ「．」印を印字する。次に、後述するリストに対する処理をおこなう（１７０６）。その後、カバレッジ情報解析ツール１０５は、次の行があるかないかを判定する（１７０７）。次の行がない場合、処理を終了する。次の行がある場合、次の行を取得（１７０８）して、処理の制御をリストを作成する処理（１７０３）に戻す。
【００６３】
図１８は、図１７のステップ１７０６で行われる処理のフローチャートを示し、現在の行のすべてのソースコードレベルのカバレッジポイントに対応するエントリが格納されたリストに対する処理の流れを示すものである。
【００６４】
まず、カバレッジ情報解析ツール１０５は、生成したリストから最初のエントリを取り出し（１８０１）、カバレッジ情報蓄積テーブル１１０の子ＩＤ１３０４の属性が空か否かを判定する（１８０２）。子ＩＤ１３０４の属性が空である場合、処理の制御を、リストに次のエントリがあるか否かの判定（１８０７）に移す。一方、子ＩＤ１３０４の属性が空でなければ、子ＩＤ１３０４の属性の最初のＩＤに対応するカバレッジ情報蓄積テーブル１１０のエントリを取り出し（１８０３）、当該エントリのカバレッジ情報の印字処理をおこなう（１８０４）。このエントリはコンパイラ１０３が自動生成した処理単位に対するカバレッジポイントに対応しており、当該エントリの印字処理については後述する。
【００６５】
そして、カバレッジ情報解析ツール１０５は、子ＩＤ１３０４の属性に次のＩＤがあるか否かを判定し（１８０５）、ＩＤが存在する場合、次のＩＤに対応するエントリを取り出して（１８０６）、処理の制御を印字処理（１８０４）に戻す。次のＩＤがない場合、リストに次のエントリがあるか否かの判定をおこなう（１８０７）。エントリがない場合、処理を終了する。エントリが存在する場合、リストから次のエントリを取り出して（１８０８）、処理の制御を子ＩＤ１３０４の属性が空か否かの判定（１８０２）に戻す。
【００６６】
上記処理を繰り返すことで、カバレッジ情報蓄積テーブル１１０の子ＩＤ１３０４に格納されたＩＤに対応するリストのエントリに印字処理が実行される。カバレッジ情報解析ツール１０５は、このリストから解析済みカバレッジ情報１１１を生成する。
【００６７】
図１９は、コンパイラ１０３が自動生成した処理単位のカバレッジ情報の解析の流れを示すフローチャートで、図１８のステップ１８０４で実行される処理である。
【００６８】
カバレッジ情報解析ツール１０５は、まず、ステップ１８０４で抽出した子ＩＤ１３０４のＩＤに対応するカバレッジ情報蓄積テーブル１１０のエントリについて、通過記録１３０９を印字する（１９０１）。当該エントリを通過していれば「＊」印、通過していなければ「．」印を印字して、さらに、そのエントリの処理内容も印字する。
【００６９】
次に、子ＩＤ１３０４の属性が空であるか否かを判定する（１９０２）。空である場合、処理を終了する。空でない場合、子ＩＤ１３０４の属性の先頭のＩＤを取り出して、カバレッジ情報蓄積テーブル１１０から該当するＩＤのエントリを取り出す（１９０３）。そのエントリに対して再帰的処理をおこなう（１９０４）。その後、次の子ＩＤ１３０４の属性が空であるか否かを判定する（１９０５）。次の子ＩＤ１３０４の属性にＩＤが存在する場合、次の子ＩＤ１３０４の属性を取得して（１９０６）、処理の制御をエントリに対する再帰的処理（１９０４）に戻す。
【００７０】
以上の処理によって、カバレッジ情報解析ツール１０５は、通過したエントリの通過記録１３０９を印字して、解析済みカバレッジ情報１１１が生成される。
【００７１】
上述したように、本実施形態では、コンパイラが暗黙的に自動生成した分岐を伴う処理単位のカバレッジとその処理内容を取得することが可能になるため、当該分岐を伴う処理単位の動作検証を可能とするテストケースの設計が容易になり、テスト担当者の作業量の軽減を図ることができるようになる。
【００７２】
特に、意味解析部２０８は、暗黙的に自動生成した分岐を伴う例外処理の処理単位に対して、各分岐先の処理内容を表す文字列（コメントノード）をカバレッジ情報蓄積テーブル１１０に記録する。さらに意味解析部２０８が出力する中間語コード列２０４には、例外処理の処理単位に対してカバレッジポイントを表すラベルがコメントノードとして挿入される。コード生成部２０９は中間語コード列２０４のラベルに含まれるＩＤを参照することでカバレッジ情報蓄積テーブル１１０のアドレスを加えることができる。
【００７３】
このように生成されたカバレッジ情報蓄積テーブル１１０をカバレッジ情報解析ツール１０５で解析することにより、ソースコード１０８に明示されていない条件分岐を伴う処理がコンパイラ１０３によって暗黙的に生成された場合でも、暗黙的に生成された処理の内容及び暗黙的に生成された処理単位が実行されたか否かを明示することができる。これにより、カバレッジに基づいてソフトウェアの検査を行うテスト担当者の労力を低減できる。また、コンパイラ１０３の自動挿入による暗黙的な処理を、カバレッジ情報蓄積テーブル１１０で可視化することで、ソフトウェアの品質向上を図ることが可能となる。
【００７４】
なお、上記実施形態においては、カバレッジ情報解析ツール１０５が、ソースコード１０８の行番号と一致する行番号１３０５が設定されているカバレッジ情報蓄積テーブル１１０のエントリを取得してリストを作成した例を示したが、リストを作成せずにソースコード１０８の行番号と一致する行番号１３０５が設定されているカバレッジ情報蓄積テーブル１１０のエントリから直接解析済みカバレッジ情報１１１を生成するようにしても良い。
【産業上の利用可能性】
【００７５】
以上のように、本発明はソースコードから実行コードを生成するコンパイラに適用することができ、さらにコンパイラ及びコンパイラが生成した実行コードを検証するカバレッジ情報解析ツールを含む計算機システムに適用することができる。
【符号の説明】
【００７６】
１０１  計算機
１０２  主記憶装置
１０３  コンパイラ
１０４  カバレッジツール
１０５  カバレッジ情報解析ツール
１０６  エディタ
１０７  補助記憶装置
１０８  ソースコード
１０９  実行可能プログラム
１１０  カバレッジ情報蓄積テーブル
１１１  解析済みカバレッジ情報
１１２  出力装置
１１３  演算装置
２０３  カバレッジノード挿入済み構文木
２０８  意味解析部
９０１〜９０４  コンパイラが自動生成する処理単位の部分木に対して挿入したカバレッジノード
１００３〜１００６  コンパイラが自動生成する処理単位の部分木に対して挿入したカバレッジノードの内容を主記憶装置上で保持するためのテーブルエントリ
【図１】
2011221656.tif 000003
【図２】
2011221656.tif 000004
【図３】
2011221656.tif 000005
【図４】
2011221656.tif 000006
【図５】
2011221656.tif 000007
【図６】
2011221656.tif 000008
【図７】
2011221656.tif 000009
【図８】
2011221656.tif 000010
【図９】
2011221656.tif 000011
【図１０】
2011221656.tif 000012
【図１１】
2011221656.tif 000013
【図１２】
2011221656.tif 000014
【図１３】
2011221656.tif 000015
【図１４】
2011221656.tif 000016
【図１５】
2011221656.tif 000017
【図１６】
2011221656.tif 000018
【図１７】
2011221656.tif 000019
【図１８】
2011221656.tif 000020
【図１９】
2011221656.tif 000021
【図２０Ａ】
2011221656.tif 000022
【図２０Ｂ】
2011221656.tif 000023