JP2008282174A - 情報処理装置、情報処理方法、および情報処理プログラム - Google Patents
情報処理装置、情報処理方法、および情報処理プログラム Download PDFInfo
- Publication number
- JP2008282174A JP2008282174A JP2007124989A JP2007124989A JP2008282174A JP 2008282174 A JP2008282174 A JP 2008282174A JP 2007124989 A JP2007124989 A JP 2007124989A JP 2007124989 A JP2007124989 A JP 2007124989A JP 2008282174 A JP2008282174 A JP 2008282174A
- Authority
- JP
- Japan
- Prior art keywords
- statement
- dependency
- classification
- source code
- statements
- 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.)
- Withdrawn
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
【課題】ユーザによるプログラム理解またはコンピュータによるソースコードの解析を容易にする。
【解決手段】ソースコードを外部の表示装置へ表示させる情報処理装置1は、表示対象のソースコードを記録する記録部5と、ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部2と、ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部3と、依存関係に従って、基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記依存関係の連鎖の段階に応じて分類するステートメント分類部4と、分類ごとにステートメントの表示態様を決定し、分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置12へ表示させる表示制御部7とを有する。
【選択図】図2
【解決手段】ソースコードを外部の表示装置へ表示させる情報処理装置1は、表示対象のソースコードを記録する記録部5と、ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部2と、ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部3と、依存関係に従って、基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記依存関係の連鎖の段階に応じて分類するステートメント分類部4と、分類ごとにステートメントの表示態様を決定し、分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置12へ表示させる表示制御部7とを有する。
【選択図】図2
Description
本発明は、コンピュータ等で実行されるプログラムのソースコードの表示または解析するための情報処理装置、情報処理方法および情報処理プログラムに関するものである。
プログラム開発用に使われるソフトウエア(例えば、開発環境、エディタ等)では、ソースコードを表示する際にソースコードの構造を理解しやすくするために、さまざまな工夫がなされている。
例えば、C言語のソースコードの表示方法として、プリプロセスによって削除される行を、削除したり、目立たない色で表示したり、あるいは、そのような行を省略したことを示す情報を表示したりする方法が開示されている(例えば、特許文献1参照)。この方法により、ソースコード参照時の視認性を向上させ、ユーザは、ソースコードの働きを理解しやすくなる。
また、特定のキーワードや記号等を所定の色で表示することで、ソースコードの視認性を向上させる方法も開示されている(例えば、非特許文献1参照)。さらに、ユーザの指定したステートメントが依存するステートメントを強調表示することで、ソースコードの構造を理解しやすくする方法を開示している(例えば、非特許文献2参照)。
この方法では、まず、ソースコードに含まれるステートメント間の依存関係が解析されてプログラム依存グラフ(Program Dependence Graph,PDG)で表される依存関係データが生成される。プログラム依存グラフは、ソースコードのステートメント間の依存関係を表すグラフである。ユーザの指定したステートメントから、プログラム依存グラフで示される依存関係を辿っていくことで、ユーザの指定したステートメントの処理に影響を与えるあるステートメント群が抽出される。そして、抽出されたステートメント群は、ソースコード中で強調表示される。これにより、ユーザは、選択したステートメントの処理に影響を与えるステートメントがソースコード中でどこにあるかを認識することができる。
しかし、上記に示す従来の方法は、基準ステートメントに影響を与えるステートメントをすべて同列に扱って強調表示するため、ユーザの選択した基準ステートメントが、他の多くのステートメントから影響を受ける場合には強調表示されるステートメントも多くなり、プログラム構造が理解しやすくならない。また、このような場合、基準ステートメントに影響を与えるステートメントを解析することが困難になる。
例えば、図4に示すソースコードで、13行目のステートメントを基準ステートメントとして、基準ステートメントに影響を与えるステートメントを強調表示すると、図16のように、ソースコード中の大部分のステートメントが強調表示される。そのため、強調表示の効果が得られない。また、基準ステートメントに影響を与えるステートメントの解析も困難になる。
特開2000−215037号公報
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.
そこで、本発明は、ユーザによるソースコードの理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置、情報処理方法、および情報処理プログラムを提供することを目的とする。
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる情報処理装置であって、表示対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御部とを備える。
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、基準となるステートメントから依存関係によって繋がるステートメント群が、基準となるステートメントからの依存関係の連鎖の段階に応じて分類され、分類ごとに決定されたそれぞれの表示態様でステートメントが表示される。そのため、ユーザは、基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群において、その連鎖の各段階におけるステートメントを認識することができる。その結果、ユーザは、例えば、その時の状況に応じて、必要とする段階のステートメントだけに絞り込んで注目することができる。ひいては、ユーザによるソースコードが示すプログラムの理解を容易にすることができる。
ここで、ステートメントとは、ソースコードで記述されるプログラムを主に構成する主要単位である。ステートメントは、例えば、プログラムが示す一連の動作における1段階の処理または1組の宣言を表す。ステートメントは、文、命令文、命令等と呼ばれることがある。ステートメントはソースコード中では、例えば、文字列で表される。開発者は、ソースコード中で各ステートメントを区別して識別することができる。1ステートメントが示す処理の範囲はプログラム言語によって異なる。また、ソースコード中での表示形式もプログラム言語によって異なる。
ここで、2つのステートメントのうち、一方の処理によって、他方の処理が影響を受ける場合に、それら2つのステートメントは依存関係を有するものとする。
本発明にかかる情報処理装置において、前記依存関係解析部は、ソースコードにおいて、ステートメントと、当該ステートメントが示す処理の実行の有無を決定する条件分岐ステートメントとの依存関係である制御依存関係と、変数の値を決定する処理を示すステートメントと、当該変数の値が再決定される前に当該変数を参照する処理を示すステートメントとの依存関係であるデータ依存関係とを、前記依存関係として解析することができる。前記ステートメント分類部は、前記基準となるステートメントを第1の分類とし、第(2N−1)(Nは1以上の整数)の分類のステートメントを実行するか否かを決定する条件分岐ステートメントを、前記依存関係解析部で解析された制御依存関係を基に抽出して第2Nの分類とする第2N分類抽出処理と、前記第2N分類とされた前記条件分岐ステートメントにおける条件判定で参照される変数値を決定する処理を示すステートメントを、前記依存関係解析部で解析されたデータ依存関係を基に抽出し、第(2N+1)の分類とする第(2N+1)分類処理とを、所定の条件が満たされるまでNを1ずつ加算して繰り返す態様とすることができる。
上記構成により、基準となるステートメントを実行するか否かに対して連鎖的に影響を与えるステートメント群が、その連鎖の数に応じて各段階に分類される。すなわち、第1分類のステートメントの実行の有無を決定する条件分岐ステートメントが第2分類となり、第2分類のステートメントの分岐の方向を決めるステートメントが第3分類に、第3分類のステートメントの実行の有無を決定する条件分岐ステートメントが第4分類に、というようにして、第1分類のステートメントに連鎖的に依存関係を有するステートメント群が、1つ分の依存関係の連鎖の段階ごとに、分類されていく。これにより、依存関係によって連鎖的に繋がるステートメント群を、基準となるステートメントからの、依存関係の連鎖の数ごとに、複数の階層に分類することができる。そのため、第1分類のステートメントに対して連鎖的に依存関係を持つステートメント群を、依存関係を遡って段階ごとに表示態様を決定することが可能になる。
本発明にかかる情報処理装置において、前記ステートメント選択部は、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付けて、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択し、前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類する態様とすることができる。
上記構成により、外部から指定されたリソース確保ステートメントで確保されたリソースを開放するステートメントと依存関係によって連鎖的に繋がるステートメント群が、依存関係の連鎖の段階に応じて分類されることになる。この分類ごとに表示態様が決定されてステートメントが表示されるので、ユーザは、リソースを解放するステートメントからの依存関係の連鎖の段階ごとに、ステートメントを区別して認識することができる。そのため、ユーザにとって、ソースコードを見てメモリリークの有無を確認することが容易になる。
本発明にかかる情報処理装置において、前記ステートメント選択部は、不正な値が設定された変数を参照する処理が実行される可能性のあるステートメントの指定を外部から受け付けて、当該指定されたステートメントで参照される変数の値を決定する値決定ステートメントを前記ソースコード中から選択し、前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの前記依存関係の連鎖の段階に応じて分類する態様とすることができる。
上記構成により、外部から指定されたステートメントで参照される変数の値を決定する処理を示す値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、依存関係の連鎖の段階に応じて分類することになる。この分類ごとに決定された表示態様でステートメントが表示される。これにより、ユーザは、値決定ステートメントからの依存関係の連鎖の段階ごとに、ステートメントを区別して認識することができる。その結果、ユーザは、ソースコードを見て不正な値が設定された変数が参照されるか否かを確認することが容易になる。
本発明にかかる情報処理装置は、どの分類のステートメントを強調表示させるかを示す情報を、外部からの入力に基づいて生成し、前記表示制御部へ通知する更新部をさらに備え、前記表示制御部は、前記更新部から前記情報が通知された場合に、前記情報が示す分類のステートメントが強調表示されるように前記ソースコードを前記表示装置への表示させる態様とすることができる。
上記構成により、更新部は、外部からの入力に基づいて、強調表示させるステートメントの分類を示す情報を生成する。表示制御部は、更新部から通知された情報に基づいて、外部からの入力に基づく分類のステートメントが強調表示されるように表示装置へソースコードを表示させる。そのため、例えば、ユーザによる強調表示箇所の指示等のような外部入力に基づいて、強調する部分を分類ごとに更新することができる。
本発明にかかる情報処理装置は、どの分類のステートメントを強調表示させるかを示す情報を、一定時間ごとに自動的に生成し、前記表示制御部へ通知する更新部をさらに備え、前記表示制御部は、前記更新部から通知された情報が示す分類のステートメントを強調表示するように、ステートメントの表示態様を決定する態様とすることができる。
これにより、一定時間ごとに強調表示するステートメントの分類を変化させて表示することが可能になる。
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、解析対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定部とを備える。
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、リソース解放ステートメントから連鎖的に繋がるステートメント群が、その依存関係の連鎖の段階に応じて分類される。判定部は、リソース解放ステートメントから、前記分類ごとに順次ステートメントを解析する。これにより、判定部は、リソース解放ステートメントから順に、依存関係の連鎖を段階的に辿りながら、リソース解放ステートメントが実行されない場合があり得るか否かを判定することができる。その結果、解析対象のステートメントにおいて確保されたリソースの解放し忘れが発生し得るか否かを、効率よく判定することが可能になる。
本発明にかかる情報処理装置は、一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、解析対象のソースコードを記録する記録部と、前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択部と、前記依存関係解析部で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類部と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定部とを備える。
上記情報処理装置によれば、依存関係解析部で解析された依存関係に従って、値決定ステートメントからの依存関係の連鎖の段階に応じて、値決定ステートメントと依存関係によって繋がるステートメント群が分類される。判定部は、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析する。これにより、判定部は、値決定ステートメントから順に、依存関係の連鎖を段階的に辿りながら、不正な値が変数の値として決定され得るか否かを判定することができる。その結果、不正な値が設定された変数を参照する処理が発生する可能性の有無を、効率よく判定することができる。
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御処理とをコンピュータに実行させる。
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる。
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択処理と、前記依存関係解析処理で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類処理と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる。
本発明にかかる情報処理プログラムは、一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させるコンピュータによる情報処理方法であって、前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択工程と、前記依存関係解析工程で生成された依存関係データを用いて、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様でステートメントを表示することを示す信号を外部の表示装置へ送信する表示制御工程とを含む。
本発明にかかる情報処理方法は、一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択工程と、前記依存関係解析工程で生成された前記依存関係データを用いて、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定工程とを含む。
本発明にかかる情報処理方法は、一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択工程と、前記依存関係解析工程で解析された前記依存関係データを用いて、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類工程と、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定工程とを含む。
本発明によれば、ユーザによるソースコードの理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置、情報処理方法、および情報処理プログラムを提供することができる。
以下本発明の実施の形態について、図面を参照しながら説明する。
(実施の形態1)
本発明の実施の形態1は、ソースコードで示される処理におけるメモリリークの有無の確認が容易になるようにソースコードを表示する機能を有する情報処理装置である。
本発明の実施の形態1は、ソースコードで示される処理におけるメモリリークの有無の確認が容易になるようにソースコードを表示する機能を有する情報処理装置である。
[メモリリークについて]
ここで、メモリリークとその確認作業について説明する。メモリリークとは、プログラム実行時に確保されたメモリ領域が、使用されなくなってからも解放されず、メモリ領域を無駄に消費している状態のことである。例えば、プログラムがコンピュータに実行させる一連の処理において、メモリ確保関数が呼び出されたあと、そのメモリ確保関数と対となるメモリ解放関数が呼び出されずに一連の処理が終了する場合にメモリリークが発生する。なお、メモリリークの原因はこれに限られない。
ここで、メモリリークとその確認作業について説明する。メモリリークとは、プログラム実行時に確保されたメモリ領域が、使用されなくなってからも解放されず、メモリ領域を無駄に消費している状態のことである。例えば、プログラムがコンピュータに実行させる一連の処理において、メモリ確保関数が呼び出されたあと、そのメモリ確保関数と対となるメモリ解放関数が呼び出されずに一連の処理が終了する場合にメモリリークが発生する。なお、メモリリークの原因はこれに限られない。
図1は、C言語で記述されたプログラムのソースコードの一例を示す図である。図1に示すソースコードにおいて、各行の左端の2桁の数字は行番号であり、2桁目以降にステートメントが記述されている。C言語のソースコードでは、ステートメントの終わりはセミコロン「;」で表される。02、03行目は、変数a、pの宣言処理をそれぞれ示すステートメントである。変数pの前の*は変数pがポインタであることを示す。04行目の場合、制御文「IF」と条件式(a>0)とが合わせて1ステートメントとして扱われてもよい。03行目の関数「malloc」および08行目の関数「free」は、例えば、ANSI C ランタイムライブラリで提供されるC言語の関数である。なお、C言語において何を1ステートメントとするかは、本実施形態に示す例に限られない。
図1に示すソースコードでは、03行目でメモリ確保関数mallocが呼び出されることによりメモリ領域が確保される。確保されたメモリ領域のメモリアドレスは、関数の戻値として返され、pに代入される。
その後、07行目のIF文の条件式「a>0」が真である場合には、08行目のメモリ解放関数freeが呼び出されて、03行目で確保されたメモリ領域が解放される(引数pは、解放すべきメモリのアドレスを表す)。
しかし、07行目のIF文の条件式「a>0」が偽である場合、メモリ解放関数freeは呼び出されない。そのため、03行目で確保されたメモリ領域が解放されず、メモリリークが発生する。
メモリリークにより解放されないメモリが蓄積すると、システムが使用可能なメモリが徐々に失われていく。最終的には、メモリ不足によりプログラムが実行できなくなったり、システム自体が停止したりするといった問題が発生するので、開発者はメモリリークが発生しないよう注意しなくてはならない。
そのため、開発者は、ソースコードを精査し、確保されたメモリが解放されずに処理が終了するような実行パスがあるかどうかを確認する作業(メモリリークの確認)をする必要がある。このような作業は、例えば、開発者が人手でソースコードをレビューする際や、メモリリーク検出ツールの検出結果を確認する際等に実施される。
ここで実行パスとは、ステートメントを実行される順に並べたものであり、ステートメントAからステートメントBへの実行パスとはAを起点、Bを終点として、AからBまでのステートメントを実行される順に並べたものを表す。
メモリリーク検出ツールは、ソースコードを解析して、メモリリークが発生する実行パスを検出するソフトウエアである。メモリリーク検出ツールの検出結果は、実際にはリークが発生しない実行パス(誤検出パス)を含んでいることが少なくないため、検出ツールのユーザは、検出結果の実行パスを1つ1つチェックして、実際にメモリリークが発生するかどうかを精査しなければならない。
メモリリーク検出ツールにおいて誤検出パスが発生する原因はツールによってさまざまであるが、典型的なパターンとして、条件分岐ステートメントの条件式の判定結果を加味しないために、実際には通り得ない実行パスを検出する例が挙げられる。
このように、開発者は、メモリリークの確認をする際、ソースコードの構造を詳細に理解しながら作業を進める必要がある。実施の形態1における情報処理装置は、ユーザのソースコードの構造理解を助け、メモリリークの確認を容易にすることが可能となるようにソースコードを表示する情報処理装置の例である。
[情報処理装置の構成]
以下、実施の形態1における情報処理装置について、図面を参照しながら説明する。図2は、実施の形態1における情報処理装置の構成を表す機能ブロック図である。図2に示す情報処理装置1は、依存関係解析部2、ステートメント選択部3、ステートメント分類部4、記録部5、更新部6および表示制御部7を備える。
以下、実施の形態1における情報処理装置について、図面を参照しながら説明する。図2は、実施の形態1における情報処理装置の構成を表す機能ブロック図である。図2に示す情報処理装置1は、依存関係解析部2、ステートメント選択部3、ステートメント分類部4、記録部5、更新部6および表示制御部7を備える。
情報処理装置1は、CPUおよびメモリを含むコンピュータにより実現することができる。依存関係解析部2、ステートメント選択部3、ステートメント分類部4、更新部6および表示制御部7の各部は、コンピュータのCPUが所定のプログラムに従って動作することにより実現される。また、記録部5は、コンピュータの内蔵記憶装置またはこのコンピュータからアクセス可能な記憶装置によって具現化される。また、依存関係解析部2、ステートメント選択部3、ステートメント分類部4、更新部6および表示制御部7の機能をコンピュータで実現するためのプログラムまたはそれを記録した記録媒体も本発明の一実施態様である。
情報処理装置1は、入力装置11および表示装置12に接続されている。入力装置11は、ユーザが情報処理装置1へ情報を入力するための装置であり、例えば、マウスおよびキーボード等で実現される。表示装置12は、情報処理装置1から出力される画像信号に基づいて画像を表示する装置であり、例えば、CRT、液晶ディスプレイ、プラズマディスプレイ、SEDまたは有機ELディスプレイ等のディスプレイであってもよいし、プロジェクタ、プリンタ等であってもよい。
依存関係解析部2は、記録部5に記録されたソースコードを読み出して、ソースコードに含まれるステートメント間の依存関係を解析し、依存関係を表すデータを記録部5に記録する。例えば、依存関係解析部2は、まず、ソースコードで示されるプログラムを解釈し、ソースコードに含まれるステートメントを抽出する。続いて、依存関係解析部2はステートメント間の依存関係を調べ、例えば、プログラム依存グラフを表すデータのような依存関係データを生成し記録部5へ記録する。プログラム依存グラフについては後述する。
本実施形態では、一例として、依存関係は以下に示す制御依存関係およびデータ依存関係で表される場合について説明する。
例えば、プログラム中のA、Bという2つのステートメントについて、i)Aが条件分岐であり、ii)Bの実行がAの判定結果に依存するとき、A、Bの間には制御依存関係が存在するという。
また、プログラム中のA、Bという2つのステートメントについて、i)Aが変数Vを定義(決定)し、ii)Bが変数Vを参照し、iii)AからBへに至るまでのすべての実行パスについて、Vの再定義(再決定)が発生しない実行パスが少なくとも1つ存在するとき、A、Bの間にはデータ依存関係が存在するという。
表示制御部7は、記録部5に記録されたソースコードを表示装置12へ表示させる。ユーザは、表示装置12に表示されたソースコードを見て、メモリリークの確認作業を行う。例えば、メモリリークの確認作業の初期段階において、ユーザは、表示装置12に表示されたソースコード中のステートメントのうち、作業の対象としたいステートメントを示す情報等を、入力装置11を用いて入力することができる。具体的には、ユーザは、表示装置12に表示されたソースコードに含まれるステートメントのうち、所望のステートメントをマウス等でクリックすることでそのステートメントを選択することができる。
ステートメント選択部3は、ユーザからの入力を、入力装置11を介して受け付け、前記入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメント(以下、基準ステートメントと称する)を選択する。ステートメント選択部3は、選択した基準ステートメントをステートメント分類部4に通知する。
ステートメント分類部4は、記録部5に記録されたプログラム依存グラフが示すステートメント間の依存関係を参照し、基準ステートメントから依存関係によって連鎖的に繋がるステートメント群を、基準ステートメントからの依存関係の連鎖の度合いに応じて分類する。ステートメント分類部4は、分類結果を表示制御部7へ通知する。
ステートメントの分類方法の詳細は後述するが、例えば、以下のように基準ステートメントから依存関係によって連鎖的に繋がるステートメント群を、分類1、2、3・・・2n、2n+1、・・・に分類することができる。
分類1:基準ステートメント
分類2:分類1の実行を決定する条件分岐ステートメント
分類3:分類2の分岐方向を決定するステートメント
…
分類2n:分類2n−1の実行を決定する条件分岐ステートメント
分類2n+1:分類2nの分岐方向を決定するステートメント
…
表示制御部7は、ステートメント分類部4により通知されたステートメントの分類によって、そのステートメントの表示態様を決定する。例えば、表示制御部7は、分類1ならば赤、分類2ならば青…といったように、分類によってステートメントの色づけを決定してもよい。表示制御部7は、決定した表示態様を表示装置12に通知し、表示態様に従ったステートメントを表示装置12へ表示させる。これにより、表示装置12にはステートメント分類部4で生成された分類ごとに決定された表示態様でステートメントが表示される。なお、表示制御部7は、ユーザが選択したステートメントについても表示態様を決定し、その表示態様で表示装置12に表示させてもよい。
分類2:分類1の実行を決定する条件分岐ステートメント
分類3:分類2の分岐方向を決定するステートメント
…
分類2n:分類2n−1の実行を決定する条件分岐ステートメント
分類2n+1:分類2nの分岐方向を決定するステートメント
…
表示制御部7は、ステートメント分類部4により通知されたステートメントの分類によって、そのステートメントの表示態様を決定する。例えば、表示制御部7は、分類1ならば赤、分類2ならば青…といったように、分類によってステートメントの色づけを決定してもよい。表示制御部7は、決定した表示態様を表示装置12に通知し、表示態様に従ったステートメントを表示装置12へ表示させる。これにより、表示装置12にはステートメント分類部4で生成された分類ごとに決定された表示態様でステートメントが表示される。なお、表示制御部7は、ユーザが選択したステートメントについても表示態様を決定し、その表示態様で表示装置12に表示させてもよい。
更新部6は、例えば、どの分類のステートメントを強調表示させるかのユーザによる選択等の入力を、入力装置11を介して受け付け、この入力に基づいて、強調表示させる分類のステートメントを示す情報を生成し、表示制御部7へ通知する。
例えば、ユーザは、分類1、2を強調表示し、他の分類は強調しないことを示す指示および表示更新の指示の入力を、入力装置11を用いて行う。ユーザの指示の入力を受けた更新部は、強調表示する分類1、2と更新指示を示す更新信号を生成し表示制御部7へ送信する。表示制御部7は、更新信号を受けた時点で、分類1、2のステートメントを強調表示するよう表示装置12に表示画像を更新させる。また、更新部6は、ユーザから表示の終了の指示を受け付け、表示の終了を指示する終了信号を生成して表示制御部7に送信してもよい。
なお、本実施形態では、ユーザの指示に基づいて更新信号、終了信号が送信されることになっているが、更新部6は、ユーザが指示に基づくのではなく、例えば、タイマ等を用いて定期的に更新信号が送信されるようにすることも可能である。これにより、例えば、分類1〜nまでのステートメントを、分類ごとに、一定時間間隔で順次、強調表示することができる。
[情報処理装置1の動作例]
次に、情報処理装置1の動作例を説明する。図3は、情報処理装置1がソースコードを表示する動作の一例を示すフローチャートである。ここで、一例として、ユーザが、ソースコードで示される処理において、メモリリークが発生し得るか否かを確認する際に、その確認作業を容易にするための情報処理装置1によるソースコード表示について説明する。
次に、情報処理装置1の動作例を説明する。図3は、情報処理装置1がソースコードを表示する動作の一例を示すフローチャートである。ここで、一例として、ユーザが、ソースコードで示される処理において、メモリリークが発生し得るか否かを確認する際に、その確認作業を容易にするための情報処理装置1によるソースコード表示について説明する。
図3において、まず、表示制御部7は、表示するべきソースコードを記録部5から読み出して表示装置12に表示させる(ステップ301)。これにより、ユーザは、表示されたソースコードに含まれるステートメントの中からメモリリーク確認作業の対象とするメモリ確保ステートメントを選択することができる。
依存関係解析部2は、記録部5から読み出したソースコードを解釈し、ソースコードに含まれるステートメント間の依存関係を調査して、プログラム依存グラフを作成する(ステップ302)。プログラム依存グラフは、依存関係を表すデータとして記録部5に記録される。なお、依存関係の調査の詳細については後述する。
ステートメント選択部3は、ユーザによるメモリ確保ステートメントの選択を、入力装置11を介して受け付ける(ステップ303)。ステートメント選択部3は、ソースコードの中から、上記メモリ確保ステートメントで確保されたメモリを解放する処理を示すステートメント(メモリ解放ステートメント)を、基準ステートメントとして抽出する(ステップ304)。
なお、本実施形態ではメモリ解放ステートメントが基準ステートメントとなる場合を例示するが、基準ステートメントはこれに限られない。例えば、ユーザが選択したメモリ確保ステートメントを基準ステートメントとすることもできる。
次に、ステートメント分類部4が、ステップ302で作成されたプログラム依存グラフに基づいて、基準ステートメント(メモリ解放ステートメント)と依存関係によって連鎖的に繋がるステートメント群を、分類1、2、・・・2n、2n+1、・・・に分類する(ステップ305)。すなわち、基準ステートメントと依存関係によって連鎖的に繋がるステートメント群それぞれに、分類1、2、・・・2n、2n+1、・・・のいずれかを示すデータが割り当てられることになる。分類結果を示すデータは、表示制御部7に通知される。なお、分類方法の詳細は後述する。
上記ステップ305の分類処理が終了すると、表示制御部7は、更新部6から、更新信号または終了信号が送信されてくるまで待つ(ステップ306)。更新部6は、ユーザから、どの分類のステートメントを強調表示させるかを示す情報の入力を受け付け、その情報の入力があった場合は、更新信号を生成して表示制御部7へ送信する。更新信号には、強調表示する分類を示す情報と、更新指示を示す情報とが含まれる。また、ユーザから表示終了の指示の入力があった場合、更新部6は、終了信号を生成して表示制御部7へ送信する。
表示制御部7は、終了信号を受信した場合(ステップ307でY)、表示装置12にソースコードの表示を終了させる。表示制御部7は、終了信号でなく更新信号を受信すると(ステップ307でN、かつステップ308でY)、受信した更新信号と、ステップ305で各ステートメントに割り当てられた分類に基づいて、各ステートメントの表示態様を決定する(ステップ309)。
そして、表示制御部7は、ステップ308で決定した表示態様で各ステートメントを表示するように、表示装置12にソースコード表示を更新させる(ステップ310)。その後、表示制御部7は、更新信号または終了信号を受信するまで待機する(ステップ306)。
このように、表示制御部7は、更新信号を受信する度に、表示態様の決定処理(ステップ309)および表示処理(ステップ310)を実行するので、ユーザからの入力に基づいて、強調表示するステートメントを分類ごとに変化させることができる。これにより、メモリ解放ステートメントと依存関係によって連鎖的に繋がるステートメント群、すなわち、メモリ解放ステートメントが依存するステートメント群を、ユーザが分類ごとに区別して視認できるように表示することができる。すなわち、メモリ領域の解放処理に関連する箇所をソースコード全体から絞り込み、関連の仕方によって各ステートメントを区別できるように表示することができる。そのため、ユーザのソースコードの構造理解を助け、メモリリークの確認作業を容易にすることが可能となる。
以下、図3に示すフローチャートにおける、依存関係解析処理(ステップ302)、ステートメント分類処理(ステップ305)およびステートメントの表示形態決定処理(ステップ309)それぞれについて、より詳細な具体例を説明する。
[依存関係解析処理(ステップ302)の具体例]
図4は、C言語のソースコードの一例を示す図であり、図5は、図4に示すソースコードに含まれるステートメント間の依存関係を表すプログラム依存グラフである。本具体例では、依存関係解析部2は、図4に示すソースコードを記録部5読み込んで、図5に示すプログラム依存グラフを表すデータを生成する。このプログラム依存グラフの生成には公知のプログラム依存グラフ作成アルゴリズムを用いることができる。
図4は、C言語のソースコードの一例を示す図であり、図5は、図4に示すソースコードに含まれるステートメント間の依存関係を表すプログラム依存グラフである。本具体例では、依存関係解析部2は、図4に示すソースコードを記録部5読み込んで、図5に示すプログラム依存グラフを表すデータを生成する。このプログラム依存グラフの生成には公知のプログラム依存グラフ作成アルゴリズムを用いることができる。
プログラム依存グラフは、「節点」、と「辺」によって表される。特に、向きがある辺は「有向辺」と呼ばれる。節点は、プログラムに存在するステートメントを表す。辺は、2つの節点間の依存関係(制御依存関係またはデータ依存関係)を表す。例えば、ステートメントBがステートメントAに依存している場合、プログラム依存グラフにおいては、Aに対応する節点からBに対応する節点へ向かう有向辺により、AとBの依存関係が表される。
図5に示す例では、四角形が節点、実線の矢印が制御依存を表す有向辺、点線の矢印がデータ依存を表す有向辺である。依存関係解析部2は、図4に示すソースコードを読み込んだ場合、まず、節点となるステートメント(04、05、06、08、09、11、13、14行目のステートメント)を抽出する。そして、依存関係解析部2は、各節点のステートメントについて、他のステートメントとの制御依存関係およびデータ依存関係を解析する。
例えば、04行目のステートメントの処理でpの値が決定され、このpの値は、06行目、14行目、16行目のステートメントの処理でそれぞれ参照される。また、pの値は、04行目のステートメントの処理が実行されてから、06行目、14行目または16行目のステートメントの処理が実行されるまで再定義されない。従って、04行目のステートメントから、06行目、14行目、16行目のそれぞれのステートメントへの値pに関するデータ依存関係がある。そのため、図5に示すプログラム依存グラフでは、04行目のステートメントの節点から、06行目、14行目、16行目の節点それぞれに向けて点線矢印の有向辺が設けられる。
また、05行目のステートメントにおけるIF文の判定結果により、06行目のステートメントの処理が実行されるか否かが決まるので、05行目のステートメントから06行目のステートメントへの制御依存関係がある。したがって、図5に示すプログラム依存グラフでは、05行目のステートメントの節点から、06行目の節点に向けて実線矢印の有向辺が設けられている。
なお、プログラム依存グラフは、上記例のように、制御依存関係およびデータ依存関係のみで表される場合に限らず、その他の依存関係がプログラム依存グラフで表されてもよい。また、依存関係解析部2が生成する依存関係を表すデータは、プログラム依存グラフで示されるデータに限られない。
[ステートメント分類処理(ステップ305)の具体例]
以下、ステートメント分類部4の動作の具体例として、図5に示したプログラム依存グラフが表す依存関係に基づいてステートメントを分類する処理について説明する。図6は、ステートメント分類部4が、ステートメントを分類する処理の例を示すフローチャートである。
以下、ステートメント分類部4の動作の具体例として、図5に示したプログラム依存グラフが表す依存関係に基づいてステートメントを分類する処理について説明する。図6は、ステートメント分類部4が、ステートメントを分類する処理の例を示すフローチャートである。
図6に示す処理は、図3に示したフローチャートのステップ305の具体例である。ここでは、一例として、図3のステップ303でユーザが図4に示すソースコードの04行目のメモリ確保ステートメントを選択し、ステップ304でステートメント選択部3が、06行目と16行目のメモリ解放ステートメントを基準ステートメントとして抽出した場合について説明する。
この場合、ステートメント分類部4は、まず、基準ステートメントであるメモリ解放ステートメントを分類1とする(ステップ601)。すなわち、図4に示したソースコードにおいて、06行目と16行目のメモリ解放ステートメントが分類1となる。
次に、ステートメント分類部4は、変数の値を、初期値を設定し(n=1)、分類(2n−1)に属するステートメントが存在するか否かを判断する(ステップ602)。もし、分類(2n−1)のステートメントが存在しない場合(ステップ602でN)は、ステートメント分類処理は終了する。
これに対して、例えば、n=1の場合は、分類(2n−1)(=分類1)に属するステートメントとして、上記06行目と16行目のメモリ解放ステートメントが存在する。このように分類(2n−1)のステートメントが存在する場合(ステップ602でY)、ステートメント分類部4は、変数mの値に初期値を設定し(m=1)、変数Mに分類(2n−1)のステートメントの数(本例ではM=2)を設定する。
さらに、ステートメント分類部4は、分類(2n−1)に属するステートメントのうちm番目のステートメント(以下、St(2n−1,m)と表す)を選択する。n=1かつm=1の場合、分類1に属するステートメントにおいて1番目のステートメントSt(1,1)は、06行目のステートメントとなる。
次に、ステートメント分類部4は、選択したステートメントSt(2n−1,m)が他のステートメントに対して制御依存関係を有するか否かを判断する(ステップ604)。制御依存関係がある場合(ステップ604でY)、ステートメント分類部4はその制御依存関係をひとつ遡ったステートメントを分類2nとする(ステップ605)。
上記ステップ604および605において、ステートメント分類部4は、記録部5に記録された依存関係データが示すプログラム依存グラフにおいて、ステートメントSt(2n−1,m)の節点へ向う制御依存関係を示す有向辺があるか否かにより制御依存関係の有無を判断し、そのような有向辺がある場合は、その有向辺を一段遡った節点のステートメントを分類2nに属するステートメントとすることができる。
例えば、ステートメント分類部4は、図5に示すプログラム依存グラフにおいて、St(1,1)=06行目のステートメントの節点に向う実線の有向辺があるか否かを判断する。この場合、実線の有向辺があるので、その有向辺の始点となる節点の05行目のステートメントを分類2に属するステートメントとする。
ステートメント分類部4は、上記のステップ603〜ステップ605の処理を、変数mがM(分類2n−1に属するステートメントの数)になるまで、mを1ずつ加算しながら、繰り返す。これにより、分類2n−1に属するステートメントそれぞれについて、制御依存関係を有するステートメントが検索され、その結果見つかったステートメントが分類2nに属するステートメントとなる。すなわち、分類2nのステートメントが抽出される。
本例では、M=2なので、m=2に加算されて再びステップ603〜ステップ605が繰り返される。m=2の場合は、ステップ603でステートメントSt(1、2)=16行目のステートメントが選択される。図5のプログラム依存グラフにおいて、16行目のステートメントの節点に向う実線の有向辺(制御依存を示す有向辺)が、13行目のステートメントから繋がっているので、13行目のステートメントが分類2のステートメントとして抽出される。
もし、ステップS603〜ステップ605の繰り返し処理において、分類(2n−1)に属するステートメントと制御依存関係を有するステートメントがソースコード中に1つも見つからず、分類2nに属するステートメントが存在しない場合(ステップ606でN)は、ステートメント分類処理は終了する。すなわち、分類2nに属するステートメントが抽出されなかった場合は、ステートメント分類処理は終了する。
一方、分類2nのステートメントが抽出された場合は、ステートメント分類部4は、分類2nのステートメントとデータ依存関係を有するステートメントを検索し、見つかったステートメントを分類(2n+1)のステートメントとする(ステップ607)。
図7は、ステップ607の処理の詳細を示すフローチャートである。図7において、ステートメント分類部4は、変数mに初期値を設定し(m=1)、変数Mに分類2nのステートメントの数を設定する(本例ではM=2)。
さらに、ステートメント分類部4は、分類2nに属するステートメントのうちm番目のステートメントSt(2n,m)を選択する(ステップ701)。例えば、n=1の場合、分類2に属するステートメントにおいて1番目(m=1)のステートメントSt(2,1)は、05行目のステートメントとなり、2番目(m=2)のステートメントSt(2、2)は、13行目のステートメントとなる。
次に、ステートメント分類部4は、選択したステートメントSt(2n−1,m)が他のステートメントに対してデータ依存関係を有するか否かを判断する(ステップ702)。データ依存関係がある場合(ステップ702でY)、ステートメント分類部4はそのデータ依存関係をひとつ遡ったステートメントを分類2n+1とする(ステップ703)。
上記ステップ702および703において、ステートメント分類部4は、記録部5に記録された依存関係データが示すプログラム依存グラフにおいて、ステートメントSt(2n,m)の節点へ向うデータ依存関係を示す有向辺があるか否かによりデータ依存関係の有無を判断し、そのような有向辺がある場合は、その有向辺を一段遡った節点のステートメントを分類2n+1に属するステートメントとすることができる。
例えば、ステートメント分類部4は、図5に示すプログラム依存グラフにおいて、St(2,1)=05行目のステートメントの節点に向う点線の有向辺があるか否かを判断する。この場合、有向辺がないので、St(2,1)は、他のステートメントとデータ依存関係はないと判断される。この場合、ステップ703の処理は実行されない。
ステートメント分類部4は、上記のステップ701〜ステップ703の処理を、変数mがM(分類2n−1に属するステートメントの数)になるまで、mを1ずつ加算しながら、繰り返す。本例では、M=2なので、m=2についてもステップ701〜ステップ703が繰り返される。
m=2の場合は、ステップ701でSt(2、2)として13行目のステートメントが選択される。図5に示すプログラム依存グラフでは、13行目のステートメントの節点には、09行目と11行目のステートメントの節点から点線の有向辺が繋がっているので、09行目と11行目のステートメントが分類3に属するステートメントとされる。m=2のステップ703が終了すると、m=Mなのでステップ607の処理は終了する。
以上のようにステップ607で分類2nのステートメントを抽出処理が終了すると、図6に示すように、ステートメント分類部4は、変数nに1加算して(n=n+1)、再びステップ602において、分類(2n−1)に属するステートメントが存在するか否かを判断し、存在する場合は、変数mを初期化し(m=1)、ステップ603以下の処理を繰り返す。例えば、n=2の場合、上記例では、09行目と11行目のステートメントが分類3に属するので、分類3に属するステートメントは存在すると判断される(ステップ603でY)。そして、ステートメント分類部4は、分類3に属するステートメントはと制御依存関係を有するステートメントを抽出して分類4とする処理(ステップ603〜ステップ605)を実行する。
このようにして、ステートメント分類部4は、分類(2n−1)のステートメントと制御依存関係を有するステートメントを抽出して分類2nとする処理(ステップ603〜ステップS605)と、分類2nのステートメントとデータ依存関係を有するステートメントを抽出して分類2n+1としてnに1加算する処理(ステップ607:ステップ701〜ステップ703)を、次の分類2nに属するステートメントがなくなるまで繰り返す。
上記の例では、n=1のときのステップ607で、分類3に属するステートメントとして、ステップ09行目と11行目のステートメントが抽出される。その後、ステートメント分類部4は、n=2としてステップ604〜ステップ605の処理を実行する。これにより、分類4に属するステートメントとして、08行目のステートメントが抽出される。図5に示すプログラム依存グラフでは、08行目のステートメントの節点から制御依存を示す有向辺が09行目と11行目のステートメントの節点に繋がっているからである。08行目のステートメントの節点は、有向辺がないので、その後のステップ607では、分類5のステートメントは抽出されない。その結果、n=3となった後のステップ602の処理で、分類5に属するステートメントは存在しないと判断され、ステートメント分類処理が終了する。
図8は、上記の動作例で分類されたステートメントを示す表である。図8に示す表では、図4に示したソースコードにおける基準ステートメントであるメモリ解放ステートメント(06行目、16行目のステートメント)が分類1となり、分類2には、プログラム依存グラフにおいて基準ステートメントから制御依存関係を1つ遡った節点のステートメント(05、13行目)、分類3には、分類2の13行目のステートメントからデータ依存関係を1つ遡った節点のステートメント(09、11行目)、分類4には、分類3の09、11行目のステートメントから制御依存関係を1つ遡ったステートメント(08行目)が属するようになっている。図8に示すような分類結果を示すデータは、例えば、記録部5に記録される。
このように、ステートメント分類部4は、基準ステートメントであるメモリ解放ステートメントから制御依存関係とデータ依存関係を交互に1段階ずつ辿っていき、各段階で見つかるステートメントが1つの分類に属するようにする。表示制御部7はこのように分類されたステートメントごとに表示態様を決定し、その表示態様でステートメントを表示装置12へ表示させる。これにより、例えば、後述するように、ユーザのメモリリークの確認作業を容易するようなソースコード表示が可能になる。
なお、ステートメント分類処理は、上記例に限られない。ステートメント分類部4は、上記例では、制御依存関係とデータ依存関係を交互の遡っていき、依存関係1段階ずつ分類しているが、必ずしも、1段階ずつ分類しなくてもよい。また、ステートメント分類部4は、1分類中のステートメント群をさらに分割して、依存関係の連鎖の系統ごとに異なる分類としてもよい。
[ステートメントの表示形態決定処理(ステップ309)]
以下、表示制御部7の動作の具体例として、図8に示した分類結果およびユーザからの指示に従って表示態様を決定して表示する処理について説明する。図9は、表示制御部7が、ステートメントの表示態様を決定し、表示装置12へ表示させる処理を示すフローチャートであり、図3におけるステップ309、310の処理の具体例を示す。
以下、表示制御部7の動作の具体例として、図8に示した分類結果およびユーザからの指示に従って表示態様を決定して表示する処理について説明する。図9は、表示制御部7が、ステートメントの表示態様を決定し、表示装置12へ表示させる処理を示すフローチャートであり、図3におけるステップ309、310の処理の具体例を示す。
図9に示す処理は、表示制御部7が、ユーザからの指示に基づく更新信号を更新部6から受信した後の処理である。ここでは、更新信号には、強調表示するべきステートメントの分類を示す情報が含まれている場合について説明する。強調表示するべきステートメントの分類を示す情報は、更新部6が入力装置11を介してユーザから入力された情報に基づき生成する。
更新部6は、例えば、ユーザから強調表示するステートメントの分類指定を受け付けてもよいし、あるいは、ユーザが更新ボタンをクリックした回数を数えておき、1回目のクリックは分類1、2回目は分類2、・・・というように回数に応じて分類を決定してもよい。強調表示するべきステートメントの分類を示す情報は、例えば、分類を表す番号(1、2、・・・N)のうち少なくとも1つで表される。
表示制御部7は、受信した更新信号から、どの分類を強調表示するか読み取る(ステップ901)。例えば、表示制御部7は、強調表示が指示されている分類の番号を読み取る。また、表示制御部7は、変数Nに初期値(N=1)を設定する(ステップ902)。
その後、以下ステップ903〜906の処理を、Nが分類の数M(ここでは、一例としてM=4)より大きくなるまで(ステップ907でYと判定されるまで)繰り返す。
ステップ903において、表示制御部7は、Nが、更新信号から読み取った強調表示が指示されている分類の番号に含まれるか否かを判定する。Nが、強調表示が指示されている分類の番号に含まれていれば(ステップ903でY)、表示制御部7は、分類Nのステートメントを強調表示するように表示装置12へ命令する。Nが、強調表示が指示されている分類の番号に含まれていなければ(ステップ903でN)、表示制御部7は、分類Nのステートメントを強調表示しないように表示装置12へ命令する。そして、表示制御部7は、ステップ906においてNに1加算する。
上記処理により、すべての分類1〜4について強調表示するか否かが決定され、ユーザが指定した分類のステートメントのみが強調表示される。強調表示の方法として、例えば、文字の太さを変える、色を変えて表示する、下線や枠で囲む、フォントの種類を変える等が挙げられる。
[メモリリーク確認作業におけるソースコードの表示例]
次に、図4に示したソースコードに対してユーザがメモリリークの確認作業を行う際に、表示制御部7が、図8に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図10〜図15を参照しながら説明する。
次に、図4に示したソースコードに対してユーザがメモリリークの確認作業を行う際に、表示制御部7が、図8に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図10〜図15を参照しながら説明する。
図10は、ユーザがメモリリークを確認する際の作業のステップと、各ステップにおいて強調表示されるステートメントの数、行番号、色の例を記載した表である。図11〜図15は、ユーザのメモリリーク確認作業中に表示装置12に表示される画面の例を示す図である。ここで示す例では、表示される画面は、ユーザのメモリリーク確認作業の各ステップに合わせて図11から図15まで順に遷移する。
まず、ユーザは、画面に表示されたソースコードを見ながら、03行目のメモリ確保ステートメントにカーソルを合わせクリックする。このとき、表示制御部7は、図11に示すようにユーザが選択した03行目のメモリ確保ステートメントを、例えば、太字かつオレンジ色で強調表示させる。ユーザは、メモリ確保ステートメントに着目することができる。また、図11に示す画面には、「次のステップ」ボタン50が表示されている。
次に、ユーザは、メモリ確保ステートメントで確保されるメモリを解放するメモリ解放ステートメントをソースコードから探す(図10のステップ1)。このとき、例えば、ユーザが「次のステップ」ボタン50をクリックすることにより、更新部6が分類1を強調表示するための更新信号を生成して表示制御部7に通知する。通知を受けた表示制御部7は、図12に示すように、分類1のステートメント(06行目、16行目)を例えば、太字かつ赤色で強調表示させる。これにより、ユーザは、ソースコード中のメモリ解放ステートメントの位置を容易に把握することができる。
次に、ユーザは、メモリ解放ステートメントを実行するか否か決定する分岐となる条件分岐ステートメントを探す(図10のステップ2)。この時、ユーザが図12に示す画面において、「次のステップ」ボタン50をクリックすることにより、更新部6が分類2を強調表示するための更新信号を生成して表示制御部7に通知する。表示制御部7は、図13に示すように、分類2のステートメント(05行目、13行目)を例えば、太字かつ青色で強調表示させる。ユーザは、メモリ解放ステートメントの実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。これにより、メモリリークが発生しうる実行パスが存在するか否かをすばやく判断することができる。この場合、ユーザは、13行目のIF文で条件式「cond==EMPTY」が真となる場合にメモリリークが発生することを把握する。すなわち、ユーザは、13行目の条件分岐ステートメントの分岐の方向によっては、メモリリークが発生することがわかる。ここで、演算子「==」は、両側の値が互いに等しいときに真を返す演算子である。また、「EMPTY」は、プリプロセッサ(#define)によりマクロ定義された文字列を表す。05行目の「NOT_EMPTY」および09行目の「NORMAL」も同様にマクロ定義された文字列である。
次に、ユーザは、13行目の条件分岐ステートメントにおける分岐の方向を決定するステートメントを探す(図10のステップ3)。このときも、ユーザが「次のステップ」ボタン50をクリックすることにより、分類3を強調表示するための更新信号が表示制御部7に通知される。表示制御部7は、図14に示すように、分類3のステートメント(09行目、11行目)を、例えば、太字かつ緑色で表示させる。これにより、ユーザは、メモリリークが発生する条件を満たす場合があるか否かをすばやく判断することができる。この場合、ユーザは、強調表示された11行目で「cond=EMPTY」と設定さており、13行目のIF文の条件式で真となる条件を満たす場合があることをすばやく把握することができる。
次に、ユーザは、11行目のステートメント「cond=EMPTY」を実行するか否か決定する分岐となる条件分岐ステートメントを探す(図10のステップ4)。この時、ユーザが「次のステップ」ボタン50をクリックすることにより、分類4を強調表示するための更新信号が表示制御部7に通知され、表示制御部7は、図15に示すように、分類4のステートメント(08行目)を例えば、太字かつ黄色で強調表示させる。これにより、ユーザは、11行目のステートメント「cond=EMPTY」の実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。そして、ユーザは、08行目のIF文で条件式「param−>is_nice」が偽となる場合に11行目が実行され、メモリリークが発生することをすばやく把握することができる。
次に、ユーザは、08行目の分岐の方向(条件式「param−>is_nice」)を決定するステートメントを探す(図10のステップ5)。このときも、ユーザが「次のステップ」ボタン50をクリックすることにより、分類5を強調表示する更新信号が表示制御部7へ送信される。この場合、分類5のステートメントは存在しないので、表示制御部7は、例えば、いずれもステートメントも強調表示しないように表示させる(図示せず)。これにより、ユーザは、08行目の分岐の方向を決定するステートメントはソースコード中に存在しないことがすばやく把握できる。また、08行目の分岐の条件式「param−>is_nice」におけるparamはfunction関数の引数として与えられる値であるので、ユーザは、引数によってはメモリリークが発生しうると判断することができる。これにより、メモリリークの確認は終了する。
以上のように、本実施形態では、各分類のステートメントを、メモリリーク確認作業のステップに合わせて順に強調表示することにより、ユーザは素早くかつ正確にメモリリーク確認をすることができる。これに対して、従来のように、メモリ解放ステートメントに影響を与えるステートメントを抽出して全て強調表示した場合は、図16に示すようにソースコード中の大部分が強調表示されてしまい、ユーザのメモリリーク確認作業を容易にすることはできない。
また、図10に示すように、従来の表示方法だと、メモリリーク確認作業の全てのステップで、メモリ解放ステートメントに影響を与える8行のステートメントが表示され、ユーザの検索対象となる。したがって、従来の表示方法における各ステップでの検索対象ステートメント数の平均は、(ステップ1〜5のステートメント数の合計)/(ステップの数)
= (8+8+8+8+8)/5 = 8となる。
= (8+8+8+8+8)/5 = 8となる。
一方、実施の形態1における上述の例では、各ステップの検索対象のステートメント数は、図10に示すように、ステップ1〜3においてそれぞれ2つ、ステップ4で1つ、ステップ5で0となる。そのため、各ステップでの検索対象ステートメント数の平均は、(ステップ1〜5のステートメント数の合計)/(ステップの数) = (2+2+2+1+0)/5 = 1.4となり、従来に比べて検索対象のステートメントが約1/6に絞り込まれている。
以上に述べたとおり、実施の形態1における情報処理装置1によれば、メモリ解放ステートメントに影響を与えるステートメント全体を、メモリ解放ステートメントへの影響の仕方により分類し、メモリリークの確認作業の各ステップにおいて分類ごとに区別して表示することができる。そのため、メモリリーク確認作業の各ステップで着目すべき適切なステートメントが区別可能となるよう表示される。そのため、ユーザがソースコード全体から着目すべきステートメントを探す必要がなくなり、ソースコードの理解が容易になる。
なお、本実施形態では、メモリリークの確認を例として説明を行ったが、メモリリークの確認に限らず、他のリソース確保関数・解放関数の対について、確保関数が呼び出された後に、解放関数が忘れずに呼び出されているか否かを確認する際にも有用である。
例えば、mmap関数とmunmap関数のようなメモリのマップ・アンマップ、 fopen関数とfclose関数のようなファイルオープン・クローズ、shmat関数とshmdt関数のような共有メモリのアタッチ・デタッチ、spin_lock関数とspin_unlock関数のような排他制御等のステートメント対についても、本実施形態におけるmalloc関数とfree関数の場合と同様に扱うことができる。なお、これらの関数は、すべてANSI C ランタイムで定められたC言語の標準関数である。
また、分類ごとに決定された表示態様で、ステートメントを表示する方法も、上記の表示例に限られない。上記の表示例では、ユーザ選択ステートメント→分類1→分類2→分類3→分類4の順に、ステートメントが強調表示されているが、表示制御部7は、例えば、分類1〜4それぞれのステートメントを、分類ごとに色を変えて同時に強調表示させてもよい。この場合でも、ユーザは分類ごとにステートメントを区別できるので、ユーザのソースコード理解が容易になるという効果が得られる。このように、必ずしも、各分類を異なる時間に表示するように表示形態を更新する必要はないので、場合によっては更新部6を省略することもできる。
(実施の形態2)
実施の形態2は、ソースコードを解析し、そのソースコードで示される処理におけるメモリリークの可能性の有無を判定する機能を有する情報処理装置である。図17は、実施の形態2における情報処理装置の構成を表す機能ブロック図である。図17に示す情報処理装置1aにおいて、図2に示した情報処理装置1と同じ機能ブロックには同じ符号を付している。図17に示す情報処理装置1aは、メモリリークの可能性の有無を判定する判定部8を備えることを特徴とする。
実施の形態2は、ソースコードを解析し、そのソースコードで示される処理におけるメモリリークの可能性の有無を判定する機能を有する情報処理装置である。図17は、実施の形態2における情報処理装置の構成を表す機能ブロック図である。図17に示す情報処理装置1aにおいて、図2に示した情報処理装置1と同じ機能ブロックには同じ符号を付している。図17に示す情報処理装置1aは、メモリリークの可能性の有無を判定する判定部8を備えることを特徴とする。
判定部8は、記録部5に記録されたソースコードを読み出して解析し、そのソースコードが示す処理においてメモリリークが発生し得るか否かを判定する。判定結果は、表示装置12へ出力される。判定部8は、ステートメント選択部3が選択した基準ステートメントに依存関係によって連鎖的に繋がるステートメント群の各ステートメントについて、基準ステートメントから順に依存関係を辿りながら解析する。その際、ステートメント分類部4が決定した分類ごとに解析する。そして、判定部8は、前記分類ごとに、メモリリークの可能性の有無を判定する。
図18は、本実施形態における情報処理装置1aがソースコードの示す処理におけるメモリリーク発生の可能性の有無を判定する動作の一例を示すフローチャートである。図18において、ステップ1801〜ステップ1805は、図3に示したフローチャートのステップ301〜ステップ305と同様である。ステップ1806において、判定部8は、ステップ305で決定された分類に基づいて、分類ごとにステートメントの解析を行い、メモリリーク発生の可能性の有無を判定する。
ここでは、一例として、実施の形態1で図4に示したソースコードについて解析する場合について説明する。すなわち、本実施形態でも、ステップ1802では、図5に示すプログラム依存グラフを示す依存関係データが作成される。また、ステップ1803では、図4に示すソースコードの04行目のメモリ確保ステートメントがユーザによって選択され、ステップ1804では、ステートメント選択部3が、06行目と16行目のメモリ解放ステートメントを基準ステートメントとして抽出する。ステップ1805では、図8に示すようにステートメントが分類される。
図19は、図18におけるステップ1806の判定部8によるメモリリーク判定処理の具体例を示すフローチャートである。図19に示す例では、まず、判定部8は、分類2のステートメントから、分類1の基準ステートメントであるメモリ解放ステートメントを実行するか否かを決定する条件分岐ステートメントを取得する(ステップ1901)。ここでは、05行目と13行目の条件分岐ステートメントが取得される。
判定部8は、取得した分類2の条件分岐ステートメントを解析し、メモリ解放ステートメントが実行されないような実行パス(すなわち、メモリリークが発生する実行パス)があり得るか否か判断する(ステップ1902)。本例では、図4に示す05行目のIF分の条件式(mode==NORMAL)が偽、かつ、13行目のIF分の条件式(cond1==EMPTY)が真の場合の実行パスで、メモリリークが発生する。
このようにメモリリークする実行パスがある場合は、その実行パスを通るための条件式を条件Wとしてバッファに記録する(ステップ1903)。ここでは、「(mode==NORMAL)が偽、かつ(cond1==EMPTY)が真」が条件Wとして設定される。
なお、ステップ1902でメモリリークする実行パスがないと判断された場合は、判定部8は、メモリリークは発生しないと判定して処理を終了する(ステップ1911)。
次に、判定部8は、変数nに2を設定し(n=2)、分類2n−1(ここでは分類3)から、条件W「(mode==NORMAL)が偽、かつ(cond1==EMPTY)が真」の判定において参照される変数(=condおよびmode)の値を決定するステートメントを検索する(ステップ1904)。
その結果、そのようなステートメントが存在しなければ(ステップ1905でN)、判定部8は、メモリリークは発生し得るとして(ステップ1910)処理を終了する。本例では、分類3には、変数modeの値を決定するステートメントはないが、変数cond1の値を決定する処理のステートメントはある(09行目、11行目)。ここで、変数modeの値を決定するステートメントがないということは、変数modeの値は引数で指定されるということなので、引数の値によっては「(mode==NORMAL)が偽」という条件が成立し得ると判定される。
このように、ステートメントが存在する場合(ステップ1905でY)、判定部8は、条件Wを成立させるような変数の値を決定するステートメント(以下、ステートメントAと称する)があるか否かを判断する(ステップ1906)
11行目のステートメントは、変数cond1に「EMPTY」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Wが成立する。そのため、ステップ1906でYとなる。もしも、分類3におけるいずれのステートメントの処理でも変数cond1に「EMPTY」が設定されなければ、条件Wは成立しない(ステップ1906でN)。この場合、判定部8は、メモリリークは発生しないと判定して処理を終了する(ステップ1911)。
11行目のステートメントは、変数cond1に「EMPTY」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Wが成立する。そのため、ステップ1906でYとなる。もしも、分類3におけるいずれのステートメントの処理でも変数cond1に「EMPTY」が設定されなければ、条件Wは成立しない(ステップ1906でN)。この場合、判定部8は、メモリリークは発生しないと判定して処理を終了する(ステップ1911)。
ステップ1906でYの場合、判定部8は、分類2nのステートメントから、条件Wを成立させるような変数の値を決定するステートメントAを実行するか否かを決定する条件分岐ステートメントを検索する(ステップ1907)。n=2の場合、ステートメントAは、条件W「(cond1==EMPTY)は真」における変数cond1に値「EMPTY」を決定する11行目のステートメントである。そして、分類4には08行目のステートメントが含まれている。この08行目のステートメントは、11行目のステートメント(ステートメントA)を実行の有無を決定する条件分岐ステートメント(08行目)であるので、これがステップ1907における検索結果の条件分岐ステートメントとなる。
このように、条件分岐ステートメントが存在する場合(ステップ1908でY)、判定部8は、この条件分岐ステートメントで、ステートメントAの処理が実行されるような判定結果となるための条件を条件Wとしてバッファに記録する(ステップ1909)。ここでは、08行目の条件式「param―>is_niceが真」となる場合に、11行目のステートメントの処理が実行されるので、「param―>is_niceが真」が条件Wに設定される。
その後、判定部8は、変数nに1加算し(n=n+1)、ステップ1904の処理を繰り返す。例えば、n=2+1=3となった場合、判定部8は、分類5から条件式「param―>is_niceが真」で参照される変数paramの値を決定するステートメントを検索する。しかし、分類5に含まれるステートメントは存在しないので、ステップ1905でNとなる。その場合、判定部8は、メモリリークは発生しうると判定し(ステップ1910)、処理を終了する。すなわち、変数paramの値は、function関数内で決定されるのではなく、function関数の引数で指定される値なので、引数の値によってはメモリリークが発生する可能性があると判定される。
以上の処理により、判定部8は、ソースコードが示す処理においてメモリリークが発生するか否かを判定することができる。判定部8は、判定結果を表示装置12に表示する。判定結果には、メモリリークの有無を表す情報の他に、メモリリークの有無に影響を与える変数、ステートメント、デバッグ情報等が含まれてもよい。
図19に示した上記処理例では、判定部8は、ステートメント分類部4による分類を用いて、分類ごとにステートメントの解析を行っている(ステップ1901、1905、1907)。そのため、判定部8は、メモリ解放ステートメントから依存関係を遡っていく過程のそれぞれのステップで、解析対象とするステートメントに適格に絞り込んで判定をすることができる。その結果、判定処理の効率がよくなる。
なお、図19に示したメモリリークの判定処理は一例であり、本発明は、これに限られない。
(実施の形態3)
実施の形態3は、ユーザが、ソースコードにおいて、不正な値が設定された変数を参照する処理が実行されうるか否かを確認する作業を容易にするようにソースコードを表示する機能を有する情報処理装置である。ここでは、上記作業の例として、ユーザによる、NULLポインタデリファレンスの発生の有無を確認する作業を挙げて説明する。
実施の形態3は、ユーザが、ソースコードにおいて、不正な値が設定された変数を参照する処理が実行されうるか否かを確認する作業を容易にするようにソースコードを表示する機能を有する情報処理装置である。ここでは、上記作業の例として、ユーザによる、NULLポインタデリファレンスの発生の有無を確認する作業を挙げて説明する。
[NULLポインタデリファレンスについて]
デリファレンスとは、ポインタの指すメモリアドレスのメモリ領域に格納された値を参照することである。NULLポインタデリファレンスとは、NULLが設定されたポインタが、有効なメモリアドレスを指していないにも関わらず、そのポインタの指す不正なメモリアドレスを用いてメモリを参照しようとすることである。
デリファレンスとは、ポインタの指すメモリアドレスのメモリ領域に格納された値を参照することである。NULLポインタデリファレンスとは、NULLが設定されたポインタが、有効なメモリアドレスを指していないにも関わらず、そのポインタの指す不正なメモリアドレスを用いてメモリを参照しようとすることである。
NULLは通常無効なメモリアドレスであるので、NULLポインタデリファレンスが発生すると、その時点でプログラムはエラーとなり停止する。
例えば、図20に示すC言語のプログラムのソースコードでは、03行目のステートメントでポインタpにNULLが代入される。その後、07行目のIF文における条件式「a>0」の判定結果が真の場合には、08行目の処理でpに適切なメモリアドレスが設定され、続く10行目のデリファレンスで、pが指すメモリアドレスのメモリ領域に値「1」を記録することができる。
しかし、07行目の条件式「a>0」の判定結果が偽の場合には、pがNULLのまま10行目の処理が実行され、NULLポインタデリファレンスが発生してプログラムがエラーとなり停止する。
このようなNULLポインタデリファレンスの確認は、例えば、開発者が、ソースコードを精査し、NULLポインタデリファレンスが発生する実行パスがあるかどうかを確認することにより行われる。
[情報処理装置の構成]
図21は、実施の形態3における情報処理装置の構成を表す機能ブロック図である。図21に示す情報処理装置10において、実施の形態1において図2に示した情報処理装置1と同じ機能グロックには同じ符号を付す。図21に示す情報処理装置10において、ステートメント選択部30、ステートメント分類部40および表示制御部70の有する機能の一部が図2の情報処理装置1のステートメント選択部3、ステートメント分類部4および表示制御部7とは異なる。
図21は、実施の形態3における情報処理装置の構成を表す機能ブロック図である。図21に示す情報処理装置10において、実施の形態1において図2に示した情報処理装置1と同じ機能グロックには同じ符号を付す。図21に示す情報処理装置10において、ステートメント選択部30、ステートメント分類部40および表示制御部70の有する機能の一部が図2の情報処理装置1のステートメント選択部3、ステートメント分類部4および表示制御部7とは異なる。
ステートメント選択部30は、不正な値が設定された変数が参照される恐れのあるステートメントの指定を、ユーザから入力装置11を介して受け付け、前記入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメント(以下、基準ステートメントと称する)を選択する。ステートメント選択部30は、基準ステートメントとして、例えば、ユーザの指定するステートメントで参照される変数の値を決定する処理を示すステートメント(以下、値決定ステートメントと称する)を選択する。
ステートメント分類部40は、例えば、以下のように値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群、すなわち、値決定ステートメントに影響を与えるステートメント群を、分類1、2、3・・・2n、2n+1、・・・に分類することができる。
分類1:値決定ステートメント
分類2:分類1の実行を決定する条件分岐ステートメント
分類3:分類2の分岐方向を決定するステートメント
…
分類2n:分類2n−1の実行を決定する条件分岐ステートメント
分類2n+1:分類2nの分岐方向を決定するステートメント
…
表示制御部70は、ステートメント分類部4により通知されたステートメントの分類によって、そのステートメントの表示態様を決定して、表示装置12へその表示態様でステートメントを表示させる。これにより、表示制御部70は、値決定ステートメントからの依存関係の連鎖の段階ごとにステートメントを区別して表示装置12へ表示させることができる。そのため、ユーザは、不正な値の変数が参照されることがないかを確認する作業において、各ステップで注目すべきステートメントが分類され、区別可能となるような表示が可能になる。
分類2:分類1の実行を決定する条件分岐ステートメント
分類3:分類2の分岐方向を決定するステートメント
…
分類2n:分類2n−1の実行を決定する条件分岐ステートメント
分類2n+1:分類2nの分岐方向を決定するステートメント
…
表示制御部70は、ステートメント分類部4により通知されたステートメントの分類によって、そのステートメントの表示態様を決定して、表示装置12へその表示態様でステートメントを表示させる。これにより、表示制御部70は、値決定ステートメントからの依存関係の連鎖の段階ごとにステートメントを区別して表示装置12へ表示させることができる。そのため、ユーザは、不正な値の変数が参照されることがないかを確認する作業において、各ステップで注目すべきステートメントが分類され、区別可能となるような表示が可能になる。
[情報処理装置10の動作例]
次に、本実施形態における情報処理装置10の動作例について説明する。図22は、本実施形態における情報処理装置10の動作例を示すフローチャートである。図22に示すフローチャートにおいて、図3に示したステップと同じステップには同じ番号を付し、詳細な説明を省略する。ここでは、一例として、図23に示すC言語のソースコードが表示対象のソースコードである場合について説明する。
次に、本実施形態における情報処理装置10の動作例について説明する。図22は、本実施形態における情報処理装置10の動作例を示すフローチャートである。図22に示すフローチャートにおいて、図3に示したステップと同じステップには同じ番号を付し、詳細な説明を省略する。ここでは、一例として、図23に示すC言語のソースコードが表示対象のソースコードである場合について説明する。
図22に示すように、まず、表示制御部7がソースコードを表示させ(ステップ301)、依存関係解析部2が、ソースコードの依存関係を解析して、プログラム依存グラフで表される依存関係データを生成する(ステップ302)。図24は、図23に示すソースコードのプログラム依存グラフを示す図である。
ステートメント選択部3は、ユーザから、入力装置11を介して、ポインタをデリファレンスする処理を示すステートメントの入力を受け付ける(ステップ2203)。ユーザは、例えば、表示装置12の画面に表示されたソースコード中で、NULLポインタデリファレンスする恐れのあるステートメントをクリックすることにより指定することができる。以下では、一例として図23に示すソースコードにおいて、18行目のステートメント「*p=1;」が、NULLポインタデリファレンスの恐れのあるステートメントとして指定された場合について説明する。ここで、「*p=1;」は、ポインタpが指すアドレスに値「1」を格納する処理を示しています。
ステートメント選択部30は、ステップ2202でユーザに指定されたステートメントで、デリファレンスされるポインタの値を決定するステートメントを抽出し、基準ステートメントとする(ステップ2204)。本例では、基準ステートメントは、すなわち、分類1の値決定ステートメントである。ここでは、図23に示すソースコードにおいて、18行目のステートメント「*p=1;」の、ポインタpの値を決定するステートメントは、04行目、06行目、16行目の3つであるので、これらが分類1の値決定ステートメントとなる。
次に、ステートメント分類部40は、ステップ302で作成されたプログラム依存グラフに基づいて、値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、連鎖の段階ごとに、分類1、2、・・・2n、2n+1、・・・に分類する(ステップ2205)。分類の詳細な処理は、実施の形態1で図6の示した処理と、ステップ601以外は同じである。本実施形態における分類処理では、ステップ601において、メモリ解放ステートメントに代えて、値決定ステートメントが分類1とされる。
図25は、ステートメント分類部40が、図23に示すソースコードのステートメントを、図24に示すプログラム依存グラフに基づいて分類した場合の分類結果を示す表である。図25に示す表は、図23に示したソースコードにおける値決定ステートメント(04行目、06行目、16行目のステートメント)が分類1となり、分類2には、分類1の値決定ステートメント(06行目および16行目)からそれぞれ制御依存関係を1つ遡った節点の05行目、13行目ステートメント(図24参照)、分類3には、分類2の13行目のステートメントからデータ依存関係を1つ遡った節点のステートメント(09、11行目)、分類4には、分類3の09、11行目のステートメントから制御依存関係を1つ遡ったステートメント(08行目)が属するようになっている。
表示制御部70は、更新部6からの更新信号を受信すると(ステップ308でY)、ステートメント分類部40による分類ごとに、ステートメントの表示態様を決定し(ステップ2209)、表示装置12へ表示させる(ステップ2210)。
[NULLポインタデリファレンス確認作業におけるソースコードの表示例]
次に、図23に示したソースコードに対してユーザがNULLポインタデリファレンスの確認作業を行う際に、表示制御部70が、図25に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図26〜図31を参照しながら説明する。
次に、図23に示したソースコードに対してユーザがNULLポインタデリファレンスの確認作業を行う際に、表示制御部70が、図25に示した分類結果および更新信号に従って表示態様を決定して表示する場合の表示例について説明する。ここでは、図26〜図31を参照しながら説明する。
図26は、ユーザがNULLポインタデリファレンスを確認する際の作業のステップと、各ステップにおいて強調表示されるステートメントの数、行番号、色の例を記載した表である。図27〜図31は、ユーザのNULLポインタデリファレンス確認作業中に表示装置12に表示される画面の例を示す図である。ここで示す例では、表示される画面は、ユーザのNULLポインタデリファレンス確認作業の各ステップに合わせて図27から図31まで順に遷移する。
まず、ユーザは、画面に表示されたソースコードを見ながら、18行目のポインタpをデリファレンスする処理を示すステートメントにカーソルを合わせクリックする。このとき、表示制御部70は、図27に示すようにユーザが選択した18行目のステートメントを、例えば、太字かつオレンジ色で強調表示させる。ユーザは、ポインタpのデリファレンス処理のステートメント「*p=1;」に着目することができる。また、図27に示す画面には、「次のステップ」ボタン50が表示されている。
次に、ユーザは、18行目のステートメントで参照されるポインタpの値を決定する値決定ステートメントをソースコードから探す(図26のステップ1)。このとき、例えば、ユーザが「次のステップ」ボタン50をクリックすることにより、更新部6が分類1を強調表示するための更新信号を生成して表示制御部70に通知する。通知を受けた表示制御部70は、図28に示すように、分類1のステートメント(04行目、06行目、16行目)を例えば、太字かつ赤色で強調表示させる。これにより、ユーザは、ソースコード中の値決定ステートメントの位置を容易に把握することができる。
次に、ユーザは、値決定ステートメントを実行するか否か決定する分岐となる条件分岐ステートメントを探す(図26のステップ2)。この時、ユーザが図28に示す画面において、「次のステップ」ボタン50をクリックすることにより、更新部6が分類2を強調表示するための更新信号を生成して表示制御部70に通知する。表示制御部70は、図29に示すように、分類2のステートメント(05行目、13行目)を例えば、太字かつ青色で強調表示させる。ユーザは、値決定ステートメントの実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。これにより、NULLポインタデリファレンスが発生しうる実行パスが存在するか否かをすばやく判断することができる。この場合、ユーザは、13行目のIF文で条件式「cond==EMPTY」が真となる場合にNULLポインタデリファレンスクが発生することを把握する。
次に、ユーザは、13行目の条件分岐ステートメントにおける分岐の方向を決定するステートメントを探す(図26のステップ3)。このときも、ユーザが「次のステップ」ボタン50をクリックすることにより、分類3を強調表示するための更新信号が表示制御部70に通知される。表示制御部70は、図30に示すように、分類3のステートメント(09行目、11行目)を、例えば、太字かつ緑色で表示させる。これにより、ユーザは、NULLポインタデリファレンスが発生する条件を満たす場合があるか否かをすばやく判断することができる。この場合、ユーザは、強調表示された11行目で「cond=EMPTY」と設定さており、13行目のIFで真となる条件を満たす場合があることをすばやく把握することができる。
次に、ユーザは、11行目のステートメント「cond=EMPTY」を実行するか否か決定する分岐となる条件分岐ステートメントを探す(図26のステップ4)。この時、ユーザが「次のステップ」ボタン50をクリックすることにより、分類4を強調表示するための更新信号が表示制御部70に通知され、表示制御部70は、図31に示すように、分類4のステートメント(08行目)を例えば、太字かつ黄色で強調表示させる。これにより、ユーザは、11行目のステートメント「cond=EMPTY」の実行の有無を決定する条件分岐ステートメントの位置を容易に把握することができる。そして、ユーザは、08行目のIF文で条件式「param−>is_nice」が偽となる場合に11行目が実行され、NULLポインタデリファレンスが発生することをすばやく把握することができる。なお、上記条件式中の「−>」は、ポインタ「param」が指す構造体のメンバ「is_nice」を指定するためのアロー演算子である。
次に、ユーザは、08行目の分岐の方向(条件式「param−>is_nice」)の判定結果を決定するステートメントを探す(図26のステップ5)。このときも、ユーザが「次のステップ」ボタン50をクリックすることにより、分類5を強調表示する更新信号が表示制御部70へ送信される。この場合、分類5のステートメントは存在しないので、表示制御部70は、例えば、いずれもステートメントも強調表示しないように表示させる(図示せず)。これにより、ユーザは、08行目の分岐の方向を決定するステートメントはソースコード中に存在しないことがすばやく把握できる。ユーザは、function関数の引数paramによってはNULLポインタデリファレンスが発生しうると判断することができる。これにより、NULLポインタデリファレンスの確認は終了する。
以上のように、本実施形態では、各分類のステートメントを、NULLポインタデリファレンス確認作業のステップに合わせて順に強調表示することにより、ユーザは素早くかつ正確にNULLポインタデリファレンス確認をすることができる。これに対して、従来のように、値決定ステートメントに影響を与えるステートメントを抽出して全て強調表示した場合は、図32に示すようにソースコード中の大部分が強調表示されてしまい、ユーザのNULLポインタデリファレンス確認作業を容易にすることはできない。
また、図26に示すように、従来の表示方法だと、NULLポインタデリファレンス確認作業の全てのステップで、値決定ステートメントに影響を与える9行のステートメントが表示されるので、各ステップでの検索対象ステートメント数の平均は8となる。
一方、実施の形態3における上述の例では、各ステップの検索対象のステートメント数は、ステップ1〜5においてそれぞれ3、2、2、1、0となる。そのため、各ステップでの検索対象ステートメント数の平均は、1.6となり、従来に比べて検索対象のステートメントが約1/5に絞り込まれている。
以上に述べたとおり、実施の形態3における情報処理装置10によれば、値決定ステートメントに影響を与えるステートメント全体を、値決定ステートメントへの影響の仕方により分類し、NULLポインタデリファレンスの確認作業の各ステップにおいて分類ごとに区別して表示することができる。そのため、NULLポインタデリファレンス確認作業の各ステップで着目すべき適切なステートメントが区別可能となるよう表示される。
なお、なお、本実施形態においては、不正な値が設定された変数を参照する処理を確認することの例として、NULLポインタデリファレンスの確認を挙げて説明したが、不正な値の変数参照の確認はこれに限られない。その他、あるステートメントの変数に対して、不正な値が設定されて実行されるかどうかを確認する場合にも本実施形態により同様の効果が得られる。例えば、x=10/y;のような除算のステートメントに対して、除数が0に設定されて実行されるか否かを確認する場合にも上記実施形態と同様の方法が適用可能である。
また、例えば、memcpy(x,y,z)のような関数呼び出しのステートメントに対して、関数の引数として設定されてはならない値(たとえば、上記の例ではx、yにNULL)が設定されて実行されるかどうかを確認する場合にも上記実施形態と同様の方法が適用可能である。
(実施の形態4)
実施の形態4は、ソースコードを解析し、そのソースコードで示される処理におけるNULLポインタデリファレンスの可能性の有無を判定する機能を有する情報処理装置である。図33は、実施の形態4における情報処理装置の構成を表す機能ブロック図である。図33に示す情報処理装置10aにおいて、図20に示した情報処理装置10と同じ機能ブロックには同じ符号を付している。図33に示す情報処理装置10aは、NULLポインタデリファレンスの可能性の有無を判定する判定部80を備えることを特徴とする。
実施の形態4は、ソースコードを解析し、そのソースコードで示される処理におけるNULLポインタデリファレンスの可能性の有無を判定する機能を有する情報処理装置である。図33は、実施の形態4における情報処理装置の構成を表す機能ブロック図である。図33に示す情報処理装置10aにおいて、図20に示した情報処理装置10と同じ機能ブロックには同じ符号を付している。図33に示す情報処理装置10aは、NULLポインタデリファレンスの可能性の有無を判定する判定部80を備えることを特徴とする。
判定部80は、記録部5に記録されたソースコードを読み出して解析し、そのソースコードが示す処理においてNULLポインタデリファレンスが発生し得るか否かを判定する。判定結果は、表示装置12へ出力される。判定部80は、ステートメント選択部30が選択した基準ステートメントに依存関係によって連鎖的に繋がるステートメント群の各ステートメントについて、基準ステートメントから順に依存関係を辿りながら解析する。その際、ステートメント分類部40が決定した分類ごとに解析する。そして、判定部80は、前記分類ごとに、NULLポインタデリファレンスの可能性の有無を判定する。
図34は、本実施形態における情報処理装置10aがソースコードの示す処理におけるNULLポインタデリファレンス発生の可能性の有無を判定する動作の一例を示すフローチャートである。図34において、ステップ3401〜ステップ3405は、図22に示したフローチャートのステップ301、302、2203〜2205とそれぞれ同様である。ステップ3406において、判定部80は、ステップ3405で決定された分類に基づいて、分類ごとにステートメントの解析を行い、NULLポインタデリファレンス発生の可能性の有無を判定する。
ここでは、一例として、実施の形態3で図23に示したソースコードについて解析する場合について説明する。すなわち、本実施形態でも、ステップ3403では、図23に示すソースコードの18行目のポインタpをデリファレンスする処理のステートメント「*p=1;」がユーザによって選択され、ステップ3404では、ステートメント選択部3が、04行目、06行目および16行目の値決定ステートメントを基準ステートメントとして抽出する。また、ステップ3404では、図24に示すプログラム依存グラフを示す依存関係データが作成され、ステップ3405では、図25に示すようにステートメントが分類される。
図35は、図34におけるステップ3406の判定部80によるNULLポインタデリファレンス判定処理の具体例を示すフローチャートである。図35に示す例では、まず、判定部80は、分類2のステートメントから、分類1の基準ステートメントである値決定ステートメントを実行するか否かを決定する条件分岐ステートメントを取得する(ステップ3501)。ここでは、05行目と13行目の条件分岐ステートメントが取得される。
判定部80は、取得した分類2の条件分岐ステートメントを解析し、値決定ステートメントが実行されないような実行パス(すなわち、NULLポインタデリファレンスが発生する実行パス)があり得るか否か判断する(ステップ3502)。本例では、05行目のIF分の条件式(mode==NORMAL)が偽、かつ、13行目のIF分の条件式(cond1==EMPTY)が真の場合の実行パスで、NULLポインタデリファレンスが発生する。
このようにNULLポインタデリファレンスする実行パスがある場合は、その実行パスを通るための条件式を条件Wとしてバッファに記録する(ステップ3503)。ここでは、「(mode==NORMAL)が偽、かつ(cond1==EMPTY)が真」であることが条件Wとして設定される。
なお、ステップ3502でNULLポインタデリファレンスする実行パスがないと判断された場合は、判定部80は、NULLポインタデリファレンスは発生しないと判定して処理を終了する(ステップ3511)。
判定部80は、ステップ3503で条件Wを設定した後、変数nに2を設定し(n=2)、分類2n−1(ここでは分類3)から、条件W「(mode==NORMAL)が偽、かつ(cond1==EMPTY)が真」の判定において参照される変数(=condおよびmode)の値を決定するステートメントを検索する(ステップ3504)。
その結果、もしも、そのようなステートメントが存在しなければ(ステップ3505でN)、判定部80は、NULLポインタデリファレンスは発生し得るとして(ステップ3510)処理を終了する。本例では、分類3には、変数modeの値を決定するステートメントはないが、変数cond1の値を決定する処理のステートメントはある(09行目、11行目)。ここで、変数modeの値を決定するステートメントがないということは、変数modeの値は引数で指定されるということなので、引数の値によっては(mode==NORMAL)が偽という条件が成立し得ると判定される。
このように、ステートメントが存在する場合(ステップ3505でY)、判定部80は、条件Wを成立させるような変数の値を決定するステートメント(以下、ステートメントAと称する)があるか否かを判断する(ステップ3506)
11行目のステートメントは、変数cond1に「EMPTY」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Wが成立する。そのため、ステップ3506でYとなる。もしも、分類3におけるいずれのステートメントの処理でも変数cond1に「EMPTY」が設定されなければ、条件Wは成立しない(ステップ3506でN)。この場合、判定部80は、NULLポインタデリファレンスは発生しないと判定して処理を終了する(ステップ3511)。
11行目のステートメントは、変数cond1に「EMPTY」を設定する処理を示しており、このステートメントの処理が実行された場合は、条件Wが成立する。そのため、ステップ3506でYとなる。もしも、分類3におけるいずれのステートメントの処理でも変数cond1に「EMPTY」が設定されなければ、条件Wは成立しない(ステップ3506でN)。この場合、判定部80は、NULLポインタデリファレンスは発生しないと判定して処理を終了する(ステップ3511)。
ステップ3506でYの場合、判定部80は、分類2nのステートメントから、条件Wを成立させるような変数の値を決定するステートメントAを実行するか否かを決定する条件分岐ステートメントを検索する(ステップ3507)。n=2の場合、ステートメントAは、条件W「(cond1==EMPTY)は真」における変数cond1に値「EMPTY」を決定する11行目のステートメントである。そして、分類4には08行目のステートメントが含まれている。この08行目のステートメントは、11行目のステートメント(ステートメントA)を実行の有無を決定する条件分岐ステートメント(08行目)であるので、これがステップ3507における検索結果の条件分岐ステートメントとなる。
このように、条件分岐ステートメントが存在する場合(ステップ3508でY)、判定部80は、この条件分岐ステートメントで、ステートメントAの処理が実行されるような判定結果となるための条件を条件Wとしてバッファに記録する(ステップ3509)。ここでは、08行目の条件式「param―>is_niceが真」となる場合に、11行目のステートメントの処理が実行されるので、「param―>is_niceが真」が条件Wに設定される。
その後、判定部80は、変数nに1加算し(n=n+1)、ステップ3504の処理を繰り返す。例えば、n=2+1=3となった場合、判定部80は、分類5から条件式「param―>is_niceが真」で参照される変数paramの値を決定するステートメントを検索する。しかし、分類5に含まれるステートメントは存在しないので、ステップ3505でNとなる。その場合、判定部80は、NULLポインタデリファレンスは発生しうると判定し(ステップ3510)、処理を終了する。すなわち、変数paramの値はfunction関数内で決定されるのではなく、function関数の引数で指定される値なので、引数の値によってはNULLポインタデリファレンスが発生する可能性があると判定される。
以上の処理により、判定部80は、ソースコードが示す処理においてNULLポインタデリファレンスが発生するか否かを判定することができる。判定部80は、判定結果を表示装置12に表示する。判定結果には、NULLポインタデリファレンスの有無を表す情報の他に、NULLポインタデリファレンスの有無に影響を与える変数、ステートメント、デバッグ情報等が含まれてもよい。
図35に示した上記処理例では、判定部80は、ステートメント分類部4による分類を用いて、分類ごとにステートメントの解析を行っている(ステップ3501、3505、3507)。そのため、判定部80は、値決定ステートメントから依存関係を遡っていく過程のそれぞれ段階で、解析対象とするステートメントに適格に絞り込んで判定をすることができる。その結果、判定処理の効率がよくなる。
なお、図35に示したNULLポインタデリファレンスの判定処理は一例であり、本発明は、これに限られない。
以上、実施の形態1〜4において、本発明の情報処理装置の実施形態の一例を説明しが、本発明の実施形態は、上記実施の形態1〜4に限定されない。例えば、本発明の対象となるソースコードのプログラム言語は、上記実施形態のようにC言語に限られない。そのため、依存関係の定義、ステートメントの定義もプログラム言語に合わせて適切に決めることができる。なお、本発明の対象となりうるソースコードのプログラム言語には、例えば、BASIC、C++、C#、COBOL、FORTRAN、Java(登録商標)、JavaScript、LISP、Perl、Ruby等が挙げられる。
また、上記実施形態では、依存関係に、制御依存関係とデータ依存関係が含まれる場合について説明したが、依存関係はこれらに限られない。例えば、プログラム言語の性質に合わせて、データ依存関係をさらに細かく分類して定義した依存関係を用いることもできるし、制御依存関係およびデータ依存関係以外の依存関係を定義して用いることもできる。
また、上記実施形態では、C言語の1つの関数において、ソースコードの表示または解析を行う例について説明したが、複数の関数に渡って依存関係を追跡することにより、複数の関数についてソースコードの表示または解析を行うこともできる。
また、上記実施形態では、情報処理装置について説明したが、上記の情報検索装置の機能をコンピュータで実現させるためのプログラム、またはこれを記録した記録媒体も、本発明の実施の一形態である。
また、本発明は、ユーザのソースコード構造解析を支援するプログラム開発環境、プログラムエディタが備える機能の1つとして適用することができる。これにより、ユーザの利便性を向上させることができる。
本発明は、ソースコードのユーザによるプログラム理解またはコンピュータによるソースコードの解析を容易にすることができる情報処理装置として利用可能である。
1、1a、10、10a 情報処理装置
2 依存関係解析部
3、30 ステートメント選択部
4、40 ステートメント分類部
5 記録部
6 更新部
7、70 表示制御部
8、80 判定部
11 入力装置
12 表示装置
2 依存関係解析部
3、30 ステートメント選択部
4、40 ステートメント分類部
5 記録部
6 更新部
7、70 表示制御部
8、80 判定部
11 入力装置
12 表示装置
Claims (14)
- 一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる情報処理装置であって、
表示対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御部とを備える情報処理装置。 - 前記依存関係解析部は、ソースコードにおいて、ステートメントと、当該ステートメントが示す処理の実行の有無を決定する条件分岐ステートメントとの依存関係である制御依存関係と、変数の値を決定する処理を示すステートメントと、当該変数の値が再決定される前に当該変数を参照する処理を示すステートメントとの依存関係であるデータ依存関係とを、前記依存関係として解析し、
前記ステートメント分類部は、
前記基準となるステートメントを第1の分類とし、
第(2N−1)(Nは1以上の整数)の分類のステートメントを実行するか否かを決定する条件分岐ステートメントを、前記依存関係解析部で解析された制御依存関係を基に抽出して第2Nの分類とする第2N分類抽出処理と、
前記第2N分類とされた前記条件分岐ステートメントにおける条件判定で参照される変数値を決定する処理を示すステートメントを、前記依存関係解析部で解析されたデータ依存関係を基に抽出し、第(2N+1)の分類とする第(2N+1)分類処理とを、所定の条件が満たされるまでNを1ずつ加算して繰り返すことを特徴とする、請求項1に記載の情報処理装置。 - 前記ステートメント選択部は、リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付けて、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択し、
前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類することを特徴とする、請求項1または2に記載の情報処理装置。 - 前記ステートメント選択部は、不正な値が設定された変数を参照する処理が実行される可能性のあるステートメントの指定を外部から受け付けて、当該指定されたステートメントで参照される変数の値を決定する値決定ステートメントを前記ソースコード中から選択し、
前記ステートメント分類部は、前記依存関係解析部で解析された依存関係に従って、前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの前記依存関係の連鎖の段階に応じて分類することを特徴とする、請求項1または2に記載の情報処理装置。 - どの分類のステートメントを強調表示させるかを示す情報を、外部からの入力に基づいて生成し、前記表示制御部へ通知する更新部をさらに備え、
前記表示制御部は、前記更新部から前記情報が通知された場合に、前記情報が示す分類のステートメントが強調表示されるように前記ソースコードを前記表示装置への表示させる、請求項1〜4のいずれか1項に記載の情報処理装置。 - どの分類のステートメントを強調表示させるかを示す情報を、一定時間ごとに自動的に生成し、前記表示制御部へ通知する更新部をさらに備え、
前記表示制御部は、前記更新部から通知された情報が示す分類のステートメントを強調表示するように、ステートメントの表示態様を決定する、請求項1〜4のいずれか1項に記載の情報処理装置。 - 一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、
解析対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定部とを備える、情報処理装置。 - 一連の処理を示すプログラムを記述したソースコードを解析する情報処理装置であって、
解析対象のソースコードを記録する記録部と、
前記記録部に記録されたソースコードに含まれるステートメント間の依存関係を解析する依存関係解析部と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択部と、
前記依存関係解析部で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類部と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定部とを備える、情報処理装置。 - 一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させる処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された依存関係に従って、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様にしたがってソースコードのステートメントを外部の表示装置へ表示させる表示制御処理とをコンピュータに実行させる情報処理プログラム。 - 一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された依存関係に従って、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる、情報処理プログラム。 - 一連の処理を示すプログラムを記述したソースコードを解析する処理をコンピュータに実行させる情報処理プログラムであって、
前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を解析する依存関係解析処理と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択処理と、
前記依存関係解析処理で解析された前記依存関係に従って、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類処理と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定処理とをコンピュータに実行させる、情報処理プログラム。 - 一連の処理を示すプログラムを記述したソースコードを外部の表示装置へ表示させるコンピュータによる情報処理方法であって、
前記コンピュータが備える記録部に記録された表示対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
外部からの入力に基づいて、前記ソースコードに含まれるステートメントの中から基準となるステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で生成された依存関係データを用いて、前記基準となるステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記基準となるステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記分類ごとにステートメントの表示態様を決定し、前記分類ごとの表示態様でステートメントを表示することを示す信号を外部の表示装置へ送信する表示制御工程とを含む情報処理方法。 - 一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、
前記コンピュータが備える記録部に記録された解析対象のソースコードを読み出して、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
リソース確保処理を示すリソース確保ステートメントの指定を外部から受け付け、当該リソース確保ステートメントで確保されたリソースを解放する処理を示すリソース解放ステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で生成された前記依存関係データを用いて、前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群を、前記リソース解放ステートメントからの前記依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記リソース解放ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記リソース解放ステートメントから、前記分類ごとに順次解析することにより、前記リソース解放ステートメントが実行されない場合があり得るか否かを前記分類ごとに判定する判定工程とを含む、情報処理方法。 - 一連の処理を示すプログラムを記述したソースコードをコンピュータが解析する情報処理方法であって、
前記コンピュータの記録部に記録された解析対象のソースコードを読み出し、当該ソースコードに含まれるステートメント間の依存関係を示す依存関係データを生成する依存関係解析工程と、
不正な値が設定された変数を参照する可能性のあるステートメントの指定を外部から受け付け、当該指定されたステートメントにおいて参照される変数の値を決定する値決定ステートメントを選択するステートメント選択工程と、
前記依存関係解析工程で解析された前記依存関係データを用いて、ソースコード中の前記値決定ステートメントと依存関係によって連鎖的に繋がるステートメント群を、前記値決定ステートメントからの依存関係の連鎖の段階に応じて分類するステートメント分類工程と、
前記値決定ステートメントから依存関係によって連鎖的に繋がるステートメント群のそれぞれのステートメントについて、前記値決定ステートメントから、前記分類ごとに順次ステートメントを解析することにより、前記変数の値として不正な値が決定され得る否かを前記分類ごとに判定する判定工程とを含む、情報処理方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007124989A JP2008282174A (ja) | 2007-05-09 | 2007-05-09 | 情報処理装置、情報処理方法、および情報処理プログラム |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2007124989A JP2008282174A (ja) | 2007-05-09 | 2007-05-09 | 情報処理装置、情報処理方法、および情報処理プログラム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2008282174A true JP2008282174A (ja) | 2008-11-20 |
Family
ID=40142945
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2007124989A Withdrawn JP2008282174A (ja) | 2007-05-09 | 2007-05-09 | 情報処理装置、情報処理方法、および情報処理プログラム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2008282174A (ja) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010160593A (ja) * | 2009-01-07 | 2010-07-22 | Meidensha Corp | ソフトウェアの開発支援システム、開発支援方法およびプログラム |
JP2012164264A (ja) * | 2011-02-09 | 2012-08-30 | Mitsubishi Electric Corp | プログラム解析装置およびプログラム解析プログラム |
JP2017004282A (ja) * | 2015-06-11 | 2017-01-05 | 日本電気通信システム株式会社 | プログラム表示装置、プログラム表示システム、プログラム表示方法、及びプログラム表示プログラム |
CN111858290A (zh) * | 2019-04-30 | 2020-10-30 | 深圳市前海源伞科技有限公司 | 用于检测目标代码的内存泄漏路径的方法和设备 |
-
2007
- 2007-05-09 JP JP2007124989A patent/JP2008282174A/ja not_active Withdrawn
Cited By (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP2010160593A (ja) * | 2009-01-07 | 2010-07-22 | Meidensha Corp | ソフトウェアの開発支援システム、開発支援方法およびプログラム |
JP2012164264A (ja) * | 2011-02-09 | 2012-08-30 | Mitsubishi Electric Corp | プログラム解析装置およびプログラム解析プログラム |
JP2017004282A (ja) * | 2015-06-11 | 2017-01-05 | 日本電気通信システム株式会社 | プログラム表示装置、プログラム表示システム、プログラム表示方法、及びプログラム表示プログラム |
CN111858290A (zh) * | 2019-04-30 | 2020-10-30 | 深圳市前海源伞科技有限公司 | 用于检测目标代码的内存泄漏路径的方法和设备 |
CN111858290B (zh) * | 2019-04-30 | 2024-02-06 | 深圳市前海源伞科技有限公司 | 用于检测目标代码的内存泄漏路径的方法和设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US6408430B2 (en) | Interactive software testing system and method | |
JP2795244B2 (ja) | プログラムデバッグシステム | |
US6820256B2 (en) | System and method for whole-system program analysis | |
US5854924A (en) | Static debugging tool and method | |
JP3966518B2 (ja) | プログラム解析装置、その解析方法及びプログラム | |
EP0688448B1 (en) | Incremental build system | |
US7865870B2 (en) | Automatic content completion of valid values for method argument variables | |
US9098626B2 (en) | Method and system for log file processing and generating a graphical user interface based thereon | |
US7266809B2 (en) | Software debugger and software development support system for microcomputer operable to execute conditional execution instruction | |
US8359292B2 (en) | Semantic grouping for program performance data analysis | |
US20110271258A1 (en) | Software Development Tool | |
US20110271250A1 (en) | Software Development Tool | |
JP2009129179A (ja) | プログラム並列化支援装置およびプログラム並列化支援方法 | |
US8732676B1 (en) | System and method for generating unit test based on recorded execution paths | |
US6148427A (en) | Method and apparatus for test data generation | |
US11126527B2 (en) | Software engineering method including tracing and visualizing | |
JP2008282174A (ja) | 情報処理装置、情報処理方法、および情報処理プログラム | |
JP7077909B2 (ja) | デッドコード解析プログラム、デッドコード解析方法及びデッドコード解析装置 | |
Gunter et al. | Path exploration tool | |
US8798971B2 (en) | System and method for using a truth table graphical function in a statechart | |
Aho et al. | Automated extraction of GUI models for testing | |
US7620937B2 (en) | System and method for debugging programs | |
Alvin et al. | StaticGen: static generation of UML sequence diagrams | |
US10762211B2 (en) | Source code diagnostic instrument | |
CA3134422A1 (en) | System and method of computer-assisted computer programming |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
A300 | Withdrawal of application because of no request for examination |
Free format text: JAPANESE INTERMEDIATE CODE: A300 Effective date: 20100803 |