(57)【要約】【課題】データフローに含まれる、保守上問題のあるフローを自動的に検出する技術を提供する。【解決手段】データフローリスト生成部は、ソースコードから、データフローの集まりからなるデータフローリストを生成する。ステージ分け部は、データフローリストに含まれる機能要素のそれぞれについて、外部入力からの最短パス長である順方向距離を取得し、データフローリストに含まれる機能要素のそれぞれについて、外部出力からの最短パス長である逆方向距離を取得し、各機能要素の順方向距離と逆方向距離の逆数との平均値を算出し、平均値を用いて各機能要素のステージ番号を算出する。問題構造検出部は、データフローリストに含まれる各データフローにおいて、データを渡す側の機能要素のステージ番号と、データを受け取る側の機能要素のステージ番号とを比較して、当該データフローが問題構造か否かを判定する。【選択図】図２
2015106339.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードから、データフローの集まりからなるデータフローリストを生成する生成手段と、
前記データフローリストに含まれる機能要素のそれぞれについて、外部入力からの最短パス長である順方向距離を取得し、
前記データフローリストに含まれる機能要素のそれぞれについて、外部出力からの最短パス長である逆方向距離を取得し、
各機能要素の順方向距離と逆方向距離の逆数との平均値を算出し、
前記平均値を用いて各機能要素のステージ番号を算出する
計算手段と、
前記データフローリストに含まれる各データフローにおいて、データを渡す側の機能要素のステージ番号と、データを受け取る側の機能要素のステージ番号とを比較して、当該データフローが問題構造に該当するか否かを判定する判定手段と
を有する、データフロー評価装置。
【請求項２】
前記計算手段は、下記式
（ステージ番号）＝roundup(正規化された平均値×（ステージ数−１）＋１）
を用いてステージ番号を算出する、但し上記式においてroundup()は、小数点以下を切り上げる関数であり、ステージ数はステージの数である、
請求項１に記載のデータフロー評価装置。
【請求項３】
同一機能要素内でのみ使用されている変数である一時変数を介したデータフローと、引数なしの機能要素呼び出しのみを実行する機能要素化なるデータフローとを、前記データフローリストから削除する削除手段を
さらに有する請求項１又は２に記載のデータフロー評価装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、データフロー評価装置に関する。
【背景技術】
【０００２】
手続き型言語で記述されたプログラム（ソースコード）を、人間が直接見ても、保守上の問題となる構造を発見することは難しい。そこで、ソースコードから、データの流れが直感的に分かりやすいデータフロー図を作成した上で、データフロー図を目視して問題を発見するというのが一般的な従来手法である。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−１５６７８６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
従来手法でソースコードより生成したデータフローから、問題箇所を指摘するのは以下の２つの理由で容易ではない。
１．ソースコードから作成したデータフローには制御設計の仕様に直接起因しない、実装都合のフロー（ノイズ）が多数含まれる。
２．保守上の問題は、人がデータフローの入力から出力の流れを整理分類しないと発見できない。
【０００５】
本発明の目的は、ソースコードから作成したデータフローにおいて、保守上問題のあるフローを自動的に検出する技術を提供することにある。
【０００６】
本発明の別の目的は、ソースコードから作成したデータフローにおいて、要求を満たすための本質的なデータフローに的を絞り、この本質的なデータフローに含まれる、保守上問題のあるフローを自動的に検出する技術を提供することにある。
【課題を解決するための手段】
【０００７】
本発明の実施の形態はデータフロー評価装置として提案される。このデータフロー評価装置は、生成手段と、計算手段と、判定手段を有する。
生成手段は、ソースコードから、データフローの集まりからなるデータフローリストを生成する。
【０００８】
計算手段は、前記データフローリストに含まれる機能要素のそれぞれについて、外部入力からの最短パス長である順方向距離を取得し、前記データフローリストに含まれる機能要素のそれぞれについて、外部出力からの最短パス長である逆方向距離を取得し、各機能要素の順方向距離と逆方向距離の逆数との平均値を算出し、前記平均値を用いて各機能要素のステージ番号を算出する。
【０００９】
判定手段は、前記データフローリストに含まれる各データフローにおいて、データを渡す側の機能要素のステージ番号と、データを受け取る側の機能要素のステージ番号とを比較して、当該データフローが問題構造に該当するか否かを判定する。
前記計算手段は、下記式
（ステージ番号）＝roundup(正規化された平均値×（ステージ数−１）＋１）
を用いてステージ番号を算出してもよい。但し上記式においてroundup()は、小数点以下を切り上げる関数であり、ステージ数はステージの数である。
【００１０】
データフロー評価装置は、同一機能要素内でのみ使用されている変数である一時変数を介したデータフローと、引数なしの機能要素呼び出しのみを実行する機能要素化なるデータフローとを、前記データフローリストから削除する削除手段をさらに有していてもよい。
【図面の簡単な説明】
【００１１】
【図１】データフロー図の例を示す図
【図２】実施の形態に係るデータフロー評価装置の構成例を示す機能ブロック図
【図３】ソースコードの一例を示す図
【図４】図３のソースコードから生成されたデータフローリストの例を示す図
【図５】図４のデータフローリストに対応するデータフロー図の例を示す図
【図６】外部入力の読み込みの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す図
【図７】外部出力への書き出しの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す図
【図８】変数を介した機能要素間の読み書きの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す図
【図９】実装都合のデータフローの例を示すデータフロー図
【図１０】「実装都合のノード」の例を示すデータフロー図
【図１１】図４のデータフローリストに含まれる「実装都合のデータフロー」と「実装都合のノード」を示す図
【図１２】枝刈り処理前のデータフローリストに基づいて生成されるデータフロー図の例を示す図
【図１３】図１２に示すデータフローリストから、枝刈り処理後に生成される枝刈り後データフローリストに基づいて生成される、データフロー図の例を示す図
【図１４】各関数の外部入力exti1からの最短パス長すなわち順方向距離を示す図
【図１５】各関数の外部出力exto1からの最短パス長すなわち逆方向距離を示す図
【図１６】各関数についての正規化された順方向距離、正規化された逆方向距離の逆数、正規化された平均値を示す図
【図１７】図１６に示す正規化された平均値からステージ番号を算出した例を示す図
【図１８】図１７に示したステージ番号に応じて、各関数がステージに分けられたデータフロー図を図１８に示す図
【図１９】ある制御プログラムのデータフロー図
【図２０】図３に示したソースコードからデータフローリスト生成部が生成したデータフローリストに枝刈り部が枝刈り処理を行った結果、生成された枝刈り後データフローリストを示す図
【図２１】関数（ノード）とステージ番号の対応関係を記述したテーブルを示す図
【図２２】問題構造検出部が生成する問題構造検出用リストの例を示す図
【図２３】図２２の問題構造検出用リストのうち、問題構造に該当したデータフローを示した図
【図２４】問題構造であることを示す情報が付加された枝刈り後データフローリストに基づいて生成されたデータフロー図の例を示す図
【図２５】データフロー評価装置の主たる動作であるデータフロー評価処理の例を示すフローチャート
【図２６】データフロー評価装置に入力されるソースコードに対応するデータフロー図を示す図
【図２７】本質ではないデータフローを削除したデータフローリストに対応するデータフロー図を示す図
【図２８】問題構造検出、問題構造表示を行った状態のデータフロー図を示す図
【発明を実施するための形態】
【００１２】
以下、図面を参照して本発明の実施の形態に係るデータフロー評価装置を説明する。
[０．用語の定義]
本明細書中で使用する用語の定義を述べる。
[０．１．データフロー図]
「データフロー図」（DataFlowDiagram：DFD）とは、モジュールや関数などの機能間のデータ・メッセージの流れの関係で示される構造を示す図をいう。データフロー図は、ノードと、フローとで構成される。「ノード」とは、データを演算するモジュールや関数などの機能要素をいう。「フロー」とは、ノード間でのデータ・メッセージの流れをいう。図１にデータフロー図の例を示す。図１に示したデータフロー図には、ノードである関数func0と、関数func1と、関数func2とが存在している。ノードfunc0からノードfunc1へのフローがある。このフローには変数var0が関与している。また、ノードfunc1からノードfunc2へのフローがある。このフローには変数var1が関与している。さらに、ノードfunc2からノードfunc0へのフローがある。このフローには変数var2が関与している。
【００１３】
[０．２．実装都合のフロー]
「実装都合のフロー」とは、要求を満たすためのノードやフローとは関係が無いノードやフローをいう。言い換えると、システムの仕様に関係しないフローを実装都合という。例えば、データの値変化を算出できるように、前回取得した値を保存するために設けた変数とそのフローは、実装都合のフローである。
【００１４】
[０．３．機能要素]
データフローに含まれる「機能要素」とは、一纏まりの命令文の集合であって、例えば関数、モジュールである。
【００１５】
[１．実施の形態]
本発明の実施の形態は、データフロー評価装置として提案される。このデータフロー評価装置は、ソースコードから作成したデータフローにおいて、保守上問題のあるデータフローを自動的に検出し、問題のあるデータフローを出力する装置である。
【００１６】
データフロー評価装置は、コンピュータ、ワークステーション、サーバなどの情報処理装置であって、この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読み出し専用メモリ（ROM）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００１７】
[１．１．構成例]
本発明の実施の形態に係るデータフロー評価装置の構成について説明する。図２は、本実施の形態に係るデータフロー評価装置の構成例を示す機能ブロック図である。なお、機能ブロック図中に示す構成要素は、データフロー評価装置の機能を機能ごとにまとめてブロックとして捉えたものであり、データフロー評価装置が各構成要素に対応する基板、装置、回路、部品などの物理的構成要素を備えていなければならないことを意味するわけではない。また、「接続」とは、データ、情報、命令などの送信及び／又は受信、受け取り、受け渡しなどが可能な状態になっていることをいい、互いに配線で連結されているような物理的な接続に限られる意味ではない。本明細書中の他の構成要素の機能ブロック図の説明についても同様である。
【００１８】
データフロー評価装置１は、データフローリスト生成部１０と、データフローリスト生成部１０に接続された枝刈り部２０と、枝刈り部２０に接続されたステージ分け部３０と、ステージ分け部３０に接続された問題構造検出部４０と、問題構造検出部４０に接続された問題構造出力部５０とを有している。なお、データフローリスト生成部１０は、本実施の形態の生成手段に相当し、ステージ分け部３０は本実施の形態の計算手段に相当し、問題構造検出部４０は本実施の形態の判定手段に相当し、枝刈り部２０は本実施の形態の削除手段に相当する。
【００１９】
［１．１．１．データフローリスト生成部］
データフローリスト生成部１０は、ソースコード１００からデータフローリストを生成する機能を有する。「データフローリスト」とは、「データフロー」の集まりからなるデータである。「データフロー」とは、あるデータの流れの始端となる変数又は機能要素と、当該データの流れの終端となる変数又は機能要素と、始端となる変数又は機能要素との間で共通に使用される変数とを対応付けた情報である。図３にソースコードの一例を示し、図４に、図３のソースコードから生成されたデータフローリストの例を示し、図５に、図４のデータフローリストに対応するデータフロー図の例を示す。なお、データフローリスト生成部１０が出力するのはデータフローリスト若しくはそれに相当するデータであって、データフロー図を出力するものではない。
【００２０】
図３に示すソースコードは、関数main、関数func0、関数func1、関数func2を含んでいる。関数func0から関数func1へ変数var0を介してデータの受け渡しが行われるというデータフローが存在する。また、関数func1から関数func2へ変数var1を介してデータの受け渡しが行われるデータフローが存在する。さらに、関数func1から関数func0へ変数var2を介してデータの受け渡しが行われるデータフローが存在する。関数mainは、関数func0、関数func1、関数func2のそれぞれを呼び出す関数である。関数mainと、関数func0、関数func1、関数func2の間で変数を介したデータの受け渡しは行われない。また、データフローリスト生成部１０は、宣言のみで定義しか無い変数は外部変数とし、システムが書き込みを行っている場合それを外部出力、入力を行っている場合は外部入力とみなす。図３に示すソースコードでは、変数exti1は外部入力とみなされ、変数exto1は外部出力とみなされて、データフローリストが生成される。
【００２１】
図６に、外部入力の読み込みの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す。図７に、外部出力への書き出しの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す。図８に、変数を介した機能要素間の読み書きの場合のソースコード、データフローリスト中の記述、データフロー図の例を示す。なお、図６、７、８において「src」はデータを渡す変数又は機能要素を示し、「dest」はデータを受け取る変数又は機能要素を示し、「var」は変数を介した機能要素間の読み書きの場合の当該変数を示す。
【００２２】
［１．１．２．枝刈り部］
枝刈り部２０は、データフローリスト生成部１０によって生成されたデータフローリストから、実装都合のデータフローと実装都合のノードとを取り除く。実装都合のデータフローと実装都合のノードとが取り除かれたデータフローリスト（以下、「枝刈り済みデータフローリスト」と呼ぶ）は、要求を満たすための本質的なデータフローのみに絞り込まれるため、保守上問題のあるデータフローを的確に検出することが可能となる。
【００２３】
「実装都合のデータフロー」とは、一時変数を介したデータフローをいう。「一時変数」とは、同一関数内でのみ使用されている変数をいう。図９に実装都合のデータフローの例を示すデータフロー図を掲げる。
「実装都合のノード」とは、引数なしの関数呼び出しのみを実行する関数をいう。図１０に、「実装都合のノード」の例を示すデータフロー図を掲げる。
【００２４】
図１１は、図４のデータフローリストに含まれる「実装都合のデータフロー」と「実装都合のノード」を示す図である。図１１のデータフローリストでは、データフロー６０１は、「実装都合のデータフロー」に相当し、枝刈り部２０によって取り除かれる対象となる。また、データフロー６０２＿１、データフロー６０２＿２、データフロー６０２＿３は「実装都合のノード」に相当し、枝刈り部２０によって取り除かれる対象となる。
【００２５】
図１２に、枝刈り部２０による枝刈り処理前のデータフローリストに基づいて生成されるデータフロー図の例を示す。図１３に、図１２に示すデータフローリストから、枝刈り部２０による枝刈り処理後に生成される枝刈り後データフローリストに基づいて生成される、データフロー図の例を示す。図１３のデータフロー図において、「実装都合のデータフロー」に相当する関数func1から関数func1へ変数var3を介したデータの流れを示す矢印線が削除されている。また、「実装都合のノード」に相当する関数mainと、この関数mainから関数func0、関数func1、関数func2のそれぞれへ向かう矢印線が削除されている。
【００２６】
［１．１．３．ステージ分け部］
ステージ分け部３０は、枝刈り済みデータフローリストに含まれる機能要素（関数、モジュールなど）のそれぞれについて、ステージ番号を付与する処理であるステージ分けを実行する。「ステージ分け」とは、機能要素とその機能要素のステージ番号を紐付けを行うことをいう。「ステージ番号」とは、ステージを識別する番号をいう。「ステージ」とは、開始点である外部入力と終了点である外部出力から個々の機能要素に至るまでの距離によって、各機能要素をクラスタリングしたものをいう。なお、ステージは必ず１以上の機能要素を含まなければならない。ここにいう「距離」とは、開始点／終了点から個々の機能要素へ至る最短のフロー（線）の数を数えたものをいう。
【００２７】
ステージ数（分割数）は、使用者、実行者、オペレータなどが指定するようにしてもよいし、データフローリストに含まれる機能要素の個数や、開始点から終了点までの距離の大きさ等によって、所定の計算方法から定められるなどしてもよい。
ステージ分け部３０は、各機能要素について、外部入力と外部出力からの距離に応じて当該機能要素のステージ番号を算出する。
【００２８】
［１．１．３．１．ステージ番号の計算例］
上述した図１３に示すデータフロー図を例として、このデータフローに含まれる機能要素である、関数func0、関数func1、関数func2それぞれのステージ番号の計算例を述べる。
【００２９】
（１）開始点である外部入力exti1から順方向（外部出力exto1へ向かう方向）に辿れる部分グラフの各ノードに対し、外部入力exti1からの最短パス長すなわち距離（以下、区別のため「順方向距離」と呼ぶ）を取得する。この例の場合、関数func0への最短パス長は「１」、関数func1への最短パス長は「２」、関数func2への最短パス長は「３」となる。各関数の外部入力exti1からの最短パス長すなわち順方向距離を図１４に示す。
【００３０】
（２）上記の各関数の最短パス長すなわち順方向距離を０から１．０までの範囲に正規化する。正規化された順方向距離は以下の式により算出する。
（正規化した順方向距離）＝（当該関数の順方向距離平均−１）／（順方向距離の最大値−１）
【００３１】
本例の場合、上記式より関数func0の正規化された順方向距離＝０、関数func1の正規化された順方向距離＝０．５、関数func2の正規化された順方向距離＝１．０のそれぞれが得られる。
【００３２】
（３）次に、終了点である外部出力exto1から逆方向（外部入力exti1へ向かう方向）に辿れる部分グラフの各ノードに対し、外部出力exto1からの最短パス長である距離（区別のため「逆方向距離」と呼ぶ）を取得する。この例の場合、関数func0への最短パス長は「３」、関数func1への最短パス長は「２」、関数func2への最短パス長は「１」となる。各関数の外部出力exto1からの最短パス長すなわち逆方向距離を図１５に示す。
【００３３】
（４）上記の各関数の最短パス長すなわち逆方向距離の逆数を０から１．０までの範囲で正規化する。正規化した逆方向距離の逆数は以下の式により算出する。
（正規化した、距離の逆数）＝{（距離の最大値−当該関数の距離平均)／(距離の最大値−1）}
【００３４】
本例の場合、上記式より関数func0の正規化された逆方向距離の逆数＝０、関数func1の正規化された逆方向距離の逆数＝０．５、関数func2の正規化された逆方向距離＝１．０のそれぞれが得られる。
【００３５】
（５）各関数の順方向距離と、逆方向距離の逆数との平均値を算出し、算出した平均値を０から１．０の範囲で正規化する。本例の場合、関数func0の正規化された平均値＝０、関数func1の正規化した平均値＝０．５、関数func2の正規化された平均値＝１．０のそれぞれが得られる。各関数についての正規化された順方向距離、正規化された逆方向距離の逆数、正規化された平均値を図１６に示す。
【００３６】
（６）次に、ステージ分け部３０は、各関数の正規化された平均値から、当該関数のステージ番号を以下の式を用いて算出する。
（ステージ番号）＝roundup(正規化された平均値×（ステージ数−１）＋１）
なお、上記式においてroundup()は、小数点以下を切り上げる関数であり、「ステージ数」はステージの数である。
【００３７】
図１７に、図１６に示す正規化された平均値からステージ番号を算出した例を示す。なお、この例でのステージ数はユーザ若しくはシステムによって「３」が指定されているものとする。
【００３８】
図１７に示したステージ番号に応じて、各関数がステージに分けられたデータフロー図を図１８に示す。関数func0は、ステージ番号＝１に対応するステージ１に分類され、関数func1は、ステージ番号＝２に対応するステージ２に分類され、関数func2は、ステージ番号＝３に対応するステージ３に分類されたことが分かる。
【００３９】
［１．１．４．問題構造検出部］
問題構造検出部４０は、枝刈り後データフローリストに含まれる問題構造を検出する。「問題構造」とは、各処理を実行順に順序よく並べたときに、その流れを飛び越しているフロー（以下「飛越」と呼ぶ）、若しくは逆流しているフロー（以下「逆流」と呼ぶ）をいう。
【００４０】
一般的に、入力（センサ）から出力（アクチュエータ）に対して整然と順序よく流れるフローが自然である。各処理を処理の順番に順序よく並べたときに、その流れを飛び越しているフローや逆流しているフローは、不自然なフローに該当する。本実施の形態では、不自然なフロー（逆流や飛越など）が、ソフトウェアの保守性に影響を与える問題であるという前提の元、それらを問題構造として検出する。
【００４１】
以下に「飛越」と「逆流」の例を説明する。図１９は、ある制御プログラムのデータフロー図である。この制御プログラムは、センサ１４０１の出力を入力として受付け、センサ出力信号を物理単位に変換するモジュール１４０２＿１、システム状態を判定するモジュール１４０２＿２、制御目標値を決定するモジュール１４０２＿３、制御目標値を調整するモジュール１４０２＿４、制御目標値をアクチュエータ出力値に変換するモジュール１４０２＿５のそれぞれをこの順序でデータの受け渡しを行い、モジュール１４０２＿５がアクチュエータ１４０３に制御信号を出力するデータフローが存在する。アクチュエータ１４０３がこの制御信号に応じて駆動する。この制御プログラムには、上記のモジュール１４０２＿１からモジュール１４０２＿５へ至るデータフローとは別に、前述のモジュール１４０２＿３からモジュール１４０２＿１へデータの受け渡しが行われるデータフロー１４０４と、モジュール１４０２＿２からモジュール１４０２＿５へデータの受け渡しが行われるデータフロー１４０５とが存在しているものとする。
【００４２】
データフロー１４０４は不自然なデータフローである。センサ値を「物理単位に変換」するために「制御目標値」の値は不要だからである。このような不自然なデータフローは問題構造の一形態「逆流」として、問題構造検出部４０によって抽出（マーク）される。
【００４３】
データフロー１４０５は不自然なデータフローである。制御目標値を入力に「アクチュエータ出力値に変換する」処理では「システム状態の判定」は必要ないはずである。このような不自然なデータフローは問題構造の一形態「飛越」として、問題構造検出部４０によって抽出（マーク）される。
【００４４】
問題構造検出部４０による問題構造検出処理の例を示す。図２０は、図３に示したソースコードからデータフローリスト生成部１０が生成したデータフローリストに枝刈り部２０が枝刈り処理を行った結果、生成された枝刈り後データフローリストを示す図である。また、図２１は、ステージ分け部３０が生成した、関数（ノード）とステージ番号の対応関係を記述したテーブルである、ステージ番号テーブルの例である。問題構造検出部４０は、ステージ番号テーブルを参照してこの枝刈り後データフローリストの関数をステージ番号で置き換えたリストである、問題構造検出用リストを生成する。図２２に、図２０に示した枝刈り後データフローリストと、図２１に示したステージ番号テーブルとから、問題構造検出部４０が生成する問題構造検出用リストの例を示す。
【００４５】
問題構造検出部４０は、問題構造検出用リストの各データフロー（各行）について、データを渡す側の関数（図中[src]と表記する）のステージ番号（以下、「srcステージ番号」と呼ぶ）と、データを受け取る側の関数（図中[dest]と表記する）のステージ番号（以下、「destステージ番号」）とを比較して、当該データフローが問題構造のいずれかの形態に該当するか否かを判定する。具体的には：
（１）destステージ番号−srcステージ番号＜０ならば、問題構造の「逆流」に該当する。
（２）destステージ番号−srcステージ番号＞１ならば、問題構造の「飛越」に該当する。
（３）上記（１）（２）以外は問題構造に該当しない。
と判定する。
【００４６】
図２３に、図２２の問題構造検出用リストのうち、問題構造に該当したデータフローを示した図を掲げる。データフロー１８０１は、destステージ番号−srcステージ番号＝１−２＜０であるので、問題構造の「逆流」に該当すると判定される。
【００４７】
問題構造検出部４０は、問題構造であると判定したデータフロー（行）について、問題構造であることを示す情報（例えば、フラグ、マークなど）を付加した枝刈り後データフローリストを後述する問題構造出力部５０に出力する。
【００４８】
［１．１．５．問題構造出力部］
問題構造出力部５０は、問題構造検出部４０が出力した、問題構造であることを示す情報が付加された枝刈り後データフローリストを受け取り、この問題構造であることを示す情報が付加された枝刈り後データフローリストに基づいて、データフロー図等を表示する。
【００４９】
図２４に、問題構造であることを示す情報が付加された枝刈り後データフローリストに基づいて生成されたデータフロー図の例を示す。図２４に示す例では、問題構造であると判定されたデータフローである関数func1から変数var2を介して関数func0へ流れるデータフローを示す矢印線が、他の矢印線より太い線で表示されることにより、強調されて示されている。ユーザはこの表示により関数func1から変数var2を介して関数func0へ流れるデータフローが問題であることが容易に分かる。
【００５０】
なお、問題構造出力部５０による表示形態はデータフロー図に限られるわけではない。データフローリストの形式でもよいし、その他ユーザが問題構造であることを認識可能である表示形式であればどのようなものであっても本実施の形態は成立する。
【００５１】
また、本実施の形態では、問題構造出力部５０による表示形態は枝刈り後データフローリストに基づいてデータフロー図を表示させるとしたが、枝刈り前のデータフローリストに基づいてデータフロー図を表示させるようにしてもかまわない。但し、この場合には枝刈りの対象となるデータフローやノード、変数がユーザに認識されるような情報を付加して表示することが好ましい。
【００５２】
［２．動作例］
［２．１．データフロー評価処理］
次に、データフロー評価装置１の動作例を説明する。図２５に、データフロー評価装置１の主たる動作であるデータフロー評価処理の例を示すフローチャートを掲げる。
【００５３】
データフロー評価処理において、まずデータフロー評価装置１、より詳しくはデータフローリスト生成部１０はソースコード１００を読み込み、このソースコード１００からデータフローリストを生成する（S10）。
【００５４】
次にデータフロー評価装置１、より詳しくは枝刈り部２０は、ステップS10において生成されたデータフローリストから、枝刈りパターンに合致するデータフローを取り除いて、枝刈り後データフローリストを生成する。枝刈りパターンは予め枝刈り部２０に登録されている。
【００５５】
次にデータフロー評価装置１、より詳しくはステージ分け部３０は、外部入力から機能要素（関数、モジュールなど）への距離（順方向距離）、及び、外部出力から機能要素へ逆に辿ったときの距離（逆方向距離）をそれぞれの機能要素について算出する（S30）。
【００５６】
次にデータフロー評価装置１、より詳しくはステージ分け部３０は、
（ａ）外部入力から機能要素まで平均距離と、
（ｂ）外部出力から機能要素までの平均距離の逆数
を算出する（S40）。
次にデータフロー評価装置１、より詳しくはステージ分け部３０は、各機能要素について上記（ａ）（ｂ）から、
式  [(a)+(b)]/2  を用いて平均値を算出し、この平均値を０〜１の範囲で正規化し、正規化された平均値をそれぞれの機能要素のスコア、すなわちステージ番号とする（S50）。具体的な例をあげると、
当該機能要素のステージ番号＝Roundup(平均値×(分割数−１)＋１）
により、各機能要素のステージ番号を算出する（S60）。
【００５７】
次にデータフロー評価装置１、より詳しくは問題構造検出部４０は、枝刈り後データフローリストに含まれる各データフローに対して以下の処理を実行する（S70）。
【００５８】
データフロー評価装置１、より詳しくは問題構造検出部４０は、当該データフローの出力元の機能要素のステージ番号と出力先の機能要素のステージ番号を比較して、当該データフローが問題構造に該当するか判定する（S80）。具体的には、出力先の機能要素のステージ番号から出力元の機能要素のステージ番号を引いた値が０より小さい場合は問題構造の一形態である「逆流」であり、出力先の機能要素のステージ番号から出力元の機能要素のステージ番号を引いた値が１より大きい場合は問題構造の一形態である「飛越」である。
【００５９】
ステップS80において、当該データフローが問題構造に該当すると判定した場合（S80 Yes）、データフロー評価装置１、より詳しくは問題構造検出部４０は、当該データフローを問題構造であると示す情報を付加し、データフロー評価装置１、より詳しくは問題構造出力部５０はこの情報に基づいて、問題構造を表示する（S90）。
【００６０】
一方、ステップS80において、当該データフローが問題構造に該当しないと判定した場合（S80 No）、データフロー評価装置１、より詳しくは問題構造検出部４０は次の未処理のデータフローについてステップS70を実行する。ステップS70、S80の処理を、枝刈り後データフローリストに含まれるすべてのデータフローについて実行したのち（S100）、データフロー評価装置１はデータフロー評価処理を終了する。
【００６１】
［３．実施例］
データフロー評価装置１によるデータフロー評価の例を示す。図２６にデータフロー評価装置１に入力されるソースコードに対応するデータフロー図を示す。このソースコードには、外部入力Ｄ０からＤ７までの７個の外部入力と、外部出力Ｄ８とＤ９の２個の外部出力があり、関数ａから関数tまでの２０個の関数を含んでいる。外部入力、関数、外部出力へのデータの流れを矢印線で示した。
【００６２】
図２７に、図２６に示すデータフロー図に対応するデータフローリストから、枝刈り部２０によって本質ではないデータフローを削除したデータフローリストに対応するデータフロー図を示す。枝刈り部２０で削除されるデータフロー及び関数を点線及び、点線矢印線で示す。
【００６３】
図２８に、枝刈り部２０によって削除された後のデータフローリストについて、ステージ分け、問題構造検出、問題構造表示を行った状態のデータフロー図を示す。図２８では、関数はステージ１からステージ５までの５個のステージに分類され、さらに、ステージ１に分類された関数eからステージ３に分類された関数fへ流れるデータフローと、ステージ５に分類された関数eからステージ４に分類された関数fへ流れるデータフローとが問題構造に該当するとして検出され、太線矢印線によって強調表示されている。なお、関数eから関数fへ流れるデータフローは「飛越」であり、関数eから関数fへ流れるデータフローは「逆流」である。
【００６４】
［４．利点］
本実施の形態によれば、ソースコードから生成されたデータフローリストに基づいて、ソースコードに含まれる問題箇所を検出することができる。
（１）実装都合や設計都合といった、ノイズに相当するフローを除去し、クリティカルな問題を高精度で出力することが可能である。
（２）データフローリスト中の各データフローについて、自然な流れと不自然な流れとに峻別し、不自然な流れである問題のあるフローを発見することを可能としている。
【００６５】
[４．まとめ、その他]
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【符号の説明】
【００６６】
１・・・データフロー評価装置；  １０・・・データフローリスト生成部；  ２０・・・枝刈り部；  ３０・・・ステージ分け部；  ４０・・・問題構造検出部；  ５０・・・問題構造出力部；  １００・・・ソースコード；
【図１】
2015106339.tif 000003
【図２】
2015106339.tif 000004
【図３】
2015106339.tif 000005
【図４】
2015106339.tif 000006
【図５】
2015106339.tif 000007
【図６】
2015106339.tif 000008
【図７】
2015106339.tif 000009
【図８】
2015106339.tif 000010
【図９】
2015106339.tif 000011
【図１０】
2015106339.tif 000012
【図１１】
2015106339.tif 000013
【図１２】
2015106339.tif 000014
【図１３】
2015106339.tif 000015
【図１４】
2015106339.tif 000016
【図１５】
2015106339.tif 000017
【図１６】
2015106339.tif 000018
【図１７】
2015106339.tif 000019
【図１８】
2015106339.tif 000020
【図１９】
2015106339.tif 000021
【図２０】
2015106339.tif 000022
【図２１】
2015106339.tif 000023
【図２２】
2015106339.tif 000024
【図２３】
2015106339.tif 000025
【図２４】
2015106339.tif 000026
【図２５】
2015106339.tif 000027
【図２６】
2015106339.tif 000028
【図２７】
2015106339.tif 000029
【図２８】
2015106339.tif 000030