JP2011221656A - 実行コードの生成方法、コンパイラ及びコンパイル装置 - Google Patents

実行コードの生成方法、コンパイラ及びコンパイル装置 Download PDF

Info

Publication number
JP2011221656A
JP2011221656A JP2010088000A JP2010088000A JP2011221656A JP 2011221656 A JP2011221656 A JP 2011221656A JP 2010088000 A JP2010088000 A JP 2010088000A JP 2010088000 A JP2010088000 A JP 2010088000A JP 2011221656 A JP2011221656 A JP 2011221656A
Authority
JP
Japan
Prior art keywords
coverage
code
node
processing
compiler
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2010088000A
Other languages
English (en)
Inventor
Tomohiro Tsukamoto
智博 塚本
Tsuyoshi Hatakei
毅之 畑井
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2010088000A priority Critical patent/JP2011221656A/ja
Publication of JP2011221656A publication Critical patent/JP2011221656A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

【課題】コンパイラが暗黙的に自動生成した処理単位を明示して、当該処理単位の動作検証を容易に実施可能にして、テスト担当者の作業量の軽減を図る。
【解決手段】コンパイラが自動生成した分岐を伴う例外処理の処理単位に対して、各分岐先の処理単位を実行したか否かを測定するためのポイントを設け(1205、1209)、当該処理単位について、コンパイラが設定した処理内容を表す文字列を対応付け(1206、1211)、当該処理内容と共にカバレッジを取得可能にする。
【選択図】図12

Description

