JP5409039B2 - 情報処理装置及び情報処理方法及びプログラム - Google Patents
情報処理装置及び情報処理方法及びプログラム Download PDFInfo
- Publication number
- JP5409039B2 JP5409039B2 JP2009034105A JP2009034105A JP5409039B2 JP 5409039 B2 JP5409039 B2 JP 5409039B2 JP 2009034105 A JP2009034105 A JP 2009034105A JP 2009034105 A JP2009034105 A JP 2009034105A JP 5409039 B2 JP5409039 B2 JP 5409039B2
- Authority
- JP
- Japan
- Prior art keywords
- variable
- analysis
- argument
- program code
- address
- 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.)
- Expired - Fee Related
Links
Images
Landscapes
- Devices For Executing Special Programs (AREA)
- Stored Programmes (AREA)
Description
特許文献2では、プログラムの並列化を2パスで行い、ソースコード中の関数呼び出しを検出した際に、第1のパスにおいて生成された各関数内で使用される大域変数の情報を参照することにより、大域変数への参照や代入の順序関係から関数呼び出しの並列実行の可否を判定し、関数呼び出しの前後のプログラム部分及び呼び出された関数同志の並列化の解析を行っている。
さらに、特許文献3では、オブジェクト指向言語を対象として、クラスメンバの情報を考慮することにより、効率の良い並列化を行っている。
比較的規模の大きなプログラムでは、機能の共通化等を目的として、大域変数名等を関数定義の中に直接記述せず、引数で与えられたアドレスに対する参照や代入を行う場合がある。
このような記述をしているソースコードの場合、上述した従来技術では、アドレスが代入された引数を対象とした解析ができないため、割り込み禁止の検査については検出漏れが発生し、自動並列化については該当箇所が並列化対象から外れてしまい並列度が上がらないなど、結果としてそれぞれの目的を達成できないという課題がある。
また、本発明は、上述の解析結果を用いて、大域変数とそのアドレスが格納された変数との関係を視覚的に表示することを主な目的とする。
大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するからコード指定部と、
前記コード指定部により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出部と、
前記コード解析抽出部の抽出結果を記憶する抽出結果記憶部とを有することを特徴とする。
この実施の形態では、大域変数の参照、代入について、詳細な情報の提供を可能としたソースコード解析装置について説明する。
<A>大域変数の参照
<B>大域変数への代入
<C>いずれかのアドレスを格納した引数の参照
<D>局所変数への
(1)大域変数のアドレスの代入
(2)いずれかのアドレスを格納した関数の引数の代入
(3)大域変数のアドレスが格納されている局所変数の代入
(4)いずれかのアドレスを格納した関数の引数が格納されている局所変数の代入
<E>
(1)大域変数のアドレスが格納されている局所変数の参照
(2)いずれかのアドレスを格納する引数が格納されている局所変数の参照
<F>上記<D>の局所変数を介した、大域変数もしくは局所変数の参照
<G>上記<D>の局所変数を介した、大域変数もしくは局所変数への代入
<H>いずれかのアドレスを格納する関数の引数を介した、大域変数もしくは局所変数の参照
<I>いずれかのアドレスを格納する関数の引数を介した、大域変数もしくは局所変数への代入
なお、図24のソースコード例は、C言語で記述されたものである。
本実施の形態では、ソースコード解析装置は、ソースコードの構文木と記号表を生成し、構文木と記号表を用いてソースコードを解析して上記の<A>〜<I>を抽出し、抽出結果を記憶する。
なお、構文木と記号表の生成は必須ではなく、構文木と記号表を用いずにソースコードを解析するようにしてもよい。
また、ソースコード解析装置は、呼び出し対象の関数が含まれているソースコードを識別し、当該ソースコードを新たな解析対象ソースコードとして指定するとともに、それまで解析を行っていた解析対象ソースコードに対する解析を中断し、新たな解析対象ソースコードに対する解析を開始し、新たな解析対象ソースコードに対する解析が終了した際に、新たな解析対象ソースコードの前に解析を行っていた解析対象ソースコードに対する解析を再開する。
そして、検査対象変数の参照と、検査対象変数への代入(代入文において検査対象変数が左辺)と、検査対象要素を介した他の変数への代入(代入文において他の変数が左辺)と、他の変数への検査対象変数の代入(代入文において他の変数が左辺、検査対象変数が右辺)の少なくともといずれかが解析対象ソースコードに含まれているか否かを検査して抽出処理を行う。
また、ソースコード解析装置は、他の変数へ検査対象変数が代入されている場合(代入文において他の変数が左辺、検査対象変数が右辺)に、当該他の変数がアドレスを格納する変数であるかを判断し、当該他の変数がアドレスを格納する変数である場合に当該他の変数を検査リストに入れて検査対象変数とする。
ソースコード解析装置1は、大域変数の参照・代入について、詳細な解析結果を提供することを可能とした装置であり、動作の詳細については後述する。
記憶装置2は、例えばHDD(Hard Disk Drive)等の不揮発性記憶装置である。
記憶装置2は、ソースコード解析装置1への入力となるデータ、およびソースコード解析装置1からの出力を蓄積する。
ソースファイル特定部11は、コード指定部の例である。また、ソースファイル特定部11により行われる処理がコード指定ステップとなる。
引数関連情報設定部13は、ソースコード展開部12が一時記憶部16に格納した構文木160、および記号表161に基づき、解析対象関数の仮引数と実引数との対応関係を引数関連情報162として一時記憶部16に格納する。
解析部14は、ソースコード展開部12が一時記憶部16に格納した構文木160、および記号表161に基づき、大域変数と、大域変数のアドレスが格納されている局所変数と、関数の引数を用いた大域変数、に対する参照、代入を解析結果22に出力し、引数関連情報162にある仮引数を用いた大域変数に対する参照、代入等の動作を、引数関連情報162に記録する。また、関数呼び出しの記述がある場合は、記述された関数に対する解析を先に実行し、解析結果22に出力する。
これらソースコード展開部12、引数関連情報設定部13及び解析部14は、コード解析抽出部の例である。また、ソースコード展開部12、引数関連情報設定部13及び解析部14は、コード解析抽出部により行われる処理がコード解析抽出ステップとなる。
一時記憶部16は、例えばRAM(Random Access Memory)等の揮発性記憶装置であり、構文木160、記号表161、引数関連情報162、階層値163、解析結果164を一時的に格納する。
解析結果164は、ソースコード解析装置1がソースコードを解析中の中間段階の解析結果である。
解析部14は、解析結果22に反映させる上記の<A>〜<I>を抽出する度に、逐次解析結果164に抽出結果を蓄積し、解析結果164を記憶装置2に移して解析結果22とするが、説明が煩雑になるのを避けるため、以下では、解析部14は解析結果22に抽出結果を蓄積するものとして説明する。
一時記憶部16は、抽出結果記憶部の例である。また、一時記憶部16による解析結果164の記憶処理が抽出結果記憶ステップとなる。
また、上記の説明では、表示部15をソースコード解析装置1の中に含むとしているが、ソースコード解析装置1とは別の装置(例えば「表示装置」)であっても構わない。
図2は構文木160を構成するノード1600の構造を示す図である。
ノード1600はノード種別1601、構文規則番号1602、行番号1603、値種別1604、ノード値1605を備える。
ノード種別1601は、構文規則を構成する終端記号(ソースコード上に出現する識別子、演算子、特殊記号等)もしくは非終端記号(ソースコードには出現せず、特定の終端記号の集合を表すもの)を識別するための情報である。
構文規則番号1602は、非終端記号に関する構文規則を一意に特定するための番号である。例えば、ある非終端記号が親ノードとなる木構造に対応する構文規則が2つあるとした場合、構文規則番号1602に0、1のどちらかを入れることで、該当する構文規則を特定できる。
行番号1603はそれぞれの終端記号について、ソースコード上の出現位置を意味する番号である。
値種別1604は、ノード値1605の種類を識別するための情報である。
ノード値1605は、ノード種別1601が非終端記号に属する場合、子ノードの個数と子ノードへの接続情報である。また、ノード種別1601が記号表161に格納される識別子の場合、ノード値1605は、記号表の該当する情報への接続情報である。また、ノード種別1601が識別子以外の終端記号の場合、ノード値1605は、ソースコードに出現する予約語、特殊文字等の文字列である。
図3は記号表161の構造を示す図である。
記号表161には、識別子の数だけ識別子名1610、識別子種別1611、型指定子情報1612、宣言子情報1613、初期化子情報1614が存在する。すなわち、記号表161は、1つ以上の識別子名1610、識別子種別1611、型指定子情報1612、宣言子情報1613、初期化子情報1614から構成される組を備える。
識別子名1610は、ソースコードに出現した識別子の名前である。
識別子種別1611は、識別子の種類を表す情報である。識別子種別1611に格納する値は、例えば、大域変数、静的変数、引数、局所変数等を意味する値である。
型指定子情報1612は、識別子名1610の型指定子に関する情報である。具体的には、型指定子という名前の非終端記号に対応するノードをルートとする構文木160の部分木に出現する終端記号、すなわち型名等の記述となる。
宣言子情報1613は、識別子名1610の宣言子に関する情報である。具体的には、宣言子という名前の非終端記号に対応するノードをルートとする構文木160の部分木に出現する終端記号、すなわち変数宣言の場合は変数名、関数宣言の場合は関数名と引数リスト、等の記述となる。
初期化子情報1614は、識別子名1610の初期化子に関する情報である。具体的には、初期化子という名前の非終端記号に対応するノードをルートとする構文木160の部分木に出現する終端記号、すなわち代入する値の記述となる。図3では、大域変数gValのみに対して「20」と記述されており、大域変数gValが宣言と同時に20という値で初期化されることを意味する。
なお、説明のため、図3では記号表161の型指定子情報1612、宣言子情報1613、初期化子情報1614の欄に型名、もしくは初期化値等を直接記述したが、構文木160の該当するノード1600への接続情報を格納してもよい。
図4は引数関連情報162の構造を示す図である。
引数関連情報162には、引数の数だけ実引数1620、仮引数1621、初期設定1622、操作種別1623が存在する。
すなわち、引数関連情報162は、0個以上の実引数1620、仮引数1621、初期設定1622、操作種別1623から構成される組を備える。なお、引数のない関数の呼び出しの場合は、実引数1620、仮引数1621、初期設定1622、操作種別1623から構成される組の個数が0個となる。
実引数1620は、ソースコード21に記述された関数呼び出しにある引数である。
仮引数1621は、ソースコード21に記述された関数定義、もしくは関数プロトタイプ宣言に記述されている引数である。
初期設定1622は、実引数1620に代入されている値である。図4では、gValという名前の変数のアドレスを格納しているため、初期設定1622には「&gVal」と先頭に「&」をつけている。
操作種別1623は仮引数1621を用いた処理の種類を表す情報である。
階層値163は、ソースコード解析装置1による解析における、解析を開始する関数から、現在解析している関数に到達するまでの関数呼び出しの回数を示す値である。
図5は関数定義ファイルリスト20の構造を示す図である。関数定義ファイルリスト20には、ソースコード解析装置1による解析に用いる1つ以上のソースコード21で定義されている関数の数だけ、関数名200、ソースファイル名201が存在する。
すなわち、関数定義ファイルリスト20は、1つ以上の関数名200、ソースファイル名201から構成される組を備える。
関数名200は、ソースコード21に記述された関数定義における関数の名前である。
ソースファイル名201は、関数名200の関数定義が記述されているファイルの名前である。
図6はこの実施の形態の説明に用いるソースコード21を示す図である。
ソースコード21はC言語で記述されたプログラムである。
図6には、3つのソースコード21a、ソースコード21b、ソースコード21cが示されており、ファイル名はそれぞれ、/src/funcA.c、/src/funcB.c、/src/funcC.cである。
ソースコード21aには大域変数gValの宣言と関数f1の定義が記述されている。
ソースコード21bには関数f2の定義が記述されている。
ソースコード21cには関数f3の定義が記述されている。
なお、図6には示していないが、関数f1における関数f2の呼び出し、および、関数f2における関数f3の呼び出しが可能なように、各ソースコードには関数プロトタイプ宣言が記述されているものとする。
なお、この実施の形態ではC言語で記述されたソースコードを例として説明するが、他の言語を対象とすることも可能である。
図7は解析結果22の構造を示す図である。
解析結果22には、解析対象となる変数に対する操作の回数だけ、変数名220、ソースファイル名221、行番号222、呼出階層223、操作種別224、設定値225が存在する。すなわち、解析結果22は、1つ以上の変数名220、ソースファイル名221、行番号222、呼出階層223、操作種別224、設定値225から構成される組を備える。
変数名220は操作された変数の名前である。
ソースファイル名221は、変数名220により特定される変数への操作が記述されたファイルの名前である。
行番号222は、ソースファイル名221のファイルにおける、変数名220により特定される変数への操作の記述位置を示す情報である。
呼出階層223は、関数呼び出しの深さを示す情報である。
操作種別224は、変数名220により特定される変数への操作の種類を示す情報であり、格納する情報の種類は操作種別1623と同じである。なお、図7の操作種別224では「Set」「Read」「Write」が各欄に1つずつ格納されているが、同時に複数の情報を保持することもできる。
設定値225は、変数名220により特定される変数そのもの、もしくは前記変数がアドレスを保持している場合はそのアドレスが指す変数、に対して設定された値である。前記変数に対する値の設定が発生しない操作の場合、設定値225は空である。
図8は、この実施の形態における、解析システムの使用者から入力を受けた入力部10の動作を示すフローチャートである。
(S101):入力部10は、階層値163に0を設定する。この動作は階層値163の初期化に相当する。
(S102):入力部10は、解析結果22を開く。
(S103):入力部10は、S100にて取得した関数名と、空の引数関連情報をソースファイル特定部11に渡す。空の引数関連情報とは、実引数1620、仮引数1621、初期設定1622、操作種別1623の組を1つも持たないこと引数関連情報162であることを意味する。
(S104):入力部10は、初期化処理を完了する。
図9は、この実施の形態における、ソースファイル特定部11の動作を示すフローチャートである。
(S111):ソースファイル特定部11は、関数定義ファイルリスト20を読み込む。この実施の形態では、関数定義ファイルリスト20は解析システムによる解析の実行前に予め準備されており、図5に示す内容が記録されているとする。
(S112):ソースファイル特定部11は、関数定義ファイルリスト20の関数名200に、入力部10もしくは解析部14から渡された関数名が存在するか判定する。存在すると判定した場合(S112でYes)は、S113に進む。一方、存在しないと判定した場合(S112でNo)は、S114に進む。
(S113):ソースファイル特定部11は、関数定義ファイルリストから該当する関数名200、およびソースファイル名201を取り出し、ソースコード展開部12に渡す。
(S114):ソースファイル特定部11は、処理を完了する。
図10は、この実施の形態における、ソースコード展開部12の動作を示すフローチャートである。
なお、以降はソースファイル名201に対応するソースコード21は記憶装置2に存在するものとして説明する。
(S121):ソースコード展開部12は、ソースコード21を読み込み、構文木160を作成する。構文木160の作成方法について、詳細には述べず、概要のみ述べる。まず、ソースコード21に対して字句解析を行い終端記号として取り出し、ノード1600を作成し、スタックに蓄積する。次に、ノードの並びが構文規則と一致した場合、前記一致した1つ以上のノードをスタックから取り出し、さらに、それらを子ノードとする非終端記号を表すノードを作成し、前記作成したノードをスタックに蓄積する。この処理をソースコード21の終端まで繰り返すことで、構文木160が作成される。
(S122):ソースコード展開部12は、ソースコード21を読み込み、記号表161を作成する。記号表161の作成方法について、詳細には述べず、概要のみ述べる。ソースコード21から変数宣言、関数定義等を読み取り、構文規則に基づき、識別子名1610から初期化子情報1614までの5つの情報を取り出し、記号表161に格納する。変数宣言に対する識別子種別1611の判定は、変数宣言が行われているソースコード21内の位置、具体的には関数定義の外側(大域変数)、関数定義の引数リスト(引数)、関数定義の内側(局所変数)、に基づき行う。
(S123):ソースコード展開部12は、処理を完了する。
図11は、この実施の形態における、引数関連情報設定部13の動作を示すフローチャートである。
(S131):引数関連情報設定部13は、ソースファイル特定部11に渡された引数関連情報162に格納された、実引数1620、仮引数1621、初期設定1622、操作種別1623から構成される組の数を判定する。0個より多い場合(S131でYes)は、S132に進む。一方、0個の場合(S131でNo)はS136に進む。
(S132):引数関連情報設定部13は、記号表161から仮引数1621に対応する識別子名1610を探索し、前記識別子名1610の型を、型指定子情報1612、および宣言子情報1613を取り出す。前記型指定子情報1612、および宣言子情報1613から、仮引数1621がアドレスを格納すると判定した場合(S132でYes)は、S133に進む。一方、仮引数1621がアドレスを格納しないと判定した場合(S132でNo)は、S134に進む。
(S133):引数関連情報設定部13は、記号表161から仮引数1621に対応する宣言子情報1613を探す。続いて、変数名220に仮引数1621、ソースファイル名221にソースコード展開部12に渡されたソースファイル名201、行番号222に前記宣言子情報1613に対応する構文木160のノード1600の行番号1603、呼出階層223に階層値163、操作種別224にアドレス設定を意味する値(図7では「Set」と記載)、設定値225に実引数1620を格納する組を、解析結果22に記録する。
(S134):引数関連情報設定部13は、引数関連情報162における、S132の実行対象を次に進める。
(S135):引数関連情報設定部13は、引数関連情報162全体に対して、S132が実行されたか判定する(補足:図4において、表の上から順番に検査して、一番下に到達したか、ということを判定している)。実行されたと判定した場合(S135でYes)は、S136に進む。一方、実行されていないと判定した場合(S135でNo)は、S132に進む。
(S136):引数関連情報設定部13は、処理を完了する。
図12は、この実施の形態における、解析部14の動作を示すフローチャートである。
(S141):解析部14は、記号表の特定の識別子に対するリンク情報で構成される検査リストを作成する(検査リストは図示しない)。検査リストに格納する変数は、ソースコード21のすべての大域変数と、引数関連情報設定部13にて解析結果22に記録された引数関連情報162の仮引数1621である。この実施の形態では、静的大域変数、すなわち、スコープがソースファイル内部に限定される変数は検査リストに格納しない。
(S142):解析部14は、構文木160にて、解析対象の関数の関数定義に対応するノードに移動する。以降は、前記ノードの子ノードを用いて解析を行う。
(S143)〜(S147):解析部14は、関数定義内部の宣言、もしくは代入文を単位とした解析を行う。まず、前記単位に相当する構文木160の部分木を、ノード種別1601、構文規則番号1602、値種別1604、およびノード値1605を用いて決定し、前記決定された部分木が宣言に相当するか、代入文に相当するかを判定する(S143)。宣言と判定した場合(S143で宣言)はS144に進み、宣言に対する解析を行う(S144)。一方、代入文と判定した場合(S143で代入文)はS145に進み、文の解析を行う(S145)。S144およびS145の詳細な動作は後述する。宣言もしくは代入文の解析が完了すると、次の宣言もしくは代入文に進む。このとき、有効範囲(スコープ)から外れた局所変数について、検査リストから削除する(S146)。続いて、関数定義の末尾に到達しているか判定する(S147)。到達していると判定した場合(S147でYes)は、S148に進む。一方、まだ到達していない場合(S147でNo)は、S143に進む。なお、S143およびS146では、宣言もしくは代入文のいずれでもない部分は読み飛ばす。
(S148):解析部14は、検査リストを破棄する。また、構文木160と記号表161も破棄する。
(S149):解析部14は、処理を完了する。
図13は、解析部14における宣言に対する解析の動作(図12のS144)を示すフローチャートである。
(S151):解析部14は、解析部14は、宣言に対応する構文木160の部分木を用いて、宣言された変数が初期化されているか判定する。初期化されていると判定した場合(S151でYes)は、初期化式に対する代入文解析を実行し(S152)、その後S153に進む。一方、初期化されていないと判定した場合(S151でNo)は、S157に進む。
(S152):解析部14は、初期化式に対して代入文解析を実行する。S152の詳細な動作は後述する。
(S153):解析部14は、宣言に対応する構文木160の部分木を用いて、宣言された変数の型を特定し、アドレスを格納する型か判定する。アドレスを格納する型であると判定した場合(S153でYes)は、S154に進む。一方、アドレスを格納する型でないと判定した場合(S153でNo)は、S157に進む。
(S154):解析部14は、宣言に対応する構文木160の部分木を用いて、S152で解析した初期化式に、検査リストに格納された変数が出現しているか判定する。出現していると判定した場合(S154でYes)は、S155に進む。一方、出現していないと判定した場合(S154でNo)は、S157に進む。
(S155):解析部14は、宣言された変数を検査リストに追加する。
(S156):解析部14は、記号表161から宣言された変数に対応する宣言子情報1613を探す。続いて、変数名220に宣言された変数の名前、ソースファイル名221にソースコード展開部12に渡されたソースファイル名201、行番号222に前記宣言子情報1613に対応する構文木160のノード1600の行番号1603、呼出階層223に階層値163、操作種別224にアドレス設定を意味する値(図7では「Set」と記載)、設定値225に初期化に用いた式全体を格納する組を、解析結果22に記録する。
(S157):解析部14は、宣言に対する解析を終了する。
図14は、解析部14における代入文に対する解析の動作(図12のS145、および図13のS152)を示すフローチャートである。
(S161):解析部14は、代入文に対応する構文木160の部分木を用いて、関数呼び出しがあるか判定する。関数呼び出しがあると判定した場合(S161でYes)は、S180に進む。一方、関数呼び出しがないと判定した場合(S161でNo)は、S162に進む。
(S162):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を参照しているか判定する。ただし、S161で参照した関数呼び出しに対応する部分は判定に用いない。代入文で検査リストに格納された変数を参照していると判定した場合(S162でYes)は、S167に進む。一方、代入文で検査リストに格納された変数を参照していないと判定した場合(S162でNo)は、S163に進む。
(S163):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を介した他の変数への代入が行われているか判定する。代入文で検査リストに格納された変数を介した他の変数への代入が行われていると判定した場合(S163でYes)は、S168に進む。一方、代入文で検査リストに格納された変数を介した他の変数への代入が行われていないと判定した場合(S163でNo)は、S164に進む。
(S164):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入文で検査リストに格納された変数に対する代入(代入文において検査リストに格納された変数が左辺)が行われているか判定する。代入文で検査リストに格納された変数に対する代入が行われていると判定した場合(S164でYes)は、S168に進む。一方、代入文で検査リストに格納された変数に対する代入が行われていないと判定した場合(S164でNo)は、S165に進む。
(S165):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入文で検査リストに格納された変数を代入(代入文において検査リストに格納された変数が右辺)しているか判定する。代入文で検査リストに格納された変数を代入していると判定した場合(S165でYes)は、S170に進む。一方、代入文で検査リストに格納された変数を代入していないと判定した場合(S165でNo)は、S174に進む。
(S166):解析部14は、代入文に対応する構文木160の部分木を用いて、次の関数呼び出しを探索する。
(S169):解析部14は、変数名220に代入された変数の名前、ソースファイル名221にソースコード展開部12に渡されたソースファイル名201、行番号222に代入文を表す構文木160の部分木における代入された変数を表すノード1600の行番号1603、呼出階層223に階層値163、操作種別224にアドレス設定を意味する値もしくは代入を意味する値(図7では「Set」もしくは「Write」と記載)、設定値225に代入された式全体、を格納する組を、解析結果22に記録する。このとき、解析部14は、S168で特定した左辺の型を参照して、アドレスを格納する型の場合は操作種別224にアドレス設定を意味する値を格納し、アドレスを格納する型ではない場合は代入を意味する値を格納する。また、変数名220が引数関連情報162の仮引数1621に格納されている変数、もしくは引数関連情報162の仮引数1621に格納されている変数が代入されている変数の場合は、追加で、該当する組の操作種別1623にアドレス設定もしくは代入を意味する値を記録する。
(S171):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入された変数(代入文の左辺の変数)が検査リストに格納されているか判定する。代入された変数が検査リストに格納されていると判定した場合(S171でYes)は、S172に進む。一方、代入された変数が検査リストに格納されていないと判定した場合(S171でNo)は、S173に進む。
(S172):解析部14は、代入文に対応する構文木160の部分木、および検査リストを用いて、代入された変数を検査リストに追加する。
(S173):解析部14は、変数名220に代入された変数の名前、ソースファイル名221にソースコード展開部12に渡されたソースファイル名201、行番号222に代入文を表す構文木160の部分木における代入された変数を表すノード1600の行番号1603、呼出階層223に階層値163、操作種別224にアドレス設定を意味する値(図7では「Set」と記載)、設定値225に代入された式全体、を格納する組を、解析結果22に記録する。また、変数名220が引数関連情報162の仮引数1621に格納されている変数、もしくは引数関連情報162の仮引数1621に格納されている変数が代入されている変数の場合は、追加で、該当する組の操作種別1623に参照を意味する値を記録する。
(S174):解析部14は、代入文に対する解析を終了する。
図15は、解析部14における関数呼び出しに対する解析の動作を示すフローチャートである。
(S182):解析部14は、関数呼び出しに対応する構文木160の部分木を用いて、引数の個数を数える。
(S183):解析部14は、S182で数え上げた引数の個数分、引数関連情報162に情報を追加したか判定する。引数の個数分、引数関連情報162に情報を追加したと判定した場合(S183でYes)は、S190に進む。一方、引数の個数分、引数関連情報162に情報を追加していないと判定した場合(S183でNo)は、S184に進む。
(S184):解析部14は、関数呼び出しに対応する構文木160の部分木を用いて、引数が関数呼び出しか判定する。引数が関数呼び出しであると判定した場合(S184でYes)は、S185に進む。一方、引数が関数呼び出しでないと判定した場合(S184でNo)は、S186に進む。
(S185):解析部14は、引数にある関数を対象に、関数呼出解析を実行する。すなわち、S180を再帰的に実行する。
(S186):解析部14は、検査リスト、および関数呼び出しに対応する構文木160の部分木を用いて、(ア)実引数の型がアドレスを格納する型である、(イ)実引数が検査リストに格納されている、の2条件を判定する。(ア)が真であり、かつ(イ)が偽の場合(S186でYes)は、S187に進む。一方、(ア)が真であり、かつ(イ)が偽を満たさない場合(S186でNo)は、S188に進む。
(S187):解析部14は、引数に記述されている変数を検査リストに追加する。
(S188):解析部14は、解析結果22を用いて、まず実引数に代入されている値を特定する。ただし、実引数が複数の変数で表現されている場合、特定は行わない。次に、解析部14は、実引数1620に関数呼び出しに記述されている式、仮引数1621に呼び出されている関数のプロトタイプ宣言もしくは定義に記述されている仮引数、初期設定1622に前記動作により特定された実引数1620に代入されている値(特定していない場合は何も設定しない)、操作種別1623には無設定を意味する値、を格納する引数関連情報162Newを作成する(ソースファイル特定部に渡される引数関連情報と区別するため162Newとする)。なお、引数が複数ある場合は、先頭の引数の処理にて作成し、残りの引数については追記となる。
(S189):解析部14は、次の引数に対する処理に移る。
(S191):解析部14は、ソースファイル特定部11を実行する。このとき、関数名は関数呼び出しに記述されている関数の名前であり、引数関連情報162NewはS184からS189までの処理にて作成したもの、もしくは空である。
(S192):解析部14は、階層値163を1減少させる。
(S193):解析部14は、引数関連情報162Newがある場合、すなわち引数の個数が1個以上の場合は引数関連情報162Newを参照し、操作種別1623に参照もしくは代入を意味する値が格納されている場合は、変数名220に実引数1620、ソースファイル名221にソースコード展開部12に渡されたソースファイル名201、行番号222に代入文を表す構文木160の部分木における代入された変数を表すノード1600の行番号1603、呼出階層223に階層値163、操作種別224に操作種別1623に格納されている値(参照もしくは代入の一方)、設定値225に設定値なしを意味する値、を格納する組を、解析結果22に記録する。また、引数関連情報162Newに格納されている実引数が、引数関連情報162の仮引数1621に格納されている変数である、もしくは、引数関連情報162の仮引数1621に格納されている変数が代入されている変数の場合は、該当する引数関連情報162の操作種別1623も更新する。なお、引数関連情報162Newの操作種別1623に参照と代入の両方が発生したことを意味する値が格納されている場合は、解析結果にそれぞれを分けて記録する。一方、解析部14は、引数関連情報162Newがない場合、何もしない。
(S194):解析部14は、引数関連情報162Newがある場合、S184からS189までで作成した引数関連情報162Newを破棄する。一方、解析部14は、引数関連情報162Newがない場合、何もしない。
(S195):解析部14は、関数呼出解析を完了する。
(ソースファイル特定部11[f1]):関数定義ファイルリスト120を読み込み(S111)、関数f1の存在を判定し(S112)、関数名200すなわち「f1」、およびソースファイル名(/src/funcA.c)をソースコード展開部12に渡す(S113)。
(ソースコード展開部12[f1]):/src/funcA.cを読み込み、構文木160aおよび記号表161aを作成する(S121、S122)。
(引数関連情報設定部13[f1]):引数関連情報162aは空であるため、S131にて分岐し、S136に到達する。
(解析部14[f1:行番号5]):「int y = gVal」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわちgValに対する代入文解析を実行する(S152)。gValに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でNo、であり、gValの参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数yはアドレスを格納する型ではないため(S153でNo)、宣言解析を終了する(S157)。
(解析部14[f1:行番号7]):「gVal = 0」に対する代入文解析を実行する(S145)。gValは検査リストに格納されているため、代入文解析の流れは、S161でNo、S162でNo、S163でNo、S164でYes、S165でNo、であり、左辺の型がアドレスを格納する型ではないため、gValに対する値の代入をを解析結果22に記録し(S168、S169)、代入文解析を終了する(S174)。
(解析部14[f1:行番号8]):「x = &gVal;」に対する代入文解析を実行する(S145)。代入文解析の流れは、まず、S161でNoとなる。次に、gValが検査リストに格納されているため、S162はYesとなり、gValの参照を解析結果22に記録する(S167)。xは検査リストに格納されていないため、S163、S164はNoとなる。右辺にgValがあるため、S165はYesとなる、xはアドレスを格納する型であるため、S170はYesとなる。xは検査リストに格納されていないため、S171はNoとなり、xを検査リストに追加し(S172)、xに対するアドレス設定を解析結果22に記録する(S173)。その後、代入文解析を終了する(S174)。
(解析部14[f1:行番号9]):「y = f2(x)」に対する代入文解析を実行する。代入文解析の流れは、まず、S161でYesとなり、関数呼び出しを実行する(S180)。引数関連情報162bをを作成し(S184〜S189)、関数名f2と引数関連情報162bをソースファイル特定部11に渡す(S191)。
(ソースコード展開部12[f2]):/src/funcB.cを読み込み、構文木160bおよび記号表161bを作成する(S121、S122)。
(引数関連情報設定部13[f2]):引数関連情報162bは空でなく(S131でYes)、仮引数pはアドレスを格納する型であるため(S132でYes)、pに対するアドレス設定を解析結果22に記録する(S133)。
(解析部14[f2:行番号3]):「int *q = p」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわちpに対する代入文解析を実行する(S152)。pに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でNo、であるため、pの参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数qはアドレスを格納する型であり(S153でYes)、かつ右辺のpが検査リストに格納されているため(S154でYes)、qを検査リストに格納し(S155)、qに対するアドレス設定を解析結果22に記録する(S156)。その後、宣言解析を終了する(S157)。
(解析部14[f2:行番号4]):「int *r = q」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわちqに対する代入文解析を実行する(S152)。qに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でNo、であるため、qの参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数rはアドレスを格納する型であり(S153でYes)、かつ右辺のqが検査リストに格納されているため(S154でYes)、rを検査リストに格納し(S155)、rに対するアドレス設定を解析結果22に記録する(S156)。その後、宣言解析を終了する(S157)。
(解析部14[f2:行番号5]):「int *s = r」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわちrに対する代入文解析を実行する(S152)。rに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でYes、であるため、rの参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数sはアドレスを格納する型であり(S153でYes)、かつ右辺のrが検査リストに格納されているため(S154でYes)、sを検査リストに格納し(S155)、sに対するアドレス設定を解析結果22に記録する(S156)。その後、宣言解析を終了する(S157)。
(解析部14[f2:行番号6]):「int b = *r」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわち*rに対する代入文解析を実行する(S152)。*rに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でNo、であるため、rに対する参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数sはアドレスを格納する型ではないため(S153でNo)、宣言解析を終了する(S157)。
(解析部14[f2:行番号8]):「*s =0」に対する代入文解析を実行する。代入文解析の流れは、S161でNo、S162でNo、S163でYes、であり、左辺の型がアドレスを格納する型ではないため、sに対する値の代入を解析結果22に記録する(S168,S169)。続いて、S165でNoとなるため、代入文解析を終了する(S174)。
(解析部14[f2:行番号9]):「b = f3(q)」に対する代入文解析を実行する。代入文解析の流れは、まず、S161でYesとなり、関数呼び出しを実行する(S180)。引数関連情報162cをを作成し(S184〜S189)、関数名f3と引数関連情報162cをソースファイル特定部11に渡す(S191)。
(ソースコード展開部12[f3]):/src/funcC.cを読み込み、構文木160cおよび記号表161cを作成する(S121、S122)。
(引数関連情報設定部13[f3]):引数関連情報162cは空でなく(S131でYes)、仮引数tはアドレスを格納する型であるため(S132でYes)、tに対するアドレス設定を解析結果22に記録する(S133)。
(解析部14[f3:行番号3]):「int z = *t」に対する宣言解析を実行する(S144)。この宣言は、初期化を行っているため(S151でYes)、初期化式、すなわち*tに対する代入文解析を実行する(S152)。*tに対する代入文解析の流れは、S161でNo、S162でYes、S163でNo、S164でNo、S165でNo、であるため、tに対する参照を解析結果22に記録し(S167)、代入文解析を終了する(S174)。続いて、局所変数zはアドレスを格納する型ではないため(S153でNo)、宣言解析を終了する(S157)。
(解析部14[f3:行番号4]):「*t = 100」に対する代入文解析を実行する。代入文解析の流れは、S161でNo、S162でNo、S163でYes、であり、左辺の型がアドレスを格納する型ではないため、tに対する値の代入を解析結果22に記録する(S168、S169)。その後、S165でNoとなるため、代入文解析を終了する(S174)。
(解析部14[f3:行番号5]「z」に対する代入文解析を実行する。代入文解析の流れは、S161でNo、S162でNo、S163でNo、S164でNo、S165でNo、であるため、代入文解析を終了する(S174)。
(解析部14[f3]):関数f3の末尾まで解析すると(S147でYes)、解析部14の処理が完了し(S149)、関数f2の解析に戻る。
(解析部14[f2]):関数f2の末尾まで解析すると(S147でYes)、解析部14の処理が完了し(S149)、関数f1の解析に戻る。
(解析部14[f1:行番号10]):「y」に対する代入文解析を実行する。代入文解析の流れは、S161でNo、S162でNo、S163でNo、S164でNo、S165でNo、であるため、代入文解析を終了する(S174)。
(解析部14[f1]):関数f1の末尾まで解析すると(S147でYes)、解析部14の処理が完了する(S149)。すなわち、ソースコード解析装置による解析処理が完了する。
図16は表示部15の動作を示すフローチャートである。
(S201):表示部15は、入力部10から表示形式を取得する。
(S202):表示部15は、解析結果22を読み込む。
(S203):表示部15は、S201で取得した表示形式に従い、解析結果22を表示する。
(S204):表示部15は、処理を完了する。
例えば、表示形式が「テーブル」の場合、図7のような表示となる。
具体的には、図6のソースコードを解析する場合、大域変数の名前のみに基づく解析では、/src/funcC.cの代入文「*r=100;」にて大域変数gValへの代入が発生していることが分からない。
しかし、本実施の形態によれば、/src/funcA.cの「x=&gVal;」によるアドレス代入、「y=f2(x);」による関数の引数を介したアドレスの伝播、/src/funcB.cの「int *q=p;」によるアドレスの代入、「b=f3(q);」による関数の引数を介したアドレスの伝播、/src/funcC.cの「*r=100;」によるポインタ型変数を介した大域変数への代入、をソースコードから抽出して解析結果22に出力することで、この解析結果22を用いてユーザは/src/funcC.cの代入文「*r=100;」にて大域変数gValへの代入が発生していると判断できる。
このようにすることで、静的大域変数に対する参照、代入も解析可能となるといった利点がある。
このようにすることで、1ファイルに多数の関数定義が記述されている場合は静的大域変数を検査リストに入れる、等のように、解析範囲に柔軟性を持たせることができ、かつ、静的大域変数を検査リストに格納しない場合は、解析の高速化が期待できる。
このようにすることで、再帰呼び出しを行う関数に対する解析が可能となる。
このようにすることで、ソースコード展開部12の実行回数の削減が期待でき、結果として構文木160および記号表161を展開する記憶領域の削減、および解析の高速化が期待できる。
なお、このとき、構文木160および記号表161の破棄は、参照する解析処理がなくなった場合に実行する。
さらに、構造体および共用体のメンバについても、構文木160および記号表161を用いることで型の特定が可能であるため、変数と同様に解析できる。
このとき、解析結果22の変数名220にはメンバ名も含めて格納してもよい。ユーザ定義の型名(C言語の場合、typedefを使用)についても、同様に解析可能である。
したがって、前記必要な引数のみを引数関連情報に格納するようにしてもよい。
このとき、各組が何番目であるか特定するための序数を、実引数1620、仮引数1621、初期設定1622、操作種別1623から成る組に追加する(図示せず)。
つまり、解析と表示が独立して動作可能である。
別の表示形式について、図17に基づき説明する。
図17は、解析結果22を木構造状に示した図である。ソースコード21から関数名を取り出し、解析結果22の呼出階層223を用いると、図17のような表示が実現できる。各関数を示すブロックの中には、関数名と、解析結果22に出現する操作種別224を表示している。
ただし、記憶装置2にメモリのアドレスと、そのアドレスに格納される変数の対応関係を事前に知っているものとする。
同様に、関数の呼び出し関係についても、表示部15は最初に解析開始関数であるf1のみ表示し、その後入力部10からの指示に従い、関数f2を表示するようにしても構わない。
また、複数の関数呼び出しがある場合、図17から図18のような情報の展開を行う関数呼び出しを選択できるようにしても構わない。
このようにすることで、複雑な呼び出し関係にある関数でも、特定の実行経路に着目できるといった利点がある。
図19は、縦軸に着目する変数を1つ選択し(図19ではgValを選択)、横軸に解析開始関数から呼び出される関数を並べて、アドレスの代入、着目変数への代入を実行順序に従い表示した図である。
図19のような表示形式は、例えば、代入と参照のタイミングのみに着目する場合に、必要な情報のみを表示しているため、解析結果22の可読性が上がるといった利点がある。
このようにすることで、解析結果22とソースコード21の対応関係が分かりやすくなるという利点がある。
また、大域変数ではなく、局所変数を選択するようにしても構わない。
このようにすることで、解析結果22の可読性が上がるといった利点がある。
このようにすることで、例えば複数のタスクにおける特定の大域変数への参照、代入を簡単に把握できるといった利点がある。
解析対象関数、または表示形式を入力する入力部と、
解析対象関数が記述されているファイルを特定するソースファイル特定部と、
上記ソースファイル特定部により特定されたソースコードを読み込み構文木および記号表を作成するソースコード展開部と、
構文木および記号表を一時的に蓄積する一時記憶部と、
構文木および記号表を用いて、大域変数と、大域変数のアドレスが格納されている局所変数と、関数の引数を用いた大域変数、に対する参照、代入を解析結果に出力する解析部と、
上記入力部から指定された表示形式に基づき、解析結果を表示する表示部と
を備えるソースコード解析装置を説明した。
上記ソースコード解析装置は、さらに、
ソースファイル特定部が受け取った仮引数と実引数の対応関係を用いて、変数のアドレスが実引数に格納されていることを解析結果に出力する引数関連情報設定部
を備え、
さらに、
上記解析部は、ソースファイル特定部が受け取った仮引数と実引数の対応関係を用いて、仮引数、もしくは仮引数の値を代入した局所変数、に対する参照、代入を、仮引数と実引数の対応関係に記録することを説明した。
上記解析部は、入力部が受け取った上記入力に基づき、静的大域変数を解析対象に含めるか否かを決定することを説明した。
実施の形態1では、解析結果22の作成に必要なソースコード21すべてをその場で解析しており、なおかつ関数定義ファイルリスト20を事前に準備する必要があった。
これに対して、実施の形態2では、予め解析に必要と思われるソースコード21のそれぞれに対してソースコード展開部12により作成される構文木160と記号表161を記憶装置2に保存するとともに関数定義ファイルリスト20に関数とソースコードの対応関係を記録することで、解析の高速化を図る。
実施の形態1との相違点は、記憶装置2に展開済データ23が追加されている点と、入力部10からソースコード展開部12への矢印が追加された点である。
入力部10は、解析システムの使用者からの入力として、ソースコード21のファイル名を受け取ると、受け取ったファイル名をソースコード展開部12に渡す。
図21は、実施の形態2における関数定義ファイルリスト20の構造を示す図である。
関数定義ファイルリスト20には、ソースコード解析装置1による解析に用いる1つ以上のソースコード21で定義されている関数の数だけ、関数名200、ソースファイル名201、展開済データ名202が存在する。
すなわち、関数定義ファイルリスト20は、1つ以上の関数名200、ソースファイル名201、展開済データ名202から構成される組を備える。
図22は、実施の形態2におけるソースコード展開部12による展開済データ23作成の動作を示すフローチャートである。
(S124):ソースコード展開部12は、構文木160、および記号表161を用いて、展開済データ23を作成する。展開済データ23は、ソースコード21と同じディレクトリに格納し、ファイル名はソースコードの拡張子を「.dat」に変更したものとする。
(S125):ソースコード展開部12は、構文木160、および記号表161を用いて、関数定義ファイルリスト20に記録する。このとき、関数名200は構文木160、および記号表161から取り出した関数定義の関数名であり、関数定義ごとに変更する。また、ソースファイル名201は、入力部10から与えられたファイル名を用いる。展開済データ名202はS124にて記載のものを用いる。
(S126):ソースコード展開部12は、処理を完了する。同時に、ソースコード解析装置1の第1の動作も完了する。
入力部10は、解析システムの使用者からの入力として、ソースコード21のファイル名を受け取ると、受け取ったファイル名をソースコード展開部12に渡す。
図23は、実施の形態2におけるソースコード展開部12による展開済データ23読み込みの動作を示すフローチャートである。
(S127):ソースコード展開部12は、関数定義ファイルリスト20から、ソースコード21のファイル名に対応する展開済データ名202を取得し、該当する展開済データ23を読み込んで、構文木160と記号表161を一時記憶部16に格納する。
例えば、複数ファイルで構成されるプログラムにて、数ファイルのみ変更して解析を再度行う場合、実施の形態2では、展開済データ23の再利用が可能であるため、解析を高速に行える。
逆に、展開済データ名202があれば、展開済データ23をソースコード21と異なるディレクトリ格納しても構わない。
このようにすることで、実施の形態2における解析システムの第2の動作では、関数呼び出しに関する箇所のみ解析すればよく、解析を高速に行えるといった利点がある。
このようにすることで、ソースコード21に対する変更の後、単にソースコード解析装置1を用いた解析を行うだけで、ソースコード21に対する変更を解析結果22に反映することが可能になるといった利点がある。
図25は、実施の形態1及び2に示すソースコード解析装置1のハードウェア資源の一例を示す図である。
なお、図25の構成は、あくまでもソースコード解析装置1のハードウェア構成の一例を示すものであり、ソースコード解析装置1のハードウェア構成は図25に記載の構成に限らず、他の構成であってもよい。
CPU911は、バス912を介して、例えば、ROM(Read Only Memory)913、RAM(Random Access Memory)914、通信ボード915、表示装置901、キーボード902、マウス903、磁気ディスク装置920と接続され、これらのハードウェアデバイスを制御する。
更に、CPU911は、FDD904(Flexible Disk Drive)、コンパクトディスク装置905(CDD)、プリンタ装置906、スキャナ装置907と接続していてもよい。また、磁気ディスク装置920の代わりに、光ディスク装置、メモリカード(登録商標)読み書き装置などの記憶装置でもよい。
RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
通信ボード915、キーボード902、マウス903、スキャナ装置907、FDD904などは、入力装置の一例である。
また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。
プログラム群923のプログラムは、CPU911がオペレーティングシステム921、ウィンドウシステム922を利用しながら実行する。
また、RAM914には、CPU911による処理に必要な各種データが格納される。
ソースコード解析装置1の起動時には、ROM913のBIOSプログラム及び磁気ディスク装置920のブートプログラムが実行され、BIOSプログラム及びブートプログラムによりオペレーティングシステム921が起動される。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出され、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのCPUの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態1及び2で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示し、データや信号値は、RAM914のメモリ、FDD904のフレキシブルディスク、CDD905のコンパクトディスク、磁気ディスク装置920の磁気ディスク、その他光ディスク、ミニディスク、DVD等の記録媒体に記録される。また、データや信号は、バス912や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
Claims (19)
- 大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するコード指定部と、
前記コード指定部により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出部と、
前記コード解析抽出部の抽出結果を記憶する抽出結果記憶部とを有し、
前記コード解析抽出部は、
大域変数と、アドレスを格納する実引数に記述されている変数と、アドレスを格納する実引数に対応する仮引数に記述されている変数と、宣言文に含まれている変数のそれぞれを検査対象変数とし、
検査対象変数の参照と、検査対象変数への代入と、検査対象変数を介した他の変数への代入と、他の変数への検査対象変数の代入の少なくともといずれかが前記解析対象プログラムコードに含まれているか否かを検査して抽出処理を行うことを特徴とする情報処理装置。 - 前記コード解析抽出部は、
他の変数へ検査対象変数が代入されている場合に、当該他の変数がアドレスを格納する変数であるかを判断し、当該他の変数がアドレスを格納する変数である場合に当該他の変数を検査対象変数とすることを特徴とする請求項1に記載の情報処理装置。 - 前記コード解析抽出部は、
大域変数のアドレスを格納する局所変数の参照と、いずれかのアドレスを格納する引数を格納する局所変数の参照を前記解析対象プログラムコードから抽出することを特徴とする請求項1又は2に記載の情報処理装置。 - 前記コード解析抽出部は、
大域変数のアドレスを代入した局所変数を介した大域変数又は局所変数の参照と、
いずれかのアドレスを格納する引数を代入した局所変数を介した大域変数又は局所変数の参照と、
大域変数のアドレスを格納する局所変数を代入した局所変数を介した大域変数又は局所変数の参照と、
いずれかのアドレスを格納する引数を格納する局所変数を代入した局所変数を介した大域変数又は局所変数の参照の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項1〜3のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
大域変数のアドレスを代入した局所変数を介した大域変数又は局所変数への代入と、
いずれかのアドレスを格納する引数を代入した局所変数を介した大域変数又は局所変数への代入と、
大域変数のアドレスを格納する局所変数を代入した局所変数を介した大域変数又は局所変数への代入と、
いずれかのアドレスを格納する引数を格納する局所変数を代入した局所変数を介した大域変数又は局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項1〜4のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
いずれかのアドレスを格納する引数の参照を前記解析対象プログラムコードから抽出することを特徴とする請求項1〜5のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
いずれかのアドレスを格納する引数を介した大域変数の参照と、いずれかのアドレスを格納する引数を介した局所変数の参照の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項1〜6のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
いずれかのアドレスを格納する引数を介した大域変数への代入と、いずれかのアドレスを格納する引数を介した局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項1〜7のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
大域変数の参照と、大域変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出することを特徴とする請求項1〜8のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
前記解析対象プログラムコードに関数呼び出しが含まれている場合に、
前記関数呼び出しに関連する仮引数と実引数を抽出し、抽出した抽出仮引数と抽出実引数とを対応付け、呼び出し対象の関数のプログラムコードを解析し、抽出仮引数の参照と、抽出仮引数への代入と、抽出仮引数の値を代入した局所変数の参照と、抽出仮引数の値を代入した局所変数の他の局所変数への代入の少なくともといずれかを抽出し、抽出結果を、抽出仮引数と抽出実引数に対応付けることを特徴とする請求項1〜9のいずれかに記載の情報処理装置。 - 前記コード指定部は、
前記解析対象プログラムコードに関数呼び出しが含まれている場合に、呼び出し対象の関数が含まれているプログラムコードを識別し、当該プログラムコードを新たな解析対象プログラムコードとして指定し、
前記コード解析抽出部は、
前記コード指定部により新たな解析対象プログラムコードが指定された場合に、それまで解析を行っていた解析対象プログラムコードに対する解析を中断し、前記新たな解析対象プログラムコードに対する解析を開始し、前記新たな解析対象プログラムコードに対する解析が終了した際に、前記新たな解析対象プログラムコードの前に解析を行っていた解析対象プログラムコードに対する解析を再開することを特徴とする請求項1〜10のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
前記解析対象プログラムコードに静的変数が含まれている場合に、静的変数を検査対象変数に含ませることを特徴とする請求項1又は2に記載の情報処理装置。 - 前記コード解析抽出部は、
前記解析対象プログラムコードを解析して、前記解析対象プログラムコードの構文木と記号表を生成し、生成した構文木と記号表を用いて抽出処理を行うことを特徴とする請求項1〜12のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
前記コード指定部による解析対象プログラムコードの指定前に複数のプログラムコードを解析し、各プログラムコードの構文木と記号表を生成し、
前記コード指定部により解析対象プログラムコードが指定された際に、解析対象プログラムコードの構文木と記号表を用いて抽出処理を行うことを特徴とする請求項1〜13のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
他のプログラムコードについての以前の抽出結果を用いて、前記解析対象プログラムコードについての抽出処理を行うことを特徴とする請求項1〜14のいずれかに記載の情報処理装置。 - 前記コード解析抽出部は、
抽出結果を示す抽出結果情報を生成し、
前記情報処理装置は、更に、
前記抽出結果情報と、前記解析対象プログラムコードとを併せて表示する表示部を有することを特徴とする請求項1〜15のいずれかに記載の情報処理装置。 - 前記表示部は、
前記抽出結果情報を用いて、前記解析対象プログラムコードに含まれる特定の変数が記述されているプログラム文及び前記特定の変数の伝播状況の少なくともいずれかを表示することを特徴とする請求項16に記載の情報処理装置。 - コンピュータが、大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するコード指定ステップと、
前記コンピュータが、前記コード指定ステップにより指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出ステップと、
前記コンピュータが、前記コード解析抽出ステップの抽出結果を記憶する抽出結果記憶ステップとを有し、
前記コード解析抽出ステップにおいて、
前記コンピュータが、
大域変数と、アドレスを格納する実引数に記述されている変数と、アドレスを格納する実引数に対応する仮引数に記述されている変数と、宣言文に含まれている変数のそれぞれを検査対象変数とし、
検査対象変数の参照と、検査対象変数への代入と、検査対象変数を介した他の変数への代入と、他の変数への検査対象変数の代入の少なくともといずれかが前記解析対象プログラムコードに含まれているか否かを検査して抽出処理を行うことを特徴とする情報処理方法。 - 大域変数及び局所変数が含まれるプログラムコードを解析対象プログラムコードとして指定するコード指定処理と、
前記コード指定処理により指定された解析対象プログラムコードに対する解析を行い、大域変数のアドレスの局所変数への代入と、いずれかのアドレスを格納する引数の局所変数への代入と、大域変数のアドレスを格納する局所変数の他の局所変数への代入と、いずれかのアドレスを格納する引数を格納する局所変数の他の局所変数への代入の少なくともいずれかを前記解析対象プログラムコードから抽出するコード解析抽出処理と、
前記コード解析抽出処理の抽出結果を記憶する抽出結果記憶処理とをコンピュータに実行させるプログラムであって、
前記コード解析抽出ステップにおいて、
前記コンピュータに、
大域変数と、アドレスを格納する実引数に記述されている変数と、アドレスを格納する実引数に対応する仮引数に記述されている変数と、宣言文に含まれている変数のそれぞれを検査対象変数とさせ、
検査対象変数の参照と、検査対象変数への代入と、検査対象変数を介した他の変数への代入と、他の変数への検査対象変数の代入の少なくともといずれかが前記解析対象プログラムコードに含まれているか否かを検査させて抽出処理を行わせることを特徴とするプログラム。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009034105A JP5409039B2 (ja) | 2009-02-17 | 2009-02-17 | 情報処理装置及び情報処理方法及びプログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2009034105A JP5409039B2 (ja) | 2009-02-17 | 2009-02-17 | 情報処理装置及び情報処理方法及びプログラム |
Publications (2)
Publication Number | Publication Date |
---|---|
JP2010191598A JP2010191598A (ja) | 2010-09-02 |
JP5409039B2 true JP5409039B2 (ja) | 2014-02-05 |
Family
ID=42817595
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2009034105A Expired - Fee Related JP5409039B2 (ja) | 2009-02-17 | 2009-02-17 | 情報処理装置及び情報処理方法及びプログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP5409039B2 (ja) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPWO2013088461A1 (ja) * | 2011-12-12 | 2015-04-27 | 株式会社日立製作所 | ソフトウェア解析プログラム、および、ソフトウェア解析システム |
CN110413284B (zh) * | 2019-08-06 | 2023-10-17 | 腾讯科技(深圳)有限公司 | 词法分析方法、装置、计算机设备和存储介质 |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH05241799A (ja) * | 1992-02-21 | 1993-09-21 | Nec Corp | 引数参照構造解析装置 |
JPH06348475A (ja) * | 1993-06-14 | 1994-12-22 | Nec Corp | ポインタ解析システム |
JPH07281883A (ja) * | 1994-04-06 | 1995-10-27 | Fujitsu Ltd | プログラム修正支援装置及び方法 |
JP3900223B2 (ja) * | 1998-02-05 | 2007-04-04 | 新日鉄ソリューションズ株式会社 | 変数影響解析装置及び変数影響解析方法 |
JP3458796B2 (ja) * | 1999-10-18 | 2003-10-20 | 株式会社デンソー | 割込命令チェック装置及び記録媒体 |
JP3887550B2 (ja) * | 2001-07-25 | 2007-02-28 | 株式会社東芝 | クロスリファレンス構築装置、クロスリファレンス構築方法及びクロスリファレンス構築用プログラム |
JP3999949B2 (ja) * | 2001-07-25 | 2007-10-31 | 株式会社東芝 | 別名検索装置、別名検索方法及び別名検索用プログラム |
JP3857576B2 (ja) * | 2001-11-30 | 2006-12-13 | 正男 土井 | 高分子材料設計システムおよび高分子材料設計プログラム |
JP2005190330A (ja) * | 2003-12-26 | 2005-07-14 | Matsushita Electric Ind Co Ltd | ソースプログラムのレビュー支援システム |
-
2009
- 2009-02-17 JP JP2009034105A patent/JP5409039B2/ja not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
JP2010191598A (ja) | 2010-09-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
JP4148527B2 (ja) | 機能テスト・スクリプト生成装置 | |
US6186677B1 (en) | Byte code instrumentation | |
JP4619698B2 (ja) | コードセグメント作成方法及びそのシステム | |
US9632916B2 (en) | Method and apparatus to semantically connect independent build and test processes | |
JP2007521568A (ja) | 複数の例外処理モデルの中間表現 | |
US20090182689A1 (en) | Rule-based dynamic operation evaluation | |
JP4638484B2 (ja) | データ処理装置におけるデータ整合性 | |
JP6070847B2 (ja) | 検証方法、検証装置および検証プログラム | |
JP6440895B2 (ja) | ソフトウェア分析装置及びソフトウェア分析方法 | |
JP6845429B2 (ja) | コンパイラプログラム、情報処理装置およびコンパイル方法 | |
JP5409039B2 (ja) | 情報処理装置及び情報処理方法及びプログラム | |
JP5342508B2 (ja) | 情報処理装置及び情報処理方法及びプログラム | |
KR102614967B1 (ko) | 자바스크립트의 중간 언어 기반 의미론 추출 자동화 시스템 및 방법 | |
JP2013003854A (ja) | テストデータ生成プログラム、テストデータ生成方法、テストデータ生成装置 | |
JP6748357B2 (ja) | 解析装置、解析プログラムおよび解析方法 | |
JP2021096685A (ja) | テスト実行プログラム、テスト実行方法、およびテスト実行装置 | |
JP2022531515A (ja) | コンピュータ支援コンピュータプログラミングのシステムおよび方法 | |
JP5578625B2 (ja) | プログラム分析装置、プログラム分析方法、及びプログラム | |
Mennie et al. | Giving meaning to macros | |
WO2022254487A1 (ja) | 情報処理プログラム、情報処理方法および情報処理装置 | |
Ward et al. | The formal semantics of program slicing for nonterminating computations | |
JP6983693B2 (ja) | スタブ生成支援装置、スタブ生成支援方法、及びプログラム | |
JP6081144B2 (ja) | ソースコード解析装置 | |
CN115185526B (zh) | 一种能够逆向推理的编程语言的编译系统及方法 | |
JP3194372B2 (ja) | パーザ生成器プリプロセッサシステム、パーザ生成器用プリプロセス方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A621 | Written request for application examination |
Free format text: JAPANESE INTERMEDIATE CODE: A621 Effective date: 20110909 |
|
A977 | Report on retrieval |
Free format text: JAPANESE INTERMEDIATE CODE: A971007 Effective date: 20130123 |
|
A131 | Notification of reasons for refusal |
Free format text: JAPANESE INTERMEDIATE CODE: A131 Effective date: 20130219 |
|
A521 | Written amendment |
Free format text: JAPANESE INTERMEDIATE CODE: A523 Effective date: 20130322 |
|
A01 | Written decision to grant a patent or to grant a registration (utility model) |
Free format text: JAPANESE INTERMEDIATE CODE: A01 Effective date: 20131008 |
|
A61 | First payment of annual fees (during grant procedure) |
Free format text: JAPANESE INTERMEDIATE CODE: A61 Effective date: 20131105 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
R250 | Receipt of annual fees |
Free format text: JAPANESE INTERMEDIATE CODE: R250 |
|
LAPS | Cancellation because of no payment of annual fees |