(57)【要約】      （修正有）【課題】ソフトウェア静的解析における問題箇所の検出精度を向上させることが可能なソースコード問題予測技術を提供する。【解決手段】ソースコード問題予測プログラム２０において、ソースコード４０、検出関数一覧表４１から字句・構文解析部２１、検出部２２、関数呼出し列抽出部２３〜例外処理情報抽出部２６によって関数呼出し列情報３１〜例外処理情報表３４、検出結果表３６を生成し、これらから関数呼出し関係情報生成部２７によって関数呼出し関係情報３５を生成する。実行頻度予測部２８によって、関数呼出し関係情報３５と重み定義表４２から実行頻度情報表３７を生成し、レポート出力部２９によって、検出結果表３６、実行頻度情報表３７、ランク定義表４３から、検出結果レポート５０を生成する。検出関数一覧表４１、重み定義表４２、ランク定義表４３にて問題の関数を効果的に絞り込んで、ランク付けして表示する。【選択図】図１Ａ
2007179488.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出する処理と、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測する処理と、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示する処理と、
をコンピュータに実行させることを特徴とするソースコード問題予測プログラム。
【請求項２】
請求項１記載のソースコード問題予測プログラムにおいて、
前記関数の呼出し列中に含まれる前記繰返し構造と前記条件分岐構造の各々の数を計測し、予め定義された重み定義情報に基づき、各々の前記数の計測値に重みを乗算することで予測される前記実行頻度を計算する処理を、さらに前記コンピュータに実行させることを特徴とするソースコード問題予測プログラム。
【請求項３】
請求項１記載のソースコード問題予測プログラムにおいて、
再帰呼出しを行う前記関数を抽出し、当該関数内の処理を実行頻度が高い前記特定領域として予測する処理、
オブジェクト指向型プログラムにおける継承の関係にあるクラス群を抽出し、各クラスに宣言されている同一名の前記関数について、クラス数に反比例する実行頻度を割当てる処理、
前記条件分岐構造の条件値となっている変数及び定数について、前記変数及び定数の文字列表現を予め定義されたエラー処理を表す文字列と照合し、類似性が高ければ条件一致時に実行される処理領域に対して低い実行頻度を割当てる処理、
前記関数の呼出し列中に含まれる例外処理の数を計測し、前記例外処理の数に反比例する実行頻度を個々の前記関数に割当てる処理、
特定の前記関数に対するユーザからの重み定義を受け付け、前記重み定義も用いて実行頻度を個々の前記関数に割当てる処理、
の少なくとも一つを、さらに前記コンピュータに実行させることを特徴とするソースコード問題予測プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード問題予測技術に関し、たとえば、ソフトウェアレビュー工程におけるソースコード品質の検証、管理、評価作業等に適用して有効な技術に関する。
【背景技術】
【０００２】
近年、様々なソフトウェア開発において、ソフトウェアの大規模化・多様化に伴い、低コストで高品質を確保したいという要求が強まっている。
低コストでソフトウェアを高品質化する技術としては、ソフトウェア静的解析がある。ソフトウェア静的解析は、ソースコード（以下ソース）を解析し様々な問題検出を行うものである。
【０００３】
プロファイラ、デバッガ、その他、一般のテスト技術では、プログラム実行時の情報（動作ログ等）を必要とする。
これらのテスト技術とは異なり、ソフトウェア静的解析では、ソースを対象とするため、開発工程のより上流の設計・コーディング工程での問題検出作業に利用できる。すなわち、シミュレーションや実機テスト前に問題の発見が可能である。このように早期にプログラムの問題を発見できる分、修正コストを削減でき、ソフトウェアの低コスト化、高性能化が見込める。
【０００４】
しかしながら、ソフトウェア静的解析では実行時情報を使わない分、実行時に起きる問題の予測をどう高精度で実現するかが技術的課題となるが、従来の製品はいずれも低い予測精度に留まっている。
【０００５】
すなわち、従来製品はいずれも、問題の可能性がある対象（関数呼出し等）を定義しておき、それらをソース中から一律に検索して出力する。このため、実際には問題にならないものも多く検出してしまい低精度となる。
【０００６】
この結果、問題の軽重に関係なく多数の関数をレビューする必要があり、ソフトウェア開発のソースレビユー工程における工数が増大する。
さらに、肝心の問題部分の出力結果が、大量の問題にならない部分の出力情報に埋もれてしまい、視認性や操作性が低下するため、支援プログラム自体の利用率も低くなる。
【０００７】
なお、特許文献１には、オブジェクト指向プログラムの実行性能を劣化させる可能性のあるクラス名、処理名、処理パターンを実行環境毎に性能劣化情報として予め蓄積し、この性能劣化情報に基づいてソースコードを静的に解析し、ソースコード中で実行性能を劣化させる可能性のある箇所を表示する技術が開示されている。
【０００８】
しかし、この特許文献１の場合には、ソースに含まれる条件分岐構造等の制御構造をきめ細かく分析するものではないため、問題部分の検出精度が比較的低くなる懸念がある。
【特許文献１】特開２００２−７３３６９号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
本発明の目的は、ソフトウェア静的解析における問題箇所の検出精度を向上させることが可能なソースコード問題予測技術を提供することにある。
本発明の他の目的は、ソフトウェア開発の設計工程およびレビュー工程における工数の削減を実現することが可能なソースコード問題予測技術を提供することにある。
【００１０】
本発明の他の目的は、ソフトウェア開発の設計工程およびレビュー工程において、ユーザの評価や過去の経験に基づいて問題箇所の検出方法の最適化を行うことが可能なソースコード問題予測技術を提供することにある。
【００１１】
本発明の他の目的は、ソフトウェア開発の設計工程およびレビュー工程を支援するソースコード問題予測プログラムの視認性や操作性を向上させることにある。
【課題を解決するための手段】
【００１２】
本発明の第１の観点は、プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出する処理と、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測する処理と、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示する処理と、
をコンピュータに実行させるソースコード問題予測プログラムを提供する。
【００１３】
本発明の第２の観点は、プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出するステップと、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測するステップと、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示するステップを、
含むソースコード問題予測方法を提供する。
【００１４】
本発明の第３の観点は、プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出する第１手段と、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測する第２手段と、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示する第３手段と、
を含むソースコード問題予測装置を提供する。
【００１５】
本発明では、ソース中で、実行時にボトルネックになりやすい部分（高頻度で実行される部分）を推定し、その部分に絞り込んだ検索を行うことで、問題部分の検出精度を向上させる。
【００１６】
たとえば高頻度で実行される部分の予測は、以下のようにして行う。関数間の呼出し関係と、各関数内のループや条件分岐等の制御構文（ｉｆ文等）の関係をソースコードから抽出し、それらに対して、制御構文の性質を表す重みを付ける。この重みに基づき、関係する重みの合計が高い関数を、実行頻度が高い関数と予測する。
【００１７】
これにより、問題検出の観点から重要な関数が選択的に検出結果として出力され、問題箇所の指摘精度が向上する。この場合、実行頻度の高い順に順位付けして出力してもよい。重要でない関数は出力されないので問題箇所の検出結果の視認性も向上する。また、たとえば外部から経験的に知られた各関数の重要度に応じて重み付けを行うことで、ユーザの評価や経験に則して問題箇所の検出の最適化を実現できる。この結果、高精度の問題指摘を行うことが可能になり、操作性も向上する。
【発明の効果】
【００１８】
本発明によれば、ソフトウェア静的解析における問題箇所の検出精度を向上させることが可能となる。
また、ソフトウェア開発の設計工程およびレビュー工程における工数の削減を実現することが可能となる。
【００１９】
また、ソフトウェア開発の設計工程およびレビュー工程において、ユーザの評価や過去の経験に基づいて問題箇所の検出方法の最適化を行うことができる。
また、ソフトウェア開発の設計工程およびレビュー工程を支援するソースコード問題予測プログラムの視認性や操作性を向上させることができる。
【発明を実施するための最良の形態】
【００２０】
以下、図面を参照しながら、本発明の実施の形態について詳細に説明する。
図１Ａは、本発明の一実施の形態であるソースコード問題予測プログラムおよび方法の作用の一例を示す概念図である。
【００２１】
図１Ｂは、本発明の一実施の形態であるソースコード問題予測プログラムおよび方法を実施するソースコード問題予測装置の構成の一例を示す概念図である。
図２は、本発明の一実施の形態であるソースコード問題予測プログラムおよび方法の作用の一例を示すフローチャートである。
【００２２】
図３は、本実施の形態のソースコード問題予測プログラムで処理されるソースコードの一例を示す説明図である。
まず、図１Ｂを参照して、本実施の形態のソースコード問題予測装置を構成する情報処理装置１０（コンピュータ）の一例について説明する。
【００２３】
本実施の形態の情報処理装置１０は、中央処理装置１１、主記憶１２、外部記憶装置１３、ディスプレイ１４、情報入力装置１５、ネットワークインタフェース１６、を含んでいる。
【００２４】
中央処理装置１１は、たとえばマイクロプロセッサ等で構成され、主記憶１２に実装されたプログラムを実行することで所望の情報処理を行う。
主記憶１２は、たとえば半導体メモリで構成され、中央処理装置１１が実行するソフトウェアやデータが格納される。
【００２５】
本実施の形態の場合、主記憶１２には、オペレーティングシステム１８、ソースコード問題予測プログラム２０、関数呼出し列情報３１、ループ情報表３２、条件分岐情報表３３、例外処理情報表３４、関数呼出し関係情報３５、検出結果表３６、実行頻度情報表３７が格納される。
【００２６】
中央処理装置１１はオペレーティングシステム１８を実行することで、情報処理装置１０の全体の動作を制御する。
ソースコード問題予測プログラム２０は、オペレーティングシステム１８の配下で稼働するアプリケーションプログラムである。
【００２７】
関数呼出し列情報３１〜実行頻度情報表３７は、ソースコード問題予測プログラム２０が実行中に出力する情報である。
外部記憶装置１３は、不揮発性の記憶媒体で構成される記憶装置からなる。
【００２８】
本実施の形態の場合、この外部記憶装置１３には、ソースコード４０、検出関数一覧表４１、重み定義表４２、ランク定義表４３、関数重み定義表４４、等の情報が保持される。
【００２９】
なお、特に図示しないが、この外部記憶装置１３には、オペレーティングシステム１８、ソースコード問題予測プログラム２０も持久的に保持され、必要に応じて主記憶１２にロードされて実行される。
【００３０】
ディスプレイ１４には、ソースコード問題予測プログラム２０から出力される検出結果レポート５０が表示される。
情報入力装置１５は、たとえば、キーボード、マウス等のユーザ入力機器からなる。本実施の形態の場合には、ソースコード問題予測プログラム２０を制御するための各種情報が必要に応じてユーザから入力される。
【００３１】
ネットワークインタフェース１６は、情報処理装置１０と、外部の情報ネットワーク１７との間における情報の授受を制御する。
たとえば、外部記憶装置１３に格納される情報は、必要に応じて、ネットワークインタフェース１６を介して情報ネットワーク１７から取得するようにしてもよい。
【００３２】
また、ディスプレイ１４に出力される検出結果レポート５０を情報ネットワーク１７に出力することも可能である。
一方、図１Ａに例示されるように、本実施の形態のソースコード問題予測プログラム２０は、字句・構文解析部２１、検出部２２、関数呼出し列抽出部２３、ループ情報抽出部２４、条件分岐抽出部２５、例外処理情報抽出部２６、関数呼出し関係情報生成部２７、実行頻度予測部２８、レポート出力部２９、の各機能ブロックを含んでいる。
【００３３】
字句・構文解析部２１は、ソースコード４０を解析して後述のソースコード解析情報３０を出力する。
検出部２２は、ソースコード解析情報３０と、検出関数一覧表４１から検出結果表３６を出力する。
【００３４】
関数呼出し列抽出部２３は、ソースコード解析情報３０を解析して関数呼出し列情報３１を出力する。
ループ情報抽出部２４は、ソースコード解析情報３０を解析してループ情報表３２を出力する。
【００３５】
条件分岐抽出部２５は、ソースコード解析情報３０を解析して条件分岐情報表３３を出力する。
例外処理情報抽出部２６は、ソースコード解析情報３０を解析して例外処理情報表３４を出力する。
【００３６】
関数呼出し関係情報生成部２７は、関数呼出し列情報３１、ループ情報表３２、条件分岐情報表３３、例外処理情報表３４と、検出結果表３６を入力して関数呼出し関係情報３５を出力する。
【００３７】
実行頻度予測部２８は、重み定義表４２（および／または関数重み定義表４４）と、関数呼出し関係情報３５を入力して、実行頻度情報表３７を出力する。
レポート出力部２９は、検出結果表３６、実行頻度情報表３７と、ランク定義表４３を入力して検出結果レポート５０を出力する。
【００３８】
本実施の形態のソースコード問題予測プログラム２０は、図２に例示されるフローチャートのように動作する。
まず、字句・構文解析部２１によってソースコード４０を解析して図４に例示されるソースコード解析情報３０を出力する（ステップ１００）。
【００３９】
次に、検出部２２によって、ソースコード解析情報３０から、検出関数一覧表４１に記述された関数の呼出しを検出し、検出結果表３６に記録する（ステップ２００）。
次に、関数呼出し列抽出部２３によって、ソースコード解析情報３０から、関数呼出し列情報３１を抽出する（ステップ３００）。
【００４０】
次に、ループ情報抽出部２４（条件分岐抽出部２５）（例外処理情報抽出部２６）によって、ソースコード解析情報３０からループ情報表３２（条件分岐情報表３３）（例外処理情報表３４）を出力する（ステップ４００）。
【００４１】
次に、関数呼出し関係情報生成部２７によって、検出結果表３６、関数呼出し列情報３１、ループ情報表３２（条件分岐情報表３３）（例外処理情報表３４）から、関数呼出し関係情報３５を生成する（ステップ５００）。
【００４２】
次に、実行頻度予測部２８によって、重み定義表４２（関数重み定義表４４）により、関数呼出し関係情報３５から実行頻度情報表３７を生成する（ステップ６００）。
最後に、実行頻度情報表３７、検出結果表３６、ランク定義表４３から、検出結果レポート５０を出力する（ステップ７００）。
【００４３】
以下、上述のステップ１００〜ステップ７００の各々について詳細に説明する。
まず、上述のステップ１００では、字句・構文解析部２１によって、ソースコード４０を解析する。字句・構文解析自体は、ソースコード４０に記述されたプログラム言語のパーサ等の解析技術を用いることができる。
【００４４】
解析の結果、図４に例示されるソースコード解析情報３０が作られる。このソースコード解析情報３０は、ＲＯＯＴノードを起点として、各々が、プログラムの関数名、変数名、宣言、等記述要素を保持する複数のノード３０ａが木構造をなすように記述されている。
【００４５】
［ステップ２００の詳細］
図５は、本実施の形態における検出関数一覧表４１の構成例を示す概念図である。検出関数一覧表４１には、クラス名４１ａ、メソッド名４１ｂ、引数型４１ｃが対応付けて格納される。この検出関数一覧表４１には、後述のような非推奨関数が設定される。
【００４６】
次に、検出関数一覧表４１と、上述のソースコード解析情報３０を入力とし、検出関数一覧表４１に記述された関数の呼出しを検索する。図６は、本処理のフローチャートである。
【００４７】
ここで、図３のＪａｖａソースコード（擬似コード）では、複数の関数が定義されており、それらの関数中では別の関数を呼び出している。ｆ１００、ｆ１０１等の関数は、その中でＬｉｎｋｅｄＬｉｓｔクラスのｇｅｔ関数、Ｖｅｃｔｏｒクラスのｉｎｓｅｒｔ関数を呼んでいる。それらは一般に、高頻度で呼ぶと性能劣化を引き起こす関数として知られている。検出関数一覧表４１は、そのような問題となる非推奨の関数を事前にユーザが定義したものである。
【００４８】
図６に例示されるように、本処理では、空の検出結果表３６を生成し（ステップ２０１）、検出関数一覧表４１を読み込む（ステップ２０２）。
そして、検出関数一覧表４１の中で未処理の検出関数が存在する場合（ステップ２０３）、その未処理の関数を処理対象として選択し（ステップ２０４）、ソースコード解析情報３０の中から対象関数の呼出しを検索し（ステップ２０５）、対象関数の呼出しが存在するか判別する（ステップ２０６）。
【００４９】
対象関数の呼出しが存在する場合には、検出された呼出しに連番でＩＤ（呼出しＩＤ３６ａ）を割り当て（ステップ２０８）、検出結果表３６に、ＩＤ、関数名、呼出しの存在箇所（行番号）を登録する（ステップ２０９）。
【００５０】
そして、当該関数を処理済みとして（ステップ２０７）、ステップ２０３に戻って、検出関数一覧表４１に登録された全ての関数について反復する。
この図６に示すフローチャートの処理により、図７に例示される検出結果表３６の情報が得られる。
【００５１】
検出結果表３６には、呼出しＩＤ３６ａ、存在箇所３６ｂ、検出関数３６ｃが対応付けられて格納されている。
呼出しＩＤ３６ａは検出した関数に順に割当てた識別子である。検出関数３６ｃで特定される各関数には、その呼出しの存在位置（ファイル中の行番号）も抽出し、存在箇所３６ｂとして検出結果表３６に記憶している。
【００５２】
［ステップ３００の詳細］
次に、ステップ３００では、ソースコード解析情報３０から、関数呼出し列情報３１を抽出する。図８は、本処理のフローチャートである。
【００５３】
未処理の関数が存在するか判別し（ステップ３０１）、存在する場合は、ソースコード解析情報３０から未処理関数（＠１）を取得し（ステップ３０２）、当該関数を示すノード３１ａを作成する（ステップ３０３）。
【００５４】
当該関数内にさらに関数呼出しが存在するか判別し（ステップ３０４）、存在する場合には、さらに、呼び出す関数のノード３１ａが作成済みか判別する（ステップ３０５）。
作成済みの場合には、呼び出す関数（＠２）を取得し（ステップ３０６）、上述の関数（＠１）から関数（＠２）へのリンク３１ｂを作成して（ステップ３０７）、ステップ３０１に戻る。
【００５５】
上述のステップ３０５で、作成済みでなかった場合には、呼び出す関数（＠２）のノード３１ａを作成し、上述の関数（＠１）から関数（＠２）へのリンク３１ｂを作成して（ステップ３０７）、ステップ３０１に戻る。
【００５６】
上述のステップ３０４で関数呼出しが存在しなかった場合にはステップ３０１に戻る。
これにより図９に例示される関数呼出し列情報３１が得られる。この関数呼出し列情報３１は、ソースコード４０に含まれる関数の呼出し関係を、検出結果表３６の各検出関数に注目して生成したものである。例えば、呼出しＩＤ３６ａが＃３の呼出しは、それに至る関数の呼出し関係のリンク３１ｂをたどっていくと、図９のような形で、「ｆ０→ｆ１→ｆ１０２→＃３」と「ｆ２→ｆ１０２→＃３」の二本の呼出し列となる。
［ステップ４００の詳細］
ステップ４００により、ソースコード解析情報３０からは、ループ情報表３２や条件分岐情報表３３も抽出する。図１０は、ステップ４００の詳細を示す本処理のフローチャートである。
【００５７】
まず、空のループ情報表３２を生成し（ステップ４０１）、未処理の関数が存在するか判別する（ステップ４０２）。
存在する場合には、ソースコード解析情報３０から未処理の関数（＠１）を取得し（ステップ４０３）、当該関数内にさらに関数呼出しが存在するか判別する（ステップ４０４）。
【００５８】
存在する場合には、さらに、呼び出す関数（＠２）を取得し（ステップ４０５）、関数（＠１）の中で関数（＠２）の呼出しを含むループ構造（たとえば、ｆｏｒ文，ｗｈｉｌｅ文）が存在するか判別する（ステップ４０６）。
【００５９】
存在する場合には、ループ構造の情報（ループ構文種別、数）を取得し（ステップ４０７）、さらに、二つの関数（＠１）、関数（＠１）をキーとして、抽出したループ構造の情報をループ情報表３２に登録して（ステップ４０８）、ステップ４０２に戻る。
【００６０】
上述のステップ４０６、ステップ４０４で判定条件が不成立の場合はステップ４０２に戻る。
この処理により、得られるループ情報表３２および条件分岐情報表３３は、図１１および図１２のようになる。
【００６１】
すなわち、図１１のループ情報表３２は、関数ペア３２ａと種別３２ｂとを対応つけて保持している。たとえば、最初のエントリでは、関数ｆ０の定義中にｗｈｉｌｅ文があり、その中で関数ｆ１を呼び出していることを表現している。
【００６２】
図１２の条件分岐情報表３３は、関数ペア３３ａと種別３３ｂを対応付けて格納している。意味はループ情報表３２の場合と同様である。
このようにループ情報表３２、条件分岐情報表３３は、関数の呼出しにおいて、関数間に存在するループ（ｆｏｒ文やｗｈｉｌｅ文）や、条件分岐（ｉｆ文やｓｗｉｔｃｈ文）の有無・数を表したものである。
［ステップ５００の詳細］
上述のステップ５００の処理では、関数呼出し列情報３１に対して、ループ情報や条件分岐情報を追加し、図１４に例示される関数呼出し関係情報３５を生成する。
【００６３】
図１３は、本処理の一例を示すフローチャートである。ここで生成される関数呼出し関係情報３５は、関数の呼出し列に加え、呼出し列内に含まれるループや条件分岐を表現したものになる。関数呼出し関係情報３５は、ノード３５ａ、リンク３５ｂ、ノード３５ｃを含む。
【００６４】
まず、ループ情報表３２に未取得のキー(関数ペア)が存在するか判別し（ステップ５０１）、存在する場合は、ループ情報表３２から未取得のキーを取得し（ステップ５０２）、ループ情報表３２からキーの該当するループ情報を取得する（ステップ５０３）。
【００６５】
そして、関数呼出し関係情報３５において、キーが表す二つの関数のノード３５ａの間にループ情報を表すノード３５ｃを挿入して（ステップ５０５）、ステップ５０１に戻る。
【００６６】
ステップ５０１で未取得の関数ペアがないと判定された場合には、条件分岐情報表３３に未取得のキー（関数ペア）が存在するか判定する（ステップ５０６）。
そして、存在する場合は、条件分岐情報表３３から未取得のキーを取得し（ステップ５０７）、条件分岐情報表３３からキーの該当する条件分岐情報を取得する（ステップ５０８）。
【００６７】
そして、関数呼出し関係情報３５において、キーが表す二つの関数のノード３５ａの間に条件分岐情報を表すノード３５ｃを挿入して（ステップ５０９）、ステップ５０６に戻る。
【００６８】
ステップ５０６で未取得のキーが存在しなくなったら終了する。
［ステップ６００の詳細］
上述のステップ６００では、上記の関数呼出し関係情報３５と、図１５に例示される重み定義（重み定義表４２）から、図１６に例示されるフローチャートの処理により、図１８に例示される実行頻度情報表３７を生成する。各呼出し列において、含まれるループや条件分岐に対し、重み定義表４２で指定された重みを付加する。図１７は、この処理における関数呼出し関係情報３５の状態を例示した概念図である。
【００６９】
重みが割当てられた関数呼出し関係情報３５から、それぞれの呼出し列について、呼出し列での重み合計を求める。この結果を実行頻度情報表３７として生成する。
図１５に例示されるように、重み定義表４２は、種別４２ａ、構文４２ｂ、重み４２ｃを対応付けて保持する。
【００７０】
図１８に例示されるように、実行頻度情報表３７は、呼出し列３７ａ、重み合計３７ｂを対応つけて保持する。
図１９に例示されるように、ランク定義表４３は、ランク４３ａ、重み合計４３ｂを対応付けて保持する。
【００７１】
図１６の実行頻度予測では、まず、関数呼出し関係情報３５と重み定義表４２を読み込み（ステップ６０１）、未処理の末端呼出しが存在するか判定する（ステップ６０２）。ここで、「末端呼出し」とは、図１４の関数呼出し関係情報３５において＃ｎで表した呼出しを意味し、たとえば、＃１、＃２等のノード３５ａである。
【００７２】
そして、未処理の末端呼出しが存在する場合には、未処理の「末端呼出し」を処理対象とし（ステップ６０３）、重み合計（＠２）を０に初期化する（ステップ６０４）。
そして、未処理の「末端呼出しに至る呼出し列」が存在するか判別する（ステップ６０５）。ここで、「末端呼出しに至る呼出し列」とは、図１４の関数呼出し関係情報３５で、＃ｎで示した呼出しが最後に来る呼出し列を意味する。たとえば、図１４の例では、＃３の場合は、ｆ０→ｗｈｉｌｅ→ｆ１→ｆｏｒ→ｆ１０２→＃３、とｆ２→ｆｏｒ→ｆ１０２→＃３、の二つである。
【００７３】
ステップ６０５で未処理の「末端呼出しに至る呼出し列」が存在する場合には、その未処理の「末端呼出しに至る呼出し列」を処理対象として選択する（ステップ６０６）。
そして、呼出し列を先頭からたどり、重み定義表４２の重み定義に従って、各ノード３５ｃに重みを付加する（ステップ６０７）。
【００７４】
次に、各ノードの重みを合計し、その呼出し列（枝）全体での値（＠１）を得る（ステップ６０８）。
各呼出し列の値（＠１）を、重み合計（＠２）に加算した後（ステップ６０９）、ステップ６０５に戻る。
【００７５】
ステップ６０５で、未処理の「末端呼出しに至る呼出し列」がないと判定された場合には、処理対象の末端呼出しと、その重み合計（＠２）を、実行頻度情報表３７に登録して（ステップ６１０）、ステップ６０２に戻る。
【００７６】
ステップ６０２で、未処理の末端呼出しがなくなったら終了する。
［ステップ７００の詳細］
最後に、上述のステップ７００では、図１９に例示されるランク定義表４３のランク定義を用いて、実行頻度情報表３７の実行頻度情報と、検出結果表３６の関数検出結果（図７）から、図２１に例示される検出結果レポート５０を生成する。
【００７７】
図１９に例示されるように、ランク定義表４３は、ランク４３ａと重み合計４３ｂを対応つけて保持している。本実施の形態の場合、ランク４３ａは、重み合計４３ｂの大小に応じて、Ａ〜Ｅの５段階に分類されている。
【００７８】
図２０に、本処理フローを示す。ここでは、実行頻度情報表３７の値と、ランク定義表４３のランク定義を照合し、該当するランク（Ａ〜Ｅ）を得る。そのランクと関数検出結果を統合して、検出結果レポート５０として出力する。
【００７９】
検出結果表３６、ランク定義表４３、実行頻度情報表３７を読み込み（ステップ７０１）、検出結果表３６の各行に対して、以下のステップ７０３、ステップ７０４を反復する（ステップ７０２、ステップ７０５）。
【００８０】
すなわち、検出結果表３６の関数の呼出しＩＤ３６ａを、実行頻度情報表３７で検索し、実行頻度（重み合計３７ｂ）を取得する（ステップ７０３）。
求めた実行頻度について、ランク定義表４３の重み合計４３ｂを検索し、該当するランクを取得する（ステップ７０４）。
【００８１】
その後、取得した各情報をランクでソートして検出結果レポート５０を生成する（ステップ７０６）。
生成された検出結果レポート５０は、たとえばディスプレイ１４に表示される。
【００８２】
図２１に例示されるように、検出結果レポート５０には、検出ＩＤ５０ａ、問題ランク５０ｂ、存在箇所５０ｃ、検出関数５０ｄ、が対応つけて表示されている。
このように、本実施の形態の場合には、検出結果レポート５０には、検出関数一覧表４１で指定した関数の中から、実行頻度の高い（問題のありそうな）ものが自動的に選択され、ランク付けされて表示されるため、検出結果レポート５０の視認性は極めて高い。
【００８３】
実行頻度の評価方法の変形例について、以下に説明する。
再帰呼出し（関数が自身を内部で呼出す形）は、プログラムの実行が繰返し起きる点で、ｆｏｒ文やｗｈｉｌｅ文と同様に、ループの一種としてみなすことができる。
【００８４】
図２２（ａ）に例示されるようにソースコード４０中に再帰呼出しがあった場合、一例として、関数呼出し列情報３１は、図２２（ｂ）のようになる。ここで、関数呼出し関係情報３５は、図２３のように、再帰呼出しを示すノード３５ｃを挿入して作られる。以降の実行頻度情報表３７を生成する処理は、前記と同様になる。
【００８５】
図２４（ａ）〜（ｃ）はこの再帰呼出しの場合における実行頻度情報表３７の生成処理の例を示している。
図２４（ａ）のように、関数ｆ１０が末端呼出し＃６に連なる場合、関数呼出し関係情報３５では、再帰呼出しを示す“ＲＣ”のノード３５ｃが設定される。
【００８６】
この場合、図２４（ｂ）に示すように、重み定義表４２の構文４２ｂには、ループの構文として、再帰呼出しを示す“ＲＣ”が設定される。
この結果、図２４（ｃ）に例示されるように、呼出し列３７ａが＃６に連なる実行頻度は、“ＲＣ”の重みを反映した値となる。
【００８７】
Ｊａｖａ（登録商標）などのオブジェクト指向型プログラミング言語では、継承という仕組みがある。継承を使ったソースコード４０−１の例を図２５に示す。継承はあるクラス（スーパークラス）を再利用して別のクラス（サブクラス）を作るものである。
【００８８】
一般にスーパークラスが１つ、サブクラスが複数となることが多い。継承の特徴として、ソースコード４０−１の例にあるように、同名の関数が各クラスで定義される。これにより、コード例ではｆ２０という関数を呼んでいるが、これはスーパークラス及び３つのサブクラスのｆ２０のいずれかを呼ぶことになる（どれが実際に呼ばれるかはプログラム実行時に決定される）。
【００８９】
すなわち、ＳｕｐｅｒＣのｆ２０だけでなく、ＳｕｂＣ１〜ＳｕｂＣ３のｆ２０が呼ばれる可能性がある（４つのｆ２０のいずれかが呼ばれる）。
従って、継承を使ったクラスの関数呼出しは、一種の分岐処理ともみなすことができる。ここでは、前記のｉｆ文やｓｗｉｔｃｈ文と同様に、重み付けを行う。本処理を図２６、図２７、図２８に示す。
【００９０】
図２６は、この場合の関数呼出し列情報３１を示しており、図２７は、この場合の関数呼出し関係情報３５を示している。
この関数呼出し関係情報３５では、ｆ２０それ自身のノード３５ａの他に承継に該当するノード３５ｄとして、３つの“Ｉｎｈ”が追加されている。
【００９１】
図２８（ｂ）に例示される重み定義表４２においては、承継に対応する種別４２ａとして“分岐”が設定され、構文４２ｂには“Ｉｎｎ”が設定され、重み４２ｃには、たとえば−０．２が設定され、図２８（ａ）に例示されるように関数呼出し列情報３１のノード３５ｄの“Ｉｎｎ”には対応した重みが付与される。
【００９２】
この結果、図２８（ｃ）のように、実行頻度情報表３７においては、末端呼出しの＃７では、承継の重みを反映して、実行頻度は、−．６となる。
条件分岐の条件値を実行頻度予測の重み付けに用いることもできる。すなわち、ｉｆ文やｓｗｉｔｃｈ文の条件値も考慮した重み付けを行う。
【００９３】
例えば、エラー処理部分の実行頻度は通常小さい。エラー処理部分は、図２９（ａ）に例示されたソースコード４０−２のような表現がされることが多いため、条件値（文字列定数、この場合、“ＦＩＬＥ＿ＩＯ＿ＥＲＲＯＲ”）を見ることで、その分岐がエラー処理であるか否かを予測できる。
【００９４】
このソースコード４０−２に対応する関数呼出し列情報３１は、図２９（ｂ）のようになり、＃８の「末端呼出し」の実行頻度の予測に、条件値の判定が寄与する。
この条件分岐がエラー処理部分か否かの判定には、ソースコード解析情報３０から、条件値の変数名または定数名を取得する。そして、“ＥＲＲ”や“ＥＲＲＯＲ”などの文字列とのマッチングを行う。このマッチングで条件値が類似の文字列と判断した場合は、上述の図２９（ｂ）の関数呼出し列情報３１に対応して、図３０のように関数呼出し関係情報３５を生成する。この場合、関数呼出し関係情報３５には、評価対象となる条件値に対応した“Ｖａｌ”のノード３５ｄが追加されている。
【００９５】
以降は、図３１（ｂ）に例示されるように、重み定義表４２に、種別４２ａが条件分岐で、構文４２ｂが“Ｖａｌ”のエントリを設けて、重み４２ｃを設定し、図３１（ａ）に示されるように、関数呼出し関係情報３５の“Ｖａｌ”のノード３５ｄに対応した重み値を付与して、上述の処理と同様に、＃８の「末端呼出し」に対して、図３１（ｃ）に例示される実行頻度情報表３７を得る。
【００９６】
同様な例として、ｃａｔｃｈ節で表される例外処理も、エラー処理と同様、実行頻度は通常小さい。従って、ｃａｔｃｈ節内の関数呼出しには、実行頻度を下げる重みを付ける。この例を図３２に示す。
【００９７】
図３２（ａ）のソースコード４０−３の例のように、ｃａｔｃｈ節を含む場合、関数呼出し列情報３１は、図３２（ｂ）のようになり、例外処理情報表３４は、図３２（ｃ）のようになり、関数呼出し関係情報３５は、図３２（ｄ）のようになる。例外処理情報表３４は、関数ペア３４ａと、種別３４ｂを含む。
【００９８】
これにより、上述の条件値の場合と同様に、重み合計として実行頻度を得ることができる。
一般に、たとえば、過去の経験やプログラムの用途等から、プログラム中で高頻度で実行される関数がどれか、ユーザが事前に分かっているケースがある。
【００９９】
このような場合、以下のように、ユーザが既知の当該関数に関する情報をソースコード問題予測プログラム２０に与えることで、上記までの実行頻度の予測処理をより高精度化することができる。
【０１００】
まず、図３３（ａ）に例示されるように関数重み定義表４４を用いて、高頻度で実行される関数とその重みをユーザが指定する。この場合、関数重み定義表４４は、関数名４４ａと、対応する重み４４ｂを含む。
【０１０１】
この関数重み定義表４４の重み定義を入力として、図３３（ｂ）に例示されるように、関数呼出し関係情報３５において、指定された関数にその重みを付加する。以降は、前記と同じ処理を行うことにより、図３３（ｃ）に例示されるように、実行頻度情報表３７を生成して、重み合計から、実行頻度の予測を行う。
【０１０２】
図３４に本実施の形態の場合の効果と、従来の参考技術の場合とを比較対照して示す。
従来の参考技術の場合は、ソースコード中から一律で関数呼出しを検出するため、それを用いた設計レビューでは、全ての関数を同様にレビューする必要があり、多大な工数を必要とする。また、結果の視認性も劣る。
【０１０３】
これに対して、本実施の形態の場合には、重み付けにより、問題の関数を高精度に検出（すなわち本質的な問題を重点的に検出）できるため、それらの関数に絞ったレビューを行えば良い。これにより、設計レビューの工数を大幅に削減できる。
【０１０４】
たとえば、既存のコンピュータで実行される一般のプログラムと異なり、組み込みソフトウェアの開発では、ソフトウェアと実機の開発とが並行して行われることが多いため、実際に実機でソフトウェアを実行して試験する動的試験を開発の早期に実施することが困難な場合が多い。
【０１０５】
このとき、本実施の形態の場合には、上述のような、問題の関数等を高精度で予測して検出することにより、開発工程の早期に効果的なレビューを実施して、有効なソースコードの改善、修正を実現できる、という利点がある。
【０１０６】
図３５は、本実施の形態のソースコード問題予測プログラム２０においてディスプレイ１４に表示される操作画面と、それに基づく評価処理の作用の一例を示す説明図である。
本実施の形態の場合、単に、ディスプレイ１４に検出結果レポート５０を表示するだけでなく、ユーザが当該検出結果レポート５０を評価し、その評価結果を各種の重みの設定にフィードバックして、一層、ソースコード４０における問題の検出精度を向上させることができる。
【０１０７】
すなわち、操作画面には、検出結果レポート５０とともにユーザ評価入力領域６０を表示させる。このユーザ評価入力領域６０には、検出結果レポート５０の側の検出ＩＤ５０ａの各行に対応したチェック欄６１とコメント欄６２が設けられている。
【０１０８】
チェック欄６１は、検出結果レポート５０の結果に基づいて、改善が必要な場合を示す「改善」のチェック項目６１ａと、現在のままでも可を示す「実害なし」のチェック項目６１ｂが設けられている。
【０１０９】
チェック項目６１ｂの「改善」がチェックされた場合には、コメント欄６２には、対応する対策が記載される。
チェック項目６１ａの「実害なし」がチェックされた場合には、検出結果レポート５０の側における検出ＩＤ５０ａの関数は、現在のままでも実害がないと判定され、問題検出の観点からは、検出結果レポート５０におけるノイズとみなすことができる。
【０１１０】
そこで、本実施の形態の場合には、チェック項目６１ａがチェックされた検出ＩＤ５０ａの関数に関係する重み定義表４２、関数重み定義表４４等における重み値を変更して、問題として検出される可能性やランクを下げる。
【０１１１】
すなわち、図３５の例では、チェック項目６１ａ「実害なし」がチェックされた項目（この場合、検出ＩＤ５０ａが＃２と＃１）を抽出し、さらに検出修正対象を絞り込む。この場合、＃１は、すでに最低ランク「Ｅ」であり、重みの変更は不要と判断して検出ＩＤ５０ａが＃２の関数を、重み調整の対象と決定する。
【０１１２】
そして、こうして決定された＃２について、問題ランク５０ｂの「問題の可能性」のランクが低下するように、重み定義表４２、関数重み定義表４４等における重みの設定値を変更する。この変更に際しては、他の検出結果の検出精度への影響がより少ない重み設定項目を選択して変更を行う。
【０１１３】
図３５の例では、重み定義表４２におけるｉｆ文の条件分岐に対する重みを減らす例が示されている。
この結果、図３６に例示されるように、実行頻度情報表３７は、変更の前後で、図３６（ａ）から図３６（ｂ）に変化する。そして、これに応じて、出力される検出結果レポート５０においては、検出ＩＤ５０ａが＃２の問題ランク５０ｂが、Ｄから最低のＥに変化する。
【０１１４】
これにより、たとえば、問題ランク５０ｂをランクの降順にして検出結果レポート５０に表示すれば、「実害なし」の＃２は、最後のほうに表示され、問題検出におけるノイズとして目立たなくなり、視認性が向上する。
【０１１５】
図３５の例では、検出結果レポート５０における関数の数は、５個であるが、実際のソースコードの評価では、抽出される関数が１０００個を超える場合もあり、本実施の形態のように、問題の可能性のある関数に絞り込んで、しかもランク付けして出力することによる視認性や操作性の向上の効果は非常に大きい。
【０１１６】
このように、本実施の形態の場合には、検出結果レポート５０として出力された結果に、ユーザの評価を加味して、さらにソースコード４０の問題部分の検出精度や、検出結果レポート５０の視認性、操作性を向上させることができる。
なお、本発明は、上述の実施の形態に例示した構成に限らず、その趣旨を逸脱しない範囲で種々変更可能であることは言うまでもない。
【０１１７】
（付記１）
プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出する処理と、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測する処理と、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示する処理と、
をコンピュータに実行させることを特徴とするソースコード問題予測プログラム。
（付記２）
付記１記載のソースコード問題予測プログラムにおいて、
前記関数の呼出し列中に含まれる前記繰返し構造と前記条件分岐構造の各々の数を計測し、予め定義された重み定義情報に基づき、各々の前記数の計測値に重みを乗算することで予測される前記実行頻度を計算する処理を、さらに前記コンピュータに実行させることを特徴とするソースコード問題予測プログラム。
（付記３）
付記１記載のソースコード問題予測プログラムにおいて、
再帰呼出しを行う前記関数を抽出し、当該関数内の処理を実行頻度が高い前記特定領域として予測する処理、
オブジェクト指向型プログラムにおける継承の関係にあるクラス群を抽出し、各クラスに宣言されている同一名の前記関数について、クラス数に反比例する実行頻度を割当てる処理、
前記条件分岐構造の条件値となっている変数及び定数について、前記変数及び定数の文字列表現を予め定義されたエラー処理を表す文字列と照合し、類似性が高ければ条件一致時に実行される処理領域に対して低い実行頻度を割当てる処理、
前記関数の呼出し列中に含まれる例外処理の数を計測し、前記例外処理の数に反比例する実行頻度を個々の前記関数に割当てる処理、
特定の前記関数に対するユーザからの重み定義を受け付け、前記重み定義も用いて実行頻度を個々の前記関数に割当てる処理、
の少なくとも一つを、さらに前記コンピュータに実行させることを特徴とするソースコード問題予測プログラム。
（付記４）
プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出するステップと、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測するステップと、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示するステップを、
含むことを特徴とするソースコード問題予測方法。
（付記５）
プログラムのソースコードに含まれる関数の呼出し関係、繰返し構造、条件分岐構造の少なくとも一つに関する制御構造情報を抽出する第１手段と、
前記制御構造情報から前記プログラムの実行時に高頻度で繰返し実行される特定領域を予測する第２手段と、
前記特定領域について、予め与えられた特定の関数の呼出しが存在するか調べ、存在した前記特定の関数を予測された当該特定領域の実行頻度に基づいてランク付けして表示する第３手段と、
を含むことを特徴とするソースコード問題予測装置。
（付記６）
付記５記載のソースコード問題予測装置において、
前記第２手段では、前記関数の呼出し列中に含まれる前記繰返し構造と前記条件分岐構造の各々の数を計測し、予め定義された重み定義情報に基づき、各々の前記数の計測値に重みを乗算することで予測される前記実行頻度を計算することを特徴とするソースコード問題予測装置。
（付記７）
付記５記載のソースコード問題予測装置において、
前記第２手段では、再帰呼出しを行う前記関数を抽出し、当該関数内の処理を実行頻度が高い前記特定領域として予測することを特徴とするソースコード問題予測装置。
（付記８）
付記５記載のソースコード問題予測装置において、
前記第２手段では、オブジェクト指向型プログラムにおける継承の関係にあるクラス群を抽出し、各クラスに宣言されている同一名の前記関数について、クラス数に反比例する実行頻度を割当てることを特徴とするソースコード問題予測装置。
（付記９）
付記５記載のソースコード問題予測装置において、
前記第２手段では、前記条件分岐構造の条件値となっている変数及び定数について、前記変数及び定数の文字列表現を予め定義されたエラー処理を表す文字列と照合し、類似性が高ければ条件一致時に実行される処理領域に対して低い実行頻度を割当てることを特徴とするソースコード問題予測装置。
（付記１０）
付記５記載のソースコード問題予測装置において、
前記第２手段では、前記関数の呼出し列中に含まれる例外処理の数を計測し、前記例外処理の数に反比例する実行頻度を個々の前記関数に割当てることを特徴とするソースコード問題予測装置。
（付記１１）
付記５記載のソースコード問題予測装置において、
特定の前記関数に対するユーザからの重み定義を受け付け、前記第２手段は前記重み定義も用いて実行頻度を個々の前記関数に割当てることを特徴とするソースコード問題予測装置。
【図面の簡単な説明】
【０１１８】
【図１Ａ】本発明の一実施の形態であるソースコード問題予測プログラムおよび方法の作用の一例を示す概念図である。
【図１Ｂ】本発明の一実施の形態であるソースコード問題予測プログラムおよび方法を実施するソースコード問題予測装置の構成の一例を示す概念図である。
【図２】本発明の一実施の形態であるソースコード問題予測プログラムおよび方法の作用の一例を示すフローチャートである。
【図３】本発明の一実施の形態であるソースコード問題予測プログラムで処理されるソースコードの一例を示す説明図である。
【図４】本発明の一実施の形態であるソースコード問題予測プログラムで生成されるソースコード解析情報の一例を示す説明図である。
【図５】本発明の一実施の形態であるソースコード問題予測プログラムに入力される検出関数一覧表の構成例を示す概念図である。
【図６】本発明の一実施の形態であるソースコード問題予測プログラムにおける関数検出処理の一例を示すフローチャートである。
【図７】本発明の一実施の形態であるソースコード問題予測プログラムで出力される検出結果表の一例を示す概念図である。
【図８】本発明の一実施の形態であるソースコード問題予測プログラムにおける関数呼出し列情報の抽出処理の一例を示すフローチャートである。
【図９】本発明の一実施の形態であるソースコード問題予測プログラムにて抽出された関数呼出し列情報の一例を示す概念図である。
【図１０】本発明の一実施の形態であるソースコード問題予測プログラムにおけるループ情報の抽出処理の一例を示すフローチャートである。
【図１１】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力されるループ情報表の一例を示す概念図である。
【図１２】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される条件分岐情報表の一例を示す概念図である。
【図１３】本発明の一実施の形態であるソースコード問題予測プログラムにおける関数呼出し関係情報の抽出処理の一例を示すフローチャートである。
【図１４】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される関数呼出し関係情報の一例を示す概念図である。
【図１５】本発明の一実施の形態であるソースコード問題予測プログラムに入力される重み定義表の一例を示す概念図である。
【図１６】本発明の一実施の形態であるソースコード問題予測プログラムにおける実行頻度予測処理の一例を示すフローチャートである。
【図１７】本発明の一実施の形態であるソースコード問題予測プログラムの実行頻度予測処理における関数呼出し関係情報の状態を例示した概念図である。
【図１８】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される実行頻度情報表の一例を示す概念図である。
【図１９】本発明の一実施の形態であるソースコード問題予測プログラムに入力されるランク定義表の一例を示す概念図である。
【図２０】本発明の一実施の形態であるソースコード問題予測プログラムにおける検出結果レポートの出力処理の一例を示すフローチャートである。
【図２１】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される検出結果レポートの一例を示す概念図である。
【図２２】（ａ）および（ｂ）は、本発明の一実施の形態であるソースコード問題予測プログラムにおいて処理される、再帰呼出しを含むソースコード例と対応する関数呼出し関係情報の一例を示す概念図である。
【図２３】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される関数呼出し関係情報の一例を示す概念図である。
【図２４】（ａ）〜（ｃ）は、関数の再帰呼出しの場合における実行頻度情報表の生成処理の例を示す概念図である。
【図２５】本発明の一実施の形態であるソースコード問題予測プログラムに入力される、継承を含むソースコードの一例を示す概念図である。
【図２６】本発明の一実施の形態であるソースコード問題予測プログラムにおいて、継承を含むソースコードに対応して出力される関数呼出し列情報の一例を示す概念図である。
【図２７】本発明の一実施の形態であるソースコード問題予測プログラムにおいて、継承を含むソースコードに対応して出力される関数呼出し関係情報の一例を示す概念図である。
【図２８】（ａ）〜（ｃ）は、継承を含むソースコードに対する重み付け処理の一例を示す概念図である。
【図２９】（ａ）、（ｂ）は、本発明の一実施の形態であるソースコード問題予測プログラムにおいて、条件分岐の条件値を実行頻度予測に用いる場合の概念図である。
【図３０】本発明の一実施の形態であるソースコード問題予測プログラムにおいて出力される、条件値を含む関数呼出し関係情報の一例を示す概念図である。
【図３１】（ａ）〜（ｃ）は、本発明の一実施の形態であるソースコード問題予測プログラムにおける、条件値を含む関数呼出し関係情報の重み付け処理の一例を示す概念図である。
【図３２】（ａ）〜（ｄ）は、本発明の一実施の形態であるソースコード問題予測プログラムにおける、例外処理を含むソースコードにおける関数呼出し関係情報の生成例を示す概念図である。
【図３３】（ａ）〜（ｃ）は、本発明の一実施の形態であるソースコード問題予測プログラムにおける、ユーザによる関数の重み付けの処理例を示す概念図である。
【図３４】本発明の一実施の形態であるソースコード問題予測技術の場合と、従来の参考技術の場合の効果を比較対照して示す説明図である。
【図３５】本発明の一実施の形態であるソースコード問題予測プログラムにおける操作画面と、それを用いた重み調整の作用の一例を示す説明図である
【図３６】（ａ）〜（ｃ）は、重み調整による検出結果の最適化の一例を示す概念図である。
【符号の説明】
【０１１９】
１０  情報処理装置
１１  中央処理装置
１２  主記憶
１３  外部記憶装置
１４  ディスプレイ
１５  情報入力装置
１６  ネットワークインタフェース
１７  情報ネットワーク
１８  オペレーティングシステム
２０  ソースコード問題予測プログラム
２１  字句・構文解析部
２２  検出部
２３  関数呼出し列抽出部
２４  ループ情報抽出部
２５  条件分岐抽出部
２６  例外処理情報抽出部
２７  関数呼出し関係情報生成部
２８  実行頻度予測部
２９  レポート出力部
３０  ソースコード解析情報
３０ａ  ノード
３１  関数呼出し列情報
３１ａ  ノード
３１ｂ  リンク
３２  ループ情報表
３２ａ  関数ペア
３２ｂ  種別
３３  条件分岐情報表
３３ａ  関数ペア
３３ｂ  種別
３４  例外処理情報表
３４ａ  関数ペア
３４ｂ  種別
３５  関数呼出し関係情報
３５ａ  ノード
３５ｂ  リンク
３５ｃ  ノード
３５ｄ  ノード
３６  検出結果表
３６ａ  呼出しＩＤ
３６ｂ  存在箇所
３６ｃ  検出関数
３７  実行頻度情報表
３７ａ  呼出し列
３７ｂ  重み合計
４０  ソースコード
４０−１  ソースコード
４０−２  ソースコード
４０−３  ソースコード
４１  検出関数一覧表
４１ａ  クラス名
４１ｂ  メソッド名
４１ｃ  引数型
４２  重み定義表
４２ａ  種別
４２ｂ  構文
４２ｃ  重み
４３  ランク定義表
４３ａ  ランク
４３ｂ  重み合計
４４  関数重み定義表
４４ａ  関数名
４４ｂ  重み
５０  検出結果レポート
５０ａ  検出ＩＤ
５０ｂ  問題ランク
５０ｃ  存在箇所
５０ｄ  検出関数
６０  ユーザ評価入力領域
６１  チェック欄
６１ａ  チェック項目
６１ｂ  チェック項目
６２  コメント欄
【図１Ｂ】
2007179488.tif 000003
【図２】
2007179488.tif 000004
【図３】
2007179488.tif 000005
【図４】
2007179488.tif 000006
【図５】
2007179488.tif 000007
【図６】
2007179488.tif 000008
【図７】
2007179488.tif 000009
【図８】
2007179488.tif 000010
【図９】
2007179488.tif 000011
【図１０】
2007179488.tif 000012
【図１１】
2007179488.tif 000013
【図１２】
2007179488.tif 000014
【図１３】
2007179488.tif 000015
【図１４】
2007179488.tif 000016
【図１５】
2007179488.tif 000017
【図１６】
2007179488.tif 000018
【図１７】
2007179488.tif 000019
【図１８】
2007179488.tif 000020
【図１９】
2007179488.tif 000021
【図２０】
2007179488.tif 000022
【図２１】
2007179488.tif 000023
【図２２】
2007179488.tif 000024
【図２３】
2007179488.tif 000025
【図２４】
2007179488.tif 000026
【図２５】
2007179488.tif 000027
【図２６】
2007179488.tif 000028
【図２７】
2007179488.tif 000029
【図２８】
2007179488.tif 000030
【図２９】
2007179488.tif 000031
【図３１】
2007179488.tif 000032
【図３２】
2007179488.tif 000033
【図３３】
2007179488.tif 000034
【図３４】
2007179488.tif 000035
【図３５】
2007179488.tif 000036
【図３６】
2007179488.tif 000037
【図１Ａ】
2007179488.tif 000038
【図３０】
2007179488.tif 000039