(57)【要約】【課題】ユーザによるプログラム理解またはコンピュータによるソースコードの解析を容易にする。【解決手段】ソースコードを外部の表示装置へ表示させる情報処理装置１は、表示対象のソースコードを記録する記録部５と、ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部２と、ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部３と、依存関係に従って、基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記依存関係の連鎖の段階に応じて分類するステートメント分類部４と、分類ごとにステートメントの表示態様を決定し、分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置１２へ表示させる表示制御部７とを有する。【選択図】図２
2008282174.tif 000002
【特許請求の範囲】
【請求項１】
一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる情報処理装置であって、
表示対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御部とを備える情報処理装置。
【請求項２】
前記依存関係解析部は、ソースコードにおいて、ステートメントと、当該ステートメントが示す処理の実行の有無を決定する条件分岐ステートメントとの依存関係である制御依存関係と、変数の値を決定する処理を示すステートメントと、当該変数の値が再決定される前に当該変数を参照する処理を示すステートメントとの依存関係であるデータ依存関係とを、前記依存関係として解析し、
前記ステートメント分類部は、
前記基準となるステートメントを第１の分類とし、
第（２Ｎ−１）（Ｎは１以上の整数）の分類のステートメントを実行するか否かを決定する条件分岐ステートメントを、前記依存関係解析部で解析された制御依存関係を基に抽出して第２Ｎの分類とする第２Ｎ分類抽出処理と、
前記第２Ｎ分類とされた前記条件分岐ステートメントにおける条件判定で参照される変数値を決定する処理を示すステートメントを、前記依存関係解析部で解析されたデータ依存関係を基に抽出し、第（２Ｎ＋１）の分類とする第（２Ｎ＋１）分類処理とを、所定の条件が満たされるまでＮを１ずつ加算して繰り返すことを特徴とする、請求項１に記載の情報処理装置。
【請求項３】
前記ステートメント選択部は、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付けて、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択し、
前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類することを特徴とする、請求項１または２に記載の情報処理装置。
【請求項４】
前記ステートメント選択部は、不正な値が設定された変数を参照する処理が実行される可能性のあるステートメントの指定を外部から受け付けて、当該指定されたステートメントで参照される変数の値を決定する値決定ステートメントを前記ソースコード中から選択し、
前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの前記依存関係の連鎖の段階に応じて分類することを特徴とする、請求項１または２に記載の情報処理装置。
【請求項５】
どの分類のステートメントを強調表示させるかを示す情報を、外部からの入力に基づいて生成し、前記表示制御部へ通知する更新部をさらに備え、
前記表示制御部は、前記更新部から前記情報が通知された場合に、前記情報が示す分類のステートメントが強調表示されるように前記ソースコードを前記表示装置への表示させる、請求項１〜４のいずれか１項に記載の情報処理装置。
【請求項６】
どの分類のステートメントを強調表示させるかを示す情報を、一定時間ごとに自動的に生成し、前記表示制御部へ通知する更新部をさらに備え、
前記表示制御部は、前記更新部から通知された情報が示す分類のステートメントを強調表示するように、ステートメントの表示態様を決定する、請求項１〜４のいずれか１項に記載の情報処理装置。
【請求項７】
一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、
解析対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定部とを備える、情報処理装置。
【請求項８】
一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、
解析対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定部とを備える、情報処理装置。
【請求項９】
一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御処理とをコンピュータに実行させる情報処理プログラム。
【請求項１０】
一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる、情報処理プログラム。
【請求項１１】
一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる、情報処理プログラム。
【請求項１２】
一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させるコンピュータによる情報処理方法であって、
前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で生成された依存関係データを用いて、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様でステートメントを表示することを示す信号を外部の表示装置へ送信する表示制御工程とを含む情報処理方法。
【請求項１３】
一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、
前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で生成された前記依存関係データを用いて、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定工程とを含む、情報処理方法。
【請求項１４】
一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、
前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で解析された前記依存関係データを用いて、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定工程とを含む、情報処理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータ等で実行されるプログラムのソースコードの表示または解析するための情報処理装置、情報処理方法および情報処理プログラムに関するものである。
【背景技術】
【０００２】
プログラム開発用に使われるソフトウエア（例えば、開発環境、エディタ等）では、ソースコードを表示する際にソースコードの構造を理解しやすくするために、さまざまな工夫がなされている。
【０００３】
例えば、Ｃ言語のソースコードの表示方法として、プリプロセスによって削除される行を、削除したり、目立たない色で表示したり、あるいは、そのような行を省略したことを示す情報を表示したりする方法が開示されている（例えば、特許文献１参照）。この方法により、ソースコード参照時の視認性を向上させ、ユーザは、ソースコードの働きを理解しやすくなる。
【０００４】
また、特定のキーワードや記号等を所定の色で表示することで、ソースコードの視認性を向上させる方法も開示されている（例えば、非特許文献１参照）。さらに、ユーザの指定したステートメントが依存するステートメントを強調表示することで、ソースコードの構造を理解しやすくする方法を開示している（例えば、非特許文献２参照）。
【０００５】
この方法では、まず、ソースコードに含まれるステートメント間の依存関係が解析されてプログラム依存グラフ（Ｐｒｏｇｒａｍ  Ｄｅｐｅｎｄｅｎｃｅ  Ｇｒａｐｈ，ＰＤＧ）で表される依存関係データが生成される。プログラム依存グラフは、ソースコードのステートメント間の依存関係を表すグラフである。ユーザの指定したステートメントから、プログラム依存グラフで示される依存関係を辿っていくことで、ユーザの指定したステートメントの処理に影響を与えるあるステートメント群が抽出される。そして、抽出されたステートメント群は、ソースコード中で強調表示される。これにより、ユーザは、選択したステートメントの処理に影響を与えるステートメントがソースコード中でどこにあるかを認識することができる。
【０００６】
しかし、上記に示す従来の方法は、基準ステートメントに影響を与えるステートメントをすべて同列に扱って強調表示するため、ユーザの選択した基準ステートメントが、他の多くのステートメントから影響を受ける場合には強調表示されるステートメントも多くなり、プログラム構造が理解しやすくならない。また、このような場合、基準ステートメントに影響を与えるステートメントを解析することが困難になる。
【０００７】
例えば、図４に示すソースコードで、１３行目のステートメントを基準ステートメントとして、基準ステートメントに影響を与えるステートメントを強調表示すると、図１６のように、ソースコード中の大部分のステートメントが強調表示される。そのため、強調表示の効果が得られない。また、基準ステートメントに影響を与えるステートメントの解析も困難になる。
【特許文献１】特開２０００−２１５０３７号公報
【非特許文献１】Richard M. Stallman, Gnu Emacs Manual: For Version 21, Free Software Foundation, 2002
【非特許文献２】Wayne, R., Surf the Code: A Review of GrammaTech's CodeSurfer. Software Development Magazine, 2002.
【発明の開示】
【発明が解決しようとする課題】
【０００８】
そこで、本発明は、ユーザによるソースコードの理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置、情報処理方法、および情報処理プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００９】
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる情報処理装置であって、表示対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御部とを備える。
【００１０】
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、基準となるステートメントから依存関係によって繋がるステートメント群が、基準となるステートメントからの依存関係の連鎖の段階に応じて分類され、分類ごとに決定されたそれぞれの表示態様でステートメントが表示される。そのため、ユーザは、基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群において、その連鎖の各段階におけるステートメントを認識することができる。その結果、ユーザは、例えば、その時の状況に応じて、必要とする段階のステートメントだけに絞り込んで注目することができる。ひいては、ユーザによるソースコードが示すプログラムの理解を容易にすることができる。
【００１１】
ここで、ステートメントとは、ソースコードで記述されるプログラムを主に構成する主要単位である。ステートメントは、例えば、プログラムが示す一連の動作における１段階の処理または１組の宣言を表す。ステートメントは、文、命令文、命令等と呼ばれることがある。ステートメントはソースコード中では、例えば、文字列で表される。開発者は、ソースコード中で各ステートメントを区別して識別することができる。１ステートメントが示す処理の範囲はプログラム言語によって異なる。また、ソースコード中での表示形式もプログラム言語によって異なる。
【００１２】
ここで、２つのステートメントのうち、一方の処理によって、他方の処理が影響を受ける場合に、それら２つのステートメントは依存関係を有するものとする。
【００１３】
本発明にかかる情報処理装置において、前記依存関係解析部は、ソースコードにおいて、ステートメントと、当該ステートメントが示す処理の実行の有無を決定する条件分岐ステートメントとの依存関係である制御依存関係と、変数の値を決定する処理を示すステートメントと、当該変数の値が再決定される前に当該変数を参照する処理を示すステートメントとの依存関係であるデータ依存関係とを、前記依存関係として解析することができる。前記ステートメント分類部は、前記基準となるステートメントを第１の分類とし、第（２Ｎ−１）（Ｎは１以上の整数）の分類のステートメントを実行するか否かを決定する条件分岐ステートメントを、前記依存関係解析部で解析された制御依存関係を基に抽出して第２Ｎの分類とする第２Ｎ分類抽出処理と、前記第２Ｎ分類とされた前記条件分岐ステートメントにおける条件判定で参照される変数値を決定する処理を示すステートメントを、前記依存関係解析部で解析されたデータ依存関係を基に抽出し、第（２Ｎ＋１）の分類とする第（２Ｎ＋１）分類処理とを、所定の条件が満たされるまでＮを１ずつ加算して繰り返す態様とすることができる。
【００１４】
上記構成により、基準となるステートメントを実行するか否かに対して連鎖的に影響を与えるステートメント群が、その連鎖の数に応じて各段階に分類される。すなわち、第１分類のステートメントの実行の有無を決定する条件分岐ステートメントが第２分類となり、第２分類のステートメントの分岐の方向を決めるステートメントが第３分類に、第３分類のステートメントの実行の有無を決定する条件分岐ステートメントが第４分類に、というようにして、第１分類のステートメントに連鎖的に依存関係を有するステートメント群が、１つ分の依存関係の連鎖の段階ごとに、分類されていく。これにより、依存関係によって連鎖的に繋がるステートメント群を、基準となるステートメントからの、依存関係の連鎖の数ごとに、複数の階層に分類することができる。そのため、第１分類のステートメントに対して連鎖的に依存関係を持つステートメント群を、依存関係を遡って段階ごとに表示態様を決定することが可能になる。
【００１５】
本発明にかかる情報処理装置において、前記ステートメント選択部は、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付けて、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択し、前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類する態様とすることができる。
【００１６】
上記構成により、外部から指定されたリソース確保ステートメントで確保されたリソースを開放するステートメントと依存関係によって連鎖的に繋がるステートメント群が、依存関係の連鎖の段階に応じて分類されることになる。この分類ごとに表示態様が決定されてステートメントが表示されるので、ユーザは、リソースを解放するステートメントからの依存関係の連鎖の段階ごとに、ステートメントを区別して認識することができる。そのため、ユーザにとって、ソースコードを見てメモリリークの有無を確認することが容易になる。
【００１７】
本発明にかかる情報処理装置において、前記ステートメント選択部は、不正な値が設定された変数を参照する処理が実行される可能性のあるステートメントの指定を外部から受け付けて、当該指定されたステートメントで参照される変数の値を決定する値決定ステートメントを前記ソースコード中から選択し、前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの前記依存関係の連鎖の段階に応じて分類する態様とすることができる。
【００１８】
上記構成により、外部から指定されたステートメントで参照される変数の値を決定する処理を示す値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、依存関係の連鎖の段階に応じて分類することになる。この分類ごとに決定された表示態様でステートメントが表示される。これにより、ユーザは、値決定ステートメントからの依存関係の連鎖の段階ごとに、ステートメントを区別して認識することができる。その結果、ユーザは、ソースコードを見て不正な値が設定された変数が参照されるか否かを確認することが容易になる。
【００１９】
本発明にかかる情報処理装置は、どの分類のステートメントを強調表示させるかを示す情報を、外部からの入力に基づいて生成し、前記表示制御部へ通知する更新部をさらに備え、前記表示制御部は、前記更新部から前記情報が通知された場合に、前記情報が示す分類のステートメントが強調表示されるように前記ソースコードを前記表示装置への表示させる態様とすることができる。
【００２０】
上記構成により、更新部は、外部からの入力に基づいて、強調表示させるステートメントの分類を示す情報を生成する。表示制御部は、更新部から通知された情報に基づいて、外部からの入力に基づく分類のステートメントが強調表示されるように表示装置へソースコードを表示させる。そのため、例えば、ユーザによる強調表示箇所の指示等のような外部入力に基づいて、強調する部分を分類ごとに更新することができる。
【００２１】
本発明にかかる情報処理装置は、どの分類のステートメントを強調表示させるかを示す情報を、一定時間ごとに自動的に生成し、前記表示制御部へ通知する更新部をさらに備え、前記表示制御部は、前記更新部から通知された情報が示す分類のステートメントを強調表示するように、ステートメントの表示態様を決定する態様とすることができる。
【００２２】
これにより、一定時間ごとに強調表示するステートメントの分類を変化させて表示することが可能になる。
【００２３】
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、解析対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定部とを備える。
【００２４】
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、リソース解放ステートメントから連鎖的に繋がるステートメント群が、その依存関係の連鎖の段階に応じて分類される。判定部は、リソース解放ステートメントから、前記分類ごとに順次ステートメントを解析する。これにより、判定部は、リソース解放ステートメントから順に、依存関係の連鎖を段階的に辿りながら、リソース解放ステートメントが実行されない場合があり得るか否かを判定することができる。その結果、解析対象のステートメントにおいて確保されたリソースの解放し忘れが発生し得るか否かを、効率よく判定することが可能になる。
【００２５】
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、解析対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定部とを備える。
【００２６】
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、値決定ステートメントからの依存関係の連鎖の段階に応じて、値決定ステートメントと依存関係によって繋がるステートメント群が分類される。判定部は、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析する。これにより、判定部は、値決定ステートメントから順に、依存関係の連鎖を段階的に辿りながら、不正な値が変数の値として決定され得るか否かを判定することができる。その結果、不正な値が設定された変数を参照する処理が発生する可能性の有無を、効率よく判定することができる。
【００２７】
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御処理とをコンピュータに実行させる。
【００２８】
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる。
【００２９】
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる。
【００３０】
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させるコンピュータによる情報処理方法であって、前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択工程と、前記依存関係解析工程で生成された依存関係データを用いて、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様でステートメントを表示することを示す信号を外部の表示装置へ送信する表示制御工程とを含む。
【００３１】
本発明にかかる情報処理方法は、一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択工程と、前記依存関係解析工程で生成された前記依存関係データを用いて、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定工程とを含む。
【００３２】
本発明にかかる情報処理方法は、一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択工程と、前記依存関係解析工程で解析された前記依存関係データを用いて、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定工程とを含む。
【発明の効果】
【００３３】
本発明によれば、ユーザによるソースコードの理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置、情報処理方法、および情報処理プログラムを提供することができる。
【発明を実施するための最良の形態】
【００３４】
以下本発明の実施の形態について、図面を参照しながら説明する。
【００３５】
（実施の形態１）
本発明の実施の形態１は、ソースコードで示される処理におけるメモリリークの有無の確認が容易になるようにソースコードを表示する機能を有する情報処理装置である。
【００３６】
［メモリリークについて］
ここで、メモリリークとその確認作業について説明する。メモリリークとは、プログラム実行時に確保されたメモリ領域が、使用されなくなってからも解放されず、メモリ領域を無駄に消費している状態のことである。例えば、プログラムがコンピュータに実行させる一連の処理において、メモリ確保関数が呼び出されたあと、そのメモリ確保関数と対となるメモリ解放関数が呼び出されずに一連の処理が終了する場合にメモリリークが発生する。なお、メモリリークの原因はこれに限られない。
【００３７】
図１は、Ｃ言語で記述されたプログラムのソースコードの一例を示す図である。図１に示すソースコードにおいて、各行の左端の２桁の数字は行番号であり、２桁目以降にステートメントが記述されている。Ｃ言語のソースコードでは、ステートメントの終わりはセミコロン「；」で表される。０２、０３行目は、変数ａ、ｐの宣言処理をそれぞれ示すステートメントである。変数ｐの前の＊は変数ｐがポインタであることを示す。０４行目の場合、制御文「ＩＦ」と条件式（ａ＞０）とが合わせて１ステートメントとして扱われてもよい。０３行目の関数「ｍａｌｌｏｃ」および０８行目の関数「ｆｒｅｅ」は、例えば、ＡＮＳＩ  Ｃ  ランタイムライブラリで提供されるＣ言語の関数である。なお、Ｃ言語において何を１ステートメントとするかは、本実施形態に示す例に限られない。
【００３８】
図１に示すソースコードでは、０３行目でメモリ確保関数ｍａｌｌｏｃが呼び出されることによりメモリ領域が確保される。確保されたメモリ領域のメモリアドレスは、関数の戻値として返され、ｐに代入される。
【００３９】
その後、０７行目のＩＦ文の条件式「ａ＞０」が真である場合には、０８行目のメモリ解放関数ｆｒｅｅが呼び出されて、０３行目で確保されたメモリ領域が解放される（引数ｐは、解放すべきメモリのアドレスを表す）。
【００４０】
しかし、０７行目のＩＦ文の条件式「ａ＞０」が偽である場合、メモリ解放関数ｆｒｅｅは呼び出されない。そのため、０３行目で確保されたメモリ領域が解放されず、メモリリークが発生する。
【００４１】
メモリリークにより解放されないメモリが蓄積すると、システムが使用可能なメモリが徐々に失われていく。最終的には、メモリ不足によりプログラムが実行できなくなったり、システム自体が停止したりするといった問題が発生するので、開発者はメモリリークが発生しないよう注意しなくてはならない。
【００４２】
そのため、開発者は、ソースコードを精査し、確保されたメモリが解放されずに処理が終了するような実行パスがあるかどうかを確認する作業（メモリリークの確認）をする必要がある。このような作業は、例えば、開発者が人手でソースコードをレビューする際や、メモリリーク検出ツールの検出結果を確認する際等に実施される。
【００４３】
ここで実行パスとは、ステートメントを実行される順に並べたものであり、ステートメントＡからステートメントＢへの実行パスとはＡを起点、Ｂを終点として、ＡからＢまでのステートメントを実行される順に並べたものを表す。
【００４４】
メモリリーク検出ツールは、ソースコードを解析して、メモリリークが発生する実行パスを検出するソフトウエアである。メモリリーク検出ツールの検出結果は、実際にはリークが発生しない実行パス（誤検出パス）を含んでいることが少なくないため、検出ツールのユーザは、検出結果の実行パスを１つ１つチェックして、実際にメモリリークが発生するかどうかを精査しなければならない。
【００４５】
メモリリーク検出ツールにおいて誤検出パスが発生する原因はツールによってさまざまであるが、典型的なパターンとして、条件分岐ステートメントの条件式の判定結果を加味しないために、実際には通り得ない実行パスを検出する例が挙げられる。
【００４６】
このように、開発者は、メモリリークの確認をする際、ソースコードの構造を詳細に理解しながら作業を進める必要がある。実施の形態１における情報処理装置は、ユーザのソースコードの構造理解を助け、メモリリークの確認を容易にすることが可能となるようにソースコードを表示する情報処理装置の例である。
【００４７】
［情報処理装置の構成］
以下、実施の形態１における情報処理装置について、図面を参照しながら説明する。図２は、実施の形態１における情報処理装置の構成を表す機能ブロック図である。図２に示す情報処理装置１は、依存関係解析部２、ステートメント選択部３、ステートメント分類部４、記録部５、更新部６および表示制御部７を備える。
【００４８】
情報処理装置１は、ＣＰＵおよびメモリを含むコンピュータにより実現することができる。依存関係解析部２、ステートメント選択部３、ステートメント分類部４、更新部６および表示制御部７の各部は、コンピュータのＣＰＵが所定のプログラムに従って動作することにより実現される。また、記録部５は、コンピュータの内蔵記憶装置またはこのコンピュータからアクセス可能な記憶装置によって具現化される。また、依存関係解析部２、ステートメント選択部３、ステートメント分類部４、更新部６および表示制御部７の機能をコンピュータで実現するためのプログラムまたはそれを記録した記録媒体も本発明の一実施態様である。
【００４９】
情報処理装置１は、入力装置１１および表示装置１２に接続されている。入力装置１１は、ユーザが情報処理装置１へ情報を入力するための装置であり、例えば、マウスおよびキーボード等で実現される。表示装置１２は、情報処理装置１から出力される画像信号に基づいて画像を表示する装置であり、例えば、ＣＲＴ、液晶ディスプレイ、プラズマディスプレイ、ＳＥＤまたは有機ＥＬディスプレイ等のディスプレイであってもよいし、プロジェクタ、プリンタ等であってもよい。
【００５０】
依存関係解析部２は、記録部５に記録されたソースコードを読み出して、ソースコードに含まれるステートメント間の依存関係を解析し、依存関係を表すデータを記録部５に記録する。例えば、依存関係解析部２は、まず、ソースコードで示されるプログラムを解釈し、ソースコードに含まれるステートメントを抽出する。続いて、依存関係解析部２はステートメント間の依存関係を調べ、例えば、プログラム依存グラフを表すデータのような依存関係データを生成し記録部５へ記録する。プログラム依存グラフについては後述する。
【００５１】
本実施形態では、一例として、依存関係は以下に示す制御依存関係およびデータ依存関係で表される場合について説明する。
【００５２】
例えば、プログラム中のＡ、Ｂという２つのステートメントについて、ｉ）Ａが条件分岐であり、ｉｉ）Ｂの実行がＡの判定結果に依存するとき、Ａ、Ｂの間には制御依存関係が存在するという。
【００５３】
また、プログラム中のＡ、Ｂという２つのステートメントについて、ｉ）Ａが変数Ｖを定義（決定）し、ｉｉ）Ｂが変数Ｖを参照し、ｉｉｉ）ＡからＢへに至るまでのすべての実行パスについて、Ｖの再定義（再決定）が発生しない実行パスが少なくとも１つ存在するとき、Ａ、Ｂの間にはデータ依存関係が存在するという。
【００５４】
表示制御部７は、記録部５に記録されたソースコードを表示装置１２へ表示させる。ユーザは、表示装置１２に表示されたソースコードを見て、メモリリークの確認作業を行う。例えば、メモリリークの確認作業の初期段階において、ユーザは、表示装置１２に表示されたソースコード中のステートメントのうち、作業の対象としたいステートメントを示す情報等を、入力装置１１を用いて入力することができる。具体的には、ユーザは、表示装置１２に表示されたソースコードに含まれるステートメントのうち、所望のステートメントをマウス等でクリックすることでそのステートメントを選択することができる。
【００５５】
ステートメント選択部３は、ユーザからの入力を、入力装置１１を介して受け付け、前記入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメント（以下、基準ステートメントと称する）を選択する。ステートメント選択部３は、選択した基準ステートメントをステートメント分類部４に通知する。
【００５６】
ステートメント分類部４は、記録部５に記録されたプログラム依存グラフが示すステートメント間の依存関係を参照し、基準ステートメントから依存関係によって連鎖的に繋がるステートメント群を、基準ステートメントからの依存関係の連鎖の度合いに応じて分類する。ステートメント分類部４は、分類結果を表示制御部７へ通知する。
【００５７】
ステートメントの分類方法の詳細は後述するが、例えば、以下のように基準ステートメントから依存関係によって連鎖的に繋がるステートメント群を、分類１、２、３・・・２ｎ、２ｎ＋１、・・・に分類することができる。
【００５８】
分類１：基準ステートメント
分類２：分類１の実行を決定する条件分岐ステートメント
分類３：分類２の分岐方向を決定するステートメント
…
分類２ｎ：分類２ｎ−１の実行を決定する条件分岐ステートメント
分類２ｎ＋１：分類２ｎの分岐方向を決定するステートメント
…
表示制御部７は、ステートメント分類部４により通知されたステートメントの分類によって、そのステートメントの表示態様を決定する。例えば、表示制御部７は、分類１ならば赤、分類２ならば青…といったように、分類によってステートメントの色づけを決定してもよい。表示制御部７は、決定した表示態様を表示装置１２に通知し、表示態様に従ったステートメントを表示装置１２へ表示させる。これにより、表示装置１２にはステートメント分類部４で生成された分類ごとに決定された表示態様でステートメントが表示される。なお、表示制御部７は、ユーザが選択したステートメントについても表示態様を決定し、その表示態様で表示装置１２に表示させてもよい。
【００５９】
更新部６は、例えば、どの分類のステートメントを強調表示させるかのユーザによる選択等の入力を、入力装置１１を介して受け付け、この入力に基づいて、強調表示させる分類のステートメントを示す情報を生成し、表示制御部７へ通知する。
【００６０】
例えば、ユーザは、分類１、２を強調表示し、他の分類は強調しないことを示す指示および表示更新の指示の入力を、入力装置１１を用いて行う。ユーザの指示の入力を受けた更新部は、強調表示する分類１、２と更新指示を示す更新信号を生成し表示制御部７へ送信する。表示制御部７は、更新信号を受けた時点で、分類１、２のステートメントを強調表示するよう表示装置１２に表示画像を更新させる。また、更新部６は、ユーザから表示の終了の指示を受け付け、表示の終了を指示する終了信号を生成して表示制御部７に送信してもよい。
【００６１】
なお、本実施形態では、ユーザの指示に基づいて更新信号、終了信号が送信されることになっているが、更新部６は、ユーザが指示に基づくのではなく、例えば、タイマ等を用いて定期的に更新信号が送信されるようにすることも可能である。これにより、例えば、分類１〜ｎまでのステートメントを、分類ごとに、一定時間間隔で順次、強調表示することができる。
【００６２】
［情報処理装置１の動作例］
次に、情報処理装置１の動作例を説明する。図３は、情報処理装置１がソースコードを表示する動作の一例を示すフローチャートである。ここで、一例として、ユーザが、ソースコードで示される処理において、メモリリークが発生し得るか否かを確認する際に、その確認作業を容易にするための情報処理装置１によるソースコード表示について説明する。
【００６３】
図３において、まず、表示制御部７は、表示するべきソースコードを記録部５から読み出して表示装置１２に表示させる（ステップ３０１）。これにより、ユーザは、表示されたソースコードに含まれるステートメントの中からメモリリーク確認作業の対象とするメモリ確保ステートメントを選択することができる。
【００６４】
依存関係解析部２は、記録部５から読み出したソースコードを解釈し、ソースコードに含まれるステートメント間の依存関係を調査して、プログラム依存グラフを作成する（ステップ３０２）。プログラム依存グラフは、依存関係を表すデータとして記録部５に記録される。なお、依存関係の調査の詳細については後述する。
【００６５】
ステートメント選択部３は、ユーザによるメモリ確保ステートメントの選択を、入力装置１１を介して受け付ける（ステップ３０３）。ステートメント選択部３は、ソースコードの中から、上記メモリ確保ステートメントで確保されたメモリを解放する処理を示すステートメント（メモリ解放ステートメント）を、基準ステートメントとして抽出する（ステップ３０４）。
【００６６】
なお、本実施形態ではメモリ解放ステートメントが基準ステートメントとなる場合を例示するが、基準ステートメントはこれに限られない。例えば、ユーザが選択したメモリ確保ステートメントを基準ステートメントとすることもできる。
【００６７】
次に、ステートメント分類部４が、ステップ３０２で作成されたプログラム依存グラフに基づいて、基準ステートメント（メモリ解放ステートメント）と依存関係によって連鎖的に繋がるステートメント群を、分類１、２、・・・２ｎ、２ｎ＋１、・・・に分類する（ステップ３０５）。すなわち、基準ステートメントと依存関係によって連鎖的に繋がるステートメント群それぞれに、分類１、２、・・・２ｎ、２ｎ＋１、・・・のいずれかを示すデータが割り当てられることになる。分類結果を示すデータは、表示制御部７に通知される。なお、分類方法の詳細は後述する。
【００６８】
上記ステップ３０５の分類処理が終了すると、表示制御部７は、更新部６から、更新信号または終了信号が送信されてくるまで待つ（ステップ３０６）。更新部６は、ユーザから、どの分類のステートメントを強調表示させるかを示す情報の入力を受け付け、その情報の入力があった場合は、更新信号を生成して表示制御部７へ送信する。更新信号には、強調表示する分類を示す情報と、更新指示を示す情報とが含まれる。また、ユーザから表示終了の指示の入力があった場合、更新部６は、終了信号を生成して表示制御部７へ送信する。
【００６９】
表示制御部７は、終了信号を受信した場合（ステップ３０７でＹ）、表示装置１２にソースコードの表示を終了させる。表示制御部７は、終了信号でなく更新信号を受信すると（ステップ３０７でＮ、かつステップ３０８でＹ）、受信した更新信号と、ステップ３０５で各ステートメントに割り当てられた分類に基づいて、各ステートメントの表示態様を決定する（ステップ３０９）。
【００７０】
そして、表示制御部７は、ステップ３０８で決定した表示態様で各ステートメントを表示するように、表示装置１２にソースコード表示を更新させる（ステップ３１０）。その後、表示制御部７は、更新信号または終了信号を受信するまで待機する（ステップ３０６）。
【００７１】
このように、表示制御部７は、更新信号を受信する度に、表示態様の決定処理（ステップ３０９）および表示処理（ステップ３１０）を実行するので、ユーザからの入力に基づいて、強調表示するステートメントを分類ごとに変化させることができる。これにより、メモリ解放ステートメントと依存関係によって連鎖的に繋がるステートメント群、すなわち、メモリ解放ステートメントが依存するステートメント群を、ユーザが分類ごとに区別して視認できるように表示することができる。すなわち、メモリ領域の解放処理に関連する箇所をソースコード全体から絞り込み、関連の仕方によって各ステートメントを区別できるように表示することができる。そのため、ユーザのソースコードの構造理解を助け、メモリリークの確認作業を容易にすることが可能となる。
【００７２】
以下、図３に示すフローチャートにおける、依存関係解析処理（ステップ３０２）、ステートメント分類処理（ステップ３０５）およびステートメントの表示形態決定処理（ステップ３０９）それぞれについて、より詳細な具体例を説明する。
【００７３】
［依存関係解析処理（ステップ３０２）の具体例］
図４は、Ｃ言語のソースコードの一例を示す図であり、図５は、図４に示すソースコードに含まれるステートメント間の依存関係を表すプログラム依存グラフである。本具体例では、依存関係解析部２は、図４に示すソースコードを記録部５読み込んで、図５に示すプログラム依存グラフを表すデータを生成する。このプログラム依存グラフの生成には公知のプログラム依存グラフ作成アルゴリズムを用いることができる。
【００７４】
プログラム依存グラフは、「節点」、と「辺」によって表される。特に、向きがある辺は「有向辺」と呼ばれる。節点は、プログラムに存在するステートメントを表す。辺は、２つの節点間の依存関係（制御依存関係またはデータ依存関係）を表す。例えば、ステートメントＢがステートメントＡに依存している場合、プログラム依存グラフにおいては、Ａに対応する節点からＢに対応する節点へ向かう有向辺により、ＡとＢの依存関係が表される。
【００７５】
図５に示す例では、四角形が節点、実線の矢印が制御依存を表す有向辺、点線の矢印がデータ依存を表す有向辺である。依存関係解析部２は、図４に示すソースコードを読み込んだ場合、まず、節点となるステートメント（０４、０５、０６、０８、０９、１１、１３、１４行目のステートメント）を抽出する。そして、依存関係解析部２は、各節点のステートメントについて、他のステートメントとの制御依存関係およびデータ依存関係を解析する。
【００７６】
例えば、０４行目のステートメントの処理でｐの値が決定され、このｐの値は、０６行目、１４行目、１６行目のステートメントの処理でそれぞれ参照される。また、ｐの値は、０４行目のステートメントの処理が実行されてから、０６行目、１４行目または１６行目のステートメントの処理が実行されるまで再定義されない。従って、０４行目のステートメントから、０６行目、１４行目、１６行目のそれぞれのステートメントへの値ｐに関するデータ依存関係がある。そのため、図５に示すプログラム依存グラフでは、０４行目のステートメントの節点から、０６行目、１４行目、１６行目の節点それぞれに向けて点線矢印の有向辺が設けられる。
【００７７】
また、０５行目のステートメントにおけるＩＦ文の判定結果により、０６行目のステートメントの処理が実行されるか否かが決まるので、０５行目のステートメントから０６行目のステートメントへの制御依存関係がある。したがって、図５に示すプログラム依存グラフでは、０５行目のステートメントの節点から、０６行目の節点に向けて実線矢印の有向辺が設けられている。
【００７８】
なお、プログラム依存グラフは、上記例のように、制御依存関係およびデータ依存関係のみで表される場合に限らず、その他の依存関係がプログラム依存グラフで表されてもよい。また、依存関係解析部２が生成する依存関係を表すデータは、プログラム依存グラフで示されるデータに限られない。
【００７９】
［ステートメント分類処理（ステップ３０５）の具体例］
以下、ステートメント分類部４の動作の具体例として、図５に示したプログラム依存グラフが表す依存関係に基づいてステートメントを分類する処理について説明する。図６は、ステートメント分類部４が、ステートメントを分類する処理の例を示すフローチャートである。
【００８０】
図６に示す処理は、図３に示したフローチャートのステップ３０５の具体例である。ここでは、一例として、図３のステップ３０３でユーザが図４に示すソースコードの０４行目のメモリ確保ステートメントを選択し、ステップ３０４でステートメント選択部３が、０６行目と１６行目のメモリ解放ステートメントを基準ステートメントとして抽出した場合について説明する。
【００８１】
この場合、ステートメント分類部４は、まず、基準ステートメントであるメモリ解放ステートメントを分類１とする（ステップ６０１）。すなわち、図４に示したソースコードにおいて、０６行目と１６行目のメモリ解放ステートメントが分類１となる。
【００８２】
次に、ステートメント分類部４は、変数の値を、初期値を設定し（ｎ＝１）、分類（２ｎ−１）に属するステートメントが存在するか否かを判断する（ステップ６０２）。もし、分類（２ｎ−１）のステートメントが存在しない場合（ステップ６０２でＮ）は、ステートメント分類処理は終了する。
【００８３】
これに対して、例えば、ｎ＝１の場合は、分類（２ｎ−１）（＝分類１）に属するステートメントとして、上記０６行目と１６行目のメモリ解放ステートメントが存在する。このように分類（２ｎ−１）のステートメントが存在する場合（ステップ６０２でＹ）、ステートメント分類部４は、変数ｍの値に初期値を設定し（ｍ＝１）、変数Ｍに分類（２ｎ−１）のステートメントの数（本例ではＭ＝２）を設定する。
【００８４】
さらに、ステートメント分類部４は、分類（２ｎ−１）に属するステートメントのうちｍ番目のステートメント（以下、Ｓｔ（２ｎ−１，ｍ）と表す）を選択する。ｎ＝１かつｍ＝１の場合、分類１に属するステートメントにおいて１番目のステートメントＳｔ（１，１）は、０６行目のステートメントとなる。
【００８５】
次に、ステートメント分類部４は、選択したステートメントＳｔ（２ｎ−１，ｍ）が他のステートメントに対して制御依存関係を有するか否かを判断する（ステップ６０４）。制御依存関係がある場合（ステップ６０４でＹ）、ステートメント分類部４はその制御依存関係をひとつ遡ったステートメントを分類２ｎとする（ステップ６０５）。
【００８６】
上記ステップ６０４および６０５において、ステートメント分類部４は、記録部５に記録された依存関係データが示すプログラム依存グラフにおいて、ステートメントＳｔ（２ｎ−１，ｍ）の節点へ向う制御依存関係を示す有向辺があるか否かにより制御依存関係の有無を判断し、そのような有向辺がある場合は、その有向辺を一段遡った節点のステートメントを分類２ｎに属するステートメントとすることができる。
【００８７】
例えば、ステートメント分類部４は、図５に示すプログラム依存グラフにおいて、Ｓｔ（１，１）＝０６行目のステートメントの節点に向う実線の有向辺があるか否かを判断する。この場合、実線の有向辺があるので、その有向辺の始点となる節点の０５行目のステートメントを分類２に属するステートメントとする。
【００８８】
ステートメント分類部４は、上記のステップ６０３〜ステップ６０５の処理を、変数ｍがＭ（分類２ｎ−１に属するステートメントの数）になるまで、ｍを１ずつ加算しながら、繰り返す。これにより、分類２ｎ−１に属するステートメントそれぞれについて、制御依存関係を有するステートメントが検索され、その結果見つかったステートメントが分類２ｎに属するステートメントとなる。すなわち、分類２ｎのステートメントが抽出される。
【００８９】
本例では、Ｍ＝２なので、ｍ＝２に加算されて再びステップ６０３〜ステップ６０５が繰り返される。ｍ＝２の場合は、ステップ６０３でステートメントＳｔ（１、２）＝１６行目のステートメントが選択される。図５のプログラム依存グラフにおいて、１６行目のステートメントの節点に向う実線の有向辺（制御依存を示す有向辺）が、１３行目のステートメントから繋がっているので、１３行目のステートメントが分類２のステートメントとして抽出される。
【００９０】
もし、ステップＳ６０３〜ステップ６０５の繰り返し処理において、分類（２ｎ−１）に属するステートメントと制御依存関係を有するステートメントがソースコード中に１つも見つからず、分類２ｎに属するステートメントが存在しない場合（ステップ６０６でＮ）は、ステートメント分類処理は終了する。すなわち、分類２ｎに属するステートメントが抽出されなかった場合は、ステートメント分類処理は終了する。
【００９１】
一方、分類２ｎのステートメントが抽出された場合は、ステートメント分類部４は、分類２ｎのステートメントとデータ依存関係を有するステートメントを検索し、見つかったステートメントを分類（２ｎ＋１）のステートメントとする（ステップ６０７）。
【００９２】
図７は、ステップ６０７の処理の詳細を示すフローチャートである。図７において、ステートメント分類部４は、変数ｍに初期値を設定し（ｍ＝１）、変数Ｍに分類２ｎのステートメントの数を設定する（本例ではＭ＝２）。
【００９３】
さらに、ステートメント分類部４は、分類２ｎに属するステートメントのうちｍ番目のステートメントＳｔ（２ｎ，ｍ）を選択する（ステップ７０１）。例えば、ｎ＝１の場合、分類２に属するステートメントにおいて１番目（ｍ＝１）のステートメントＳｔ（２，１）は、０５行目のステートメントとなり、２番目（ｍ＝２）のステートメントＳｔ（２、２）は、１３行目のステートメントとなる。
【００９４】
次に、ステートメント分類部４は、選択したステートメントＳｔ（２ｎ−１，ｍ）が他のステートメントに対してデータ依存関係を有するか否かを判断する（ステップ７０２）。データ依存関係がある場合（ステップ７０２でＹ）、ステートメント分類部４はそのデータ依存関係をひとつ遡ったステートメントを分類２ｎ＋１とする（ステップ７０３）。
【００９５】
上記ステップ７０２および７０３において、ステートメント分類部４は、記録部５に記録された依存関係データが示すプログラム依存グラフにおいて、ステートメントＳｔ（２ｎ，ｍ）の節点へ向うデータ依存関係を示す有向辺があるか否かによりデータ依存関係の有無を判断し、そのような有向辺がある場合は、その有向辺を一段遡った節点のステートメントを分類２ｎ＋１に属するステートメントとすることができる。
【００９６】
例えば、ステートメント分類部４は、図５に示すプログラム依存グラフにおいて、Ｓｔ（２，１）＝０５行目のステートメントの節点に向う点線の有向辺があるか否かを判断する。この場合、有向辺がないので、Ｓｔ（２，１）は、他のステートメントとデータ依存関係はないと判断される。この場合、ステップ７０３の処理は実行されない。
【００９７】
ステートメント分類部４は、上記のステップ７０１〜ステップ７０３の処理を、変数ｍがＭ（分類２ｎ−１に属するステートメントの数）になるまで、ｍを１ずつ加算しながら、繰り返す。本例では、Ｍ＝２なので、ｍ＝２についてもステップ７０１〜ステップ７０３が繰り返される。
【００９８】
ｍ＝２の場合は、ステップ７０１でＳｔ（２、２）として１３行目のステートメントが選択される。図５に示すプログラム依存グラフでは、１３行目のステートメントの節点には、０９行目と１１行目のステートメントの節点から点線の有向辺が繋がっているので、０９行目と１１行目のステートメントが分類３に属するステートメントとされる。ｍ＝２のステップ７０３が終了すると、ｍ＝Ｍなのでステップ６０７の処理は終了する。
【００９９】
以上のようにステップ６０７で分類２ｎのステートメントを抽出処理が終了すると、図６に示すように、ステートメント分類部４は、変数ｎに１加算して（ｎ＝ｎ＋１）、再びステップ６０２において、分類（２ｎ−１）に属するステートメントが存在するか否かを判断し、存在する場合は、変数ｍを初期化し（ｍ＝１）、ステップ６０３以下の処理を繰り返す。例えば、ｎ＝２の場合、上記例では、０９行目と１１行目のステートメントが分類３に属するので、分類３に属するステートメントは存在すると判断される（ステップ６０３でＹ）。そして、ステートメント分類部４は、分類３に属するステートメントはと制御依存関係を有するステートメントを抽出して分類４とする処理（ステップ６０３〜ステップ６０５）を実行する。
【０１００】
このようにして、ステートメント分類部４は、分類（２ｎ−１）のステートメントと制御依存関係を有するステートメントを抽出して分類２ｎとする処理（ステップ６０３〜ステップＳ６０５）と、分類２ｎのステートメントとデータ依存関係を有するステートメントを抽出して分類２ｎ＋１としてｎに１加算する処理（ステップ６０７：ステップ７０１〜ステップ７０３）を、次の分類２ｎに属するステートメントがなくなるまで繰り返す。
【０１０１】
上記の例では、ｎ＝１のときのステップ６０７で、分類３に属するステートメントとして、ステップ０９行目と１１行目のステートメントが抽出される。その後、ステートメント分類部４は、ｎ＝２としてステップ６０４〜ステップ６０５の処理を実行する。これにより、分類４に属するステートメントとして、０８行目のステートメントが抽出される。図５に示すプログラム依存グラフでは、０８行目のステートメントの節点から制御依存を示す有向辺が０９行目と１１行目のステートメントの節点に繋がっているからである。０８行目のステートメントの節点は、有向辺がないので、その後のステップ６０７では、分類５のステートメントは抽出されない。その結果、ｎ＝３となった後のステップ６０２の処理で、分類５に属するステートメントは存在しないと判断され、ステートメント分類処理が終了する。
【０１０２】
図８は、上記の動作例で分類されたステートメントを示す表である。図８に示す表では、図４に示したソースコードにおける基準ステートメントであるメモリ解放ステートメント（０６行目、１６行目のステートメント）が分類１となり、分類２には、プログラム依存グラフにおいて基準ステートメントから制御依存関係を１つ遡った節点のステートメント（０５、１３行目）、分類３には、分類２の１３行目のステートメントからデータ依存関係を１つ遡った節点のステートメント（０９、１１行目）、分類４には、分類３の０９、１１行目のステートメントから制御依存関係を１つ遡ったステートメント（０８行目）が属するようになっている。図８に示すような分類結果を示すデータは、例えば、記録部５に記録される。
【０１０３】
このように、ステートメント分類部４は、基準ステートメントであるメモリ解放ステートメントから制御依存関係とデータ依存関係を交互に１段階ずつ辿っていき、各段階で見つかるステートメントが１つの分類に属するようにする。表示制御部７はこのように分類されたステートメントごとに表示態様を決定し、その表示態様でステートメントを表示装置１２へ表示させる。これにより、例えば、後述するように、ユーザのメモリリークの確認作業を容易するようなソースコード表示が可能になる。
【０１０４】
なお、ステートメント分類処理は、上記例に限られない。ステートメント分類部４は、上記例では、制御依存関係とデータ依存関係を交互の遡っていき、依存関係１段階ずつ分類しているが、必ずしも、１段階ずつ分類しなくてもよい。また、ステートメント分類部４は、１分類中のステートメント群をさらに分割して、依存関係の連鎖の系統ごとに異なる分類としてもよい。
【０１０５】
［ステートメントの表示形態決定処理（ステップ３０９）］
以下、表示制御部７の動作の具体例として、図８に示した分類結果およびユーザからの指示に従って表示態様を決定して表示する処理について説明する。図９は、表示制御部７が、ステートメントの表示態様を決定し、表示装置１２へ表示させる処理を示すフローチャートであり、図３におけるステップ３０９、３１０の処理の具体例を示す。
【０１０６】
図９に示す処理は、表示制御部７が、ユーザからの指示に基づく更新信号を更新部６から受信した後の処理である。ここでは、更新信号には、強調表示するべきステートメントの分類を示す情報が含まれている場合について説明する。強調表示するべきステートメントの分類を示す情報は、更新部６が入力装置１１を介してユーザから入力された情報に基づき生成する。
【０１０７】
更新部６は、例えば、ユーザから強調表示するステートメントの分類指定を受け付けてもよいし、あるいは、ユーザが更新ボタンをクリックした回数を数えておき、１回目のクリックは分類１、２回目は分類２、・・・というように回数に応じて分類を決定してもよい。強調表示するべきステートメントの分類を示す情報は、例えば、分類を表す番号（１、２、・・・Ｎ）のうち少なくとも１つで表される。
【０１０８】
表示制御部７は、受信した更新信号から、どの分類を強調表示するか読み取る（ステップ９０１）。例えば、表示制御部７は、強調表示が指示されている分類の番号を読み取る。また、表示制御部７は、変数Ｎに初期値（Ｎ＝１）を設定する（ステップ９０２）。
【０１０９】
その後、以下ステップ９０３〜９０６の処理を、Ｎが分類の数Ｍ（ここでは、一例としてＭ＝４）より大きくなるまで（ステップ９０７でＹと判定されるまで）繰り返す。
【０１１０】
ステップ９０３において、表示制御部７は、Ｎが、更新信号から読み取った強調表示が指示されている分類の番号に含まれるか否かを判定する。Ｎが、強調表示が指示されている分類の番号に含まれていれば（ステップ９０３でＹ）、表示制御部７は、分類Ｎのステートメントを強調表示するように表示装置１２へ命令する。Ｎが、強調表示が指示されている分類の番号に含まれていなければ（ステップ９０３でＮ）、表示制御部７は、分類Ｎのステートメントを強調表示しないように表示装置１２へ命令する。そして、表示制御部７は、ステップ９０６においてＮに１加算する。
【０１１１】
上記処理により、すべての分類１〜４について強調表示するか否かが決定され、ユーザが指定した分類のステートメントのみが強調表示される。強調表示の方法として、例えば、文字の太さを変える、色を変えて表示する、下線や枠で囲む、フォントの種類を変える等が挙げられる。
【０１１２】
［メモリリーク確認作業におけるソースコードの表示例］
次に、図４に示したソースコードに対してユーザがメモリリークの確認作業を行う際に、表示制御部７が、図８に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図１０〜図１５を参照しながら説明する。
【０１１３】
図１０は、ユーザがメモリリークを確認する際の作業のステップと、各ステップにおいて強調表示されるステートメントの数、行番号、色の例を記載した表である。図１１〜図１５は、ユーザのメモリリーク確認作業中に表示装置１２に表示される画面の例を示す図である。ここで示す例では、表示される画面は、ユーザのメモリリーク確認作業の各ステップに合わせて図１１から図１５まで順に遷移する。
【０１１４】
まず、ユーザは、画面に表示されたソースコードを見ながら、０３行目のメモリ確保ステートメントにカーソルを合わせクリックする。このとき、表示制御部７は、図１１に示すようにユーザが選択した０３行目のメモリ確保ステートメントを、例えば、太字かつオレンジ色で強調表示させる。ユーザは、メモリ確保ステートメントに着目することができる。また、図１１に示す画面には、「次のステップ」ボタン５０が表示されている。
【０１１５】
次に、ユーザは、メモリ確保ステートメントで確保されるメモリを解放するメモリ解放ステートメントをソースコードから探す（図１０のステップ１）。このとき、例えば、ユーザが「次のステップ」ボタン５０をクリックすることにより、更新部６が分類１を強調表示するための更新信号を生成して表示制御部７に通知する。通知を受けた表示制御部７は、図１２に示すように、分類１のステートメント（０６行目、１６行目）を例えば、太字かつ赤色で強調表示させる。これにより、ユーザは、ソースコード中のメモリ解放ステートメントの位置を容易に把握することができる。
【０１１６】
次に、ユーザは、メモリ解放ステートメントを実行するか否か決定する分岐となる条件分岐ステートメントを探す（図１０のステップ２）。この時、ユーザが図１２に示す画面において、「次のステップ」ボタン５０をクリックすることにより、更新部６が分類２を強調表示するための更新信号を生成して表示制御部７に通知する。表示制御部７は、図１３に示すように、分類２のステートメント（０５行目、１３行目）を例えば、太字かつ青色で強調表示させる。ユーザは、メモリ解放ステートメントの実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。これにより、メモリリークが発生しうる実行パスが存在するか否かをすばやく判断することができる。この場合、ユーザは、１３行目のＩＦ文で条件式「ｃｏｎｄ＝＝ＥＭＰＴＹ」が真となる場合にメモリリークが発生することを把握する。すなわち、ユーザは、１３行目の条件分岐ステートメントの分岐の方向によっては、メモリリークが発生することがわかる。ここで、演算子「＝＝」は、両側の値が互いに等しいときに真を返す演算子である。また、「ＥＭＰＴＹ」は、プリプロセッサ（＃ｄｅｆｉｎｅ）によりマクロ定義された文字列を表す。０５行目の「ＮＯＴ＿ＥＭＰＴＹ」および０９行目の「ＮＯＲＭＡＬ」も同様にマクロ定義された文字列である。
【０１１７】
次に、ユーザは、１３行目の条件分岐ステートメントにおける分岐の方向を決定するステートメントを探す（図１０のステップ３）。このときも、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類３を強調表示するための更新信号が表示制御部７に通知される。表示制御部７は、図１４に示すように、分類３のステートメント（０９行目、１１行目）を、例えば、太字かつ緑色で表示させる。これにより、ユーザは、メモリリークが発生する条件を満たす場合があるか否かをすばやく判断することができる。この場合、ユーザは、強調表示された１１行目で「ｃｏｎｄ＝ＥＭＰＴＹ」と設定さており、１３行目のＩＦ文の条件式で真となる条件を満たす場合があることをすばやく把握することができる。
【０１１８】
次に、ユーザは、１１行目のステートメント「ｃｏｎｄ＝ＥＭＰＴＹ」を実行するか否か決定する分岐となる条件分岐ステートメントを探す（図１０のステップ４）。この時、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類４を強調表示するための更新信号が表示制御部７に通知され、表示制御部７は、図１５に示すように、分類４のステートメント（０８行目）を例えば、太字かつ黄色で強調表示させる。これにより、ユーザは、１１行目のステートメント「ｃｏｎｄ＝ＥＭＰＴＹ」の実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。そして、ユーザは、０８行目のＩＦ文で条件式「ｐａｒａｍ−＞ｉｓ＿ｎｉｃｅ」が偽となる場合に１１行目が実行され、メモリリークが発生することをすばやく把握することができる。
【０１１９】
次に、ユーザは、０８行目の分岐の方向（条件式「ｐａｒａｍ−＞ｉｓ＿ｎｉｃｅ」）を決定するステートメントを探す（図１０のステップ５）。このときも、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類５を強調表示する更新信号が表示制御部７へ送信される。この場合、分類５のステートメントは存在しないので、表示制御部７は、例えば、いずれもステートメントも強調表示しないように表示させる（図示せず）。これにより、ユーザは、０８行目の分岐の方向を決定するステートメントはソースコード中に存在しないことがすばやく把握できる。また、０８行目の分岐の条件式「ｐａｒａｍ−＞ｉｓ＿ｎｉｃｅ」におけるｐａｒａｍはｆｕｎｃｔｉｏｎ関数の引数として与えられる値であるので、ユーザは、引数によってはメモリリークが発生しうると判断することができる。これにより、メモリリークの確認は終了する。
【０１２０】
以上のように、本実施形態では、各分類のステートメントを、メモリリーク確認作業のステップに合わせて順に強調表示することにより、ユーザは素早くかつ正確にメモリリーク確認をすることができる。これに対して、従来のように、メモリ解放ステートメントに影響を与えるステートメントを抽出して全て強調表示した場合は、図１６に示すようにソースコード中の大部分が強調表示されてしまい、ユーザのメモリリーク確認作業を容易にすることはできない。
【０１２１】
また、図１０に示すように、従来の表示方法だと、メモリリーク確認作業の全てのステップで、メモリ解放ステートメントに影響を与える８行のステートメントが表示され、ユーザの検索対象となる。したがって、従来の表示方法における各ステップでの検索対象ステートメント数の平均は、（ステップ１〜５のステートメント数の合計）/（ステップの数）
=  （８＋８＋８＋８＋８）／５  ＝  ８となる。
【０１２２】
一方、実施の形態１における上述の例では、各ステップの検索対象のステートメント数は、図１０に示すように、ステップ１〜３においてそれぞれ２つ、ステップ４で１つ、ステップ５で０となる。そのため、各ステップでの検索対象ステートメント数の平均は、（ステップ１〜５のステートメント数の合計）/（ステップの数）  =  （２+２+２+１+０）／５  ＝  １．４となり、従来に比べて検索対象のステートメントが約１／６に絞り込まれている。
【０１２３】
以上に述べたとおり、実施の形態１における情報処理装置１によれば、メモリ解放ステートメントに影響を与えるステートメント全体を、メモリ解放ステートメントへの影響の仕方により分類し、メモリリークの確認作業の各ステップにおいて分類ごとに区別して表示することができる。そのため、メモリリーク確認作業の各ステップで着目すべき適切なステートメントが区別可能となるよう表示される。そのため、ユーザがソースコード全体から着目すべきステートメントを探す必要がなくなり、ソースコードの理解が容易になる。
【０１２４】
なお、本実施形態では、メモリリークの確認を例として説明を行ったが、メモリリークの確認に限らず、他のリソース確保関数・解放関数の対について、確保関数が呼び出された後に、解放関数が忘れずに呼び出されているか否かを確認する際にも有用である。
【０１２５】
例えば、mmap関数とmunmap関数のようなメモリのマップ・アンマップ、 fopen関数とfclose関数のようなファイルオープン・クローズ、shmat関数とshmdt関数のような共有メモリのアタッチ・デタッチ、spin_lock関数とspin_unlock関数のような排他制御等のステートメント対についても、本実施形態におけるmalloc関数とfree関数の場合と同様に扱うことができる。なお、これらの関数は、すべてＡＮＳＩ  Ｃ  ランタイムで定められたＣ言語の標準関数である。
【０１２６】
また、分類ごとに決定された表示態様で、ステートメントを表示する方法も、上記の表示例に限られない。上記の表示例では、ユーザ選択ステートメント→分類１→分類２→分類３→分類４の順に、ステートメントが強調表示されているが、表示制御部７は、例えば、分類１〜４それぞれのステートメントを、分類ごとに色を変えて同時に強調表示させてもよい。この場合でも、ユーザは分類ごとにステートメントを区別できるので、ユーザのソースコード理解が容易になるという効果が得られる。このように、必ずしも、各分類を異なる時間に表示するように表示形態を更新する必要はないので、場合によっては更新部６を省略することもできる。
【０１２７】
（実施の形態２）
実施の形態２は、ソースコードを解析し、そのソースコードで示される処理におけるメモリリークの可能性の有無を判定する機能を有する情報処理装置である。図１７は、実施の形態２における情報処理装置の構成を表す機能ブロック図である。図１７に示す情報処理装置１ａにおいて、図２に示した情報処理装置１と同じ機能ブロックには同じ符号を付している。図１７に示す情報処理装置１ａは、メモリリークの可能性の有無を判定する判定部８を備えることを特徴とする。
【０１２８】
判定部８は、記録部５に記録されたソースコードを読み出して解析し、そのソースコードが示す処理においてメモリリークが発生し得るか否かを判定する。判定結果は、表示装置１２へ出力される。判定部８は、ステートメント選択部３が選択した基準ステートメントに依存関係によって連鎖的に繋がるステートメント群の各ステートメントについて、基準ステートメントから順に依存関係を辿りながら解析する。その際、ステートメント分類部４が決定した分類ごとに解析する。そして、判定部８は、前記分類ごとに、メモリリークの可能性の有無を判定する。
【０１２９】
図１８は、本実施形態における情報処理装置１ａがソースコードの示す処理におけるメモリリーク発生の可能性の有無を判定する動作の一例を示すフローチャートである。図１８において、ステップ１８０１〜ステップ１８０５は、図３に示したフローチャートのステップ３０１〜ステップ３０５と同様である。ステップ１８０６において、判定部８は、ステップ３０５で決定された分類に基づいて、分類ごとにステートメントの解析を行い、メモリリーク発生の可能性の有無を判定する。
【０１３０】
ここでは、一例として、実施の形態１で図４に示したソースコードについて解析する場合について説明する。すなわち、本実施形態でも、ステップ１８０２では、図５に示すプログラム依存グラフを示す依存関係データが作成される。また、ステップ１８０３では、図４に示すソースコードの０４行目のメモリ確保ステートメントがユーザによって選択され、ステップ１８０４では、ステートメント選択部３が、０６行目と１６行目のメモリ解放ステートメントを基準ステートメントとして抽出する。ステップ１８０５では、図８に示すようにステートメントが分類される。
【０１３１】
図１９は、図１８におけるステップ１８０６の判定部８によるメモリリーク判定処理の具体例を示すフローチャートである。図１９に示す例では、まず、判定部８は、分類２のステートメントから、分類１の基準ステートメントであるメモリ解放ステートメントを実行するか否かを決定する条件分岐ステートメントを取得する（ステップ１９０１）。ここでは、０５行目と１３行目の条件分岐ステートメントが取得される。
【０１３２】
判定部８は、取得した分類２の条件分岐ステートメントを解析し、メモリ解放ステートメントが実行されないような実行パス（すなわち、メモリリークが発生する実行パス）があり得るか否か判断する（ステップ１９０２）。本例では、図４に示す０５行目のＩＦ分の条件式（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ、１３行目のＩＦ分の条件式（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真の場合の実行パスで、メモリリークが発生する。
【０１３３】
このようにメモリリークする実行パスがある場合は、その実行パスを通るための条件式を条件Ｗとしてバッファに記録する（ステップ１９０３）。ここでは、「（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真」が条件Ｗとして設定される。
【０１３４】
なお、ステップ１９０２でメモリリークする実行パスがないと判断された場合は、判定部８は、メモリリークは発生しないと判定して処理を終了する（ステップ１９１１）。
【０１３５】
次に、判定部８は、変数ｎに２を設定し（ｎ＝２）、分類２ｎ−１（ここでは分類３）から、条件Ｗ「（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真」の判定において参照される変数（＝ｃｏｎｄおよびｍｏｄｅ）の値を決定するステートメントを検索する（ステップ１９０４）。
【０１３６】
その結果、そのようなステートメントが存在しなければ（ステップ１９０５でＮ）、判定部８は、メモリリークは発生し得るとして（ステップ１９１０）処理を終了する。本例では、分類３には、変数ｍｏｄｅの値を決定するステートメントはないが、変数ｃｏｎｄ１の値を決定する処理のステートメントはある（０９行目、１１行目）。ここで、変数ｍｏｄｅの値を決定するステートメントがないということは、変数ｍｏｄｅの値は引数で指定されるということなので、引数の値によっては「（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽」という条件が成立し得ると判定される。
【０１３７】
このように、ステートメントが存在する場合（ステップ１９０５でＹ）、判定部８は、条件Ｗを成立させるような変数の値を決定するステートメント（以下、ステートメントＡと称する）があるか否かを判断する（ステップ１９０６）
１１行目のステートメントは、変数ｃｏｎｄ１に「ＥＭＰＴＹ」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Ｗが成立する。そのため、ステップ１９０６でＹとなる。もしも、分類３におけるいずれのステートメントの処理でも変数ｃｏｎｄ１に「ＥＭＰＴＹ」が設定されなければ、条件Ｗは成立しない（ステップ１９０６でＮ）。この場合、判定部８は、メモリリークは発生しないと判定して処理を終了する（ステップ１９１１）。
【０１３８】
ステップ１９０６でＹの場合、判定部８は、分類２ｎのステートメントから、条件Ｗを成立させるような変数の値を決定するステートメントＡを実行するか否かを決定する条件分岐ステートメントを検索する（ステップ１９０７）。ｎ＝２の場合、ステートメントＡは、条件Ｗ「（ｃｏｎｄ１＝＝ＥＭＰＴＹ）は真」における変数ｃｏｎｄ１に値「ＥＭＰＴＹ」を決定する１１行目のステートメントである。そして、分類４には０８行目のステートメントが含まれている。この０８行目のステートメントは、１１行目のステートメント（ステートメントＡ）を実行の有無を決定する条件分岐ステートメント（０８行目）であるので、これがステップ１９０７における検索結果の条件分岐ステートメントとなる。
【０１３９】
このように、条件分岐ステートメントが存在する場合（ステップ１９０８でＹ）、判定部８は、この条件分岐ステートメントで、ステートメントＡの処理が実行されるような判定結果となるための条件を条件Ｗとしてバッファに記録する（ステップ１９０９）。ここでは、０８行目の条件式「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」となる場合に、１１行目のステートメントの処理が実行されるので、「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」が条件Ｗに設定される。
【０１４０】
その後、判定部８は、変数ｎに１加算し（ｎ＝ｎ＋１）、ステップ１９０４の処理を繰り返す。例えば、ｎ＝２＋１＝３となった場合、判定部８は、分類５から条件式「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」で参照される変数ｐａｒａｍの値を決定するステートメントを検索する。しかし、分類５に含まれるステートメントは存在しないので、ステップ１９０５でＮとなる。その場合、判定部８は、メモリリークは発生しうると判定し（ステップ１９１０）、処理を終了する。すなわち、変数ｐａｒａｍの値は、ｆｕｎｃｔｉｏｎ関数内で決定されるのではなく、ｆｕｎｃｔｉｏｎ関数の引数で指定される値なので、引数の値によってはメモリリークが発生する可能性があると判定される。
【０１４１】
以上の処理により、判定部８は、ソースコードが示す処理においてメモリリークが発生するか否かを判定することができる。判定部８は、判定結果を表示装置１２に表示する。判定結果には、メモリリークの有無を表す情報の他に、メモリリークの有無に影響を与える変数、ステートメント、デバッグ情報等が含まれてもよい。
【０１４２】
図１９に示した上記処理例では、判定部８は、ステートメント分類部４による分類を用いて、分類ごとにステートメントの解析を行っている（ステップ１９０１、１９０５、１９０７）。そのため、判定部８は、メモリ解放ステートメントから依存関係を遡っていく過程のそれぞれのステップで、解析対象とするステートメントに適格に絞り込んで判定をすることができる。その結果、判定処理の効率がよくなる。
【０１４３】
なお、図１９に示したメモリリークの判定処理は一例であり、本発明は、これに限られない。
【０１４４】
（実施の形態３）
実施の形態３は、ユーザが、ソースコードにおいて、不正な値が設定された変数を参照する処理が実行されうるか否かを確認する作業を容易にするようにソースコードを表示する機能を有する情報処理装置である。ここでは、上記作業の例として、ユーザによる、ＮＵＬＬポインタデリファレンスの発生の有無を確認する作業を挙げて説明する。
【０１４５】
［ＮＵＬＬポインタデリファレンスについて］
デリファレンスとは、ポインタの指すメモリアドレスのメモリ領域に格納された値を参照することである。ＮＵＬＬポインタデリファレンスとは、ＮＵＬＬが設定されたポインタが、有効なメモリアドレスを指していないにも関わらず、そのポインタの指す不正なメモリアドレスを用いてメモリを参照しようとすることである。
【０１４６】
ＮＵＬＬは通常無効なメモリアドレスであるので、ＮＵＬＬポインタデリファレンスが発生すると、その時点でプログラムはエラーとなり停止する。
【０１４７】
例えば、図２０に示すＣ言語のプログラムのソースコードでは、０３行目のステートメントでポインタｐにＮＵＬＬが代入される。その後、０７行目のＩＦ文における条件式「ａ＞０」の判定結果が真の場合には、０８行目の処理でｐに適切なメモリアドレスが設定され、続く１０行目のデリファレンスで、ｐが指すメモリアドレスのメモリ領域に値「１」を記録することができる。
【０１４８】
しかし、０７行目の条件式「ａ＞０」の判定結果が偽の場合には、ｐがＮＵＬＬのまま１０行目の処理が実行され、ＮＵＬＬポインタデリファレンスが発生してプログラムがエラーとなり停止する。
【０１４９】
このようなＮＵＬＬポインタデリファレンスの確認は、例えば、開発者が、ソースコードを精査し、ＮＵＬＬポインタデリファレンスが発生する実行パスがあるかどうかを確認することにより行われる。
【０１５０】
［情報処理装置の構成］
図２１は、実施の形態３における情報処理装置の構成を表す機能ブロック図である。図２１に示す情報処理装置１０において、実施の形態１において図２に示した情報処理装置１と同じ機能グロックには同じ符号を付す。図２１に示す情報処理装置１０において、ステートメント選択部３０、ステートメント分類部４０および表示制御部７０の有する機能の一部が図２の情報処理装置１のステートメント選択部３、ステートメント分類部４および表示制御部７とは異なる。
【０１５１】
ステートメント選択部３０は、不正な値が設定された変数が参照される恐れのあるステートメントの指定を、ユーザから入力装置１１を介して受け付け、前記入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメント（以下、基準ステートメントと称する）を選択する。ステートメント選択部３０は、基準ステートメントとして、例えば、ユーザの指定するステートメントで参照される変数の値を決定する処理を示すステートメント（以下、値決定ステートメントと称する）を選択する。
【０１５２】
ステートメント分類部４０は、例えば、以下のように値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群、すなわち、値決定ステートメントに影響を与えるステートメント群を、分類１、２、３・・・２ｎ、２ｎ＋１、・・・に分類することができる。
【０１５３】
分類１：値決定ステートメント
分類２：分類１の実行を決定する条件分岐ステートメント
分類３：分類２の分岐方向を決定するステートメント
…
分類２ｎ：分類２ｎ−１の実行を決定する条件分岐ステートメント
分類２ｎ＋１：分類２ｎの分岐方向を決定するステートメント
…
表示制御部７０は、ステートメント分類部４により通知されたステートメントの分類によって、そのステートメントの表示態様を決定して、表示装置１２へその表示態様でステートメントを表示させる。これにより、表示制御部７０は、値決定ステートメントからの依存関係の連鎖の段階ごとにステートメントを区別して表示装置１２へ表示させることができる。そのため、ユーザは、不正な値の変数が参照されることがないかを確認する作業において、各ステップで注目すべきステートメントが分類され、区別可能となるような表示が可能になる。
【０１５４】
［情報処理装置１０の動作例］
次に、本実施形態における情報処理装置１０の動作例について説明する。図２２は、本実施形態における情報処理装置１０の動作例を示すフローチャートである。図２２に示すフローチャートにおいて、図３に示したステップと同じステップには同じ番号を付し、詳細な説明を省略する。ここでは、一例として、図２３に示すＣ言語のソースコードが表示対象のソースコードである場合について説明する。
【０１５５】
図２２に示すように、まず、表示制御部７がソースコードを表示させ（ステップ３０１）、依存関係解析部２が、ソースコードの依存関係を解析して、プログラム依存グラフで表される依存関係データを生成する（ステップ３０２）。図２４は、図２３に示すソースコードのプログラム依存グラフを示す図である。
【０１５６】
ステートメント選択部３は、ユーザから、入力装置１１を介して、ポインタをデリファレンスする処理を示すステートメントの入力を受け付ける（ステップ２２０３）。ユーザは、例えば、表示装置１２の画面に表示されたソースコード中で、ＮＵＬＬポインタデリファレンスする恐れのあるステートメントをクリックすることにより指定することができる。以下では、一例として図２３に示すソースコードにおいて、１８行目のステートメント「＊ｐ＝１；」が、ＮＵＬＬポインタデリファレンスの恐れのあるステートメントとして指定された場合について説明する。ここで、「＊ｐ＝１；」は、ポインタｐが指すアドレスに値「１」を格納する処理を示しています。
【０１５７】
ステートメント選択部３０は、ステップ２２０２でユーザに指定されたステートメントで、デリファレンスされるポインタの値を決定するステートメントを抽出し、基準ステートメントとする（ステップ２２０４）。本例では、基準ステートメントは、すなわち、分類１の値決定ステートメントである。ここでは、図２３に示すソースコードにおいて、１８行目のステートメント「＊ｐ＝１；」の、ポインタｐの値を決定するステートメントは、０４行目、０６行目、１６行目の３つであるので、これらが分類１の値決定ステートメントとなる。
【０１５８】
次に、ステートメント分類部４０は、ステップ３０２で作成されたプログラム依存グラフに基づいて、値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、連鎖の段階ごとに、分類１、２、・・・２ｎ、２ｎ＋１、・・・に分類する（ステップ２２０５）。分類の詳細な処理は、実施の形態１で図６の示した処理と、ステップ６０１以外は同じである。本実施形態における分類処理では、ステップ６０１において、メモリ解放ステートメントに代えて、値決定ステートメントが分類１とされる。
【０１５９】
図２５は、ステートメント分類部４０が、図２３に示すソースコードのステートメントを、図２４に示すプログラム依存グラフに基づいて分類した場合の分類結果を示す表である。図２５に示す表は、図２３に示したソースコードにおける値決定ステートメント（０４行目、０６行目、１６行目のステートメント）が分類１となり、分類２には、分類１の値決定ステートメント（０６行目および１６行目）からそれぞれ制御依存関係を１つ遡った節点の０５行目、１３行目ステートメント（図２４参照）、分類３には、分類２の１３行目のステートメントからデータ依存関係を１つ遡った節点のステートメント（０９、１１行目）、分類４には、分類３の０９、１１行目のステートメントから制御依存関係を１つ遡ったステートメント（０８行目）が属するようになっている。
【０１６０】
表示制御部７０は、更新部６からの更新信号を受信すると（ステップ３０８でＹ）、ステートメント分類部４０による分類ごとに、ステートメントの表示態様を決定し（ステップ２２０９）、表示装置１２へ表示させる（ステップ２２１０）。
【０１６１】
［ＮＵＬＬポインタデリファレンス確認作業におけるソースコードの表示例］
次に、図２３に示したソースコードに対してユーザがＮＵＬＬポインタデリファレンスの確認作業を行う際に、表示制御部７０が、図２５に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図２６〜図３１を参照しながら説明する。
【０１６２】
図２６は、ユーザがＮＵＬＬポインタデリファレンスを確認する際の作業のステップと、各ステップにおいて強調表示されるステートメントの数、行番号、色の例を記載した表である。図２７〜図３１は、ユーザのＮＵＬＬポインタデリファレンス確認作業中に表示装置１２に表示される画面の例を示す図である。ここで示す例では、表示される画面は、ユーザのＮＵＬＬポインタデリファレンス確認作業の各ステップに合わせて図２７から図３１まで順に遷移する。
【０１６３】
まず、ユーザは、画面に表示されたソースコードを見ながら、１８行目のポインタｐをデリファレンスする処理を示すステートメントにカーソルを合わせクリックする。このとき、表示制御部７０は、図２７に示すようにユーザが選択した１８行目のステートメントを、例えば、太字かつオレンジ色で強調表示させる。ユーザは、ポインタｐのデリファレンス処理のステートメント「＊ｐ＝１；」に着目することができる。また、図２７に示す画面には、「次のステップ」ボタン５０が表示されている。
【０１６４】
次に、ユーザは、１８行目のステートメントで参照されるポインタｐの値を決定する値決定ステートメントをソースコードから探す（図２６のステップ１）。このとき、例えば、ユーザが「次のステップ」ボタン５０をクリックすることにより、更新部６が分類１を強調表示するための更新信号を生成して表示制御部７０に通知する。通知を受けた表示制御部７０は、図２８に示すように、分類１のステートメント（０４行目、０６行目、１６行目）を例えば、太字かつ赤色で強調表示させる。これにより、ユーザは、ソースコード中の値決定ステートメントの位置を容易に把握することができる。
【０１６５】
次に、ユーザは、値決定ステートメントを実行するか否か決定する分岐となる条件分岐ステートメントを探す（図２６のステップ２）。この時、ユーザが図２８に示す画面において、「次のステップ」ボタン５０をクリックすることにより、更新部６が分類２を強調表示するための更新信号を生成して表示制御部７０に通知する。表示制御部７０は、図２９に示すように、分類２のステートメント（０５行目、１３行目）を例えば、太字かつ青色で強調表示させる。ユーザは、値決定ステートメントの実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。これにより、ＮＵＬＬポインタデリファレンスが発生しうる実行パスが存在するか否かをすばやく判断することができる。この場合、ユーザは、１３行目のＩＦ文で条件式「ｃｏｎｄ＝＝ＥＭＰＴＹ」が真となる場合にＮＵＬＬポインタデリファレンスクが発生することを把握する。
【０１６６】
次に、ユーザは、１３行目の条件分岐ステートメントにおける分岐の方向を決定するステートメントを探す（図２６のステップ３）。このときも、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類３を強調表示するための更新信号が表示制御部７０に通知される。表示制御部７０は、図３０に示すように、分類３のステートメント（０９行目、１１行目）を、例えば、太字かつ緑色で表示させる。これにより、ユーザは、ＮＵＬＬポインタデリファレンスが発生する条件を満たす場合があるか否かをすばやく判断することができる。この場合、ユーザは、強調表示された１１行目で「ｃｏｎｄ＝ＥＭＰＴＹ」と設定さており、１３行目のＩＦで真となる条件を満たす場合があることをすばやく把握することができる。
【０１６７】
次に、ユーザは、１１行目のステートメント「ｃｏｎｄ＝ＥＭＰＴＹ」を実行するか否か決定する分岐となる条件分岐ステートメントを探す（図２６のステップ４）。この時、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類４を強調表示するための更新信号が表示制御部７０に通知され、表示制御部７０は、図３１に示すように、分類４のステートメント（０８行目）を例えば、太字かつ黄色で強調表示させる。これにより、ユーザは、１１行目のステートメント「ｃｏｎｄ＝ＥＭＰＴＹ」の実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。そして、ユーザは、０８行目のＩＦ文で条件式「ｐａｒａｍ−＞ｉｓ＿ｎｉｃｅ」が偽となる場合に１１行目が実行され、ＮＵＬＬポインタデリファレンスが発生することをすばやく把握することができる。なお、上記条件式中の「−＞」は、ポインタ「ｐａｒａｍ」が指す構造体のメンバ「ｉｓ＿ｎｉｃｅ」を指定するためのアロー演算子である。
【０１６８】
次に、ユーザは、０８行目の分岐の方向（条件式「ｐａｒａｍ−＞ｉｓ＿ｎｉｃｅ」）の判定結果を決定するステートメントを探す（図２６のステップ５）。このときも、ユーザが「次のステップ」ボタン５０をクリックすることにより、分類５を強調表示する更新信号が表示制御部７０へ送信される。この場合、分類５のステートメントは存在しないので、表示制御部７０は、例えば、いずれもステートメントも強調表示しないように表示させる（図示せず）。これにより、ユーザは、０８行目の分岐の方向を決定するステートメントはソースコード中に存在しないことがすばやく把握できる。ユーザは、ｆｕｎｃｔｉｏｎ関数の引数ｐａｒａｍによってはＮＵＬＬポインタデリファレンスが発生しうると判断することができる。これにより、ＮＵＬＬポインタデリファレンスの確認は終了する。
【０１６９】
以上のように、本実施形態では、各分類のステートメントを、ＮＵＬＬポインタデリファレンス確認作業のステップに合わせて順に強調表示することにより、ユーザは素早くかつ正確にＮＵＬＬポインタデリファレンス確認をすることができる。これに対して、従来のように、値決定ステートメントに影響を与えるステートメントを抽出して全て強調表示した場合は、図３２に示すようにソースコード中の大部分が強調表示されてしまい、ユーザのＮＵＬＬポインタデリファレンス確認作業を容易にすることはできない。
【０１７０】
また、図２６に示すように、従来の表示方法だと、ＮＵＬＬポインタデリファレンス確認作業の全てのステップで、値決定ステートメントに影響を与える９行のステートメントが表示されるので、各ステップでの検索対象ステートメント数の平均は８となる。
【０１７１】
一方、実施の形態３における上述の例では、各ステップの検索対象のステートメント数は、ステップ１〜５においてそれぞれ３、２、２、１、０となる。そのため、各ステップでの検索対象ステートメント数の平均は、１．６となり、従来に比べて検索対象のステートメントが約１／５に絞り込まれている。
【０１７２】
以上に述べたとおり、実施の形態３における情報処理装置１０によれば、値決定ステートメントに影響を与えるステートメント全体を、値決定ステートメントへの影響の仕方により分類し、ＮＵＬＬポインタデリファレンスの確認作業の各ステップにおいて分類ごとに区別して表示することができる。そのため、ＮＵＬＬポインタデリファレンス確認作業の各ステップで着目すべき適切なステートメントが区別可能となるよう表示される。
【０１７３】
なお、なお、本実施形態においては、不正な値が設定された変数を参照する処理を確認することの例として、ＮＵＬＬポインタデリファレンスの確認を挙げて説明したが、不正な値の変数参照の確認はこれに限られない。その他、あるステートメントの変数に対して、不正な値が設定されて実行されるかどうかを確認する場合にも本実施形態により同様の効果が得られる。例えば、ｘ＝１０／ｙ；のような除算のステートメントに対して、除数が０に設定されて実行されるか否かを確認する場合にも上記実施形態と同様の方法が適用可能である。
【０１７４】
また、例えば、ｍｅｍｃｐｙ（ｘ，ｙ，ｚ）のような関数呼び出しのステートメントに対して、関数の引数として設定されてはならない値（たとえば、上記の例ではｘ、ｙにＮＵＬＬ）が設定されて実行されるかどうかを確認する場合にも上記実施形態と同様の方法が適用可能である。
【０１７５】
（実施の形態４）
実施の形態４は、ソースコードを解析し、そのソースコードで示される処理におけるＮＵＬＬポインタデリファレンスの可能性の有無を判定する機能を有する情報処理装置である。図３３は、実施の形態４における情報処理装置の構成を表す機能ブロック図である。図３３に示す情報処理装置１０ａにおいて、図２０に示した情報処理装置１０と同じ機能ブロックには同じ符号を付している。図３３に示す情報処理装置１０ａは、ＮＵＬＬポインタデリファレンスの可能性の有無を判定する判定部８０を備えることを特徴とする。
【０１７６】
判定部８０は、記録部５に記録されたソースコードを読み出して解析し、そのソースコードが示す処理においてＮＵＬＬポインタデリファレンスが発生し得るか否かを判定する。判定結果は、表示装置１２へ出力される。判定部８０は、ステートメント選択部３０が選択した基準ステートメントに依存関係によって連鎖的に繋がるステートメント群の各ステートメントについて、基準ステートメントから順に依存関係を辿りながら解析する。その際、ステートメント分類部４０が決定した分類ごとに解析する。そして、判定部８０は、前記分類ごとに、ＮＵＬＬポインタデリファレンスの可能性の有無を判定する。
【０１７７】
図３４は、本実施形態における情報処理装置１０ａがソースコードの示す処理におけるＮＵＬＬポインタデリファレンス発生の可能性の有無を判定する動作の一例を示すフローチャートである。図３４において、ステップ３４０１〜ステップ３４０５は、図２２に示したフローチャートのステップ３０１、３０２、２２０３〜２２０５とそれぞれ同様である。ステップ３４０６において、判定部８０は、ステップ３４０５で決定された分類に基づいて、分類ごとにステートメントの解析を行い、ＮＵＬＬポインタデリファレンス発生の可能性の有無を判定する。
【０１７８】
ここでは、一例として、実施の形態３で図２３に示したソースコードについて解析する場合について説明する。すなわち、本実施形態でも、ステップ３４０３では、図２３に示すソースコードの１８行目のポインタｐをデリファレンスする処理のステートメント「＊ｐ＝１；」がユーザによって選択され、ステップ３４０４では、ステートメント選択部３が、０４行目、０６行目および１６行目の値決定ステートメントを基準ステートメントとして抽出する。また、ステップ３４０４では、図２４に示すプログラム依存グラフを示す依存関係データが作成され、ステップ３４０５では、図２５に示すようにステートメントが分類される。
【０１７９】
図３５は、図３４におけるステップ３４０６の判定部８０によるＮＵＬＬポインタデリファレンス判定処理の具体例を示すフローチャートである。図３５に示す例では、まず、判定部８０は、分類２のステートメントから、分類１の基準ステートメントである値決定ステートメントを実行するか否かを決定する条件分岐ステートメントを取得する（ステップ３５０１）。ここでは、０５行目と１３行目の条件分岐ステートメントが取得される。
【０１８０】
判定部８０は、取得した分類２の条件分岐ステートメントを解析し、値決定ステートメントが実行されないような実行パス（すなわち、ＮＵＬＬポインタデリファレンスが発生する実行パス）があり得るか否か判断する（ステップ３５０２）。本例では、０５行目のＩＦ分の条件式（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ、１３行目のＩＦ分の条件式（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真の場合の実行パスで、ＮＵＬＬポインタデリファレンスが発生する。
【０１８１】
このようにＮＵＬＬポインタデリファレンスする実行パスがある場合は、その実行パスを通るための条件式を条件Ｗとしてバッファに記録する（ステップ３５０３）。ここでは、「（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真」であることが条件Ｗとして設定される。
【０１８２】
なお、ステップ３５０２でＮＵＬＬポインタデリファレンスする実行パスがないと判断された場合は、判定部８０は、ＮＵＬＬポインタデリファレンスは発生しないと判定して処理を終了する（ステップ３５１１）。
【０１８３】
判定部８０は、ステップ３５０３で条件Ｗを設定した後、変数ｎに２を設定し（ｎ＝２）、分類２ｎ−１（ここでは分類３）から、条件Ｗ「（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽、かつ（ｃｏｎｄ１＝＝ＥＭＰＴＹ）が真」の判定において参照される変数（＝ｃｏｎｄおよびｍｏｄｅ）の値を決定するステートメントを検索する（ステップ３５０４）。
【０１８４】
その結果、もしも、そのようなステートメントが存在しなければ（ステップ３５０５でＮ）、判定部８０は、ＮＵＬＬポインタデリファレンスは発生し得るとして（ステップ３５１０）処理を終了する。本例では、分類３には、変数ｍｏｄｅの値を決定するステートメントはないが、変数ｃｏｎｄ１の値を決定する処理のステートメントはある（０９行目、１１行目）。ここで、変数ｍｏｄｅの値を決定するステートメントがないということは、変数ｍｏｄｅの値は引数で指定されるということなので、引数の値によっては（ｍｏｄｅ＝＝ＮＯＲＭＡＬ）が偽という条件が成立し得ると判定される。
【０１８５】
このように、ステートメントが存在する場合（ステップ３５０５でＹ）、判定部８０は、条件Ｗを成立させるような変数の値を決定するステートメント（以下、ステートメントＡと称する）があるか否かを判断する（ステップ３５０６）
１１行目のステートメントは、変数ｃｏｎｄ１に「ＥＭＰＴＹ」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Ｗが成立する。そのため、ステップ３５０６でＹとなる。もしも、分類３におけるいずれのステートメントの処理でも変数ｃｏｎｄ１に「ＥＭＰＴＹ」が設定されなければ、条件Ｗは成立しない（ステップ３５０６でＮ）。この場合、判定部８０は、ＮＵＬＬポインタデリファレンスは発生しないと判定して処理を終了する（ステップ３５１１）。
【０１８６】
ステップ３５０６でＹの場合、判定部８０は、分類２ｎのステートメントから、条件Ｗを成立させるような変数の値を決定するステートメントＡを実行するか否かを決定する条件分岐ステートメントを検索する（ステップ３５０７）。ｎ＝２の場合、ステートメントＡは、条件Ｗ「（ｃｏｎｄ１＝＝ＥＭＰＴＹ）は真」における変数ｃｏｎｄ１に値「ＥＭＰＴＹ」を決定する１１行目のステートメントである。そして、分類４には０８行目のステートメントが含まれている。この０８行目のステートメントは、１１行目のステートメント（ステートメントＡ）を実行の有無を決定する条件分岐ステートメント（０８行目）であるので、これがステップ３５０７における検索結果の条件分岐ステートメントとなる。
【０１８７】
このように、条件分岐ステートメントが存在する場合（ステップ３５０８でＹ）、判定部８０は、この条件分岐ステートメントで、ステートメントＡの処理が実行されるような判定結果となるための条件を条件Ｗとしてバッファに記録する（ステップ３５０９）。ここでは、０８行目の条件式「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」となる場合に、１１行目のステートメントの処理が実行されるので、「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」が条件Ｗに設定される。
【０１８８】
その後、判定部８０は、変数ｎに１加算し（ｎ＝ｎ＋１）、ステップ３５０４の処理を繰り返す。例えば、ｎ＝２＋１＝３となった場合、判定部８０は、分類５から条件式「ｐａｒａｍ―＞ｉｓ＿ｎｉｃｅが真」で参照される変数ｐａｒａｍの値を決定するステートメントを検索する。しかし、分類５に含まれるステートメントは存在しないので、ステップ３５０５でＮとなる。その場合、判定部８０は、ＮＵＬＬポインタデリファレンスは発生しうると判定し（ステップ３５１０）、処理を終了する。すなわち、変数ｐａｒａｍの値はｆｕｎｃｔｉｏｎ関数内で決定されるのではなく、ｆｕｎｃｔｉｏｎ関数の引数で指定される値なので、引数の値によってはＮＵＬＬポインタデリファレンスが発生する可能性があると判定される。
【０１８９】
以上の処理により、判定部８０は、ソースコードが示す処理においてＮＵＬＬポインタデリファレンスが発生するか否かを判定することができる。判定部８０は、判定結果を表示装置１２に表示する。判定結果には、ＮＵＬＬポインタデリファレンスの有無を表す情報の他に、ＮＵＬＬポインタデリファレンスの有無に影響を与える変数、ステートメント、デバッグ情報等が含まれてもよい。
【０１９０】
図３５に示した上記処理例では、判定部８０は、ステートメント分類部４による分類を用いて、分類ごとにステートメントの解析を行っている（ステップ３５０１、３５０５、３５０７）。そのため、判定部８０は、値決定ステートメントから依存関係を遡っていく過程のそれぞれ段階で、解析対象とするステートメントに適格に絞り込んで判定をすることができる。その結果、判定処理の効率がよくなる。
【０１９１】
なお、図３５に示したＮＵＬＬポインタデリファレンスの判定処理は一例であり、本発明は、これに限られない。
【０１９２】
以上、実施の形態１〜４において、本発明の情報処理装置の実施形態の一例を説明しが、本発明の実施形態は、上記実施の形態１〜４に限定されない。例えば、本発明の対象となるソースコードのプログラム言語は、上記実施形態のようにＣ言語に限られない。そのため、依存関係の定義、ステートメントの定義もプログラム言語に合わせて適切に決めることができる。なお、本発明の対象となりうるソースコードのプログラム言語には、例えば、ＢＡＳＩＣ、Ｃ＋＋、Ｃ＃、ＣＯＢＯＬ、ＦＯＲＴＲＡＮ、Ｊａｖａ（登録商標）、ＪａｖａＳｃｒｉｐｔ、ＬＩＳＰ、Ｐｅｒｌ、Ｒｕｂｙ等が挙げられる。
【０１９３】
また、上記実施形態では、依存関係に、制御依存関係とデータ依存関係が含まれる場合について説明したが、依存関係はこれらに限られない。例えば、プログラム言語の性質に合わせて、データ依存関係をさらに細かく分類して定義した依存関係を用いることもできるし、制御依存関係およびデータ依存関係以外の依存関係を定義して用いることもできる。
【０１９４】
また、上記実施形態では、Ｃ言語の１つの関数において、ソースコードの表示または解析を行う例について説明したが、複数の関数に渡って依存関係を追跡することにより、複数の関数についてソースコードの表示または解析を行うこともできる。
【０１９５】
また、上記実施形態では、情報処理装置について説明したが、上記の情報検索装置の機能をコンピュータで実現させるためのプログラム、またはこれを記録した記録媒体も、本発明の実施の一形態である。
【０１９６】
また、本発明は、ユーザのソースコード構造解析を支援するプログラム開発環境、プログラムエディタが備える機能の１つとして適用することができる。これにより、ユーザの利便性を向上させることができる。
【産業上の利用可能性】
【０１９７】
本発明は、ソースコードのユーザによるプログラム理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置として利用可能である。
【図面の簡単な説明】
【０１９８】
【図１】プログラムのソースコードの一例を示す図
【図２】実施の形態１における情報処理装置の構成を表す機能ブロック図
【図３】情報処理装置がソースコードを表示する動作の一例を示すフローチャート
【図４】ソースコードの一例を示す図
【図５】図４に示すソースコードに含まれるステートメント間の依存関係を表すプログラム依存グラフ
【図６】ステートメントを分類する処理の例を示すフローチャート
【図７】図６におけるステップ６０７の処理の詳細を示すフローチャート
【図８】動作例で分類されたステートメントを示す表
【図９】ステートメントの表示態様を決定し、表示装置へ表示させる処理を示すフローチャート
【図１０】メモリリーク確認作業の各ステップにおいて強調表示されるステートメントの数、行番号および色との一例を記載した表
【図１１】実施の形態１においてメモリリーク確認作業中に表示される画面の例を示す図
【図１２】実施の形態１においてメモリリーク確認作業中に表示される画面の例を示す図
【図１３】実施の形態１においてメモリリーク確認作業中に表示される画面の例を示す図
【図１４】実施の形態１においてメモリリーク確認作業中に表示される画面の例を示す図
【図１５】実施の形態１においてメモリリーク確認作業中に表示される画面の例を示す図
【図１６】メモリ解放ステートメントに影響を与えるステートメントを全て強調表示した場合の画面の例を示す図
【図１７】実施の形態２における情報処理装置の構成を表す機能ブロック図
【図１８】実施の形態２において、情報処理装置が、ソースコードの示す処理におけるメモリリーク発生の可能性の有無を判定する動作の一例を示すフローチャート
【図１９】図１８におけるステップ１８０６のメモリリーク判定処理の具体例を示すフローチャート
【図２０】プログラムのソースコードの一例を示す図
【図２１】実施の形態３における情報処理装置の構成を表す機能ブロック図
【図２２】実施の形態３における情報処理装置１の動作例を示すフローチャート
【図２３】プログラムのソースコードの一例を示す図
【図２４】図２３に示すソースコードのプログラム依存グラフ
【図２５】図２３に示すソースコードのステートメントを、図２４に示すプログラム依存グラフに基づいて分類した場合の分類結果を示す表
【図２６】ＮＵＬＬポインタデリファレンスを確認する作業の各ステップにおける強調表示ステートメント数、行番号、色の例を記載した表
【図２７】ＮＵＬＬポインタデリファレンス確認作業中に表示される画面の例を示す図
【図２８】ＮＵＬＬポインタデリファレンス確認作業中に表示される画面の例を示す図
【図２９】ＮＵＬＬポインタデリファレンス確認作業中に表示される画面の例を示す図
【図３０】ＮＵＬＬポインタデリファレンス確認作業中に表示される画面の例を示す図
【図３１】ＮＵＬＬポインタデリファレンス確認作業中に表示される画面の例を示す図
【図３２】値決定ステートメントに影響を与えるステートメントを全て強調表示した場合の画面の例を示す図
【図３３】実施の形態４における情報処理装置の構成を表す機能ブロック図
【図３４】実施の形態４におけるＮＵＬＬポインタデリファレンス発生の可能性の有無を判定する動作の一例を示すフローチャート
【図３５】図３４におけるステップ３４０６の具体例を示すフローチャート
【符号の説明】
【０１９９】
１、１ａ、１０、１０ａ      情報処理装置
２     依存関係解析部
３、３０      ステートメント選択部
４、４０      ステートメント分類部
５     記録部
６     更新部
７、７０      表示制御部
８、８０      判定部
１１   入力装置
１２   表示装置
【図１】
2008282174.tif 000003
【図２】
2008282174.tif 000004
【図３】
2008282174.tif 000005
【図４】
2008282174.tif 000006
【図５】
2008282174.tif 000007
【図６】
2008282174.tif 000008
【図７】
2008282174.tif 000009
【図８】
2008282174.tif 000010
【図９】
2008282174.tif 000011
【図１０】
2008282174.tif 000012
【図１１】
2008282174.tif 000013
【図１２】
2008282174.tif 000014
【図１３】
2008282174.tif 000015
【図１４】
2008282174.tif 000016
【図１５】
2008282174.tif 000017
【図１６】
2008282174.tif 000018
【図１７】
2008282174.tif 000019
【図１８】
2008282174.tif 000020
【図１９】
2008282174.tif 000021
【図２０】
2008282174.tif 000022
【図２１】
2008282174.tif 000023
【図２２】
2008282174.tif 000024
【図２３】
2008282174.tif 000025
【図２４】
2008282174.tif 000026
【図２５】
2008282174.tif 000027
【図２６】
2008282174.tif 000028
【図２７】
2008282174.tif 000029
【図２８】
2008282174.tif 000030
【図２９】
2008282174.tif 000031
【図３０】
2008282174.tif 000032
【図３１】
2008282174.tif 000033
【図３２】
2008282174.tif 000034
【図３３】
2008282174.tif 000035
【図３４】
2008282174.tif 000036
【図３５】
2008282174.tif 000037