本発明は、コンパイラが自動的に生成した処理単位のカバレッジ情報及びその処理内容を取得する方法及び装置に関するものである。
従来からコンピュータプログラムの品質の評価をおこなうための指標として、カバレッジが知られている。カバレッジ(網羅率)とは、コンピュータプログラムの処理経路をどのくらい網羅しているかを示す単位で、一般的に、高級言語のソースコードレベルのカバレッジを測定する技術と、機械語レベルのカバレッジを測定する技術がある。
例えば、ソースコードレベルのカバレッジの測定では、図20Aのソースコードレベルの測定の例2001に示すように、ソースコード上の文単位でカバレッジを測定することができるようになっている。この例2001では、ソースコードにおいてBをCで除した結果Aを求める演算を示している。
他方、機械語レベルのカバレッジの計測では、機械語レベルの基本ブロック(入口と出口をそれぞれ先頭と末尾に1つずつもち、その間に分岐を含まない機械語の列のこと。)の単位でカバレッジを計測することができるようになっている。またその改良方式として、特許文献1に開示されるように、ソースコードがないオブジェクトコードに対するカバレッジを測定できるような方法も提案されている。
特開2006−146669号公報
しかしながら、図20Aの従来例では、ソースコードレベルのカバレッジの測定結果が100%であっても、機械語レベルでは100%となっていないという問題がある。このような問題は、コンパイラが分岐を伴う処理を自動的に挿入することに起因する。コンパイラが自動生成する一般的な処理としては、分岐を伴う例外処理などがある。例えば、図20Bの機械語レベルの測定の例2002に示すように、コンパイラが自動的に挿入した処理に分岐がある場合は、実行される処理単位と実行されない処理単位が存在することになるが、ソースコードレベルのカバレッジではすべての経路が実行されたように表示されてしまう。すなわち、機械語レベルの測定の例2002では、BをCで除した結果Aを求めるソースコードをコンパイルした結果、0による除算が発生したときの例外処理がコンパイラによって暗黙的に挿入されたことを示している。
その点、機械語レベルでカバレッジを測定する技術を用いれば、上述したような問題は生ずることなく、正確なカバレッジを測定することができる。しかし、機械語レベルのカバレッジ測定結果は、機械語レベルで表示され、高級言語のユーザは通常機械語を理解できない。
したがって、高級言語のユーザが機械語レベルのコード部分を読んで処理内容を理解して、そのコード部分を通過するための高級言語のソースコードレベルの条件を明確にすることは困難であり、その様なテストケースを設計するにはスキルと労力が要求されるという問題がある。
本発明は、コンピュータプログラムのテスト担当者が、コンパイラが自動生成した処理単位を把握して、当該処理単位の動作検証を容易に実施可能にし、テスト担当者の作業量の軽減を図ることを目的とする。
本発明は、CPUと主記憶を含む計算機で実行コードを生成する実行コードの生成方法であって、前記計算機が、ソースコードを読み込むステップと、前記計算機が、前記ソースコードから中間語コードを生成するステップと、前記計算機が、中間語コードから実行コードを生成するステップと、を含み、前記中間語コードを生成するステップは、前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加するステップと、前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加するステップと、を含む。
また、前記予め設定された分岐処理を付加するステップは、前記ソースコードに明示されていない分岐処理を付加する。
したがって、本発明によれば、コンピュータプログラムのテスト担当者が、コンパイラが暗黙的に自動生成した処理単位を把握することができ、当該処理単位の動作検証が容易に実施可能になり、テスト担当者の作業量の軽減を図ることができるようになる。
本発明の実施の形態を示し、本発明を適用する計算機の計算機の一例を示すブロック図である。 本発明の実施の形態を示し、本発明の処理の原理を表す概要図である。 本発明の実施の形態を示し、本実施形態におけるコンパイラの動作を表す概要図である。 本発明の実施の形態を示し、コンパイラの入力データとなるソースコードの例を示す説明図である。 本発明の実施の形態を示し、構文解析により生成される構文木の一例を示す説明図である。 本発明の実施の形態を示し、構文解析により生成される構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す説明図である。 従来例を示し、カバレッジノード挿入済み構文木の一例を示す図である。 従来例を示し、カバレッジノード挿入済み構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す図である。 本発明の実施の形態を示し、コンパイラが自動的に挿入した例外処理の部分木に対してカバレッジノードを挿入した構文木の一例を示す図である。 本発明の実施の形態を示し、コンパイラが自動的に挿入した例外処理の部分木に対してカバレッジノードを挿入した構文木の内容を計算機の主記憶装置上に保持するためのテーブルの一例を示す図である。 本発明の実施の形態を示し、例外処理の部分木及びカバレッジノードの挿入手順を示すフローチャートである。 本発明の実施の形態を示し、例外処理の部分木及びカバレッジノードを挿入する処理におけるノード毎の処理手順を示すフローチャートである。 本発明の実施の形態を示し、意味解析部が生成するカバレッジ情報蓄積テーブルの一例を示す説明図である。 本発明の実施の形態を示し、カバレッジ情報蓄積テーブルの作成手順を示すフローチャートである。 本発明の実施の形態を示し、カバレッジノード挿入後の中間語コード列の一例を表す説明図である。 本発明の実施の形態を示し、解析済みカバレッジ情報の表示例を表す説明図である。 本発明の実施の形態を示し、カバレッジ情報解析ツールで行われるカバレッジ情報蓄積テーブルの解析結果である解析済みカバレッジ情報の作成手順を示すフローチャートである。 本発明の実施の形態を示し、解析済みカバレッジ情報の作成におけるリストに対する処理手順を示すフローチャートである。 本発明の実施の形態を示し、コンパイラが自動生成した処理単位のカバレッジ情報の解析手順を示すフローチャートである。 従来例を示し、ソースコードレベルのカバレッジ測定結果の一例を表す説明図である。 従来例を示し、機械語レベルのカバレッジ測定結果の一例を表す説明図である。
以下、本発明の一実施形態を添付図面に基づいて説明する。
図1は、本発明を適用した実施形態における計算機101の構成例を示すブロック図である。計算機101は、バス114で接続された演算装置(またはCPU)113、主記憶装置102、補助記憶装置107及び出力装置112から構成される。
主記憶装置102には、本実施形態の主体となるコンパイラ103、カバレッジを測定するカバレッジツール104、コンパイラ103が採取したカバレッジ情報(検証情報)を解析するカバレッジ情報解析ツール105及びカバレッジ情報解析ツール105の解析結果を表示するエディタ106が展開され、これらのプログラム群を演算装置113が実行することにより種々の処理が提供される。補助記憶装置107には、カバレッジ計測対象のソースコード108、コンパイルの結果生成される実行可能プログラム(または実行コード)109、カバレッジポイントの位置やカバレッジ計測結果などを格納するために生成されるカバレッジ情報蓄積テーブル110及びカバレッジ情報の解析結果を格納するために生成される解析済みカバレッジ情報111が記憶されている。また、補助記憶装置107はコンパイラ103、カバレッジツール104、カバレッジ情報解析ツール105及びエディタ106からなるプログラム群を格納する記憶媒体として機能する。計算機101は、コンパイル装置及びカバレッジ情報解析装置として機能する。
図2は、本実施形態における計算機101で実行される処理の概要を示すものである。まず、コンパイラ103が予め補助記憶装置107に格納されたソースコード108をコンパイルして、実行可能プログラム109及びカバレッジ情報蓄積テーブル110を生成する。このコンパイラの動作概要は図3に示す。また、カバレッジ情報蓄積テーブル110の例は図13に示す。
次に、カバレッジツール104は、カバレッジ情報蓄積テーブル110から取得したカバレッジポイントを実行可能プログラム109に対して設定し、実行可能プログラム109のカバレッジを測定する。カバレッジツール104の測定結果はカバレッジ情報蓄積テーブル110に蓄積する。そして、カバレッジ情報蓄積テーブル110に格納されたカバレッジ情報は、カバレッジ情報解析ツール105によって解析され、解析結果が解析済みカバレッジ情報111に格納される。この解析の流れは、後述の図17〜図19に示す。また、解析済みカバレッジ情報111の表示例は、図16に示す。解析済みカバレッジ情報111は、エディタ106により出力装置112へ表示される。
図3は、本実施形態におけるコンパイラ103の処理の概要を示すものである。コンパイラ103は、ソースコード108が入力されると、コンパイルをおこない、実行可能プログラム109を出力する。コンパイラ103は、字句解析部206、構文解析部207、意味解析部208、コード生成部209を備える。
字句解析部206は、ソースコード108上の文字列を構文解析しやすい形に切り出して、トークン列201を生成する。構文解析部207は、字句解析部206により解析されたトークン列201から、トークンをノードとして有する構文木202を生成する。この構文木202の例は図5に示す。
意味解析部208は、構文解析部207により解析された構文木202の各ノードに従って、各ノードにデータ型などの情報を追加したり、シンボルテーブルを作成して変数や関数の定義箇所と参照箇所を結び付けたりして、構文木202に意味論的情報を追加する。
さらに、意味解析部208は、例外処理が必要な箇所には、例外処理のための部分木と、カバレッジポイントを構文木上で表現するためのノード(以下、「カバレッジノード」という。)を挿入し、カバレッジノード挿入済み構文木203を生成する。このカバレッジノード挿入済み構文木203を作成するフローチャートは、後述の図11と図12に示す。また、意味解析部208により作成されたカバレッジノード挿入済み構文木203の例は図9に示す。
そして、意味解析部208はカバレッジノード挿入済み構文木203から、カバレッジ情報蓄積テーブル110及び中間語コード列204を生成する。このカバレッジ情報蓄積テーブル110と中間語コード列204の例は、図13と図15に示す。また、このときのカバレッジ情報蓄積テーブル110の作成の流れを図14に示す。
コード生成部209は、意味解析部208により解析された中間語コード列204から、カバレッジポイントに対応するアドレス情報をカバレッジ情報蓄積テーブル110に追加しながら、実行可能プログラム109を生成する。
以下、図4のCOBOL言語で書かれたソースコードを例にして、本実施形態におけるデータの流れ及び処理の流れの詳細を説明する。図4に示すソースコードにおいて、カバレッジの測定対象となる文401は、14行目に示すように、変数Cを添え字として配列Bを参照し、配列B(C)の格納値を変数Dで除算した結果を、変数Aに代入するものである。
図5は、図4のソースコードの文401から構築される構文木202を示している。このような構文木202は、プログラミング言語ごとに予めコンパイラ103に定義されている構文規則に従って、種々の態様が考えられるが、本実施形態では、例として下向き構文解析法などの構文解析手法を用いてソースコードを解析することで構築するものとする。
図5におけるノード「COMPUTE」501は、ソースコード108上の算術式「COMPUTE」に対応している。ノード「COMPUTE」501の子ノード「=」503は、ソースコード108上の代入演算子「=」に対応しており、子ノード503の左右の部分木は、それぞれ代入先と代入値を表している。ノード「=」503の図中左の子ノード「A」502はソースコード108上の変数「A」に対応しており、右の子ノード「/」507はソースコード108上の除算演算子「/」に対応している。さらにノード「/」507の図中左と右の子ノードは、それぞれ除数と被除数を表している。ノード「/」507の左の子ノード「()」505はソースコード108上の配列参照演算子「()」に対応する配列参照ノードで、右の子ノード「D」508はソースコード108上の変数「D」に対応している。そして、ノード「()」505の図中左と右の子ノードは、それぞれ配列とその添え字を表している。ノード「()」505の左の子ノード「B」504はソースコード108上の配列「B」に対応し、右の子ノード「C」506はソースコード108上の変数「C」に対応している。
図6の構文木テーブルは、コンパイラ103の構文解析により生成され、上記図5に示した構文木の内容を示し、計算機101の主記憶装置102上に保持される。構文木テーブルをチャート化したものが図5の構文木202となる。構文木テーブルの各列について、ID欄601はノードを識別するための番号、名前欄602はノードの名前、親ID欄603は構文木における親ノードのID、子ID欄604は構文木202における図5の左の子ノードのIDから順に設定されている。行番号欄605、及び列番号欄606は、各ノードのソースコード108上の位置を示している。なお、本実施形態で示している構文木202を表すテーブル類は、説明上の例であり、計算機101における構文木の表現方法、及び構文木202が有するノードの内容は、これに限るものではない。
次いで、意味解析部208の説明を行う。以下の説明では、図7及び図8を用いて、従来のソースコードレベルのカバレッジ測定技術等で適用されていた処理等を説明し、その後、図9及び図10を用いて本実施形態における意味解析部208の処理の説明を行う。
従来例のコンパイラの意味解析部では、構文解析部が生成した図5の構文木に対して、図7に示すように例外処理のための部分木及びカバレッジノードを挿入した構文木を作成する。従来の意味解析部では、例えば、図7において、除算の処理に、ゼロによる除算(以下、「ゼロ割」という。)が行われるか否かの判定を伴う例外処理の部分木702(除算ノード)を暗黙的に挿入する。この例外処理の部分木702は、条件分岐処理を表すノード「if」704によって実現されており、ノード「if」704の最左端の子ノード705が表すように「D」の値が0であるか否かを判定して、「D」が0であればノード「if」704の左から2番目の子ノード706が表すように例外処理のための実行時ライブラリLIBを呼び出し、「D」が0でなければノード「if」704の最右端の子ノード707が表すように「D」による除算を行う。
また、図4に示したソースコード中の8、9行目の配列「B(C)」について、添え字の「C」が配列の範囲内であるか否かの判定を伴う例外処理の部分木703も同様に、ノード「if」708の最左端ノード709が表すように「C」の値を判定して、「C」の値が添え字の範囲の1から1024の間でなければ、図中左から2番目の子ノード710が表すように例外処理のための実行時ライブラリLIBを呼び出し、「C」の値が1から1024の範囲であれば最右端の子ノード711が表すように配列参照のための添え字のアドレス計算をおこなうようになっている。
図7に示す従来例のカバレッジノード701は、ソースコードレベルのカバレッジポイントの位置に対応して挿入されている。挿入されたカバレッジノードは、このカバレッジノードをルートとする部分木を1つの処理単位として考え、このカバレッジノードの通過記録をカバレッジツール104に測定させることを意味している。図5に示したノード「C」506が図7のようなノード「*」711をルートとする部分木に変化している理由は、意味解析部の解析により、ノード「C」506が配列Bの添え字であると判断され、配列Bの各要素のサイズ分だけ乗じた値を表す部分木に展開されたためである。
図8のテーブルは、従来例による図7の構文木を計算機の主記憶装置上に保持する形態の一例である。ゼロ割等の例外処理のために暗黙的に挿入した部分木を構成する各ノードは、対応するトークンがソースコード上には存在していないため、図中行番号605、及び列番号606が空白となっている。一方、カバレッジノード801は、ソースコードレベルのカバレッジポイントとの対応が取れる必要があるため、子ノード802の行番号、及び列番号が設定されている。その他の構成は、図6に示した構文木テーブルと同様である。
図9は、本実施形態の特徴となる構文木を示している。本発明によるコンパイラ103の意味解析部208は、ゼロ割等の暗黙的に自動的に挿入した例外処理の部分木に対して、例外を判定する条件分岐のthen側の部分木とelse側の部分木のルートに、カバレッジノード901〜904を挿入する。これにより、条件分岐のthen側とelse側のそれぞれの通過記録を取得することが可能になる。
すなわち、本発明のコンパイラ103の意味解析部208では、まず、図7に示した前記従来例と同様に、除算の処理ではゼロ割が行われるか否かの判定を伴う例外処理の部分木702を暗黙的に生成し、条件分岐処理を表すノード「if」704、子ノード705、「D」が0のときにライブラリを実行するノード706、「D」が0でなければ除算を行う子ノード707を生成する。
そして、本発明のコンパイラ103の意味解析部208は、ソースコードには無い例外処理の判定結果に対応する条件分岐処理のノード「if」704からライブラリを実行するノード706の間に、カバレッジノード901を挿入する。また、意味解析部208は、条件分岐処理のノード「if」704から除算を実行する子ノード707の間に、カバレッジノード902を挿入する。
コンパイラ103の意味解析部208は、配列「B(C)」について添え字の「C」が配列の範囲内であるか否かの判定を伴う例外処理の部分木703についても同様に、ノード「if」708と、「C」の値が添え字の範囲外で例外処理のための実行時ライブラリLIBを呼び出す子ノード710の間にカバレッジノード903を挿入する。また、意味解析部208は、ノード「if」708と、添え字のアドレス計算を行う子ノード711の間にカバレッジノード904を挿入する。
図10のテーブルは、本発明による図9のカバレッジ挿入済み構文木を計算機101の主記憶装置102上に保持する形態の一例である。図10のカバレッジ挿入済み構文木のテーブルは、従来例の図8に示したテーブルにグループID欄1001と処理内容欄1002を加えたものであり、その他の構成は図8及び図5と同様である。グループID欄1001は、コンパイラ103により自動的に挿入された例外処理の部分木の単位で設定される。また、処理内容欄1002は、例外処理の部分木の正常処理及び例外処理の内容を表す文字列を設定する。図9で挿入されたカバレッジノード901〜904に対応するエントリ1003〜1006は、コンパイラ103が自動的に挿入した条件分岐を伴う処理単位のカバレッジポイントに対応するものであり、対応するソースコードはないため、行番号及び列番号は、空白となる。
図11及び図12は、コンパイラ103の意味解析部208が、暗黙的に挿入される例外処理の部分木及びカバレッジノードを挿入する処理の流れを示している。なお、コンパイラ103の字句解析部206、構文解析部207、コード生成部209については、公知ないし周知の技術を適用すればよいので、ここでは詳述しない。
図11において、意味解析部208は、構文解析部207が生成した構文木202を読み込んで、以下の処理を実行する。
意味解析部208は、まず、現在着目しているノードが、ソースコードレベルのカバレッジポイントに対応するか否かを判定する(1101)。この判定は前記従来例と同様に行われる。現在のノードがソースコードレベルのカバレッジポイントに対応するならば、該当ノードの親ノードとしてカバレッジノードを挿入する(1102)。
次に、現在のノードが、リーフノード(以下、リーフとする)であるか否かを判定する(1103)。リーフである場合、処理を終了する。リーフでない場合は、ノードに対する処理を行う(1104)。このノードに対する処理1104は、図12に後述する。ノードに対する処理1104が完了した後、現在のノードがもつ全ての子ノードに対して同様の処理を深さ優先(木構造のすべてのノードを辿るための一般的な手法の一つである。具体的には、ルートからリーフに行き着くまで深い方向に辿り、リーフまで辿り着いたら、最も近くの訪れていないノードまで戻り、再び深い方向を辿っていく。これを繰り返す。)で再帰的に適用する。具体的な処理の流れを説明する。
まず、意味解析部208は、現在のノードがもつ最初の子ノードを取り出して(1105)、この子ノードに対して再帰的処理を適用する(1106)。その後、現在のノードに次の子ノードがあるか否かを判定する(1107)。次の子ノードがある場合、その子ノードを取り出して(1108)、再帰的処理1106に処理の制御を戻す。次の子ノードがない場合は、処理を終了する。
次に、図12は、図11の例外処理の部分木及びカバレッジノードを挿入する処理におけるノードに対する処理(1104)の詳細を示すフローチャートである。
意味解析部208は、まず、どのような例外処理の部分木を挿入するかを、現在のノードの種類に従って判断する(1201)。例外処理の部分木を挿入するか否かを判断する条件は、公知ないし周知の技術を適用することができる、ここでの詳細な解説は割愛するが、ノードの種類の他にも該当ノードがもつ右左の部分木のそれぞれのデータ型による判断などが加わることがある。また、図12においては部分木を挿入する例外処理として、除算ノードと配列参照ノードの例を示したが、ステップ1201で判定する例外処理の種類に応じて各処理のフローチャートを予め設定しておけばよい。
そして、意味解析部208は、例外処理を自動挿入するか否かを示すユーザから指定されたオプション値を判断する(1202、1207)。オプション値はソースコード108に含まれていてもよいし、コンパイル時にユーザからの入力を受け付けてもよい。例外処理を自動挿入しない場合、処理を終了する。例外処理を自動挿入する場合、例えば、除算ノードならばゼロ割のチェックの部分木を挿入し(1203)て、カバレッジ挿入済み構文木203を生成し、配列参照ノードならば配列の添え字範囲のチェックの部分木を挿入してカバレッジ挿入済み構文木203を生成する(1208)。
さらに、自動挿入した処理のカバレッジを測定するか否かを示すユーザから指定されたオプション値を判断する(1204、1209)。カバレッジを測定しない場合、処理を終了する。カバレッジを測定する場合、本実施形態の特徴となる処理の1つである例外処理の部分木の条件分岐についてthen側とelse側にカバレッジノードを挿入する処理(1205、1210)と、条件分岐のthen側とelse側の処理内容を表す文字列をカバレッジノードに設定する処理(1206、1211)を行い、カバレッジ挿入済み構文木203を生成する。どのような例外処理の部分木を挿入するかの判断(1201)において、挿入する例外処理の部分木は存在しないと判断した場合、ノードに対する処理を終了する。
以上の、図11、図12の処理により、ソースコード108の除算や配列参照に対して暗黙的に除算ノードと配列参照ノード等の例外処理を挿入したカバレッジ挿入済み構文木203が生成され、さらに、これら例外処理の部分木には条件分岐のthen側とelse側にカバレッジノードが自動的に挿入されたカバレッジ挿入済み構文木203が生成される。
図13は、意味解析部208により生成されるカバレッジ情報蓄積テーブル110の例を示している。カバレッジ情報蓄積テーブル110には、カバレッジノードの情報(ID、グループID、親ID及び子ID)の欄1301〜1304と、ソースコードレベルの情報(行番号及び列番号)の欄1305、1306がある。親ID欄1303及び子ID欄1304は、図9の構文木におけるカバレッジノードのみの親子関係を表している。さらに、カバレッジ情報蓄積テーブル110には本実施形態で特徴となる処理内容欄1307がある。処理内容欄1307には例外処理の内容が格納される。アドレス欄1308は、カバレッジポイントに対応するカバレッジノードの実行可能オブジェクト内のアドレスを示す。アドレスの値は、コード生成部209によるコード生成時に設定される。カバレッジツール104の実行時に設定される通過記録欄1309は、カバレッジノードに対応する位置を何回通過したかを表している。
図14は、意味解析部208によるカバレッジ情報蓄積テーブル110の作成の流れを示すフローチャートである。この処理は、上記図11、図12の処理でカバレッジ挿入済み構文木203を生成した後に実行される。
意味解析部208は、カバレッジ挿入済み構文木203を読み込んで、まず、現在のノードが、カバレッジノードであるか否かを判定する(1401)。カバレッジノードの判定は、図10に示したカバレッジ挿入済み構文木203のテーブルにおいて、名前602が「Coverage」のエントリがカバレッジノードであると判定する。現在のノードがカバレッジノードでない場合、子ノードがあるか否かを判定(1402)して、子ノードがある場合はその子ノードに対する再帰的処理を行う(1403)。
一方、現在のノードがカバレッジノードである場合、カバレッジ情報蓄積テーブル110に新しいエントリを作成して(1404)、新しいエントリに現在のカバレッジノードの属性(ID、グループID、行番号、列番号及び処理内容)を設定する(1405)。親IDに設定すべきカバレッジノードを記憶しておくためのスタックが、空であるか否かを判定し(1406)、空でない場合、新しいエントリと、スタックトップのカバレッジノードに親子関係のリンクを設定する。具体的には、新しいエントリの親IDの欄にスタックトップのカバレッジノードのIDを設定し(1407)、スタックトップのカバレッジノードの子ID属性には、新しいエントリのID属性を追加する(1408)。
次に、意味解析部208は、現在のカバレッジノードをスタックにプッシュして(1409)、現在のカバレッジノードの子ノードに対して再帰的に同様の処理を実行する(1410)。最後に、スタックから現在のカバレッジノードをポップする(1411)。
上記処理により、図13に示したカバレッジ情報蓄積テーブル110が生成され、処理の親子関係と処理内容1307等が設定される。
図15は、意味解析部208が出力する図9の構文木に対する中間語コード列204の例を示すものである。中間語コード列204は、ID1510と、演算子1511と、被演算子1(1512)と、被演算子2(1513)から構成される。意味解析部208は、上記生成したカバレッジ挿入済み構文木203から公知または周知の技術により中間語コード列204を生成する。意味解析部208は、上記挿入したカバレッジノードを中間語コード列204の演算子1511に識別子とともに格納する。本実施形態の意味解析部208によりカバレッジ挿入済み構文木203に挿入したカバレッジノードに対応するカバレッジポイントには、カバレッジポイントを表すラベル(1501〜1505)が図示のように出力されている。
コード生成部209における各カバレッジポイントに対応するラベルに対する処理では、コード生成部209が中間語コード列204を読み込んで該当するラベル1501〜1505が示すアドレスを、ラベルに対応するカバレッジ情報蓄積テーブル110のエントリのアドレスの欄1308に設定する。この例では、各カバレッジポイントに対応するラベルと、カバレッジ情報蓄積テーブル110のエントリは、このラベルの名前の末尾にある数字がエントリのIDを表わしていることで対応をとることができるようになっている。例えば、図15の中間語コード列204のラベル1502のカバレッジノードは、演算子1511=「Coverage_16」となっており、「16」がカバレッジ情報蓄積テーブル110のID1301の「16」に対応する。コード生成部209は、ラベル1502の演算子1511に含まれるIDが一致するカバレッジ情報蓄積テーブル110のエントリのアドレス1308を設定する。
図16は、解析済みカバレッジ情報111の表示例を示すものである。解析済みカバレッジ情報111は、カバレッジ情報解析ツール105によって解析された解析結果が格納され、エディタ106によって出力装置112へ出力される。
図16の表示例において、1行目1601にカバレッジ測定対象となったソースコード108が表示される。ここでは、カバレッジ情報解析ツール105が通過した箇所には「*」印が表示され、通過していない箇所には「.」印が表示されている。2行目〜5行目(1602〜1605)は、本実施形態の特徴となるカバレッジ情報の表示例であり、1行目のソースコード108に対してコンパイラ103が自動的に生成した処理単位のカバレッジ情報を示している。この例では、カバレッジ情報解析ツール105によって動作検証が行われた処理が、除算における正常処理1602、及び配列の添え字参照における正常処理1603であることがわかる。一方、動作検証が行われていない処理は、除算におけるゼロ割のときの処理1605及び配列参照における範囲外参照のときの処理1604であることがわかる。
図17、図18及び図19は、カバレッジ情報解析ツール105で行われるカバレッジ情報蓄積テーブル110の解析結果である解析済みカバレッジ情報111の作成の流れを示すフローチャートである。
図17は、カバレッジ情報解析ツール105で行われる解析済みカバレッジ情報111の全体的な処理の一例を示すフローチャートである。
カバレッジ情報解析ツール105は、まず、ソースコード108を読み込み(1701)、先頭の行を取得する(1702)。カバレッジ情報蓄積テーブル110から、ソースコード108の現在の行番号と一致する行番号1305が設定されている全てのエントリを取得して、リスト(図示省略)を作成する(1703)。その際、カバレッジ情報蓄積テーブル110の列番号1306が昇順になるように並び替えておく。
次に、カバレッジ情報解析ツール105は、作成したリストが空であるか否かを判定する(1704)。リストが空でなければ、ソースコードレベルの1行分の通過記録を印字するために、リスト内の全てのエントリの通過記録をリストの先頭から順に印字する(1705)。この印字処理はリストのエントリを通過していれば「*」印を印字し、通過していなければ「.」印を印字する。次に、後述するリストに対する処理をおこなう(1706)。その後、カバレッジ情報解析ツール105は、次の行があるかないかを判定する(1707)。次の行がない場合、処理を終了する。次の行がある場合、次の行を取得(1708)して、処理の制御をリストを作成する処理(1703)に戻す。
図18は、図17のステップ1706で行われる処理のフローチャートを示し、現在の行のすべてのソースコードレベルのカバレッジポイントに対応するエントリが格納されたリストに対する処理の流れを示すものである。
まず、カバレッジ情報解析ツール105は、生成したリストから最初のエントリを取り出し(1801)、カバレッジ情報蓄積テーブル110の子ID1304の属性が空か否かを判定する(1802)。子ID1304の属性が空である場合、処理の制御を、リストに次のエントリがあるか否かの判定(1807)に移す。一方、子ID1304の属性が空でなければ、子ID1304の属性の最初のIDに対応するカバレッジ情報蓄積テーブル110のエントリを取り出し(1803)、当該エントリのカバレッジ情報の印字処理をおこなう(1804)。このエントリはコンパイラ103が自動生成した処理単位に対するカバレッジポイントに対応しており、当該エントリの印字処理については後述する。
そして、カバレッジ情報解析ツール105は、子ID1304の属性に次のIDがあるか否かを判定し(1805)、IDが存在する場合、次のIDに対応するエントリを取り出して(1806)、処理の制御を印字処理(1804)に戻す。次のIDがない場合、リストに次のエントリがあるか否かの判定をおこなう(1807)。エントリがない場合、処理を終了する。エントリが存在する場合、リストから次のエントリを取り出して(1808)、処理の制御を子ID1304の属性が空か否かの判定(1802)に戻す。
上記処理を繰り返すことで、カバレッジ情報蓄積テーブル110の子ID1304に格納されたIDに対応するリストのエントリに印字処理が実行される。カバレッジ情報解析ツール105は、このリストから解析済みカバレッジ情報111を生成する。
図19は、コンパイラ103が自動生成した処理単位のカバレッジ情報の解析の流れを示すフローチャートで、図18のステップ1804で実行される処理である。
カバレッジ情報解析ツール105は、まず、ステップ1804で抽出した子ID1304のIDに対応するカバレッジ情報蓄積テーブル110のエントリについて、通過記録1309を印字する(1901)。当該エントリを通過していれば「*」印、通過していなければ「.」印を印字して、さらに、そのエントリの処理内容も印字する。
次に、子ID1304の属性が空であるか否かを判定する(1902)。空である場合、処理を終了する。空でない場合、子ID1304の属性の先頭のIDを取り出して、カバレッジ情報蓄積テーブル110から該当するIDのエントリを取り出す(1903)。そのエントリに対して再帰的処理をおこなう(1904)。その後、次の子ID1304の属性が空であるか否かを判定する(1905)。次の子ID1304の属性にIDが存在する場合、次の子ID1304の属性を取得して(1906)、処理の制御をエントリに対する再帰的処理(1904)に戻す。
以上の処理によって、カバレッジ情報解析ツール105は、通過したエントリの通過記録1309を印字して、解析済みカバレッジ情報111が生成される。
上述したように、本実施形態では、コンパイラが暗黙的に自動生成した分岐を伴う処理単位のカバレッジとその処理内容を取得することが可能になるため、当該分岐を伴う処理単位の動作検証を可能とするテストケースの設計が容易になり、テスト担当者の作業量の軽減を図ることができるようになる。
特に、意味解析部208は、暗黙的に自動生成した分岐を伴う例外処理の処理単位に対して、各分岐先の処理内容を表す文字列(コメントノード)をカバレッジ情報蓄積テーブル110に記録する。さらに意味解析部208が出力する中間語コード列204には、例外処理の処理単位に対してカバレッジポイントを表すラベルがコメントノードとして挿入される。コード生成部209は中間語コード列204のラベルに含まれるIDを参照することでカバレッジ情報蓄積テーブル110のアドレスを加えることができる。
このように生成されたカバレッジ情報蓄積テーブル110をカバレッジ情報解析ツール105で解析することにより、ソースコード108に明示されていない条件分岐を伴う処理がコンパイラ103によって暗黙的に生成された場合でも、暗黙的に生成された処理の内容及び暗黙的に生成された処理単位が実行されたか否かを明示することができる。これにより、カバレッジに基づいてソフトウェアの検査を行うテスト担当者の労力を低減できる。また、コンパイラ103の自動挿入による暗黙的な処理を、カバレッジ情報蓄積テーブル110で可視化することで、ソフトウェアの品質向上を図ることが可能となる。
なお、上記実施形態においては、カバレッジ情報解析ツール105が、ソースコード108の行番号と一致する行番号1305が設定されているカバレッジ情報蓄積テーブル110のエントリを取得してリストを作成した例を示したが、リストを作成せずにソースコード108の行番号と一致する行番号1305が設定されているカバレッジ情報蓄積テーブル110のエントリから直接解析済みカバレッジ情報111を生成するようにしても良い。
以上のように、本発明はソースコードから実行コードを生成するコンパイラに適用することができ、さらにコンパイラ及びコンパイラが生成した実行コードを検証するカバレッジ情報解析ツールを含む計算機システムに適用することができる。
101 計算機
102 主記憶装置
103 コンパイラ
104 カバレッジツール
105 カバレッジ情報解析ツール
106 エディタ
107 補助記憶装置
108 ソースコード
109 実行可能プログラム
110 カバレッジ情報蓄積テーブル
111 解析済みカバレッジ情報
112 出力装置
113 演算装置
203 カバレッジノード挿入済み構文木
208 意味解析部
901〜904 コンパイラが自動生成する処理単位の部分木に対して挿入したカバレッジノード
1003〜1006 コンパイラが自動生成する処理単位の部分木に対して挿入したカバレッジノードの内容を主記憶装置上で保持するためのテーブルエントリ

