(57)【要約】【課題】ソフトウェアプログラムをより適切に解析する技術を提供する。【解決手段】ソフトウェアプログラムのソースコードを解析するためのソースコード演算装置であって、前記ソースコードの構文を解析し、前記ソフトウェアプログラムを、内部に分岐および合流を有しない命令の集合である基本ブロックと前記基本ブロック間の制御構造を示す有向グラフとで表わした制御フローグラフを生成する制御フローグラフ生成部と、前記ソフトウェアプログラムの構文の解析で値が定まらない部分を未定とした前記制御フローグラフに基づいて前記ソフトウェアプログラム内の所定の解決対象を探索し、前記制御フローグラフを用いて前記解決対象の到達定義を計算し、前記到達定義から得られる値を前記制御フローグラフに反映することにより前記制御フローグラフを再構成する解決部と、を有している。【選択図】図１
2016181228.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアプログラムのソースコードを解析するためのソースコード演算装置であって、
前記ソースコードの構文を解析し、前記ソフトウェアプログラムを、内部に分岐および合流を有しない命令の集合である基本ブロックと前記基本ブロック間の制御構造を示す有向グラフとで表わした制御フローグラフを生成する制御フローグラフ生成部と、
前記ソフトウェアプログラムの構文の解析で値が定まらない部分を未定とした前記制御フローグラフに基づいて前記ソフトウェアプログラム内の所定の解決対象を探索し、前記制御フローグラフを用いて前記解決対象の到達定義を計算し、前記到達定義から得られる値を前記制御フローグラフに反映することにより前記制御フローグラフを再構成する解決部と、
を有するソースコード演算装置。
【請求項２】
前記解決部は、前記制御フローグラフを再構成すると、解決した前記解決対象を始点としてプログラムパスを辿って次の解決対象を探索し、当該解決対象を解決して前記制御フローグラフを再構成するという処理を、前記ソフトウェアプログラム内の全ての解決対象を解決するまで繰り返す、
請求項１に記載のソースコード演算装置。
【請求項３】
再構成された前記制御フローグラフに基づいて前記ソースコードを解析するプログラム解析処理部を更に有する、請求項１または２に記載のソースコード演算装置。
【請求項４】
前記プログラム解析処理部は、前記制御フローグラフに基づくデータフロー解析により前記ソースコードを解析する、請求項３に記載のソースコード演算装置。
【請求項５】
前記プログラム解析処理部は、前記ソースコードの解析により得た情報と、前記データフロー解析に用いた前記制御フローグラフと、を解析結果として出力する、請求項４に記載のソースコード演算装置。
【請求項６】
前記解決部は、前記制御フローグラフを再構成するとき、前記ソフトウェアプログラムの開始位置から前記制御フローグラフまでのプログラムパスを示すパストレース情報を前記制御フローグラフと共に記録し、前記パストレース情報を参照して前記ソースコードの静的解析を実行する、請求項１に記載のソースコード演算装置。
【請求項７】
前記解決対象は間接アドレッシングモードの命令である、請求項１に記載のソースコード演算装置。
【請求項８】
前記解決対象は、実行中にプログラム領域を書き換える命令である、請求項１に記載のソースコード演算装置。
【請求項９】
ソフトウェアプログラムのソースコードを解析するためのソースコード演算方法であって、
制御フローグラフ生成手段が、前記ソースコードの構文を解析し、前記ソフトウェアプログラムを、内部に分岐および合流を有しない命令の集合である基本ブロックと前記基本ブロック間の制御構造を示す有向グラフとで表わした制御フローグラフを生成し、
解決手段が、前記ソフトウェアプログラムの構文の解析で値が定まらない部分を未定とした前記制御フローグラフに基づいて前記ソフトウェアプログラム内の所定の解決対象を探索し、前記制御フローグラフを用いて前記解決対象の到達定義を計算し、前記到達定義から得られる値を前記制御フローグラフに反映することにより前記制御フローグラフを再構成する、
ソースコード演算方法。
【請求項１０】
前記解決手段は、前記制御フローグラフを再構成すると、解決した前記解決対象を始点としてプログラムパスを辿って次の解決対象を探索し、当該解決対象を解決して前記制御フローグラフを再構成するという処理を、前記ソフトウェアプログラム内の全ての解決対象を解決するまで繰り返す、
請求項９に記載のソースコード演算方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マイクロコントローラ向けソフトウェアプログラムのソースコードを解析する技術に関する。
【背景技術】
【０００２】
近年ではマイクロコントローラ（以下「マイコン」と称す）の一部で生産終了するものが出ている。マイコンの生産終了に伴い、マイコンを内蔵する産業機器などで、生産終了となったマイコンから他のマイコンへの置き換えが進められている。そのために、あるマイコン用に設計された組み込みソフトウェアを他のマイコン用に再設計することが求められている。
【０００３】
生産終了となるマイコンを内蔵する製品の中にはソフトウェアプログラムの全部あるいは一部がアセンブリ言語で記述されたものがある。アセンブリ言語の仕様はマイコン製品によって異なるため、アセンブリ言語で記述されたソースコードは、Ｃ言語のような高水準言語のソースコードと異なり、マイコン間の移植性が低い。また、マイコン製品によってアーキテクチャが異なるため、ソフトウェアプログラムの再設計において、アセンブリ言語のソースコードは命令単位の単純な変換では対応できないことが殆どである。例えば、命令単位で変換の手順を一意に定めることは困難であり、フラグなどのマイコン内部処理、メモリマップ、周辺回路の互換などを含めてソースコードを一旦解析した上で、命令の集合が意味する処理内容を考慮しながら変換していくことになる。
【０００４】
以上のような背景から、アセンブリ言語で記述されたソースコードの静的な解析、とりわけデータの流れ（データフロー）の解析が重要となる。データフローレベルでソースコードを解析することができれば、命令の集合が意味する処理内容を把握できる。しかし、特にデータフローを考慮してソースコードを修正するにはソースコードの熟読が必須であり、人手で作業する場合、高いスキルと多大な工数が必要とされる。そのためソフトウェアプログラムのデータフローレベルでの解析を自動化することができれば、大きな工数の削減が期待できる。
【０００５】
特許文献１には、ソースコードからマシンコードへ変換する過程において、処理の並列化が可能であるかどうか判定し、可能であれば並列化されたマシンコードを生成するプログラム並列化支援装置が記載されている。特許文献１では、プログラムを並列化することが可能かどうかソースコードをデータフローレベルで解析し、並列化を阻害する要因を抽出している。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−１２９１７９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
上述のように、あるマイコン向けに記述されたソースコードを他のマイコン向けに修正するためには、データフローレベルでソースコードを解析する必要がある。ソフトウェアプログラムのデータフローレベルでの解析にはＣＦＧ（制御フローグラフ）が用いられる。ＣＦＧは、ソフトウェアプログラムを、内部に分岐および合流を有しない基本ブロックと、基本ブロック間の分岐あるいは合流などの制御構造を示す有向グラフとによって表現したものである。ＣＦＧはソースコードを構文解析することにより得ることができる。
【０００８】
ソフトウェアプログラムのデータフローレベルでの解析はＣＦＧを用いて到達定義を計算することで実現される。到達定義とは、各基本ブロックの入り口に到達するデータ定義命令の集合である。到達定義から命令間の依存関係やレジスタなどの変数が取り得る値の候補を知ることができる。それらの情報をソースコードの解析に活用することによりプログラムをデータフローレベルで解析することが可能となる。また、そのようなソフトウェアプログラムのデータフローレベルでの解析を可能にするためにＣＦＧが完全なものでなければならない。
【０００９】
上述したようにＣＦＧはソースコードの構文解析により得られる。しかし、ソースコードの構文を解析しただけで完全なＣＦＧを得られない場合もある。例えば、ソースコードの中に間接アドレッシングモードの分岐命令が含まれている場合、ソースコードの構文解析だけで完全なＣＦＧを得ることはできない。間接アドレッシングモードではソースコードを構文解析しても実際のアドレス番地が直接得られないからである。実際のアドレス番地が分からなければ、分岐命令の分岐先を判定することは難しい。分岐命令の分岐先が判明しなければＣＦＧを完成させることができない。
【００１０】
特許文献１にはプログラムの並列化の可能性を判断する方法が説明されている。その方法というのは、ＣＦＧを解析してＣ言語のポインタ情報を取得し、得られたポインタ情報を並列化が可能か否かを判定するための指標として利用するというものである。このポインタが、間接アドレッシングモードによる命令と類似する処理を実現するものである。つまり、ポインタが示す変数の内容をアドレス値とし、そのアドレス値が示すメモリ上の番地にあるデータを参照したり、更新したりするという処理が実現される。その際、特許文献１に記載された技術では、ソースコードから直接得たＣＦＧのみを利用してポインタを解析し、ポインタに依存関係があるかどうか判定する。しかし、特許文献１の技術は並列化の可能性を判定することを目的としているため、特定の命令を実行したときにポインタが示すアドレス値まで考慮する必要はない。
【００１１】
一方、あるマイコンの組み込みソフトウェアを他のマイコン用に修正する場合、データフローレベルでソースコードを解析し、参照あるいは更新するデータのアドレス値を取得し、新たなマイコンにおいてもそのアドレスのデータを参照あるいは更新するようにソフトウェアプログラムを修正する必要がある。また、アドレス値はマイコン毎に固有であるため必然的に置き換えの対象となることがある。そのためソフトウェアプログラムの再設計で命令を新しく置き換えるためにはアドレス値の算出が不可欠である。
【００１２】
しかし、特許文献１に開示された処理では具体的なアドレス値を導出しないため、ポインタが示すアドレス値がＣＦＧに影響するような場合には完全なＣＦＧを得ることができない。
【００１３】
このように、あるマイコンのソフトウェアプログラムをアーキテクチャが異なる他のマイコン用に書き換えるには、特許文献１の技術では不十分であり、間接アドレッシングモードなどを含め、ソフトウェアプログラムをより適切に解析する技術が必要である。
【００１４】
本発明の目的は、ソフトウェアプログラムをより適切に解析する技術を提供することである。
【課題を解決するための手段】
【００１５】
本発明の一態様によるソースコード演算装置は、ソフトウェアプログラムのソースコードを解析するためのソースコード演算装置であって、前記ソースコードの構文を解析し、前記ソフトウェアプログラムを、内部に分岐および合流を有しない命令の集合である基本ブロックと前記基本ブロック間の制御構造を示す有向グラフとで表わした制御フローグラフを生成する制御フローグラフ生成部と、前記ソフトウェアプログラムの構文の解析で値が定まらない部分を未定とした前記制御フローグラフに基づいて前記ソフトウェアプログラム内の所定の解決対象を探索し、前記制御フローグラフを用いて前記解決対象の到達定義を計算し、前記到達定義から得られる値を前記制御フローグラフに反映することにより前記制御フローグラフを再構成する解決部と、を有している。
【発明の効果】
【００１６】
本発明によれば、ソフトウェアプログラムを構文解析して得た制御フローグラフで未定値を生じさせている解決対象を探索し、その解決対象を制御フローグラフを用いて解決し、その解析で得た値を制御フローグラフに反映させることにより、未定値となっている部分を決定していく。構文解析では明らかとならない部分を制御フローグラフを用いて解決していくので、ソフトウェアプログラムをより適切に解析することが可能となる。
【図面の簡単な説明】
【００１７】
【図１】本実施形態によるソースコード解析装置１００の基本的構成を示すブロック図である。
【図２Ａ】ソースコードとそれを基に生成したＣＦＧの一例を示す図である。
【図２Ｂ】ソースコードとそれを基に生成したＣＦＧの一例を示す図である。
【図３】アドレス値解決部ＢＬ１０２のブロック図である。
【図４】本実施形態によるソースコード解析装置の処理を示すフローチャートである。
【図５】ＣＦＧ管理テーブルＯＢ１０３のイメージを示す図である。
【図６】図４のステップＳ４０４からＳ４１０までの一連の処理を詳細化したフローチャートである。
【図７】分岐にける探索のイメージを示す図である。
【図８】ＣＦＧオブジェクトが変換される様子を例示する図である。
【図９】プログラム解析処理部ＢＬ１０３による解析処理のフローチャートである。
【図１０】人間が容易に解読可能な形式となった解析結果が画面に表示されている様子を示す図である。
【図１１】コンピュータがバッチ処理することができる形式の解析結果を示す図である。
【図１２】他の実施形態によるソースコード解析装置の一部を示すブロック図である。
【図１３】他の実施形態によるソースコード解析装置の解析処理のフローチャートである。
【発明を実施するための形態】
【００１８】
以下、図面を用いて本実施形態によるソースコード解析装置について説明する。なお、本ソースコード解析装置は所定のソースコード解析方法を実現する装置であり、例えば、あるマイコン用のソフトウェアプログラムを他のマイコン用に再設計するのに利用可能である。
【００１９】
図１は、本実施形態によるソースコード解析装置１００の基本的構成を示すブロック図である。図１を参照すると、ソースコード解析装置１００は、ＣＦＧ生成部ＢＬ１０１と、アドレス値解決部ＢＬ１０２と、ＣＦＧ管理テーブルＯＢ１０３と、プログラム解析処理部ＢＬ１０３と、プログラム最適化処理部ＢＬ１０４を有している。
【００２０】
ＣＦＧ生成部ＢＬ１０１は、アセンブリ言語等で記述されたソースコードＯＢ１０１を入力とし、そのソースコードＯＢ１０１の構文を解析して制御フローグラフ（ＣＦＧ）を生成する。生成されたＣＦＧがＣＦＧオブジェクトＯＢ１０２となる。ＣＦＧは、ソースコードＯＢ１０１のの構文を解析して生成されるグラフデータであり、そのデータ構造は、内部に分岐および合流を有しない基本ブロックと、基本ブロック間のデータの流れを示す有向グラフと、により表現される。
【００２１】
アドレス値解決部ＢＬ１０２は、ＣＦＧオブジェクトＯＢ１０２を元にソースコードＯＢ１０１のデータフロー解析を実行する。その際、アドレス値解決部ＢＬ１０２は、ＣＦＧオブジェクトＯＢ１０２内にある間接アドレッシングモードの命令を探索し、その命令にて参照される実効アドレスを示すアドレス情報を取得する。
【００２２】
更に、アドレス値解決部ＢＬ１０２は、取得したアドレス情報を、データフロー解析に利用したＣＦＧオブジェクトＯＢ１０２に反映し、再構成したＣＦＧオブジェクトＯＢ１０２に所定の管理情報を付加し、解析結果としてＣＦＧ管理テーブルＯＢ１０３に記録する。その管理情報には、ＣＦＧオブジェクトＯＢ１０２の識別情報と、開始位置からアドレス解決の対象となった間接アドレッシングモードの命令までのプログラムパスを示すパストレース情報とが含まれる。
【００２３】
ＣＦＧ管理テーブルＯＢ１０３は、アドレス値解決部ＢＬ１０２が取得した間接アドレッシングモードの命令で参照する実効アドレスを示すアドレス情報と管理情報とを含む解析結果をデータベースにて保持する。
【００２４】
プログラム解析処理部ＢＬ１０３は、ＣＦＧ生成部ＢＬ１０１がソースコードＯＢ１０１から生成し、アドレス値解決部ＢＬ１０２が間接アドレッシングモードの命令のアドレス解決を行った結果を反映したＣＦＧオブジェクトに対して、そのＣＦＧオブジェクトにおける所定の解析対象命令を解析する所定の解析処理を実行し、その解析結果をプログラム解析結果ＯＢ１０５として出力する。所定の解析処理は、一例を挙げれば、データフロー解析により解析対象命令の到達定義を算出する処理である。その場合、算出した到達定義が解析結果となる。プログラム解析結果ＯＢ１０５は、ＣＦＧ管理テーブルＯＢ１０３に登録されたＣＦＧオブジェクトＯＢ１０２を元に、置き換え前のマイコン用のソースコードＯＢ１０１を置き換え後の新たなマイコンが処理できる形式のソースコードＯＢ１０６へ変換するとき、変換を行うマシンまたは人間が参照する情報である。
【００２５】
プログラム最適化処理部ＢＬ１０４は、プログラム解析結果ＯＢ１０５を元に、入力されたソースコードＯＢ１０１を最適化する。ここでいう最適化は、ソースコードＯＢ１０１を、置き換え後の新たなマイコンで処理しやすい形式にしたり、新たなマイコンで効率よく処理できるようにしたり、または人間の作業を容易化あるいは低減できるようにすることである。具体的には、プログラム解析結果ＯＢ１０５を、置き換え後の新たなマイコンが効率よく自動処理できる形式、あるいは人間にとって可読性の高い形式に変換することが好ましい。
【００２６】
図２Ａ〜図２Ｂは、ソースコードとそれを基に生成したＣＦＧの一例を示す図である。図２Ａはソースコードの一例を示し、図２Ｂは、図２Ａのソースコードから生成したＣＦＧオブジェクトを示している。
【００２７】
図２ＢのＣＦＧオブジェクトＯＢ１０２を見ると、図２Ａに示したソースコード２００が、内部に分岐および合流を含まない基本ブロックＢ２０２、Ｂ２０３、Ｂ２０４に分割されている。更に開始（ＳＴＡＲＴ）ブロックＢ２０１と終了（ＥＮＤ）ブロックＢ２０５を加えた５つのブロックＢ２０１〜２０５が、連結状態を矢印で示した有向グラフで連結されている。
【００２８】
図３は、アドレス値解決部ＢＬ１０２のブロック図である。図３を参照すると、アドレス値解決部ＢＬ１０２は、プログラムパス探索部ＢＬ３０１、データフロ―解析部ＢＬ３０２、ＣＦＧ再構成部ＢＬ３０３、およびＣＦＧ検証部ＢＬ３０４を有している。
【００２９】
プログラムパス探索部ＢＬ３０１は、入力されたＣＦＧオブジェクトＯＢ１０２からＳＴＡＲＴブロックＢ２０１を探し出し、ＳＴＡＲＴブロック２０１から各基本ブロックの命令を辿り、解析対象命令を探索する。解析対象命令は具体例として間接アドレッシングモードの命令である。プログラムパス探索部ＢＬ３０１は、解析対象命令を発見すると、開始位置からその命令までのプログラムパスを示すプログラムパス情報を出力する。
【００３０】
データフロー解析部ＢＬ３０２は、プログラムパス探索部ＢＬ３０１からのプログラムパス情報に基づき、ＣＦＧオブジェクトＯＢ１０２を元にデータフロー解析処理を実行することにより、解析対象命令の実効アドレスの候補となる値（アドレス候補値）を生成する。
【００３１】
ＣＦＧ再構成部ＢＬ３０３は、データフロー解析部ＢＬ３０２が生成したアドレス候補値を元にＣＦＧオブジェクトＯＢ１０２を再構成する。
【００３２】
ＣＦＧ検証部ＢＬ３０４は、再構成されたＣＦＧオブジェクト（再構成ＣＦＧオブジェクトＯＢ３０１）を検証し、管理情報と共にＣＦＧ管理テーブルＯＢ１０３へ保存する。また、ＣＦＧ検証部ＢＬ３０４は、他の構成のＣＦＧが得られる可能性がある場合、再構成ＣＦＧオブジェクトＯＢ３０１を再びプログラムパス探索部ＢＬ３０１へ戻す。ＣＦＧオブジェクトＯＢ３０１の検証として、例えば、開始位置から解析対象命令までのプログラムパスを正常に辿れること等を検証すればよい。
【００３３】
図１に戻り、ＣＦＧ管理テーブルＯＢ１０３は、ＣＦＧ生成部ＢＬ１０１が生成したＣＦＧオブジェクトあるいはそれを再構成した再構成ＣＦＧオブジェクト（以下それらをまとめて「ＣＦＧオブジェクトＯＢ１０２」とも称す）と、その管理情報とを、それらを互いに紐付けた状態で保存するテーブルである。管理情報には、当該ＣＦＧオブジェクトＯＢ１０２の識別情報と、当該ＣＦＧオブジェクトＯＢ１０２が生成に寄与した、解析対象命令である間接アドレッシングモードの命令までのプログラムパス情報が含まれる。
【００３４】
プログラム解析処理部ＢＬ１０３は、ＣＦＧ管理テーブルＯＢ１０３に登録されたＣＦＧオブジェクトＯＢ１０２を解析することにより、ソースコードの移植に必要な情報を生成し、生成したプログラム解析結果ＯＢ１０５を出力する。
【００３５】
また、プログラム最適化処理部ＢＬ１０４は、プログラム解析処理部ＢＬ１０３が生成したプログラム解析結果ＯＢ１０５を元に、ソースコードＯＢ１０１に対してプログラム最適化処理を行い、処理結果を出力する。ここでいう最適化処理は、ソースコードＯＢ１０１を移植先のマイコンが処理可能な形式へ変換する処理、あるいはその変換に有用な情報を生成する処理である。プログラム最適化処理部ＢＬ１０４は、例えば、最適化したソースコードＯＢ１０６を出力する。
【００３６】
図４は、本実施形態によるソースコード解析装置の処理を示すフローチャートである。
【００３７】
まず、ソースコード解析装置１００は、入力されたソースコードＯＢ１０１の字句解析および構文解析を実行し、ソースコードＯＢ１０１にプログラミング言語上のエラーがあるかどうかチェックする（ステップＳ４００）。
【００３８】
ソースコードＯＢ１０１に文法上のエラーがあったら、ソースコード解析装置１００は、エラーを通知して処理を終了する（ステップＳ４０１）。ソースコードＯＢ１０１に文法上のエラーが見当たらない場合、ソースコード解析装置１００は、図２Ｂに示したようなＣＦＧオブジェクトＯＢ１０２を生成する（ステップＳ４０１）。ステップＳ４０１の処理において、プログラム中に間接アドレッシングモード（ＩＤＡ：Ｉｎｄｉｒｅｃｔ  Ａｄｄｒｅｓｓｉｎｇ  Ｍｏｄｅ）の命令を含む場合がある。しかし、この時点でアドレスの具体的な値を見積もることはできないため、未定値としておく。
【００３９】
次に、ソースコード解析装置１００は、ソースコードＯＢ１０１のプログラムパスを辿り、間接アドレッシングモードの命令があるか否か判定する（ステップＳ４０２）。ソースコードＯＢ１０１中に間接アドレッシングモードの命令が見つからない場合、ソースコード解析装置１００は、ステップＳ４０１の処理で得られたＣＦＧオブジェクトＯＢ１０２を出力し、処理を終了する。すなわち、間接アドレッシングモードの命令が見つからずにプログラムの終点に到達した場合は処理を終了する。
【００４０】
ソースコードＯＢ１０１に間接アドレッシングモードの命令が含まれていた場合、ソースコード解析装置１００は、ステップＳ４０１の処理で得られた、その命令を含むＣＦＧオブジェクトＯＢ１０２を探索対象ＣＦＧとして登録し（ステップＳ４０３）、プログラムパス探索処理を開始する（ステップＳ４０４）。
【００４１】
プログラムパスの探索過程において間接アドレッシングモードの命令を発見した場合、ソースコード解析装置１００は、現在探索中のＣＦＧオブジェクトＯＢ１０２を用いてデータフロー解析を実行し、到達定義を計算することで、間接アドレッシングモードの命令のアドレスの候補値を計算する（ステップＳ４０５）。なお、到達定義は、式（１）のデータフロー方程式を計算することで得られる。
【００４２】
【数１】
2016181228.tif 000003
【００４３】
式（１）において、ＩＮ（Ｂ）はＣＦＧオブジェクトＯＢ１０２の基本ブロックＢに到達する定義命令の集合を示す。ＯＵＴ（Ｂ）は基本ブロックＢの出口で有効な定義命令の集合である。Ｐｒｅｄ（Ｂ）は基本ブロックＢの先行ブロックの集合である。ＰはＰｒｅｄ（Ｂ）の要素である。
【００４４】
ＤＥＦ（Ｂ）は基本ブロックＢにおいて定義される定義命令の集合である。ＫＩＬＬ（Ｂ）は基本ブロックＢにおいて再定義等によって消滅する定義命令の集合である。このデータフロー方程式をステップＳ４０４の処理にて発見した間接アドレッシングモードの命令が属する基本ブロックにおいて計算し、当該命令においてアドレス情報を保持するレジスタまたはメモリの有効な定義集合（到達定義）を計算する。この到達定義を命令セットシミュレータ等により解釈することでアドレス値を得ることができる。
【００４５】
次に、ソースコード解析装置１００は、アドレス値が有効であるか確認する（ステップＳ４０６）。得られたアドレス値が有効なアドレス値でなければ、エラーを出力して処理を終了する（ステップＳ４１１）。
【００４６】
得られたアドレス値が有効であれば、ソースコード解析装置１００は、探索対象ＣＦＧとなっているＣＦＧオブジェクトＯＢ１０２を複製し、そのアドレス候補値を元にＣＦＧオブジェクトＯＢが示すＣＦＧを再構成する（ステップＳ４０７）。ＣＦＧの再構成の際、間接アドレッシングモードの命令であることを示す情報を残しておく。ソースコードＯＢ１０１によっては複数のアドレス値を得る場合があるが、アドレス値毎に、ＣＦＧオブジェクトＯＢ１０２のコピーを複製し、そのアドレス値を用いて再構成する。
【００４７】
次に、ソースコード解析装置１００は、解析終了条件が満たされているか否か検証する（ステップＳ４０８）。ステップＳ４０８における解析終了条件は、再構成ＣＦＧオブジェクトＯＢ３０１の構造が循環するという条件である。例えば、再構成されたＣＦＧである再構成ＣＦＧオブジェクトＯＢ３０１の構造が、既にＣＦＧ管理テーブルＯＢ１０３に登録されている場合、同じ構造のＣＦＧが繰り返し発言する可能性が高い。同じ構造のＣＦＧが繰り返される場合、すなわちＣＦＧ構造が循環する場合、新たに得られるＣＦＧはこれ以上存在しないこととなる。その場合、それ以上の探索は不要といえるので、解析終了条件が満たされる。解析終了条件が満たされていれば、ソースコード解析装置１００は処理を終了する（ステップＳ４０８のＹｅｓ）。
【００４８】
一方、解析終了条件が満たされていなければ、ソースコード解析装置１００は、再構成ＣＦＧオブジェクトＯＢ３０１を管理情報と共にＣＦＧ管理テーブルＯＢ１０３に登録する（ステップＳ４０９）。
【００４９】
図５は、ＣＦＧ管理テーブルＯＢ１０３のイメージを示す図である。図５中の「ＣＦＧ」が再構成ＣＦＧオブジェクトＯＢ３０１である。「ＮＯ．Ｘ」は再構成ＣＦＧオブジェクトＯＢ３０１の識別番号であり、「ＰＡＴＨ」はプログラムパス情報である。この「ＮＯ．Ｘ」と「ＰＡＴＨ」は管理情報に該当する。
【００５０】
その後、ソースコード解析装置１００は、再構成ＣＦＧオブジェクトＯＢ３０１を探索対象ＣＦＧとして登録し、アドレス解決処理を実行した間接アドレッシングモードの命令を始点としてステップＳ４０４の探索処理を実行する（ステップＳ４１０）。
【００５１】
なお、ステップＳ４００においてソースコードＯＢ１０１に文法上のエラーが発見された場合、ステップＳ４０６においてアドレスが有効な値でなかった場合は、ステップＳ４１１にてエラー情報を生成して処理を終了する。このエラー情報が生成された場合、ソースコードＯＢ１０１を移植する過程において必ず人手によりプログラムを解析して手直しする作業が発生する。そのため、エラー情報は人間が容易に理解できるように詳細な情報を出力することが好ましい。たとえば、エラー情報として、具体的なアドレス値、そのアドレス値の決定に寄与する到達定義、関連する命令群の情報が該当する。
【００５２】
図６は、図４のステップＳ４０４からＳ４１０までの一連の処理を詳細化したフローチャートである。
【００５３】
ソースコード解析装置１００は、ＳＴＡＲＴブロックＢ２０１からプログラム先頭命令を検索する（ステップＳ７００）。プログラムの先頭の命令（以下「プログラム先頭命令」という）は、ソースコードＯＢ１０１から生成したＣＦＧオブジェクトＯＢ１０２におけるＳＴＡＲＴブロックに続く後続ブロックを参照することで見つけることができる。
【００５４】
次に、ソースコード解析装置１００は、それまでのパスのトレースを記録したパストレース情報を初期化し、プログラム先頭命令を探索点として設定する（ステップＳ７０１）。探索点とは、プログラムパスを辿る命令の探索における現在の位置（命令）をいう。次に、ソースコード解析装置１００は、探索点の命令をパストレース情報に追記し（ステップＳ７０２）、その次の命令を探索点として設定する（ステップＳ７０３）。
【００５５】
なお、プログラムには分岐が存在する場合がある。ソースコード解析装置１００は、プログラムにおける分岐を発見した場合、その分岐毎に非決定的に探索を行う。図７は、分岐にける探索のイメージを示す図である。
【００５６】
図７を参照すると、基本ブロックＢ８００が命令（分岐命令）１０４により基本ブロックＢ８０１またはＢ８０２に分岐する例が示されている。その場合、命令１０４の次の探索点は命令１０５または命令１１５のいずれかとなる。この際、パストレース情報Ｐ８０３を複製し、基本ブロックＢ８０１を探索する場合のパストレース情報Ｐ８０４と、基本ブロックＢ８０２を探索する場合のパストレース情報Ｐ８０５とを生成する。それらはプログラムパスを辿るときに利用される。
【００５７】
探索点がプログラム終点である場合、ソースコード解析装置１００は、探索中のプログラムパスにおける解析処理を終了する（ステップＳ７０４）。すべてのプログラムパスの探索を行い、解析処理を終了した場合に限り、ソースコード解析装置１００は、完全な終了条件が満たされたと判断する。
【００５８】
しかし、プログラム中にループが存在する場合、プログラムパスが無限通りとなり解析処理を終了することができない場合がある。この場合、ループとなるパスを探索する場合のプログラムパス探索条件に制限をつけることで、プログラムパスを辿る命令の探索を終了させることが可能となる。例えば、同じループを通過する回数をカウントし、そのカウント値（ループ回数）が、閾値である所定値に達したら、ループ終了条件が満たされたと判定してプログラムパスの探索を終了することにしてもよい。その場合、閾値をユーザが手動で設定できてもよい。また、データフロー解析によりループ終了条件を定めることにしてもよい。
【００５９】
通常、間接アドレッシングモードの命令によって指定されるアドレス値はアドレス空間上で制限された領域内のアドレスのみとなることが多いので、ループ回数が有限となることが大半である。特に、生産終了の対象となるような古い設計のマイコンのプログラム場合、メモリ空間のサイズが乏しく、間接アドレッシングモードの命令で指定されるアドレスが取りうるメモリ領域も極めて限定的である場合が多い。したがって、生産終了のマイコンのソフトウェアプログラムを移植するためにソースコードを解析するという目的においては、ループ回数によってループ終了条件を定めるのは有用かつ現実的な手法である。
【００６０】
ソースコード解析装置１００は、次に探索点が間接アドレッシングモードの命令であるか否か判定する（ステップＳ７０５）。そうでなければ、ソースコード解析装置１００は、パストレース情報に追記した上で探索点を次命令に進めて探索処理を継続する（ステップＳ７０５、Ｓ７０２、Ｓ７０３）。一方、ステップＳ７０５の判定において探索点が間接アドレッシングモードの命令である場合、ソースコード解析装置１００は、探索処理で利用しているＣＦＧオブジェクトＯＢ１０２を利用してデータフロー解析を実施し、当該命令における到達定義を計算し、当該命令のアドレス値を取得する（ステップＳ７０６、Ｓ７０７）。
【００６１】
式（１）にて上述したデータフロー方程式の計算は、データフローが全体として不動点に到達するまで計算を繰り返す方法がよく利用される。その場合、パストレース情報に含まれない命令も到達定義に含まれる可能性がある。そこで、式（１）を用いたデータフロー解析により得られた到達定義のうち、パストレース情報に含まれない命令を除去することが好ましい。そのようにパストレース情報に含まれない命令を除去した到達定義を元にアドレスの候補値を計算することで、ソフトウェアプログラムが確実にアクセスし得るアドレス値を得ることができるようになる。
【００６２】
次に、ソースコード解析装置１００は、以上の過程で得られたアドレス値が有効であるか否か判定する（ステップＳ７０８）。アドレス値が有効である場合、ソースコード解析装置１００は、探索処理で用いているＣＦＧオブジェクトＯＢ１０２を複製し、アドレス値を元に再構成し、再構成されたＣＦＧオブジェクトＯＢ１０２を生成する（ステップＳ７０９）。
【００６３】
間接アドレッシングモードの命令にはジャンプ命令と非ジャンプ命令とがある。間接アドレッシングモードの命令がジャンプ命令である場合、ソースコード解析装置１００は、基本ブロック間の連結関係を含めてＣＦＧオブジェクトＯＢ１０２を再構成する。一方、間接アドレッシングモードの命令が非ジャンプ命令である場合、ソースコード解析装置１００は、当該命令を絶対値表記に変換するのみでよい。
【００６４】
間接アドレッシングモードの命令のアドレス解決に基づきＣＦＧオブジェクトＯＢ１０２を再構成するときにおいても、当該命令が元々間接アドレッシングモードの命令であったことを識別できる情報（フラグ等）を付与する。この情報は、再探索時に当該命令のアドレス値の解決を再実行する際の指標として利用する。その際、アドレス値を保持するレジスタあるいはメモリの情報も併せて保持してもよい。
【００６５】
図８は、ＣＦＧオブジェクトが変換される様子を例示する図である。
【００６６】
ここでＣＦＧ９００はプログラムパス探索で利用中のＣＦＧオブジェクトである。ＣＦＧ９０１およびＣＦＧ９０２は、再構成された後のＣＦＧオブジェクトである。例えば、命令１０３における間接アドレッシングモードのジャンプ命令において、破線矢印によって図示されているように、アドレス値を格納するレジスタＲ０が０ｘＸＸＸＸまたは０ｘＹＹＹＹという値をなる場合について考える。その場合、ＣＦＧ９００を２つコピーし、一方はレジスタのアドレスＲ０＝０ｘＸＸＸＸを元にＣＦＧ９００再構成することでＣＦＧ９０１を取得する。他方はレジスタのアドレスＲ０＝０ｘＹＹＹＹを元にＣＦＧ９００を再構成することでＣＦＧ９０２を取得する。
【００６７】
ステップＳ７０９にて再構成されたＣＦＧオブジェクトは、管理情報と共にＣＦＧ管理テーブルＯＢ１０３に登録される（ステップＳ７１０）。ＣＦＧオブジェクトが格納された様子のイメージは図５に示した通りであり、管理情報として、ＣＦＧオブジェクトＯＢ１０２の識別情報と、開始位置からアドレス解決対象の命令までのパストレース情報が含まれる。
【００６８】
次に、ソースコード解析装置１００は、再構成ＣＦＧオブジェクトＯＢ３０１をプログラムパスの探索対象となるＣＦＧオブジェクトとして設定し、解析終了条件が満たされるまで探索処理を繰り返す（ステップＳ７１１）。
【００６９】
ステップＳ７０９において、アドレス値の候補が複数となる場合、ソースコード解析装置１００は、それぞれのアドレス値を元に再構成された再構成ＣＦＧオブジェクトＯＢ３０１のそれぞれに対してプログラムパスに沿った探索処理を実行する。この際、ソースコード解析装置１００は、パストレース情報も併せて複製し、プログラムパスの探索において分岐命令を発見した場合と同様、非決定的に処理を実行する。ステップＳ７０８において有効なアドレスの候補値を得られない場合、ソースコード解析装置１００は、前述の通りエラーを生成して処理を終了する（ステップＳ７１２）。
【００７０】
以上の処理により、ＣＦＧ管理テーブルＯＢ１０３は、プログラムが取り得る全てのＣＦＧオブジェクトＯＢ１０２のパターンを保持することができ、更に、それらＣＦＧオブジェクトＯＢ１０２は間接アドレッシングモードの命令による影響を考慮済みのものとなる。
【００７１】
図９は、プログラム解析処理部ＢＬ１０３による解析処理のフローチャートである。解析処理は、ＣＦＧ管理テーブルＯＢ１０３に登録されたＣＦＧオブジェクトＯＢ１０２を利用して実行される。
【００７２】
最初に、プログラム解析処理部ＢＬ１０３は、解析の対象となる命令を識別する（ステップＳ１０００）。解析対象命令は、ユーザが手動で指定する方法、所定の条件により機械的に自動指定する方法などがある。
【００７３】
解析対象命令が指定されると、プログラム解析処理部ＢＬ１０３は、ＣＦＧ管理テーブルＯＢ１０３へアクセスし、最初のＣＦＧオブジェクトＯＢ１０２を取得する（ステップＳ１００１）。ＣＦＧ管理テーブルＯＢ１０３においてはＣＦＧオブジェクトＯＢ１０２のデータは様々な管理方法で管理され得る。最も単純な方法はリスト型で記録し、管理する方法である。ＣＦＧオブジェクトＯＢ１０２をリストとして管理する場合、リストの先頭にあるＣＦＧオブジェクトＯＢ１０２が、上述した最初のＣＦＧオブジェクトＯＢ１０２に該当する。
【００７４】
次に、プログラム解析処理部ＢＬ１０３は、ＣＦＧ管理テーブルＯＢ１０３から取得した最初のＣＦＧオブジェクトＯＢ１０２に紐付けられた管理情報に含まれるパストレース情報を参照し、そのパストレース情報で示されたプログラムパスに解析対象命令が含まれているか否か検証する（ステップＳ１００２）。
【００７５】
パストレース情報に解析対象命令が含まれていない場合、それは、そのＣＦＧオブジェクトＯＢ１０２は解析対象命令が実行されたときに通らないＣＦＧオブジェクトＯＢ１０２であることを意味するので、プログラム解析処理部ＢＬ１０３は、次に、全てのＣＦＧオブジェクトＯＢ１０２を検証したか否か判定する（ステップＳ１００３）。全てのＣＦＧオブジェクトＯＢ１０２が検証済であれば、プログラム解析処理部ＢＬ１０３は処理を終了する。また、未だ検証を行っていないＣＦＧオブジェクトＯＢ１０２があれば、プログラム解析処理部ＢＬ１０３は次のＣＦＧオブジェクトＯＢ１０２を取得し（ステップＳ１００４）、ステップＳ１００２に戻る。
【００７６】
ステップＳ１００２にてパストレース情報で示されたプログラムパスに解析対象命令が含まれていたら、プログラム解析処理部ＢＬ１０３は、ＣＦＧオブジェクトＯＢ１０２を利用してソフトウェアプログラムを解析する所定の処理を実行する（ステップＳ１００５）。この解析処理として様々な処理が適用可能であるが、一例として、データフロー解析により解析対象命令の到達定義を計算する処理がある。
【００７７】
次に、プログラム解析処理部ＢＬ１０３は、ステップＳ１００５の解析処理において、パストレース情報に含まれない命令を含むような解析結果が生じたら。それを除去する（ステップＳ１００６）。そのような解析結果は無効なものだからである。例えば、前方解析あるいは後方解析などのＣＦＧオブジェクトＯＢ１０２を用いてデータフロー方程式に基づいてソフトウェアプログラムを解析する場合、到達定義が不動点に達するまでデータフロー方程式を繰り返し解くという処理が存在する場合がある。そのような場合、解析対象命令が実行された後に実行される命令が解析対象命令の解析結果に含まれてくることが起こりうる。そして、後から実行される命令が実行されていない状態の情報に基づく解析結果は無効である。その場合には、ＣＦＧオブジェクトＯＢ１０２に紐付けられたパストレース情報を元に命令の解析結果を得る必要があるため、ステップＳ１００６で、プログラム解析処理部ＢＬ１０３は、無効な解析結果を除去しておく。
【００７８】
次に、プログラム解析処理部ＢＬ１０３は、得られた解析結果を出力する（ステップＳ１００７）。解析対象命令の解析結果に、その命令の解析に利用されたＣＦＧオブジェクトＯＢ１０２に関する情報を付加する。このとき付加するＣＦＧオブジェクトＯＢ１０２に付加する情報は、ＣＦＧオブジェクトＯＢ１０２に紐付けられた管理情報に含まれている識別情報であってもよいし、パストレース情報を含むＣＦＧオブジェクトＯＢ１０２そのものであってもよい。
【００７９】
プログラム解析処理部ＢＬ１０３は、解析結果を、人間が容易に解読可能な形式、あるいはコンピュータによるバッチ処理が可能な形式などで出力すればよい。
【００８０】
図１０は、人間が容易に解読可能な形式となった解析結果が画面に表示されている様子を示す図である。図１０の例では、データフローを示す画像の画像データを含めてＷｅｂブラウザで閲覧可能な形式となっている。図１１は、コンピュータがバッチ処理することができる形式の解析結果を示す図である。図１１の例では、ＸＭＬベースの言語で記述された解析結果（ＯＢ１２００）と、ＣＳＶ（ＯＢ１２０１）、バイナリデータなど機械処理可能な形式で出力する。これらの処理結果を元に、プログラム最適化処理部ＢＬ１０４は、ソフトウェアプログラムのソースコードＯＢ１０１を最適化する処理を行う。
【００８１】
上述したように最適化処理は様々考えられるが、例を挙げると、複数の命令の意味を解析してそれら複数の命令を含んだ処理を効率よく実現するようにコードを変換する処理、内部レジスタを自動更新する処理を含めた不要な命令の削除、制御構造を最適にする処理、異なるメモリ空間の変換、ＩＯに依存する命令の抽出、高可読性のコードの生成処理などである。
【００８２】
以上説明したように、本実施形態によると、間接アドレッシングモードの命令による影響を考慮しながらＣＦＧオブジェクトＯＢ１０２を生成でき、そのＣＦＧオブジェクトＯＢ１０２を元に制的解析によりソースコードＯＢ１０１の解析を実行することができる。その解析結果を、ブラウザなどでの可読性が高い方法で閲覧できるようにする手段や、コンピュータが認識可能な形式へ変換することで、ソースコード移行に係る工数削減や、最適化された変換済コードを生成できる。
【００８３】
また、本実施形態では、形式検証などに代表される不具合検証を目的とせず、動作が保証されたプログラムを元に解析するため、有限時間内で解析できることが多く、異なるマイコン間でソースコードＯＢ１０１を移植する場合に有用である。
【００８４】
また、本実施形態では、制御フローグラフ生成部（ＣＦＧ生成部ＢＬ１０１）が、ソースコードＯＢ１０１の構文を解析し、ソフトウェアプログラムを、内部に分岐および合流を有しない命令の集合である基本ブロックとその基本ブロック間の制御構造を示す有向グラフとで表わした制御フローグラフ（ＣＦＧ）を生成する。解決部（アドレス値解決部ＢＬ１０２）は、ソフトウェアプログラムの構文の解析で値が定まらない部分を未定とした制御フローグラフに基づいてソフトウェアプログラム内の所定の解決対象を探索し、制御フローグラフを用いて解決対象の到達定義を計算し、その到達定義から得られる値を制御フローグラフに反映することにより、制御フローグラフを再構成する。
【００８５】
これによれば、ソフトウェアプログラムを構文解析して得た制御フローグラフで未定値を生じさせている解決対象を探索し、その解決対象を制御フローグラフを用いて解決し、その解析で得た値を制御フローグラフに反映させることにより、未定値となっている部分を決定していく。構文解析では明らかとならない部分を制御フローグラフを用いて解決していくので、ソフトウェアプログラムをより適切に解析することが可能となる。
【００８６】
また、本実施形態では、解決部（アドレス値解決部ＢＬ１０２）は、制御フローグラフを再構成すると、解決した解決対象を始点としてプログラムパスを辿って次の解決対象を探索し、その解決対象を解決して制御フローグラフを再構成するという処理を、ソフトウェアプログラム内の全ての解決対象を解決するまで繰り返す。
【００８７】
これによれば、解決対象を探索して解決するという処理を全ての解決対象を解決するまで繰り返すので、ソフトウェアプログラムをより適切に解析することが可能となる。
【００８８】
また、本実施形態では、プログラム解析処理部ＢＬ１０３は、再構成された制御フローグラフに基づいてソースコードを解析する。再構成された制御フローグラフを用いてソースコードを解析することができるので、より適切にソフトウェアプログラムを解析することができる。
【００８９】
また、本実施形態によれば、プログラム解析処理部ＢＬ１０３は、制御フローグラフに基づくデータフロー解析によりソースコードを解析する。これによれば、データフロー解析でソースコードを解析するので、構文解析では未定値となってしまう部分を確定させることができる。
【００９０】
また、本実施形態では、プログラム解析処理部ＢＬ１０３は、ソースコードの解析により得た情報と、データフロー解析に用いた制御フローグラフと、を解析結果として出力する。これによれば、ソースコードの解析結果とともに制御フローグラフを出力するので、ソースコード解析の課程で行われたデータフロー解析の状況を知ることができる。
【００９１】
また、本実施形態によれば、解決部（アドレス値解決部ＢＬ１０２）は、制御フローグラフを再構成するとき、ソフトウェアプログラムの開始位置から制御フローグラフまでのプログラムパスを示すパストレース情報を制御フローグラフと共に記録し、パストレース情報を参照してソースコードの静的解析を実行する。これによれば、パストレース情報を記録しそれを参照してソフトウェアプログラムの静的解析を実行するので、パストレース情報が示すプログラムパスに沿ってソフトウェアの静的解析を進めることができる。
（他の実施形態）
【００９２】
上述の実施形態では、間接アドレッシングモードの命令を含むソースコードＯＢ１０１の解析を例示したが、ここでは他の実施形態として自己書き換えコードを含むソースコードの解析について例示する。
【００９３】
自己書き換えコードとは、ＭＯＶ命令などのデータコピー命令を利用し、プログラムを実行中に実行しているプログラムのプログラムコード記憶域のデータを書き換えることにより、プログラムの処理内容を更新する命令である。自己書き換えコードは、アセンブリ言語により簡単に記述可能であり、様々な用途で利用される。上述した実施形態で間接アドレッシングモードの命令に対応したのに対して、他の実施形態では、自己書き換えコードの命令に対応する。
【００９４】
図１２は、他の実施形態によるソースコード解析装置の一部を示すブロック図である。図１２には、本実施形態のソースコード解析装置は、図１に示したソースコード解析装置１００とは、アドレス値解決部ＢＬ１０２が自己書き換えコード解決部ＢＬ１３００へ置き換えられている点で異なることが示されている。
【００９５】
自己書き換えコード解決部ＢＬ１３００は、自己書き換えコード判定部ＢＬ１３０１と、自己書き換えコード識別部ＢＬ１３０２とを有している。
【００９６】
自己書き換えコード判定部ＢＬ１３０１は、入力されたＣＦＧオブジェクトＯＢ１０２内の命令に対して、その命令がメモリ領域にデータを書き込む命令である場合、そのメモリ領域がプログラム領域であるか判定する。データを書き込む命令でプログラム領域を書き換える命令であれば、その命令は自己書き換えコードである。
【００９７】
自己書き換えコード識別部ＢＬ１３０２は、当該命令が自己書き換えコードであれば、その命令で書き込まれる値を取得し、その値から具体的なメモリの内容を識別する。自己書き換えコードによって書き換えられたメモリの内容が分かれば、ソースコードＯＢ１０１の解析が可能となる。
【００９８】
自己書き換えコード判定部ＢＬ１３０１は、命令が自己書き換えコードであるか否かを判定するための指標として、メモリにおけるプログラム領域のアドレス情報を定義したプログラム域定義リストＯＢ１３０１を保持している。
【００９９】
メモリのプログラム領域を知る方法として、例えば、以下に示す３つの方法がある。ひとつ目は、ソースコードから判定する方法である。二つ目は、マイコンのマニュアルから判定する方法である。三つ目は、ソースコードＯＢ１０１のデータフローを解析し、プログラムカウンタの情報を頼りに実行コードとして参照されるメモリ領域から判定する方法である。
【０１００】
また、自己書き換えコード識別部ＢＬ１３０２は、メモリのプログラム領域に書き込まれる値（バイナリ値）と、その値が示す命令についての情報（命令情報）との対応関係を示す情報を保持する命令コードテーブルＯＢ１３０２を有している。命令コードテーブルＯＢ１３０２に格納する情報は、主にマイコンの仕様書から取得できる。
【０１０１】
図１３は、他の実施形態によるソースコード解析装置の解析処理のフローチャートである。
【０１０２】
まず、ソースコード解析装置１００は、図４の間接アドレッシングモードの命令を解析するときと同様に、ソースコードＯＢ１０１からＣＦＧを生成した後、ソースコードＯＢ１０１に自己書き換えコードが存在するか否か確認する（ステップＳ１４００）。ある命令が自己書き換えコードであるかどうかは、プログラム域定義リストＯＢ１３０１を元に、命令によりデータが書き込まれるメモリアドレスがプログラム領域であるか否か判定し、データが書き込まれるメモリアドレスがプログラム領域であれば、その命令は自己書き換えコードであると判定する。
【０１０３】
ソースコードＯＢ１０１中に自己書き換えコードの存在を確認した場合、ソースコード解析装置１００は、入力によって指定されたＣＦＧオブジェクトＯＢ１０２を探索対象として設定する（ステップＳ１４０１）。
【０１０４】
次に、ソースコード解析装置１００は、探索対象のＣＦＧオブジェクトＯＢ１０２のプログラムパスを先頭から辿り、自己書き換えコードがあるか否か探索する（ステップＳ１４０２）。
【０１０５】
プログラムパスを辿ってソフトウェアプログラムの終了位置に到達した場合にはソースコード解析装置１００はソースコードＯＢ１０１の解析ができない旨のエラーを出力し（ステップＳ１４０９）、処理を終了する。
【０１０６】
プログラムパスを辿っていく中で分岐を発見したら、ソースコード解析装置１００は、間接アドレッシングモードの命令を発見したときと同様、分岐先ごとに非決定的に探索を行う。ソースコード解析装置１００は、自己書き換えコードについて、探索で利用したＣＦＧオブジェクトＯＢ１０２を基に到達定義を計算し、書き込まれる値を同定する（ステップＳ１４０３）。この書き込まれる値は、命令の内容を識別するのに利用される。
【０１０７】
次に、ソースコード解析装置１００は、ステップＳ１４０３の処理で得られた値から、命令コードテーブルＯＢ１３０２を参照して新たに書き換わる命令の内容を取得し、その命令を表わすコードが有効なものであるか否か検証する（ステップＳ１４０４）。その命令が有効なものでなければ、ソースコード解析装置１００は、ソースコード２０を解析できない旨を示すエラーを出力して処理を終了する（ステップＳ１４０９）。
【０１０８】
その命令が有効なものであれば、ソースコード解析装置１００は、探索対象のＣＦＧオブジェクトＯＢ１０２を複製し、書き換わる命令の情報を基にＣＦＧオブジェクトＯＢ１０２を再構成する（ステップＳ１３０５）。
【０１０９】
更に、ソースコード解析装置１００は、間接アドレッシングモードの命令の場合と同様、解析終了条件が満たされているか否か確認する（ステップＳ１４０６）。解析終了条件が満たされて入れば、ソースコード解析装置１００は処理を終了する。解析終了条件が満たされていなければ、ソースコード解析装置１００は、再構成されたＣＦＧオブジェクトＯＢ１０２（再構成ＣＦＧオブジェクトＯＢ３０１）をＣＦＧ管理テーブルＯＢ１０３へ登録する（ステップＳ１４０７）。更に、ソースコード解析装置１００は、再構成ＣＦＧオブジェクトＯＢ３０１を探索対象に設定し（ステップＳ１４０８）、ステップＳ１４０２に戻り、解析終了条件が満たされるまで処理を繰り返す。
【０１１０】
以上の処理により、ソースコード解析装置１００は、自己書き換えコードを含むソースコードＯＢ１０１のＣＦＧオブジェクトＯＢ１０２を取得することができる。また、ソースコード解析装置１００は、そのＣＦＧオブジェクトＯＢ１０２を利用してソースコードＯＢ１０１の静的解析を実現できる。間接アドレッシングモードの場合と同様、得られたＣＦＧから得られた解析結果を、様々な形式へ変換することで、ソースコードＯＢ１０１の移植に係る工数を削減したり、あるいは最適化された変換済のソースコードを自動生成したりすることも可能となる。
【０１１１】
上述した本発明の各実施形態は、本発明の説明のための例示であり、本発明の範囲をそれらの実施形態にのみ限定する趣旨ではない。当業者は、本発明の要旨を逸脱することなしに、他の様々な態様で本発明を実施することができる。
【符号の説明】
【０１１２】
１００…ソースコード解析装置、ＢＬ１０１…ＣＦＧ生成部、ＢＬ１０２…アドレス値解決部、ＢＬ１０３…プログラム解析処理部、ＢＬ１０４…プログラム最適化処理部、ＢＬ１３００…コード解決部、ＢＬ１３０１…コード判定部、ＢＬ１３０２…コード識別部、ＢＬ３０１…プログラムパス探索部、ＢＬ３０２…データフロー解析部、ＢＬ３０３…ＣＦＧ再構成部、ＢＬ３０４…ＣＦＧ検証部、ＯＢ１０１…ソースコード、ＯＢ１０２…ＣＦＧオブジェクト、ＯＢ１０３…ＣＦＧ管理テーブル、ＯＢ１０５…プログラム解析結果、ＯＢ１０６…ソースコード、ＯＢ１３０１…プログラム域定義リスト、ＯＢ１３０２…命令コードテーブル、ＯＢ３０１…再構成ＣＦＧオブジェクト
【図１】
2016181228.tif 000004
【図２Ａ】
2016181228.tif 000005
【図２Ｂ】
2016181228.tif 000006
【図３】
2016181228.tif 000007
【図４】
2016181228.tif 000008
【図６】
2016181228.tif 000009
【図７】
2016181228.tif 000010
【図８】
2016181228.tif 000011
【図９】
2016181228.tif 000012
【図１０】
2016181228.tif 000013
【図１１】
2016181228.tif 000014
【図１２】
2016181228.tif 000015
【図１３】
2016181228.tif 000016
【図５】
2016181228.tif 000017