(57)【要約】【課題】不具合が発生する可能性があるプログラム中の演算箇所を正確に特定する。【解決手段】時間差演算モジュール検出部２４が、複数のモジュール間で共通して用いられる変数のうち演算周期が異なる複数のタスクにより更新される変数を抽出し、抽出された変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定する。【選択図】図６
2008090696.tif 000002
【特許請求の範囲】
【請求項１】
演算周期が異なる複数のモジュールにより構成され、当該モジュールが必要な演算周期に応じて演算周期が異なる複数のタスクにグループ分けされているコンピュータプログラムを解析するためのプログラム解析装置であって、
前記複数のモジュール間で共通して用いられる変数を共有変数として抽出する第１変数抽出手段と、
前記第１変数抽出手段により抽出された共有変数のうち演算周期が異なる複数のタスクにより更新される変数を抽出する第２変数抽出手段と、
前記第２変数抽出手段により抽出された変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定する判定手段と
を備えることを特徴とするプログラム解析装置。
【請求項２】
請求項１に記載のプログラム解析装置であって、前記第２変数抽出手段は、各モジュールの入力変数と出力変数を検出し、検出された入力変数と出力変数とを比較することにより演算周期が異なる複数のタスクにより更新される変数を抽出することを特徴とするプログラム解析装置。
【請求項３】
請求項２に記載のプログラム解析装置であって、前記第２変数抽出手段は、コンピュータプログラムの上流側の代入式に遡って入力変数を検出することを特徴とするプログラム解析装置。
【請求項４】
請求項２又は請求項３に記載のプログラム解析装置であって、前記第２変数抽出手段はコンピュータプログラムの上流側の条件判定文に遡って入力変数を検出することを特徴とするプログラム解析装置。
【請求項５】
演算周期が異なる複数のモジュールにより構成され、当該モジュールが必要な演算周期に応じて演算周期が異なる複数のタスクにグループ分けされているコンピュータプログラムを解析するためのプログラム解析方法であって、
前記複数のモジュール間で共通して用いられる変数を共有変数として抽出するステップと、
抽出された共有変数のうち演算周期が異なる複数のタスクにより更新される変数を抽出するステップと、
抽出された複数のタスクにより更新される変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定出力するステップと
を有することを特徴とするプログラム解析方法。
【請求項６】
演算周期が異なる複数のモジュールにより構成され、当該モジュールが必要な演算周期に応じて演算周期が異なる複数のタスクにグループ分けされているコンピュータプログラムを解析するためのプログラム解析装置であって、
モジュール毎の入力変数を検出する入力変数検出部と、
モジュール毎の出力変数を検出する出力変数検出部と、
前記入力変数検出部及び前記出力変数検出部により検出された入力変数と出力変数を参照して入力変数の値が異なる複数のタスクにより更新されるか否かをモジュール毎に判定し、入力変数の値が異なる複数のタスクにより更新されるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定出力する時間差演算モジュール検出部と
を備えることを特徴とするプログラム解析装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、演算周期が異なる複数のモジュールにより構成され、モジュールが必要な演算周期に応じて演算周期が異なる複数のタスクにグループ分けされているコンピュータプログラムを解析するためのプログラム解析装置及びプログラム解析方法に関する。
【背景技術】
【０００２】
一般に、複数のモジュールにより構成され、所定の演算によってセンサからの入力信号からアクチュエータの出力信号を求めるためのコンピュータプログラム（以下、プログラムと略記）と、このプログラムを実行するマイクロコンピュータとを備える電子制御装置（Electronic Control Unit : ECU）では、プログラムを構成しているモジュールを必要な演算周期毎にグループ化し、演算周期が異なる複数のグループ（以下、タスクと表記）によりプログラムを構成するようにしている。
【０００３】
このような構成を有する電子制御装置では、変数の値が確定するタイミングは変数毎に異なることになるために、複数の変数を入力変数とするモジュールは、異なる時刻に値が確定した変数を読み出し、読み出した変数を組み合わせて演算を行わなければならない。具体的には、２入力１出力のモジュールは、２つの入力変数の値が確定するタイミングが異なる場合、異なる時刻に値が確定した２つの入力変数の値を読み出し，組み合わせて出力変数の値を演算しなければならない。
【０００４】
従って、上記のような構成を有する電子制御装置では、モジュールが演算を実行するタイミングによっては、プログラム設計者が意図しない不具合が発生することがある。このような背景から、複数のモジュールによりアクセスされる変数（以下、共有変数と表記）を抽出することにより、不具合が発生する可能性があるプログラム中の演算箇所を特定しようとするプログラム解析技術が提案されている（特許文献１参照）
【特許文献１】特開平１１−２３２０８６号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記プログラム解析技術によれば、不具合が発生する可能性があるプログラム中の演算箇所を特定するためには、抽出された全ての共有変数に対し解析処理を行わなければならず、多くの労力が必要となる。また、上記プログラム解析技術は、単に共有変数を抽出する構成になっており、共有変数の更新タイミングに着目して共有変数を抽出していないために、不具合が発生する可能性があるプログラム中の演算箇所を正確に特定することはできない。
【０００６】
本発明は、上述の課題を解決するためになされたものであり、その目的は、多くの労力を要することなく、不具合が発生する可能性があるコンピュータプログラム中の演算箇所を正確に特定可能なプログラム解析装置及びプログラム解析方法を提供することにある。
【課題を解決するための手段】
【０００７】
本発明に係るプログラム解析装置及びプログラム解析方法の特徴は、複数のモジュール間で共通して用いられる変数を共有変数として抽出し、抽出された共有変数のうち演算周期が異なる複数のタスクにより更新される変数を抽出し、抽出された変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定出力することにある。
【発明の効果】
【０００８】
本発明に係るプログラム解析装置及びプログラム解析方法によれば、共有変数の中から更新周期が異なる共有変数を抽出し、抽出された共有変数を用いて不具合が発生する可能性があるコンピュータプログラムの記述箇所を解析するので、多くの労力を要することなく、不具合が発生する可能性があるプログラム中の演算箇所を正確に特定することができる。
【発明を実施するための最良の形態】
【０００９】
本発明に係るプログラム解析装置及びプログラム解析方法は、例えば図１に示すような車両に搭載されるナビゲーション装置の電子制御装置（ＥＣＵ）内に格納されるコンピュータプログラム（以下、プログラムと略記）の解析処理に適用することができる。
【００１０】
〔電子制御装置の全体構成〕
始めに、図１，２を参照して、本発明に係るプログラム解析装置及びプログラム解析方法が適用される電子制御装置の構成について説明する。
【００１１】
本発明に係るプログラム解析装置及びプログラム解析方法が適用される電子制御装置１は、図１に示すように、ラジオモジュール２（ｆ０），携帯モジュール３（ｆ１），音声制御モジュール４（ｆ２），及びアンプモジュール５（ｆ３）を主な構成要素として備え、ラジオユニット１１及び携帯電話機１２からの入力信号（スイッチ（ＳＷ）信号，ステータス信号）に応じてラジオ音と携帯電話機１２の着信音との間でスピーカ１３への音声出力信号を切り換えるように構成されている。
【００１２】
具体的には、この電子制御装置１は、スピーカ１３がラジオ音を出力している時に携帯電話機１２が着信状態になった場合、スピーカ１３への音声出力信号をラジオ音から携帯電話機１２の着信音に切り換える。一方、スピーカ１３が携帯電話機１２の着信音を出力している時に携帯電話機１２が待受（又は通話）状態になった場合には、電子制御装置１は、スピーカ１３への音声出力信号を携帯電話機１２の着信音からラジオ音に切り換える。
【００１３】
本実施形態では、ラジオモジュール２，携帯モジュール３，及び音声制御モジュール４は、１０［ｍＳ］の制御周期毎に実行される図２に示すタスクＡ内において順に実行され、アンプモジュール５は、１００［ｍＳ］の制御周期毎に実行される図２に示すタスクＢ内において実行される。
【００１４】
ラジオモジュール２は、例えば図２に示すモジュールＣのようなプログラム記述を有し、ラジオユニット１１からのＳＷ信号がオン（ＯＮ）状態である場合、音声制御モジュール４に対しラジオ音の出力要求信号Ｖ０を出力する。
【００１５】
携帯モジュール３は、例えば図２に示すモジュールＤのようなプログラム記述を有し、携帯電話機１２からのステータス信号が着信状態を示す場合、音声制御モジュール４に対し携帯電話機１２の着信音の出力要求信号Ｖ１を出力する。
【００１６】
音声制御モジュール４は、例えば図２に示すモジュールＥのようなプログラム記述を有し、ラジオモジュール２及び携帯モジュール３からの出力要求信号Ｖ０，Ｖ１に応じてアンプモジュール５に音声切換要求信号Ｖ３（ラジオ音切換／着信音切換）を出力する。また、音声制御モジュール４は、アンプモジュール５から出力される音声出力ステータス信号Ｖ２に応じて現在の出力制御状態を示す制御ステータスＳＴＳの内容を更新する。
【００１７】
アンプモジュール５は、例えば図２に示すモジュールＦのようなプログラム記述を有し、音声制御モジュール４からの音声切換要求信号Ｖ３にしたがってラジオ音と携帯電話機１２の着信音との間でスピーカ１３への音声出力信号を切り換える。またアンプモジュール５は、スピーカ１３に出力している音声出力信号の種別を音声出力ステータス信号Ｖ２として音声制御モジュール４に出力する。
【００１８】
〔音声制御モジュールの状態遷移〕
次に、図３を参照して、上記音声制御モジュール４の音声制御状態の遷移について説明する。なお、図３中、符号Ｓ１〜Ｓ４は音声制御モジュール４の「状態」を表し、符号Ｔ１〜Ｔ４は状態の「遷移」を示す。また、「遷移」は、条件部と実行部により構成され、“／”の前部分が条件部，“／”の後部分が条件部に記載された条件が満足された場合に実行する処理の内容を示す実行部を表す。
【００１９】
いま、スピーカ１３がラジオ音を出力している状態Ｓ１（“RadioOut”）にある時に携帯電話機１２から着信音の出力要求信号Ｖ１がある（遷移Ｔ１の条件部である着信音の出力要求信号Ｖ１= =“携帯要求あり”になる）と、音声制御モジュール４は音声切り換え要求信号Ｖ３を携帯電話機１２の着信音に切り換え（遷移Ｔ１の実行部であるＶ３=“着信音へ切り換え”を実行。音声切り換え要求信号Ｖ３に“着信音へ切り換え”を代入）、音声制御モジュール４の状態はスピーカ１３からラジオ音を出力している状態Ｓ１から携帯電話機１２の着信音の出力待ち状態Ｓ２（“WaitMobileOut”）に移行する。
【００２０】
次に、タスクＢの次の実行時にアンプモジュール５が実行されると、アンプモジュール５は、音声出力信号を携帯電話機１２の着信音に切り換え、音声出力ステータス信号Ｖ２を着信音出力中（遷移Ｔ２の条件部であるＶ２＝＝“着信音出力中”）に設定する。次に、タスクＡの次の実行時に音声制御モジュール４が実行されると、音声出力ステータス信号Ｖ２が着信音出力中になっているので、音声制御モジュール４の状態は着信音出力中の状態Ｓ３（“MobileOut”）に移行する。以後同様にして、携帯電話機１２が着信状態から待受（又は通話）状態になった場合、音声制御モジュール４の状態は、ラジオ音の出力待ち状態Ｓ４（“WaitRadioOut”）を経由してスピーカ１３からラジオ音を出力している状態Ｓ１（“RadioOut”）に戻る。
【００２１】
〔問題点〕
次に、上記電子制御装置１が抱える問題点について説明する。
【００２２】
上述のように音声制御モジュール４の状態が状態Ｓ１〜Ｓ４間で遷移する場合、携帯電話機１２の着信音がスピーカ１３から出力されている状態では音声制御モジュール４の状態は状態Ｓ３に遷移し、ラジオ音がスピーカ１３から出力されている状態では音声制御モジュール４の状態は状態Ｓ１に遷移し、電子制御装置１は設計者が意図した通りに動作する。
【００２３】
しかしながら、このような構成を有する電子制御装置１では、１００［ｍＳ］の制御周期で実行されるアンプモジュール５が実行された後に携帯電話機１２が待受（又は通話）状態から着信状態になり、次に再びアンプモジュール５が実行される前に携帯電話機１２が再び待受（又は通話）状態に戻った場合には、電子制御装置１は設計者が意図しない動作をしてしまう。以下、図４を参照してこの点をより具体的に説明する。
【００２４】
いま、図４に示す時刻０［ｍＳ］において、スピーカ１３からラジオ音が出力されている状態、すなわち着信音出力要求なし（着信音出力要求信号Ｖ１＝携帯要求なし），音声出力ステータスはラジオ音出力中（音声出力ステータス信号Ｖ２＝ラジオ音出力中），音声切り換え要求信号はラジオ音切り換え（音声切換要求信号Ｖ３＝ラジオ音切り換え），及び音声制御モジュール５の制御ステータスＳＴＳがラジオ音出力中の状態Ｓ１になっており、１００［ｍＳ］の制御周期のタスクＢが時刻Ｔ＝１０［ｍＳ］から１００［ｍＳ］周期毎に実行される場合を考える。
【００２５】
この場合において、図４に示す時刻Ｔ＝２０［ｍＳ］に携帯電話機１２が着信状態になった場合、次の１０［ｍＳ］制御周期において、ラジオモジュール２が動作することにより着信音出力要求信号Ｖ１は着信音出力要求ありの状態に切り替わり、さらに携帯モジュール３が動作することにより音声切換要求信号Ｖ３は着信音への切換要求に切り替わることによって、音声制御モジュール４の制御ステータスＳＴＳは着信音の出力待ち状態Ｓ２となる。
【００２６】
そしてこのような状態において、アンプモジュール５が次に実行される前（図４に示す時刻Ｔ＝１００［ｍＳ］）に携帯電話機１２が着信状態から待受（又は通話）状態に戻った場合、次の１０［ｍＳ］制御周期において、携帯モジュール３が動作することにより着信音出力要求信号Ｖ１は着信音出力要求なしの状態に戻るが、音声出力ステータス信号Ｖ２はラジオ音出力中の状態であるために、音声制御モジュール４はラジオ音が出力されていると判断し、音声切換要求信号Ｖ３は着信音への切換要求の状態のままとなる。
【００２７】
次に、時刻１１０［ｍＳ］の時に１００［ｍＳ］周期のタスクＢが実行されると、スピーカ１３への音声出力信号は携帯電話機１２の着信音に切り替わり、音声出力ステータス信号Ｖ２は着信音出力中の状態となる。そしてこのような状態において次に１０［ｍＳ］の制御周期のタスクＡが実行されると、音声制御モジュール４の制御ステータスＳＴＳは着信音出力中の状態Ｓ３となってしまう。
【００２８】
すなわち、着信音出力要求信号Ｖ１が着信音出力要求なしの状態になっているのにも係わらず、音声制御モジュール４の制御ステータスＳＴＳは、着信音出力中の状態Ｓ３のままとなり、携帯電話機１２が次に着信状態から待受（又は通話）状態に切り替わるまでラジオ音ステータス待ちの状態Ｓ４及びラジオ音出力中の状態Ｓ１に遷移しない状態（スピーカ１３への出力音声信号が着信音のままの状態）になってしまう。
【００２９】
以上が不具合の内容にあるが、この不具合の原因は、音声制御モジュール４が１０［ｍＳ］周期毎に更新される音声制御モジュール４の制御ステータスＳＴＳと１００［ｍＳ］周期毎に更新される音声出力ステータスＶ２に従って着信音出力中の状態に遷移したことによって生じる不具合である。すなわち、音声制御モジュール４が更新タイミングが異なる制御ステータスＳＴＳと音声出力ステータスＶ２を入力として演算したことが不具合の原因である。
【００３０】
なお、従来のプログラム解析技術は、図５に示すように単に共有変数を抽出するだけであり、共有変数の更新タイミングに着目して共有変数を抽出していないために、不具合が発生する可能性があるプログラム中の演算箇所を正確に特定することができない。そこで、本発明に係るプログラム解析装置は、以下に示すように動作することにより、不具合が発生する可能性があるプログラム中の演算箇所を特定する。以下、図面を参照して、本発明の第１及び第２の実施形態となるプログラム解析装置の構成と動作について説明する。
【００３１】
［第１の実施形態］
始めに、図６〜図１０を参照して、本発明の第１の実施形態となるプログラム解析装置の構成について説明する。
【００３２】
本発明の第１の実施形態となるプログラム解析装置は、図６に示すように、タスク構成解析部２１と、入力変数検出部２２と、出力変数検出部２３と、時間差演算モジュール検出部２４とを主な構成要素として備える。なお、プログラム解析装置の各構成要素は各部の機能を記述したコンピュータプログラムをマイクロコンピュータが実行することにより実現される。そして、このような構成を有するプログラム解析装置は、以下に示すように動作することにより不具合が発生する可能性があるコンピュータプログラム中の演算箇所を特定する。
【００３３】
プログラム解析処理を実行する際、まず始めに、タスク構成解析部２１が、解析対象となるソースプログラム２５を読み込み、ソースプログラム２５からタスク構成表２６を作成，出力する。“タスク構成表”とは、他のモジュールから呼び出されることがないモジュールを頂点に配置し、頂点に配置したモジュールから直接的，間接的に呼ばれるモジュール群を頂点以下に配列した樹形図を意味する。
【００３４】
具体的には、図２に示すプログラムについては図７に示すようなタスク構成表が作成される。このタスク構成表では、モジュールTask_10msとモジュールTask_100msが他のモジュールから呼び出されることがないモジュールを示し、それぞれTask1（＝タスクＡ）及びTask2（＝タスクＢ）というタスク名が付けられている。また、モジュールTask_10msから直接的・間接的に呼び出されるモジュールはモジュールf0, f1, f2（＝モジュールＣ，Ｄ，Ｅ）である。すなわち、タスクTask1を構成するモジュールはモジュールTask_10ms, f0, f1, f2である。また同様に、タスクTask2を構成するモジュールはモジュールTask_100ms, f3（＝モジュールＤ）である。
【００３５】
次に、入力変数検出部２２が、ソースプログラム２５を読み込み、タスク構成解析部２１により作成されたタスク構成表２６を参照してソースプログラム２５からモジュール毎の入力変数一覧２７を作成，出力する。“入力変数一覧”とは、演算式の右辺にある変数、及び条件式で比較評価される変数を入力変数としてモジュール毎に示したものである。具体的には、図２に示すプログラムについては図８に示すような入力変数一覧が作成される。この入力変数一覧では、モジュールTask_10msとモジュールTask_100msについては入力変数が存在しない。一方、モジュールf0は"Radio_SW"、モジュールf1は"Calling", "PrevCall"、モジュールf2は"EventFlg", "V0", "V1", "V2", "STS"、モジュールf3は"V3"をそれぞれ入力変数とする。
【００３６】
次に、出力変数検出部２３が、ソースプログラム２５を読み込み、ソースプログラム２５からモジュール毎の出力変数一覧２８を作成，出力する。“出力変数一覧”とは、演算式の左辺にある変数を出力変数としてモジュール毎に示したものである。具体的には、図２に示すプログラムについては図９に示すような出力変数一覧が作成される。この出力変数一覧では、モジュールTask_10msとモジュールTask_100msについては出力変数が存在しない。一方、モジュールf0は"V0"、モジュールf1は"V1", "EventFlg", "PrevCall"、モジュールf2は"STS"、モジュールf3は"V2"をそれぞれ出力変数とする。
【００３７】
最後に、時間差演算モジュール検出部２４が、入力変数検出部２２及び出力変数検出部２３により作成された入力変数一覧２７と出力変数一覧２８を参照して、入力変数の値を更新するタスクを特定すると共に、特定されたタスクが各モジュールにおいて同一であるか否かを比較判定する。そして、比較判定の結果、１つのモジュールについて特定されたタスクが全て同一である、又は出力変数が存在しない場合、時間差演算モジュール検出部２４は、そのモジュールでは時間差演算は行われないと判断し、ＯＫを出力する。一方、異なる複数のタスクから値が更新される場合には、時間差演算モジュール検出部２４は、そのモジュールでは時間差演算が行われると判断し、警告(Warning)を出力する。
【００３８】
図２に示すプログラムについてのモジュール毎の警告の例を図１０に示す。モジュールTask_10msとモジュールTask_100msについては出力変数が存在しないため、時間差演算モジュール検出部２４は、時間差演算は行われないと判断し、ＯＫを出力する。また、モジュールf0については入力変数の値を更新するタスクは特定できないため、時間差演算モジュール検出部２４はＯＫを出力する。また、ワンチップマイコンのデジタルインプットのレジスタを読み込む場合には、ソフトウェアモジュールでは値を更新しないため、時間差演算モジュール検出部２４はＯＫを出力する。
【００３９】
また、モジュールf1については、入力変数を更新するタスクはタスクTask1のみであるため、時間差演算モジュール検出部２４はＯＫを出力する。また、モジュールf3については、入力変数の値を更新するタスクがタスクTask2のみであるため、時間差演算モジュール検出部２４はＯＫを出力する。一方、モジュールf2については、入力変数の値を更新するタスクがタスクTask1とタスクTask2の２つであるため、時間差演算モジュール検出部２４は警告を出力する。
【００４０】
このように、本発明の第１の実施形態となるプログラム解析装置１では、時間差演算モジュール検出部２４が、複数のモジュール間で共通して用いられる変数のうち演算周期が異なる複数のタスクにより更新される変数を抽出し、抽出された変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定するので、不具合が発生する可能性があるプログラム中の演算箇所を正確に特定することができる。
【００４１】
［第２の実施形態］
次に、図１１〜図２０を参照して、本発明の第２の実施形態となるプログラム解析装置の構成について説明する。
【００４２】
本発明の第２の実施形態となるプログラム解析装置は、図１１に示すように、タスク構成解析部２１と、出力変数検出部２３と、ステートメント番号割付部３１と、ステートメント実行順検出部３２と、双方向リンク検出部３３と、算術式分析部３４と、入力変数検出部３５と、時間差演算ステートメント検出部３６とを主な構成要素として備える。そして、このような構成を有するプログラム解析装置は、以下に示すように動作することにより、不具合が発生する可能性があるプログラム中の演算箇所を特定する。
【００４３】
プログラム解析処理を実行する際、まず始めに、タスク構成解析部２１が、解析対象となるソースプログラム２５を読み込み、ソースプログラム２５からタスク構成表２６を作成，出力する。次に、出力変数検出部２３が、ソースプログラム２５を読み込み、ソースプログラム２５からモジュール毎の出力変数一覧２８を作成，出力する。
【００４４】
次に、ステートメント番号割付部３１が、ソースプログラム２５からソースコードを一行ずつ読み込み、読み込んだソースコードを一行ずつ出力することにより図１２に示すようなモジュール毎のステートメント番号割付一覧３７を作成する。なお、ここではソースコード１行１行の文字解析は重要ではないので、簡略化のためソースコードは１行１ステップを前提条件として記述されている（１ステップとは１処理のことを意味し、条件文の場合、条件式で１ステップ、代入式で１ステップとなる）。また、ステートメント番号はソースコード毎に割り振るものとする。また、“ステートメント番号”とは、各モジュールの各ステートメントを識別するための固有の値である。なお、図２に示すプログラム例中のＳ１，Ｓ２，Ｓ３，…はそれぞれステートメント番号１，２，３に対応している。
【００４５】
次に、ステートメント実行順検出部３２が、ソースプログラム２５とステートメント番号割付一覧３７を読み込み、ステートメントの実行順序を示す図１３に示すようなステートメント実行順一覧３８をモジュール毎に作成する。次に、双方向リンク検出部３３が、ステートメント実行順検出部３２により作成されたステートメント実行順一覧３８を用いてステートメント実行順一覧３８に前ステートメント番号と全前ステートメント番号を追加した図１４に示すような双方向リンクリスト３９を作成する。
【００４６】
なお、“前ステートメント”とは、各ステートメントの１ステップ前に実行されるステートメントに割り振られたステートメント番号を意味する。また、“全前ステートメント番号”とは、各ステートメントを実行する前に実行された全てのステートメントのステートメントに割り振られた番号を意味する。具体的には、図１４に示す双方向リンクリスト３９では、ステートメント番号１の行は、１ステップ前に実行される可能性があるステートメントは存在しない。この場合、双方向リンク検出部３３は、前ステートメント番号及び全前ステートメント番号に“−”を出力する。一方、ステートメント番号２の行は、この１ステップ前にステートメント番号１のステートメントが実行されるので、双方向リンク検出部３３は前ステートメント番号及び全前ステートメント番号に“１”を出力する。また、ステートメント番号３の行は、この１ステップ前にステートメント番号２が実行されるので、双方向リンク検出部３３は、前ステートメント番号に“２”、全前ステートメント番号に“２，１”を出力する。
【００４７】
次に、算術式分析部３４が、双方向リンク検出部３３により作成された双方向リンクリスト３９を読み込み、双方向リンクリスト３９にステートメント毎の参照変数と更新変数を追加した図１５に示すようなリスト４０を作成する。なお、“参照変数”とは、各ステートメントに入力（又は値の参照）として与えられる変数を意味し、更新変数とは、各ステートメントで出力（又は値の更新）として与えられる変数を意味する。すなわち、ステートメントが条件式である場合、条件式で参照される変数が参照変数となる。また、ステートメントが演算式である場合には、代入演算子“＝”の右辺の変数が参照変数となり、左辺の変数が更新変数となる。また、ステートメント中に参照変数若しくは更新変数が存在しない場合には、算術式分析部３４は“−”を出力する。算術式分析部３４の具体的な動作については後述する。
【００４８】
次に、入力変数検出部３５が、算術式分析部３４により作成されたリスト４０を読み込み、リスト４０に各ステートメントの入力変数を追加した図１６に示すような入力変数リスト４１を作成する。なお、“入力変数”とは、更新変数が存在するステートメントの全前ステートメント番号に対応するステートメント中の参照変数のことを意味する。なお、入力変数検出部３５の具体的な動作については後述する。
【００４９】
そして最後に、時間差演算ステートメント検出部３６が、出力変数検出部２３及び入力変数検出部３５により作成された出力変数一覧２８と入力変数リスト４１を参照して、時間差演算が行われるステートメントを特定し、特定されたステートメントについて警告(Warning)を図１７に示すような警告一覧４２として出力する。なお、時間差演算ステートメント検出部３６の具体的な動作については後述する。
【００５０】
〔算術式分析部の動作〕
次に、図１８を参照して、算術式分析部３４の動作について詳しく説明する。
【００５１】
図１８に示すフローチャートは、双方向リンクリスト３９が作成されるのに応じて開始となり、リスト作成処理はステップＳ１の処理に進む。ステップＳ１の処理では、算術式分析部３４が、ステートメント番号をカウントするプログラムカウンタの値を１に設定する。これにより、ステップＳ１の処理は完了し、リスト作成処理はステップＳ２の処理に進む。
【００５２】
ステップＳ２の処理では、算術式分析部３４が、プログラムカウンタの値に対応するステートメント番号が割り付けられたステートメント本文を検索する。これにより、ステップＳ２の処理は完了し、リスト作成処理はステップＳ３の処理に進む。
【００５３】
ステップＳ３の処理では、算術式分析部３４が、ステップＳ２の処理により検索されたステートメント本文中に参照変数があるか否かを判別する。そして、判別の結果、ステートメント本文中に参照変数がある場合、算術式分析部３４は、ステップＳ５の処理としてプログラムカウンタの値に対応するリスト４０の参照変数列に参照変数を出力した後、リスト作成処理をステップＳ６の処理に進める。一方、ステートメント本文中に参照変数がない場合には、算術式分析部３４は、ステップＳ４の処理としてプログラムカウンタの値に対応するリスト４０の参照変数列に“−”を出力した後、リスト作成処理をステップＳ６の処理に進める。
【００５４】
ステップＳ６の処理では、算術式分析部３４が、ステップＳ２の処理により検索されたステートメント本文中に更新変数があるか否かを判別する。そして、判別の結果、ステートメント本文中に更新変数がある場合、算術式分析部３４は、ステップＳ８の処理としてプログラムカウンタの値に対応するリスト４０の更新変数列に更新変数を出力した後、リスト作成処理をステップＳ９の処理に進める。一方、ステートメント本文中に更新変数がない場合には、算術式分析部３４は、ステップＳ７の処理としてプログラムカウンタの値に対応するリスト４０の参照変数列に“−”を出力した後、リスト作成処理をステップＳ９の処理に進める。
【００５５】
ステップＳ９の処理では、算術式分析部３４が、プログラムカウンタの値が最後のステートメント番号の値であるか否かを判別する。そして判別の結果、プログラムカウンタの値が最後のステートメント番号の値でない場合、算術式分析部３４は、全てのステートメント本文について処理を終了していないと判断し、ステップＳ１０の処理としてプログラムカウンタの値を１増数した後、リスト作成処理をステップＳ２の処理に戻す。一方、プログラムカウンタの値が最後のステートメント番号の値である場合には、算術式分析部３４は、全てのステートメント本文について処理が終了したと判断し、一連のリスト作成処理を終了する。
【００５６】
〔入力変数検出部の動作〕
次に、図１９を参照して、入力変数検出部３５の動作について詳しく説明する。
【００５７】
図１９に示すフローチャートは、リスト４０が作成されるのに応じて開始となり、リスト作成処理はステップＳ２１の処理に進む。ステップＳ２１の処理では、入力変数検出部３５が、ステートメント番号をカウントするプログラムカウンタの値を１に設定する。これにより、ステップＳ２１の処理は完了し、リスト作成処理はステップＳ２２の処理に進む。
【００５８】
ステップＳ２２の処理では、入力変数検出部３５が、プログラムカウンタの値に対応するステートメント番号が割り付けられたステートメント本文の更新変数を検索する。そして検索の結果、更新変数がない場合、入力変数検出部３５はリスト作成処理をステップＳ２８の処理に進める。一方、更新変数がある場合には、入力変数検出部３５はリスト作成処理をステップＳ２３の処理に進める。
【００５９】
ステップＳ２３の処理では、入力変数検出部３５が、プログラムカウンタの値に対応するステートメント番号が割り付けられたステートメント本文の全前ステートメント番号を検索する。これにより、ステップＳ２３の処理は完了し、リスト作成処理はステップＳ２４の処理に進む。
【００６０】
ステップＳ２４の処理では、入力変数検出部３５が、ステップＳ２３の処理により全前ステートメント番号が検索されたか否かを判別する。そして判別の結果、全前ステートメント番号が検索されなかった場合、入力変数検出部３５はリスト作成処理をステップＳ２８の処理に進める。一方、全前ステートメント番号が検索された場合には、入力変数検出部３５はリスト作成処理をステップＳ２５の処理に進める。
【００６１】
ステップＳ２５の処理では、入力変数検出部３５が、ステップＳ２３の処理により検索された全前ステートメント番号が割り付けられたステートメント本文中の参照変数を検索する。これにより、ステップＳ２５の処理は完了し、リスト作成処理はステップＳ２６の処理に進む。
【００６２】
ステップＳ２６の処理では、入力変数検出部３５が、ステップＳ２５の処理により参照変数が検索されたか否かを判別する。そして判別の結果、参照変数が検索されなかった場合、入力変数検出部３５はリスト作成処理をステップＳ２８の処理に進める。一方、参照変数が検索された場合には、入力変数検出部３５はリスト作成処理をステップＳ２７の処理に進める。
【００６３】
ステップＳ２７の処理では、入力変数検出部３５が、プログラムカウンタの値に対応する入力変数リスト４１の入力変数列に参照変数を出力する。これにより、ステップＳ２７の処理は完了し、リスト作成処理はステップＳ２８の処理に進む。
【００６４】
ステップＳ２８の処理では、入力変数検出部３５が、プログラムカウンタの値が最後のステートメント番号の値であるか否かを判別する。そして判別の結果、プログラムカウンタの値が最後のステートメント番号の値でない場合、入力変数検出部３５は、全てのステートメント本文について処理を終了していないと判断し、ステップＳ２９の処理としてプログラムカウンタの値を１増数した後、リスト作成処理をステップＳ２の処理に戻す。一方、プログラムカウンタの値が最後のステートメント番号の値である場合には、入力変数検出部３５は、全てのステートメント本文について処理が終了したと判断し、一連のリスト作成処理を終了する。
【００６５】
〔時間差演算ステートメント検出部の動作〕
最後に、図１８を参照して、時間差演算ステートメント検出部３６の動作について詳しく説明する。
【００６６】
図１８に示すフローチャートは、入力変数リスト４１が作成されるのに応じて開始となり、解析処理はステップＳ３１の処理に進む。ステップＳ３１の処理では、時間差演算ステートメント検出部３６が、ステートメント番号をカウントするプログラムカウンタの値を１に設定する。これにより、ステップＳ３１の処理は完了し、解析処理はステップＳ３２の処理に進む。
【００６７】
ステップＳ３２の処理では、時間差演算ステートメント検出部３６が、入力変数リスト４１の中からプログラムカウンタの値に対応するステートメント番号を検索する。これにより、ステップＳ３２の処理は完了し、解析処理はステップＳ３３の処理に進む。
【００６８】
ステップＳ３の処理では、時間差演算ステートメント検出部３６が、ステップＳ２の処理によりプログラムカウンタの値に対応するステートメント番号が検索されたか否かを判別する。そして、判別の結果、ステートメント番号が検索されなかった場合、時間差演算ステートメント検出部３６は解析処理をステップＳ３９の処理に進める。一方、ステートメント番号が検索された場合には、時間差演算ステートメント検出部３６は解析処理をステップＳ３４の処理に進める。
【００６９】
ステップＳ３４の処理では、時間差演算ステートメント検出部３６が、出力変数一覧２８から入力変数リスト４１の入力変数が出力変数となっているタスクを検索する。これにより、ステップＳ３４の処理は完了し、解析処理はステップＳ３５の処理に進む。
【００７０】
ステップＳ３５の処理では、時間差演算ステートメント検出部３６が、ステップＳ３４の処理により検索されたタスクを図１７に示す警告一覧４２の入力変数の値を更新するタスク欄に出力する。これにより、ステップＳ３５の処理は完了し、解析処理はステップＳ３６の処理に進む。
【００７１】
ステップＳ３６の処理では、時間差演算ステートメント検出部３６が、ステップＳ３４の処理により検索されたタスクが全て同じタスクであるか否かを判別する。そして判別の結果、全て同じタスクでない場合、時間差演算ステートメント検出部３６は、ステップＳ３７の処理として警告一覧４２の対応する欄に警告(Warning)を出力した後、解析処理をステップＳ３９の処理に進める。一方、全て同じタスクである場合には、時間差演算ステートメント検出部３６は、ステップＳ３８の処理として警告一覧４２の対応する欄にＯＫを出力した後、解析処理をステップＳ３９の処理に進める。
【００７２】
ステップＳ３９の処理では、時間差演算ステートメント検出部３６が、ステートメント番号をカウントするプログラムカウンタの値が最後のステートメント番号の値であるか否かを判別する。そして判別の結果、プログラムカウンタの値が最後のステートメント番号の値でない場合、時間差演算ステートメント検出部３６は、全てのステートメント本文について処理を終了していないと判断し、ステップＳ４０の処理としてプログラムカウンタの値を１増数した後、解析処理をステップＳ３３の処理に戻す。一方、プログラムカウンタの値が最後のステートメント番号の値である場合には、時間差演算ステートメント検出部３６は、全てのステートメント本文について処理が終了したと判断し、一連の解析処理を終了する。
【００７３】
このように、本発明の第２の実施形態となるプログラム解析装置１では、時間差演算ステートメント検出部３６が、複数のモジュール間で共通して用いられる入力変数のうち演算周期が異なる複数のタスクにより更新される入力変数を抽出し、抽出された入力変数を用いるモジュールのプログラム記述箇所を不具合が発生する可能性があるコンピュータプログラムの記述箇所と判定するので、不具合が発生する可能性があるプログラム中の演算箇所を正確に特定することができる。
【００７４】
以上、本発明者らによってなされた発明を適用した実施の形態について説明したが、この実施の形態による本発明の開示の一部をなす論述及び図面により本発明は限定されることはない。すなわち、この実施の形態に基づいて当業者等によりなされる他の実施の形態、実施例及び運用技術等は全て本発明の範疇に含まれることは勿論であることを付け加えておく。
【図面の簡単な説明】
【００７５】
【図１】本発明に係るプログラム解析装置が適用される電子制御装置の一例を示すブロック図である。
【図２】１０［ｍＳ］及び１００［ｍＳ］の制御周期毎に実行されるタスクと、図１に示すラジオモジュール，携帯モジュール，音声制御モジュール，及びアンプモジュールのプログラム記述例を示す。
【図３】図１に示す音声制御モジュールの音声制御状態の遷移を示す模式図である。
【図４】更新タイミングが異なる入力変数を用いて演算を行う場合に生じる不具合を説明するためのタイミングチャート図である。
【図５】従来のプログラム解析技術によるプログラム解析出力例を示す。
【図６】本発明の第１の実施形態となるプログラム解析装置の構成と動作を示す模式図である。
【図７】図６に示すタスク構成表の一例を示す図である。
【図８】図６に示す入力変数一覧の一例を示す図である。
【図９】図６に示す出力変数一覧の一例を示す図である。
【図１０】図６に示すモジュールごとの警告の一例を示す図である。
【図１１】本発明の第２の実施形態となるプログラム解析装置の構成と動作を示す模式図である。
【図１２】図１１に示すステートメント番号割付一覧の一例を示す図である。
【図１３】図１１に示すステートメント実行順一覧の一例を示す図である。
【図１４】図１１に示す双方向リンクリストの一例を示す図である。
【図１５】図１１に示す算術式分析部により作成されるリンクの一例を示す図である。
【図１６】図１１に示す入力変数リストの一例を示す図である。
【図１７】図１１に示す警告一覧の一例を示す図である。
【図１８】図１１に示す算術式分析部の動作を示すフローチャート図である。
【図１９】図１１に示す入力変数検出部の動作を示すフローチャート図である。
【図２０】図１１に示す時間差演算ステートメント検出部の動作を示すフローチャート図である。
【符号の説明】
【００７６】
１：電子制御装置
２：ラジオモジュール
３：携帯モジュール
４：音声制御モジュール
５：アンプモジュール
１１：ラジオユニット
１２：携帯電話機
１３：スピーカ
２１：タスク構成解析部
２２：入力変数検出部
２３：出力変数検出部
２４：時間差演算モジュール検出部
２５：ソースプログラム
２６：タスク構成表
２７：入力変数一覧
２８：出力変数一覧
３１：ステートメント番号割付部
３２：ステートメント実行順検出部
３３：双方向リンク検出部
３４：算術式分析部
３５：入力変数検出部
３６：時間差演算ステートメント検出部
３７：ステートメント番号割付一覧
３８：ステートメント実行順一覧
３９：双方向リンクリスト
４０：リスト
４１：入力変数リスト
【図１】
2008090696.tif 000003
【図２】
2008090696.tif 000004
【図３】
2008090696.tif 000005
【図４】
2008090696.tif 000006
【図５】
2008090696.tif 000007
【図６】
2008090696.tif 000008
【図７】
2008090696.tif 000009
【図８】
2008090696.tif 000010
【図９】
2008090696.tif 000011
【図１０】
2008090696.tif 000012
【図１１】
2008090696.tif 000013
【図１２】
2008090696.tif 000014
【図１３】
2008090696.tif 000015
【図１４】
2008090696.tif 000016
【図１５】
2008090696.tif 000017
【図１６】
2008090696.tif 000018
【図１７】
2008090696.tif 000019
【図１８】
2008090696.tif 000020
【図１９】
2008090696.tif 000021
【図２０】
2008090696.tif 000022