Claims (9)

  1. CPUと主記憶を含む計算機で実行コードを生成する実行コードの生成方法であって、
    前記計算機が、ソースコードを読み込むステップと、
    前記計算機が、前記ソースコードから中間語コードを生成するステップと、
    前記計算機が、中間語コードから実行コードを生成するステップと、を含み、
    前記中間語コードを生成するステップは、
    前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加するステップと、
    前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加するステップと、
    を含むことを特徴とする実行コードの生成方法。
  2. 請求項1に記載の実行コードの生成方法であって、
    前記中間語コードを生成するステップは、
    前記付加された分岐処理の内容を示す文字列をカバレッジ情報蓄積部に蓄積することを特徴とする実行コードの生成方法。
  3. 請求項1又は2に記載の実行コードの生成方法であって、
    前記予め設定された分岐処理を付加するステップは、
    前記ソースコードに明示されていない分岐処理を付加することを特徴とする実行コードの生成方法。
  4. CPUと主記憶を含む計算機で実行コードを生成するコンパイラであって、
    ソースコードを読み込む手順と、
    前記ソースコードから中間語コードを生成する手順と、
    前記中間語コードから実行コードを生成する手順と、を含み、
    前記中間語コードを生成する手順は、
    前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加する手順と、
    前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加する手順と、
    を前記計算機に実行させることを特徴とするコンパイラ。
  5. 請求項4に記載のコンパイラであって、
    前記中間語コードを生成する手順は、
    前記付加された分岐処理の内容を示す文字列をカバレッジ情報蓄積部に蓄積することを特徴とするコンパイラ。
  6. 請求項4又は5に記載のコンパイラであって、
    前記予め設定された分岐処理を付加する手順は、
    前記ソースコードに明示されていない分岐処理を付加することを特徴とするコンパイラ。
  7. 演算処理を行う演算装置と、前記演算装置が利用する情報を格納する記憶部と、を備えて、ソースプログラムを読み込んで実行コードを生成するコンパイル装置であって、
    前記ソースプログラムを読み込んで構文木を生成する構文解析部と、
    前記構文木を読み込んで、中間語コードを生成する意味解析部と、
    前記中間語コードから実行コードを生成するコード生成部と、を備え、
    前記意味解析部は、
    前記ソースコードの所定の処理に対して、予め設定された分岐処理を付加し、前記付加された分岐処理の分岐先のそれぞれに処理を実行したか否かを検証するための検証情報を付加することを特徴とするコンパイル装置。
  8. 請求項7に記載のコンパイル装置であって、
    前記意味解析部は、
    前記付加された分岐処理の内容を示す文字列を前記記憶部のカバレッジ情報蓄積部に蓄積することを特徴とするコンパイル装置。
  9. 請求項7又は8に記載のコンパイル装置であって、
    前記意味解析部は、
    前記ソースコードに明示されていない前記分岐処理を付加することを特徴とするコンパイル装置。
