(57)【要約】【課題】図形式プログラムに関して、テキストデータのプログラムに変換することなく、静的解析を行えるようにする。【解決手段】複数の図形が接続されて成る図形式プログラム１から、その特徴を示す特徴情報として例えば各図形間の接続関係を示す接続情報を抽出する。コーディングルールデータベース１５には、予め、上記特徴に係わるルール情報が記憶されている。情報比較部１３は、このルール情報等に基づいて、上記抽出された特徴が、上記ルール情報に合致するか否かを判定する（ルール違反であるか否かを判定する）。【選択図】図１
2016057715.tif 000002
【特許請求の範囲】
【請求項１】
複数の図形が接続されて成る図形式プログラムから、その特徴を示す特徴情報として各図形間の接続関係を示す接続情報を抽出する特徴情報抽出手段と、
予め前記特徴に係わるルール情報が記憶されたルール情報記憶手段と、
前記抽出された特徴が、前記ルール情報に合致するか否かを判定することでルール違反を判定する判定手段と、
を有することを特徴とする図形式プログラム解析装置。
【請求項２】
前記判定手段による判定結果に基づいて、前記図形式プログラムにおけるルール違反箇所を表示する違反箇所表示手段を更に有することを特徴とする請求項１記載の図形式プログラム解析装置。
【請求項３】
前記図形として、ブロックと、任意のブロック間を接続する接続線があり、
前記接続情報は各ブロック間の接続関係を示す情報であり、
前記特徴情報抽出手段は、前記特徴情報として更に前記各ブロックの種別情報を抽出し、
前記ルール情報には、ブロックに関して種別に応じた接続ルールが含まれ、
前記判定手段は、前記図形式プログラムの各ブロック間の接続関係が、そのブロックの種別に応じた接続ルールに合致するか否かを判定することを特徴とする請求項１または２記載の図形式プログラム解析装置。
【請求項４】
前記特徴情報抽出手段は、前記特徴情報として更に前記ブロックの数の情報を抽出し、
前記ルール情報には、ブロック数の上限値が含まれており、
前記判定手段は、前記抽出されたブロック数が、前記上限値を超える場合には、ルール違反であると判定することを特徴とする請求項１〜３の何れかに記載の図形式プログラム解析装置。
【請求項５】
前記ルール情報には、図形式プログラムの各名称に係わる命名規則が含まれており、
前記判定手段は、前記図形式プログラムの各名称が、前記命名規則に則しているか否かを判定することを特徴とする請求項１〜４の何れかに記載の図形式プログラム解析装置。
【請求項６】
前記図形として、ブロックと、任意のブロック間を接続する接続線があり、
前記違反箇所表示手段は、前記図形式プログラムを表示すると共に、前記判定手段による判定結果に基づいて、ルール違反と判定されたブロックを強調表示することを特徴とする請求項２記載の図形式プログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、図形を用いて記述されたプログラムに対する静的解析方法に関する。
【背景技術】
【０００２】
一般的に、開発したプログラムの検証を行う場合、プログラムを実際に動作させる「動的解析」と、実際には動作させない「静的解析」の２種類の方法を適宜使用することで、効率的な検証が行われている。「静的解析」は、プログラムのコードであるテキストデータを解析し、文法が正しいか、ルールに基づいた記述をしているか等を確認しているため、比較的簡単に検証を行うことができる(例えば、特許文献１、特許文献２等、参照)。
【０００３】
一方、近年、製品の電子回路は、マイコンやFPGAなどの集積回路に置き変わっており、それらは内部の定義をプログラムなどによって定義されている。しかし、Ｃ言語などのテキストベースプログラムの場合、プログラム内の視認性が悪く、どのような処理が行われているが確認し難かった。
【０００４】
そこで、プログラム内の視認性を向上し品質や利便性を高めた図形式プログラムを用いる場合がある。図形式プログラムでは、ブロック図や接続線などの図形を用いてプログラムコードを作成する。そして、この様に作成された図形式プログラムを、コンピュータが実行可能なソフトウェア、もしくはＣ言語などの従来のプログラムコードへ変換する。近年、この様な図形式プログラムに係わる開発環境やソフトウェアが開発され、利用されている。(例えば、Math WorksのMATLAB SimulinkやMITメディアラボのScratchなど)(特許文献３、特許文献４等、参照)
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１３−１４９１３４号公報
【特許文献２】特開２０１１−１３３９６６号公報
【特許文献３】特開２０１３−１４０５１３号公報
【特許文献４】特開２００６−３０１９８９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
「静的解析」では、テキストデータの文法が対象となっているため、上記図形式プログラムに対して直接適用することはできない。このため、図形式プログラムをテキストデータのプログラム(Ｃ言語など)に変換してから、静的解析を行う必要があった。また、テキストベースのプログラムに変換しているため、修正の必要なコードが図形式プログラムのどこに相当するかが分かり難く、修正が困難であった。
【０００７】
本発明の課題は、図形式プログラムに関して、テキストデータのプログラムに変換することなく、静的解析を行うことができる図形式プログラム解析装置等を提供することである。
【課題を解決するための手段】
【０００８】
本発明の図形式プログラム解析装置は、複数の図形が接続されて成る図形式プログラムから、その特徴を示す特徴情報として各図形間の接続関係を示す接続情報を抽出する特徴情報抽出手段と、予め前記特徴に係わるルール情報が記憶されたルール情報記憶手段と、前記抽出された特徴が、前記ルール情報に合致するか否かを判定することでルール違反を判定する判定手段とを有する。
【発明の効果】
【０００９】
本発明の図形式プログラム解析装置等によれば、図形式プログラムに関して、テキストデータのプログラムに変換することなく、静的解析を行うことができる。
【図面の簡単な説明】
【００１０】
【図１】本例の静的解析システムの構成例である。
【図２】本例の静的解析システムの概略動作フローチャート図である。
【図３】図形式プログラムの具体例（その１）である。
【図４】図形式プログラムの具体例（その２）である。
【図５】図形式プログラムの具体例（その３）である。
【図６】図形式プログラムの具体例（その４）である。
【図７】（ａ）は接続線の情報、（ｂ）は接続情報の具体例である。
【図８】情報抽出部の処理フローチャート図である。
【図９】作成される関数データの具体例である。
【図１０】コーディングルールの具体例（その１）である。
【図１１】コーディングルールの具体例（その２）である。
【図１２】解析結果の表示例（その１）である。
【図１３】解析結果の表示例（その２）である。
【図１４】解析結果の表示例（その３）である。
【図１５】解析結果の表示例（その４）である。
【図１６】解析結果の表示例（その５）である。
【発明を実施するための形態】
【００１１】
以下、図面を参照して本発明の実施の形態について説明する。
図１には、本例の静的解析システム（図形式プログラム解析装置）の構成例を示す。
図２には、本例の静的解析システムの概略動作フローチャート図を示す。
【００１２】
図示の例の静的解析システム（図形式プログラム解析装置）１０は、入力部１１、情報抽出部１２、情報比較部１３、画面出力部１４、コーディングルールデータベース１５等を有する。
【００１３】
情報抽出部１２は、複数の図形が接続されて成る図形式プログラム１から、その特徴を示す特徴情報として例えば各図形間の接続関係を示す接続情報を抽出する。コーディングルールデータベース１５には、予め、上記特徴に係わるルール情報が記憶されている。ルール情報は、例えば開発者が任意に登録しておく。情報比較部１３は、このルール情報等に基づいて、上記抽出された特徴が、上記ルール情報に合致するか否かを判定する（ルール違反であるか否かを判定する）。
【００１４】
画面出力部１４は、上記情報比較部１３による判定結果を表示する。例えば、図形式プログラム１におけるルール違反箇所を表示する。例えば、ルール違反と判定されたブロックを強調表示する。
【００１５】
上記図形として、例えば、ブロックと、任意のブロック間を接続する接続線がある。また、上記接続情報は、例えば各ブロック間の接続関係を示す情報である。
上記情報抽出部１２は、上記特徴情報として更に上記各ブロックの種別情報を抽出する。また、例えば、上記ルール情報には、ブロックに関して種別に応じた接続ルールが含まれている。そして、情報比較部１３は、例えば、図形式プログラム１の各ブロック間の接続関係が、そのブロックの種別に応じた接続ルールに合致するか否かを判定する。
【００１６】
上記情報抽出部１２は、例えば上記特徴情報として更に上記図形式プログラム１に含まれるブロックの数の情報を抽出する。また、上記ルール情報には、ブロック数の上限値が含まれている。これより、情報比較部１３は、例えば、上記抽出されたブロック数が、上記上限値を超える場合には、ルール違反であると判定する。
【００１７】
また、例えば、上記ルール情報には、図形式プログラム１の各名称に係わる命名規則が含まれている。情報比較部１３は、図形式プログラム１の各名称が、上記命名規則に則しているか否かを判定する。
【００１８】
尚、静的解析システム（図形式プログラム解析装置）１０は、例えばパソコン等の汎用の一般的なコンピュータ装置により実現される。よって、図形式プログラム解析装置１０は、特に図示しないがハードウェア的には一般的なパソコン等の構成を有している。すなわち、ＣＰＵ、ハードディスク／メモリ等の記憶装置、入出力インタフェース、ディスプレイ等の表示部、キーボード等のユーザ操作部、通信機能部等の不図示の各構成を有している。
【００１９】
上記記憶装置には、予め所定のアプリケーションプログラムが記憶されている。上記ＣＰＵが、このアプリケーションプログラムを実行することで、上記入力部１１、情報抽出部１２、情報比較部１３、画面出力部１４等の各種処理機能が実現され、また、後述する図２、図８の処理等が実行される。また、上記コーディングルールデータベース１５は、例えば上記記憶装置上に構成される。また、上記画面出力部１４は、例えば上記ディスプレイ等に後述する解析結果等を表示するものである。
【００２０】
入力部１１から解析対象の任意の図形式プログラム１を入力し（図２のステップＳ１）、情報抽出部１２によって当該図形式プログラム１から静的解析に必要な情報を抽出する（ステップＳ２）。この抽出情報の一例が図９に示す関数データ４０であり後に説明する。
【００２１】
情報比較部１３は、上記抽出情報とコーディングルールデータベース１５等に基づいて、図形式プログラム１における不具合やコーディングルール違反箇所を判定する（ステップＳ３）。画面出力部１４は、この判定結果としてのルール違反箇所等の情報を、例えばディスプレイ上等に画面表示する（ステップＳ４）。
【００２２】
尚、コーディングルールデータベース１５には、予め、コーディングルール違反情報等が格納されている。これは、例えば開発者等が任意に作成して登録しておくものである。その一例を図１０、図１１に示し、後に説明する。
【００２３】
上記図形式プログラム１の一例を、図３から図６に示す。
図３は関数Ａのプログラム内容を示し、この関数Ａ中の図示の関数Ｂ（FuncB）と関数Ｃ（FuncC）のプログラム内容を、図４、図５に示している。更に、図５中の図示の関数Ｄ（FuncD）のプログラム内容を、図６に示している。
【００２４】
ここでは、主に図３のプログラム内容について詳細に説明するものとし、図４〜図６については後に簡略化して説明するものとする。
図形式プログラムでは、一般的に、各図形（ブロックや接続線等）が、内部データ（付随情報）を持っている。例えば、各ブロックはＩＤや種別番号や設定情報等を有し、各接続線は、それが接続するブロックの情報を持つ。上記ＩＤは、各ブロックに任意に割当てられるユニークなブロック識別番号等である。
【００２５】
ブロックには、例えば入力、出力、関数等の様々な種類があり、予め各種類の識別用情報として上記種別番号が定義されている。そして、図示の例では、一例として、入力を定義するブロック（以下、入力図形と記す）の種別番号を‘１００’、出力を定義するブロック（以下、出力図形と記す）の種別番号を‘１１０’、他の関数を参照するブロック（以下、関数参照図形と記す）の種別番号を‘１０１’としている。
【００２６】
また、接続線は、基本的に、任意の２つのブロック間を接続するものであり、その内部データは、接続元のブロックのＩＤと、接続先のブロックのＩＤ等を有する。尚、ここでは、接続線の種別番号は無いものとする。尚、任意の関数プログラム内の上記関数参照図形による参照先の他の関数を“参照関数”と呼ぶ場合があるものとする。
【００２７】
ここで、図３では、一部のブロックと一部の接続線のみについてその内部データを示すが、他のブロックや接続線の内部データについて、以下に示す。すなわち、図示の（１）、（２）で示す各ブロックの内部データ、図示の（３）、（４）、（５）で示す各接続線の内部データについて、具体例を以下に列挙する。
【００２８】
（１）内部データ
ＩＤ    ：２０
名前    ：InFuncOn
種別番号：１００
（２）内部データ
ＩＤ    ：１０
参照先  ：FuncB
種別番号：１０１
接続先ポイント１：InSignal
接続先ポイント２：ResData
（３）内部データ
接続元ＩＤ：２０
接続元箇所：ポイント１
接続先ＩＤ：８０
接続先箇所：ポイント１
（４）内部データ
接続元ＩＤ：１０
接続元箇所：ポイント２
接続先ＩＤ：８０
接続先箇所：ポイント２
（５）内部データ
接続元ＩＤ：８０
接続元箇所：ポイント３
接続先ＩＤ：３０
接続先箇所：ポイント１
尚、図示している内部データについても、図示のように（６）、（７）、（８）、（９）の符号を付すと共に、以下に列挙しておくものとする。
【００２９】
（６）内部データ
ＩＤ      ：５０
名前      ：InData
種別番号  ：１００
（７）内部データ
ＩＤ      ：３０
名前      ：OutData
種別番号  ：１１０
（８）内部データ
ＩＤ      ：８０
参照先    ：FuncC
種別番号  ：１０１
接続ポイント１：InSwitch
接続ポイント２：InAddData
接続ポイント３：CalcOut
（９）内部データ
接続元ＩＤ：５０
接続元箇所：ポイント１
接続先ＩＤ：１０
接続先箇所：ポイント１
尚、ブロックに関して、その枠内に示す名称を用いて、例えば上記（８）のブロックは「FuncC」ブロック等と記す場合があるものとする。
【００３０】
尚、上記接続先ポイントによって、他の図形式プログラムとの関連等が分かるようになっている。例えば、図３において上記（２）のブロックには“InData”が入力することが分かる。そして、上記（２）の内部データには、参照先として“FuncB”があり、接続先ポイント１として“InSignal”がある。これより、この“InData”が、図４に示す“FuncB”のプログラムにおける“InSignal”として入力されることが分かる。
【００３１】
尚、図４に示す関数Ｂ(FuncB)、図５に示す関数Ｃ(FuncC)、図６に示す関数Ｄ(FuncD)の各プログラムに関しては、その一部のブロックに関してのみ、以下、簡単に説明するものとする。
【００３２】
まず、図４の関数Ｂに関しては、図示の「InSignal」ブロックは種別番号＝１００であり、図示の「ResData」ブロックは種別番号＝１１０である。尚、ＩＤ等に関しては特に示さない。
【００３３】
また、図５に関しては、図示の「InSwitch」ブロックと「InAddData」ブロックが種別番号＝１００である。また、図示の「CalcOut」ブロックは種別番号＝１１０である。また、図示の「FuncD」ブロックは、種別番号＝１０１であり、参照先＝FuncDである。
【００３４】
また、図６の関数Ｄに関しては、図示の「OutTime」ブロックは種別番号＝１１０である。
尚、図４、図５、図６に関しては、内部データの詳細例は示さないが、図示の各ブロック内に示す文字は、入力図形または出力図形の場合には上記“名前”であり、関数参照図形の場合は“参照先の関数名”等である。そして、図４、図５、図６に関しては、入力図形、出力図形、関数参照図形に関しては、上記の通り、その内部データついて部分的・簡単に説明してある。
【００３５】
例えば上記図３〜図６に示す図形式プログラム１が、入力部１１を介して情報抽出部１２に入力されると、情報抽出部１２は、この図形式プログラム内に含まれるブロックの数やブロック同士の接続関係、使用している変数の情報などを抽出する。
【００３６】
接続情報の取得を行う際には、単純なブロック図同士の接続関係だけではなく、ブロック図が意図する処理の流れについても静的解析の対象とするために、対象とするブロックの前後にどのようなブロックが接続されているかをリストアップする。これは、後述する具体例では例えば種別番号等を含む関数データ４０を、生成することになるが、この例に限らない。
【００３７】
情報抽出部１２は、これらのブロックや接続線の内部データを収集することによって、関数データを生成する。
図９に、この関数データの具体例を示す。この情報はcsvやxmlなどのデータ形式によってシステム内に保存される。この関数データ生成処理を、図形式プログラム１に含まれる各関数（各ファイル）毎に実行する。
【００３８】
以下、例えば上記図９に示すような関数データ４０を生成する処理を具体例にして説明する。図９は、上記図３に示す関数Ａに応じた関数データである。
図８は、情報抽出部１２の処理フローチャート図である。つまり、上記関数データ生成処理のフローチャート図である。尚、ここでは具体例として、図３に示す関数Ａを処理対象とした場合に、図９に示す関数データ４０が生成されることについて、説明する。
【００３９】
図８の処理例では、まず、上記図形式プログラム１のファイルから、関数名の情報を取得する（ステップＳ１１）。取得した関数名は、例えば図９に示す関数データ４０における“関数名”４１の欄に記述される。ここでは、図３のファイル名から関数名４１＝「FuncA」が記述されるものとする。ここで、図３〜図６に示す各関数のプログラムは、それぞれが１つのファイルに格納されており、且つ本例では、ファイル名と関数名とが同一となるようにしているものとする。これより、本例では、ファイル名を取得することを以って関数名を取得する。但し、勿論、これは一例であり、この例に限らず、例えば、ファイル内のデータの一部として関数名の情報を持つ場合や、別途関数名とファイル名の対応付けを行ったデータを保有する場合等もある。
【００４０】
次に、図形式プログラム１の処理対象ファイル（上記の通り、ここでは図３のファイル内容）内のブロックを走査し、ステップＳ１２〜Ｓ１５の処理を実行する。ここでは、まず、ブロック数を計測する（ステップＳ１２）。ブロック数の計測は、処理対象ファイル中の全図形の中から、特定の内部データを持つ図形の数をカウントする事によって行う。例えば、その内部データに種別番号が含まれる図形の数を、カウントする。これは、接続線以外の図形はブロックであるものとしてカウントすることを意味する。但し、これは一例であり、この例に限らない。計測したブロック数は、図９に示す関数データ４０の“ブロック数”４２の欄に記述される。本例では、図３には５つのブロックがあるので、図９に示すようにブロック数４２＝‘５’が記述される。
【００４１】
続いて、上記処理対象ファイルから関数呼び出し情報を取得する（ステップＳ１３）。そして、取得した関数呼び出し情報を、関数データ４０の“関数呼び出し”４３の欄に記述する。これは、例えば一例としては、特定の種別番号(図３の例では、種別番号＝101)を有するブロックの内部データの“参照先”のデータを、上記関数呼び出し情報として取得するものである。図３の例では、上記（２）と（８）のブロックの種別番号が‘101’であり、それぞれの内部データの“参照先”は、FuncB、FuncCとなっている。これより、図９に示す関数データ４０の“関数呼び出し”４３の欄に、FuncB、FuncCが記述される。
【００４２】
次に、上記処理対象ファイルからブロック情報を取得し、これを関数データ４０の“ブロック情報”４４に記述する（ステップＳ１４）。これは、例えば、各ブロックの内部データから、ＩＤ、種別番号、名前等を抽出し、これらを図９に示す関数データの“ブロック情報”４４における“ＩＤ”４５、“種別番号”４６、“名前”４７に、それぞれ記述する。尚、内部データに“名前”が無い場合には“参照先”を“名前”４７に記述する。
【００４３】
更に、上記処理対象ファイルから変数情報を取得し、これを関数データ４０の“変数情報”５２に記述する（ステップＳ１５）。これは、例えば、各ブロックの内部データに含まれる変数の情報(型、変数名、コメント)を取得し、これを図９に示す関数データ４０の“変数情報”５２における“変数型”５３、変数名５４、コメント５５の欄に記述する。但し、図３に示す例では内部データに変数情報が無いので、図９に示すように“変数情報”５２の欄には何もデータは無い。
【００４４】
最後に、上記処理対象ファイルから接続線の情報を取得して（ステップＳ１６）、これに基づいて変数データ４０の“接続情報”４８を生成する（ステップＳ１７）。図３の例の場合、図７（ａ）に示す“接続線の情報”２０を生成して（ステップＳ１６）、これと上記取得済みの各ブロックの情報とに基づいて、図７（ｂ）に示す接続情報３０を生成することになる（ステップＳ１７）。尚、図７（ｂ）に示す接続情報３０は、図９に示す変数データ４０の“接続情報”４８の欄（“ＩＤ”４９、“入力元ＩＤ”５０、“出力先ＩＤ”５１を含む）を、抜き出して示しているものである。
【００４５】
図７（ａ）に示す“接続線の情報”２０の生成方法は、例えば、まず、図形式プログラム１から全ての接続線(図３等においてブロック間に書かれている矢印)の内部データを収集する。尚、接続線は、例えば上記の事からその内部データに種別番号が含まれない事を以って識別できるが、この例に限らず、その内部データに接続元ＩＤと接続先ＩＤが含まれる図形を、接続線と見做しようにしてもよい。
【００４６】
上記図３について説明したように、接続線の内部データには、接続元ＩＤと接続先ＩＤの情報が含まれる。接続元ＩＤは、その接続線の接続元(矢印の根元側)にあるブロックのＩＤである。接続先ＩＤは、その接続線の接続先(矢印の先端側)にあるブロックのＩＤである。この様に各接続線の内部データから接続元ＩＤと接続先ＩＤの情報を取得して、これらを例えば図７（ａ）に示す“接続線の情報”２０における“接続元ＩＤ”２１、“接続先ＩＤ”２２の欄に格納する。図３の例において、例えば上記（９）の接続線の場合、接続元ＩＤ＝５０、接続先ＩＤ＝１０となっており、これらが図７（ａ）に示す“接続線の情報”２０に格納されることになる。
【００４７】
そして、上記ステップＳ１７の処理では、例えば、図７（ａ）に示す“接続線の情報”２０と、上記取得済みの各ブロックの内部データ等に基づいて、例えば図７（ｂ）に示す接続情報３０（図９に示す接続情報４８）を生成する。この処理は、例えば、各ブロック毎に、そのブロックに接続されている接続線の反対側にあるブロックのＩＤを走査する。これは、例えば、各ブロックを順次処理対象とし、処理対象ブロックの内部データから当該ブロックのＩＤが分かるので、このブロックＩＤを図７（ｂ）の接続情報３０の“ＩＤ”３１の欄に格納する。
【００４８】
更に、図７（ａ）に示す“接続線の情報”２０において、このブロックＩＤと同一のＩＤを探索する。ここで仮にブロックＩＤ＝‘１０’とした場合、図７（ａ）の例では、‘１０’は、先頭レコードの“接続先ＩＤ”２１と、２番目のレコードの“接続元ＩＤ”２２とに存在している。これら２つのレコードにおいて、‘１０’と対応付けられているＩＤを取得する。これより、先頭レコードに関しては接続元ＩＤ２１＝‘５０’を取得し、２番目のレコードに関しては接続先ＩＤ２２＝‘８０’を取得する。これは、ＩＤ＝１０のブロックの前後のブロックのＩＤを取得することを意味することになる。
【００４９】
上記取得した接続元ＩＤを図７（ｂ）の接続情報３０の“入力元ＩＤ”３２の欄に格納し、上記取得した接続先ＩＤを図７（ｂ）の接続情報３０の“出力先ＩＤ”３３の欄に格納する。これより、図７（ｂ）の先頭レコードに示すように、“ＩＤ”が‘１０’に対応して、“入力元ＩＤ”３２の欄には‘５０’が格納され、“出力先ＩＤ”３３の欄には‘８０’が格納されることになる。
【００５０】
尚、上記の通り、接続情報３０は接続情報４８に相当するので、上記の処理は、取得した接続元ＩＤを“入力元ＩＤ”５０に格納し、取得した接続先ＩＤを“出力先ＩＤ”５１に格納する処理と同義であると考えてよい。
【００５１】
他のブロックに関しても同様にして処理を行い、その結果、図７（ｂ）に示すように、“ＩＤ”３１が‘２０’、‘３０’、‘５０’、‘８０’の各ブロックに関して、そのブロックの前後のブロックのＩＤが、“入力元ＩＤ”３２、“出力先ＩＤ”３３に格納されることになる。勿論、図７（ｂ）に示す通り、そのブロックの前または後に他のブロックが存在しない場合には、何もデータは格納されない（−で示す）。その一方で、“入力元ＩＤ”３２または“出力先ＩＤ”３３に、複数のＩＤが格納される場合もあり得る（図示のＩＤ＝‘８０’の場合など）。つまり、そのブロックの前または後に、複数のブロックが接続されている場合もあり得る。
【００５２】
以上説明した情報抽出部１２の処理によって、例えば図３に示す関数Ａの例の場合、例えば図９に示すような関数データ４０が生成されることになる。
情報比較部１３は、この様に生成された関数データ４０と、予め登録されているコーディングルールデータベース１５に基づいて、不具合やコーディングルール違反箇所を判定する。例えば、関数データ４０の各項目に関して、コーディングルールデータベース１５の情報との比較を行う。比較される項目は、関数名の命名規則、ブロック数の上限値、接続情報、変数の命名規則などである。コーディングルールとの比較処理では、例えば、関数データ４０の“関数名”４１、“ブロック数”４２、“接続情報”４８、“変数情報”５２等に関して、それぞれがコーディングルールに適合しているかを判定する。
【００５３】
例えば“接続情報”４８については、対象となるブロックとその前後のブロックから、ブロック図の書き方によってプログラムの処理に不整合が生じ無いかを確認する。以下、図１０、図１１に示す具体例も用いて更に詳細に説明する。
【００５４】
図１０は、コーディングルールデータベース１５に格納されるコーディングルールの具体例（その１）である。
図１１は、コーディングルールデータベース１５に格納されるコーディングルールの具体例（その２）である。
【００５５】
尚、図１０、図１１に示すコーディングルール情報は、“対象”６１と“ルール”６２と“違反メッセージ”６３から成るが、実質的に“ルール”６２がコーディングルールであると見做してよい。“対象”６１には、“ルール”６２の適用対象を示している。“違反メッセージ”６３には、判定対象が“ルール”６２に違反すると判定された場合に表示等するメッセージが格納されている。このメッセージは、例えば開発者等が予め任意に考えて登録している。
【００５６】
図１０は、命令規則やブロック数に関するルール情報例である。
ブロック数は、関数の最大規模をブロックの数によって定義しておき、図示のブロック数＝‘５０’はブロック数の上限値（閾値）を意味する。これより、情報比較部１３は、上記関数データ４０の“ブロック数”４２が、この上限値を超えた場合には、ルールに違反していると判定する。図９に示す例では“ブロック数”４２＝‘５’であり、上限値‘５０’以下であるので、情報比較部１３は、ルール違反ではないと判定することになる。
【００５７】
また、図１０に示すように、関数の命名規則、変数の命名規則等に係わるコーディングルールもある。図示の例では、関数名や変数名についての命名規則(１文字目には数値を用いない等の規則)を、“ルール”６２に示すように正規表現によって定義している。例えば図示の関数の命名規則としての“ルール”６２は、先頭文字が大文字のアルファベットであり、それ以降には、アンダースコアもしくは大小のアルファベット、数字が複数入る規則が、定義されている。
【００５８】
情報比較部１３は、例えば、図９に示す関数データ４０における“関数呼び出し”４３や、“ブロック情報”４４において識別番号＝‘１０１’であるデータの“名前”４７（関数名の文字列）が、命名規則に合致するか否か（文字列が上記正規表現と一致するか否か）を、判定する。また、情報比較部１３は、例えば、図９に示す関数データ４０における“変数情報”５２の“変数名”５４の文字列が、変数の命名規則に合致するか否か（各文字列が正規表現と一致するか否か）を、判定する。勿論、不一致である場合に、ルール違反と判定することになる。
【００５９】
また、図１１には、ブロック同士の接続に関するルール情報例を示す。
接続情報については、開発者等は、好ましくない接続や、やってはいけない接続等をリスト化し、“ルール”６２として登録する。そして、この場合には（例えば、対象６１が「ブロック接続ルール」である場合等には）、判定対象が“ルール”６２に合致する場合に、違反と判定されるようにする。また、開発者等は、各“ルール”６２に対する違反があった場合に、違反の意味をユーザに知らせる為の任意の内容の文章等を、上記“違反メッセージ”６３として登録する。
【００６０】
また、この場合には（例えば、対象６１が「ブロック接続ルール」である場合等には）、“ルール”６２は、図示のように“基準ブロック”６２ａ、“前ブロック”６２ｂ、“後ブロック”６２ｃから成る。
【００６１】
これら“基準ブロック”６２ａ、“前ブロック”６２ｂ、“後ブロック”６２ｃに示す図示の各数値（150,1210,1010,1002,100,1002,1005）は、ブロックの種別番号である。但し、‘０’は未接続を意味する。また、ハイフンの場合は特定のブロックの種別番号に寄らないものとしている。つまり、ハイフン（−）は、特に規定は無いことを意味している。また、図示の各数値の下の括弧内の記載は、その種別番号の意味を説明する為のものであり、実際には格納されないデータである。例えば図示の例では、種別番号＝‘150’のブロックは、スイッチであることになり、種別番号＝‘1002’のブロックは、掛け算処理を行うものである。
【００６２】
そして、図示の例では、例えば先頭行の規則は、「スイッチ」ブロックに関しては、その前に接続されるブロックが無い場合には（‘０’（未接続）である場合には）、ルール違反となる。また、２番目の規則では、「スイッチ」ブロックに関しては、その後に接続されるブロックが無い場合には（‘０’（未接続）である場合には）、ルール違反となる。つまり、「スイッチ」ブロックに関しては、その前と後の両方に何等かのブロックが接続されている状態が正常であり、それ以外の状態であるときにはルール違反となる。
【００６３】
接続のルールチェックの場合は、接続のルール情報と合致しているものについて、ルールに違反しているものと判定する。この処理は、例えば、まず、関数データ４０の“ブロック情報”４４の各レコード（各ブロックの情報）を順次処理対象として、処理対象レコードの“種別番号”４６を、“ルール”６２における“基準ブロック”６２ａの各数値と順次比較して、合致している（数値が一致する）ものを探索する。そして、合致しているものを、上記処理対象レコード（処理対象ブロック）に適用するルールと判断する。
【００６４】
そして、処理対象ブロックの“接続情報”４８を参照して、当該処理対象ブロックに関する接続が、上記このブロックに適用するルール（適用ルール）に合致するか否かを判定する。例えば、処理対象ブロックが“ＩＤ”４５＝‘１０’のブロックであった場合、“接続情報”４８における“ＩＤ”４９＝‘１０’のレコード（該当レコード）の情報を用いて、上記判定を行うことになる。
【００６５】
上記判定は、例えば、上記“接続情報”４８における該当レコードの“入力元ＩＤ”５０、“出力先ＩＤ”５１を取得することで、上記処理対象ブロックの前後のブロックのＩＤを取得する。そして、これら前後の各ブロックのＩＤに対応する“種別番号”４６を、“ブロック情報”４４から取得する。上記の例では、“ＩＤ”４９＝‘１０’のレコードにおける“入力元ＩＤ”５０は‘５０’、“出力先ＩＤ”５１は‘８０’であるので、これらの“種別番号”４６は、‘１００’、‘１０１’となる。
【００６６】
そして、情報比較部１３は、上記処理対象ブロックの前後のブロックの有無や種別番号等を用いて、上記適用ルールに合致するか否かを判定する。
情報比較部１３は、上述したように、例えば、関数データ４０における“ブロック情報”４４にある各ブロックの情報毎に、その“種別番号”４６を用いて図１１の“基準ブロック”６２ａを検索して、該当するものを探索する。例えば、図９の“ブロック情報”４４の先頭レコードの“種別番号”４６は‘１０１’であるので、これを用いて“基準ブロック”６２ａを検索すると、図示の例では「150,150,1210,1010,1002」であるので、‘１０１’と一致するものは１つもなく、適用ルールは「無し」ということになり、ルール違反か否かをチェックする処理が行われないことになる。この場合には、ここでは一例としては「ルール違反無し」と判定するものとするが、この例に限らない。
【００６７】
更に、図９の“ブロック情報”４４に示す５つのレコードは、何れも、その“種別番号”４６と一致するものが“基準ブロック”６２ａに無いので、ルール違反か否かをチェックする処理が行われないことになる。この為、ここでは説明の都合上、仮に、図９の“ブロック情報”４４において“ＩＤ”＝３０のブロックの“種別番号”４６が、‘１５０’であったものとする。この仮定の場合、図１１に示す１行目と２行目のルールが、適用されることになる。
【００６８】
これより、この仮定の場合、情報比較部１３は、“ＩＤ”＝３０の処理対象ブロックに関して、図９に示す“接続情報”４８における“ＩＤ”４９＝‘３０’のレコードを参照することで、処理対象ブロックの前後のブロックの有無や種別番号等を認識して、これらに基づいて図１１の１行目と２行目の各ルールに合致するか否かをチェックすることになる。
【００６９】
図９に示す“接続情報”４８における“ＩＤ”４９＝‘３０’のレコードでは、“入力元ＩＤ”５０＝‘８０’であり、且つ、“出力先ＩＤ”５１は無し（−）となっている。つまり、“ＩＤ”＝‘３０’の「スイッチ」ブロックは、その前に“ＩＤ”＝‘８０’のブロックが接続されているが、その後にはブロックは接続されていないことになる。よって、図１１の１行目のルールには合致しないが、２行目のルールには合致することになり、２行目のルール違反」と判定されることになる。これより、例えば、「スイッチの出力側が未接続です」のメッセージが表示等されることになる。
【００７０】
尚、上記の例では、０（未接続）であるか否かを判定するだけであるので、判定対象ブロックの前ブロックの種別番号（“入力元ＩＤ”＝‘８０’のブロックの種別番号）は、判定には必要ない。これより、以下に、図示しない一例を用いて、前後のブロックの種別番号も用いてルール違反を判定する具体例を説明する。
【００７１】
上記のことから、図示しない一例では、処理対象ブロックの“種別番号”４６が‘1010’であり、その前ブロックの種別番号が‘１００’、その後ブロックの種別番号が‘1002’であったものとする。この例の場合、図１１に示す４番目のルール（基準ブロック６２ａ＝‘1010’（割り算）のルール）が、適用されることになる。この適用ルールでは、“前ブロック”６２ｂに関してはルール無し（−）であるので、前ブロックに関してはルール違反では無いことになる。しかし、“後ブロック”６２ｃは‘1002’であるので、上記処理対象ブロックの後ブロックの種別番号＝‘1002’は該当することになり、ルール違反と判定されることになる。尚、この例の場合、後ブロックの種別番号が‘1002’以外である場合や、後ブロックが存在しない場合には、ルール違反とはならないことになる。
【００７２】
例えば上述した処理を、各関数のファイル毎に、その関数に係わるブロックの数だけ行うことになる。尚、図３に示す関数Ａに関する判定は、ルールが図１０、図１１に示す内容である場合、上述したことから全てにおいて「ルール違反なし」と判定されることになる。すなわち、関数Ａ（図９に示す関数データ）は、関数の命名規則、ブロックの数、接続情報の全てについて、ルールに則っていると判定されることになる。
【００７３】
これより、例えば、情報比較部１３の処理結果として画面出力部１４によって画面表示される判定結果は、例えば図１２に示す内容となる。尚、図１２に示す白丸（○）は、「ルール違反なし」を意味するものとする。
【００７４】
一方、図１３には、ルール違反があった場合の判定結果表示例を示す。これは、図６に示す関数Ｄに関する判定結果表示例であるものとする。尚、図１３に示すバツ印（×）が、「ルール違反あり」を意味するものとする。また、ここでは仮に、図６に示す「スイッチ」ブロックのＩＤが‘１’であり、「加算器」ブロックのＩＤが‘５４’であるものとする。更に、ここでは、図１４に示すように、例えばプログラマ等が、「スイッチ」ブロック−「加算器」ブロック間を、接続し忘れたものとする。
【００７５】
上述した仮定の例の場合には、判定結果表示は、図１３に示すように、“接続情報”の欄のＩＤ＝‘１’、‘５４’に対応する比較結果がバツ印（×）となることになる。
また、判定結果表示として、図１２、図１３のような形式に限らず、これらの代わりに、あるいは追加で、例えば図１５に示すような違反リストを表示してもよい。図示の例の違反リストは、Ｎｏ．、関数名、ＩＤ、違反項目等から成る。
【００７６】
図１２、図１３では各項目について白丸（○）またはバツ印（×）の判定結果を示したが、違反リストには「ルール違反あり」と判定された項目のみが示される。これより、図１３に示す関数Ｄ（FuncD）の判定に関しては、図１５に示すように、ＩＤ＝‘１’、‘５４’のブロックに関してルール違反である旨が示されることになる。また、違反リストでは“違反項目”の欄に違反内容を示している。これは、例えば、ルール違反と判定された適用ルールにおける“対象”６１に「違反」を加えて、“違反項目”の欄に表示する。これより、図示の例では、ＩＤ＝‘１’、‘５４’のブロックに関して、ブロック接続ルールに関する違反があることが分かる。
【００７７】
また、例えば、関数名や変数名に関して命名規則の違反がある場合には、“違反項目”の欄にその旨（「変数の命名規則違反」)が示される。
また、特に図示しないが、ブロック数に関して違反（上限値オーバー）があった場合には、“違反項目”の欄に例えば「規模が大きすぎる」旨が示される。
【００７８】
あるいは、ルール違反判定結果表示は、上記のような表示例に限らず、例えば図１６に示すように、判定対象の図形式プログラムを表示したうえで違反箇所（ブロックや接続線）の強調表示を行うようにしてもよい。図示の例では、「スイッチ」ブロックに関して、強調表示が行われている。これは、例えば、上記ルール違反に係わるＩＤ＝‘１’、‘５４’を用いて、これらＩＤの表示位置を判別して、この表示位置に所定の強調表示を行うものである。尚、特に図示しないが当然ながら、各ＩＤのブロックの表示位置を示す情報が、別途存在している。
【００７９】
この様な強調表示によって、コーディングルールに違反している関数やブロックが、一目で分かり易くなる。
尚、この様な強調表示は、例えば上記違反リストに基づいて行うようにしてもよい。違反リストを元に表示を行う場合には、２段階の処理を行う。まず、違反リストに含まれる関数名の関数のファイルを開く処理を行う。次に、任意のＩＤが違反リストに記載されている場合には、関数のファイルの中に含まれるブロックを走査し、該当のＩＤを持つブロックを見付け出して、強調表示する。
【００８０】
以上説明したように、本手法によれば、図形式プログラム内に記述されているブロック同士の接続関係や設定された変数から、文法エラーやコーディングルール違反を特定し、ユーザに対してエラー箇所の図示や強調表示を行うことができる。本手法によれば、図形式プログラムに対して静的解析を行うことができるようになり、図形式プログラム上でコーディングルール違反や文法エラーを確認する事ができるようになる。そのため、ソフト開発者が修正の必要な箇所を探す必要がなくなり、静的解析を行う際の手間が軽減される。
【符号の説明】
【００８１】
１  図形式プログラム
１０  静的解析システム
１１  入力部
１２  情報抽出部
１３  情報比較部
１４  画面出力部
１５  コーディングルールデータベース
２０  接続線の情報
２１  接続元ＩＤ
２２  接続先ＩＤ
３０  接続情報
３１  ＩＤ
３２  入力元ＩＤ
３３  出力先ＩＤ
４０  関数データ
４１  関数名
４２  ブロック数
４３  関数呼び出し
４４  ブロック情報
４５  ＩＤ
４６  種別番号
４７  名前
４８  接続情報
４９  ＩＤ
５０  入力元ＩＤ
５１  出力先ＩＤ
５２  変数情報
５３  変数型
５４  変数名
５５  コメント
６１  対象
６２  ルール
６２ａ  基準ブロック
６２ｂ  前ブロック
６２ｃ  後ブロック
６３  違反メッセージ
【図２】
2016057715.tif 000003
【図３】
2016057715.tif 000004
【図４】
2016057715.tif 000005
【図５】
2016057715.tif 000006
【図６】
2016057715.tif 000007
【図８】
2016057715.tif 000008
【図１６】
2016057715.tif 000009
【図１】
2016057715.tif 000010
【図７】
2016057715.tif 000011
【図９】
2016057715.tif 000012
【図１０】
2016057715.tif 000013
【図１１】
2016057715.tif 000014
【図１２】
2016057715.tif 000015
【図１３】
2016057715.tif 000016
【図１４】
2016057715.tif 000017
【図１５】
2016057715.tif 000018