JP2010088000A 2010-04-06 2010-04-06 実行コードの生成方法、コンパイラ及びコンパイル装置 Pending JP2011221656A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2010088000A JP2011221656A (ja) 2010-04-06 2010-04-06 実行コードの生成方法、コンパイラ及びコンパイル装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2010088000A JP2011221656A (ja) 2010-04-06 2010-04-06 実行コードの生成方法、コンパイラ及びコンパイル装置

Publications (1)

Publication Number Publication Date
JP2011221656A true JP2011221656A (ja) 2011-11-04

Family

ID=45038597

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2010088000A Pending JP2011221656A (ja) 2010-04-06 2010-04-06 実行コードの生成方法、コンパイラ及びコンパイル装置

Country Status (1)

Country Link
JP (1) JP2011221656A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9280330B2 (en) 2013-05-15 2016-03-08 Samsung Electronics Co., Ltd. Apparatus and method for executing code
KR20180135528A (ko) * 2017-06-12 2018-12-21 주식회사 티맥스데이터 최적화된 높이를 가지는 밸런스드 파스 트리를 생성하는 방법

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9280330B2 (en) 2013-05-15 2016-03-08 Samsung Electronics Co., Ltd. Apparatus and method for executing code
KR20180135528A (ko) * 2017-06-12 2018-12-21 주식회사 티맥스데이터 최적화된 높이를 가지는 밸런스드 파스 트리를 생성하는 방법
KR101985309B1 (ko) * 2017-06-12 2019-06-04 주식회사 티맥스데이터 최적화된 높이를 가지는 밸런스드 파스 트리를 생성하는 방법
US10416971B2 (en) 2017-06-12 2019-09-17 TmaxData Co., Ltd. Method of creating the balanced parse tree having optimized height

Similar Documents

Publication Publication Date Title
US7340475B2 (en) Evaluating dynamic expressions in a modeling application
US20080313616A1 (en) Methods and systems for testing tool with comparative testing
US7882493B2 (en) Software test management program software test management apparatus and software test management method
US20090319246A1 (en) Detection program, detecting device, and detecting method
US10261884B2 (en) Method for correcting violation of source code and computer readable recording medium having program performing the same
CN103914372B (zh) 基于程序切片的代码缺陷静态检测的并行化方法及装置
US20070245327A1 (en) Method and System for Producing Process Flow Models from Source Code
JP6440895B2 (ja) ソフトウェア分析装置及びソフトウェア分析方法
US7062760B2 (en) System and method for measuring syntax coverage percentage
US20110191760A1 (en) Method and apparatus for enhancing comprehension of code time complexity and flow
US10824402B2 (en) Bytecode generation from UML models
US8151253B2 (en) Efficient generation of executable file from program files when some of the program files expressly incorporate other program files
JP2011221656A (ja) 実行コードの生成方法、コンパイラ及びコンパイル装置
CN103049504A (zh) 基于源代码查询的半自动插桩方法
WO2010050128A1 (ja) コンパイル方法及びコンパイルプログラム
Baker et al. TRex-the refactoring and metrics tool for TTCN-3 test specifications
KR102614967B1 (ko) 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법
CN114327614A (zh) 参考模型数据流记录和分析的方法及应用
CN107577476A (zh) 一种基于模块划分的安卓系统源码差异性分析方法、服务器及介质
CN113434385A (zh) 一种针对软件模型检查工具的测试用例自动生成方法和系统
JP2011204069A (ja) テスト方法およびテスト仕様書テストデータ自動生成装置
Bigert et al. Autoeval and missplel: Two generic tools for automatic evaluation
JP2007058750A (ja) データ仕様記述文書および検証データ生成装置
JP2009054125A (ja) 文書情報表示システム
Mercer et al. Computing and visualizing the impact of change with Java PathFinder extensions

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120309