(57)【要約】【課題】割込干渉の有無を適正に検出することができる割込干渉解析装置等を提供する。【解決手段】割込干渉解析装置１０は、解析対象となるプログラム２１と、割込干渉有無を判定すべき箇所を示す判定箇所リスト２２と、プログラム２１の各ステートメントの実行順序を示す制御フローグラフ２３と、プログラム２１の各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合５１とに基づいて、判定箇所における割込干渉有無を解析し、解析結果ファイル２４を出力するものであり、判定箇所２５の低優先順位関数における各ステートメントの実行前、実行後の割込状態を推定する割込状態推定手段１４、並びに、第１アクセスステートメントの実質的な実行前割込状態が「禁止」か否か、及び、判定箇所２５の解析対象区間に割込許可命令が含まれているか否かを判定して割込干渉有無を解析する割込干渉解析手段１５を少なくとも備える。【選択図】図１
2011191843.tif 000002
【特許請求の範囲】
【請求項１】
解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得する取得手段と、
前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定する割込状態推定手段と、
前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析する割込干渉解析手段と、
を備えることを特徴とする割込干渉解析装置。
【請求項２】
前記割込干渉解析手段は、前記第１アクセスステートメントから前記第２アクセスステートメントまでの解析対象区間に割込許可命令が含まれているか否かを判定して割込干渉有無を解析し、解析結果を出力することを特徴とする請求項１に記載の割込干渉解析装置。
【請求項３】
前記割込干渉解析手段は、第１の条件として、前記第１アクセスステートメントから前記第２アクセスステートメントまでの解析対象区間に前記第１アクセスステートメントの実行前の割込状態を「禁止」にしている割込命令系の割込許可命令が含まれているか否かを判定し、第２の条件として、前記解析対象区間に含まれるすべてのステートメントの実行後の割込状態が、少なくともいずれか一つの割込命令系によって「禁止」となっているか否かを判定することで割込干渉有無を解析し、解析結果を出力することを特徴とする請求項１に記載の割込干渉解析装置。
【請求項４】
前記割込状態推定手段は、分岐処理の合流点のステートメントに対しては直前のステートメント全ての割込状態を参照して割込状態を推定し、繰り返し処理の開始地点から終了地点までの各ステートメントに対しては推定結果が変化しなくなるまで繰り返して割込状態を推定することを特徴とする請求項１に記載の割込干渉解析装置。
【請求項５】
前記到達可能ステートメント集合に基づいて、前記第１アクセスステートメントおよび前記第２アクセスステートメントが同一パス上にあるか否かを判定する同一パス判定手段、
を更に備えることを特徴とする請求項１に記載の割込干渉解析装置。
【請求項６】
解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得するステップと、
前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定するステップと、
前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析するステップと、
を含むことを特徴とする割込干渉解析方法。
【請求項７】
コンピュータに、
解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得するステップと、
前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定するステップと、
前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析するステップと、
を実行させるコンピュータ実行可能な割込干渉解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの欠陥を検出する解析装置、解析方法、及び解析プログラムに関し、特に、割込処理が実行されるプログラム中に設定される割込禁止区間を解析する技術に関するものである。
【背景技術】
【０００２】
自動車等の車両は、複数モジュールによって構成される電子制御装置（Electronic
Control Unit：ＥＣＵ）を搭載し、各種電装品の制御を実行している。ＥＣＵは、制御応答性や安全性の確保等を図るため、所定の処理をリアルタイムに実行させる必要がある。そのため、ＥＣＵにおいては、リアルタイム性を必要とする処理を、他の処理よりも優先順位の高い割込処理やタスクとして実行させるのが一般的である。
【０００３】
優先順位の異なる複数のタスクによって構成されるプログラムでは、優先順位の高いタスクは、優先順位の低い他のタスクに割込む。例えば、あるタスクを実行中に、優先順位の高い別のタスクの起動要求が発生すると、実行中のタスクを中断し、優先順位の高いタスクを実行する。かかるプログラムでは、例えば、優先順位の低いタスクの処理タイミングに関係しないタイミングで、優先順位の高いタスクが割込を行う。このため、例えば、優先順位の低いタスクと優先順位の高いタスクとが、共通の変数に対して読み込みや書込みを行う場合、不具合が生じる可能性がある。
【０００４】
このような事態の回避策として、優先順位の低いタスクのプログラム中に、必要に応じて割込禁止区間を設定する方法がある。割込禁止区間は、割込禁止命令と割込許可命令によって挟まれた区間である。割込禁止区間は、優先順位の高いタスクであっても割込を行うことができない。例えば、１つのグローバル変数に２回アクセスする間、他のタスクが同じグローバル変数にアクセスしないことを前提としている処理においては、他のタスクが割込を行わないように割込禁止区間を設定する。
【０００５】
割込禁止区間は、特定の処理区間を、同じ種類の割込禁止命令と割込許可命令で適正に挟むことが不可欠である。割込禁止命令と割込許可命令のいずれか一方が抜け落ちると、割込禁止区間が設定されない事態や、割込禁止区間が解除されず優先順位の高いタスクが実行されない、又は、実行が遅れる、という事態が発生する。
以下では、割込禁止区間を設定する為の命令体系を「割込命令系」と呼ぶ。割込命令系は複数種類存在することがある。
【０００６】
このような割込禁止区間の設定不良による割込干渉は、リリースされる前にプログラムの不具合として検出する必要がある。このようなプログラムの不具合を自動的に検出する装置として、例えば、特許文献１及び２に記載されたものがある。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特許第３４５８７９６号
【０００８】
【特許文献２】特開２００６−３３１０２７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら、従来の技術においては、条件式等によって分岐するような処理（分岐処理）や、ある区間をある条件の間繰り返すような処理（繰り返し処理）等があるプログラムの場合、実際には割込干渉の可能性が無いにも関わらず、割込干渉の可能性有りと検出する誤検知が多発する問題点がある。このため、解析結果から、割込干渉の可能性があると検出されたプログラムを手作業で確認する作業に多大な工数を要してしまう。
さらに、複数種類の割込命令系を含むプログラムについては考慮されていないため、そのようなプログラムには適用できないという問題点があった。
【００１０】
本発明は、前述した問題点を解消するためになされたものであり、割込干渉の有無を適正に検出することができる割込干渉解析装置等を提供することを目的とする。
【課題を解決するための手段】
【００１１】
前述した目的を達成するために第１の発明は、解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得する取得手段と、前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定する割込状態推定手段と、前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析する割込干渉解析手段と、を備えることを特徴とする割込干渉解析装置である。
第１の発明によって、割込干渉の有無を適正に検出することができる。
【００１２】
第１の発明における前記割込干渉解析手段は、例えば、前記第１アクセスステートメントから前記第２アクセスステートメントまでの解析対象区間に割込許可命令が含まれているか否かを判定して割込干渉有無を解析し、解析結果を出力する。
これによって、分岐処理や繰り返し処理を含むプログラムに対して誤検知を削減することができる。
【００１３】
また、第１の発明における前記割込干渉解析手段は、例えば、第１の条件として、前記第１アクセスステートメントから前記第２アクセスステートメントまでの解析対象区間に前記第１アクセスステートメントの実行前の割込状態を「禁止」にしている割込命令系の割込許可命令が含まれているか否かを判定し、第２の条件として、前記解析対象区間に含まれるすべてのステートメントの実行後の割込状態が、少なくともいずれか一つの割込命令系によって「禁止」となっているか否かを判定することで割込干渉有無を解析し、解析結果を出力する。
これによって、割込命令系が複数種類存在するプログラムに対して誤検知を削減することができる。
【００１４】
第１の発明における前記割込状態推定手段は、分岐処理の合流点のステートメントに対しては直前のステートメント全ての割込状態を参照して割込状態を推定し、繰り返し処理の開始地点から終了地点までの各ステートメントに対しては推定結果が変化しなくなるまで繰り返して割込状態を推定することが望ましい。
これによって、分岐処理や繰り返し処理を含むプログラムに対して、割込干渉解析手段による割込干渉の解析を適正に行うことができる。
【００１５】
第１の発明は、前記到達可能ステートメント集合に基づいて、前記第１アクセスステートメントおよび前記第２アクセスステートメントが同一パス上にあるか否かを判定する同一パス判定手段、を更に備えることが望ましい。
これによって、割込干渉解析手段によって割込干渉の解析を行う判定箇所を削減することができる。
【００１６】
第２の発明は、解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得するステップと、前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定するステップと、前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析するステップと、
を含むことを特徴とする割込干渉解析方法である。
【００１７】
第３の発明は、コンピュータに、解析対象となるプログラムにおける割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リストと、前記プログラムにおける各ステートメントの実行順序を示す制御フローグラフと、前記プログラムにおける各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合とを取得するステップと、前記制御フローグラフに基づいて、各ステートメントの実行前と実行後の割込状態を推定するステップと、前記判定箇所リストと、割込状態の推定結果と、前記到達可能ステートメント集合とに基づいて、割込干渉の有無を解析するステップと、を実行させるコンピュータ実行可能な割込干渉解析プログラムである。
【発明の効果】
【００１８】
本発明により、割込干渉の有無を適正に検出することができる割込干渉解析装置等を提供することができる。
【図面の簡単な説明】
【００１９】
【図１】割込干渉解析装置１０の概要を示す図
【図２】判定箇所リスト２２の一例を示す図
【図３】制御フローグラフ２３の一例を示す図
【図４】到達可能ステートメント集合リスト５１の一例を示す図
【図５】判定箇所の第１アクセスステートメントと第２アクセスステートメントが同一パス上に無い場合の一例を示す図
【図６】割込状態推定リスト４１の一例を示す図
【図７】処理フローが合流する点の割込状態を決める規則を説明する図
【図８】合流点の割込状態決定規則を示す図
【図９】解析結果の出力例を示す図
【図１０】割込干渉解析装置１０の動作の流れを示すフローチャート
【図１１】割込干渉解析結果リスト６１の一例を示す図
【図１２】条件式による分岐処理があるプログラムの一例を示す図
【図１３】図１２の割込状態を推定した結果を示す図
【図１４】図１３の割込状態推定リスト４１ａを示す図
【図１５】繰り返し処理があるプログラムの一例を示す図
【図１６】図１５の割込状態を推定した一回目の結果を示す図
【図１７】図１６の割込状態推定リスト４１ｂを示す図
【図１８】図１５の割込状態を推定した二回目の結果を示す図
【図１９】図１８の割込状態推定リスト４１ｃを示す図
【図２０】割込干渉解析手段１５による割込干渉解析処理の流れを示すフローチャート
【図２１】プログラムの一例を示す図
【図２２】実質的な実行前の割込状態算出処理の流れを示すフローチャート
【図２３】関数呼出し元リスト７１の一例を示す図
【図２４】割込干渉解析装置１０ａの動作の流れを示すフローチャート
【図２５】割込干渉解析手段１５ａによる割込干渉解析処理の流れを示すフローチャート
【図２６】割込干渉解析手段１５ａによる割込干渉解析処理の流れを示すフローチャート
【図２７】プログラムの一例を示す図
【発明を実施するための形態】
【００２０】
以下、本発明を適用した割込干渉解析装置の具体的な実施形態について、図面を参照しながら詳細に説明する。
【００２１】
＜第１の実施形態＞
まず、第１の実施形態について説明する。
図１は、本発明を具体化した割込干渉解析装置１０の概要を示す図である。
【００２２】
割込干渉解析装置１０は、解析対象となるプログラム２１と、割込干渉有無を判定すべき箇所を示す判定箇所リスト２２と、プログラム２１の各ステートメントの実行順序を示す制御フローグラフ２３を取得して、判定箇所における割込干渉有無を解析し、解析結果ファイル２４を出力するものである。割込干渉解析装置１０は、解析対象情報取得手段１１、到達可能ステートメント集合算出手段１２、同一パス判定手段１３、割込状態推定手段１４、割込干渉解析手段１５、解析結果出力手段１６を備える。解析対象取得手段１１、到達可能ステートメント集合算出手段１２、同一パス判定手段１３、割込状態推定手段１４、割込干渉解析手段１５、解析結果出力手段１６は、典型的にはコンピュータの１機能としてソフトウェア的に実現されるが、ハードウェア的に構成しても構わない。
【００２３】
解析対象取得手段１１は、解析対象となるプログラム２１、割込干渉有無を判定すべき箇所を示す判定箇所リスト２２、プログラム２１の各ステートメントの実行順序を示す制御フローグラフ２３を取得するものである。プログラム２１は、各関数について、関数の名称、ステートメントに対して記述順に付与されたステートメント番号、ステートメントの命令記述等の情報を保持している。
【００２４】
図２は、判定箇所リスト２２の一例を示す図である。図２に示すように、判定箇所リスト２２は、判定箇所番号、グローバル変数、高優先順位関数の情報、低優先順位関数の情報からなる。高優先順位関数の情報は、名称、グローバル変数にアクセスする箇所を示すステートメント番号である。低優先順位関数の情報は、名称、１番目にグローバル変数にアクセスする箇所を示す第１アクセスステートメント番号、２番目にグローバル変数にアクセスする箇所を示す第２アクセスステートメント番号である。図１０にて後述する処理では、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントの情報が必須となる。
【００２５】
例えば、判定箇所番号１の判定箇所２５は、グローバル変数「ａ」に、高優先順位関数「ｆｕｎｃ１」のステートメント番号Ｌ２５、及び低優先順位関数「ｍａｉｎ」の第１アクセスステートメント番号Ｌ３と第２アクセスステートメント番号Ｌ５でアクセスしており、低優先順位関数「ｍａｉｎ」の第１アクセスステートメント番号Ｌ３と第２アクセスステートメント番号Ｌ５で挟まれた解析対象区間に、高優先順位関数「ｆｕｎｃ１」が割込を行ったときの割込干渉有無を判定する箇所を示す。
【００２６】
図３は、制御フローグラフ２３の一例を示す図である。図３（ａ）は、関数の一例である。図３（ｂ）は、図３（ａ）に示す関数のフローチャートである。図３（ｃ）は、図３（ａ）に示す関数の制御フローグラフ２３である。
【００２７】
制御フローグラフ２３は、フローチャートと同様の情報を表形式に表現したものであり、関数中の各ステートメントについて、「前のステートメント」、「次のステートメント」を示すものである。ここで、ｉｆ文やｗｈｉｌｅ文等の合流点には、計算の都合上、仮想的なステートメントを定義する。図３（ｂ）、（ｃ）に示すＡ１、Ａ２は、仮想的なステートメントである。
特別なステートメントである「分岐条件」、「分岐合流」、「ループ条件」、「ループ合流」については、制御フローグラフ２３の「ステートメントの種類」の欄に登録されている。
制御フローグラフ２３の作成は、図３（ａ）または図３（ｂ）を入力として、一般的なプログラム解析手法により実現できる為、詳細は省略する。
【００２８】
更に、解析対象取得手段１１は、プログラム２１を読み込んで関数呼出しと割込命令の解析を行い、取得した制御フローグラフ２３に追加情報を登録する。
具体的には、解析対象取得手段１１は、プログラム２１を解析し、関数呼出しを行うステートメントを検索し、呼び出す関数の関数名を取得する。そして、解析対象取得手段１１は、制御フローグラフ２３の「ステートメントの種類」の欄に「関数呼出し」を登録し、「呼出し先関数」の欄に取得した関数名を登録する。図３（ｃ）に示す例では、Ｌ５が関数名「ｆｕｎｃ２」を呼び出すステートメントである。
また、解析対象取得手段１１は、プログラム２１を解析し、割込命令を行うステートメントを検索し、割込命令の種類（Ｄｉｓｅｎａｂｌｅ、Ｅｎａｂｌｅ等）を特定する。そして、解析対象取得手段１１は、制御フローグラフ２３の「ステートメントの種類」の欄に「割込命令」を登録し、「割込命令」の欄に割込命令の種類を登録する。図３（ｃ）に示す例では、Ｌ２が割込禁止命令（Ｄｉｓｅｎａｂｌｅ）のステートメントであり、Ｌ９、Ｌ１３が割込命令（Ｅｎａｂｌｅ）のステートメントである。
尚、解析対象取得手段１１が追加情報を登録するのではなく、予め全ての追加情報が制御フローグラフ２３に登録されていても良い。
【００２９】
割込命令の種類は、基本的には、割込禁止命令（Ｄｉｓｅｎａｂｌｅ）と割込許可命令（Ｅｎａｂｌｅ）の２種類である。但し、使用するプログラム言語やマイコンによっては、複数の割込命令系を備えている場合がある。例えば、割込許可フラグをクリアする命令と、割込許可レベルを最高レベルに上げる（どのレベルの割込命令に対しても割込を許さない。）の２種類の割込禁止命令が使用可能な場合がある。複数の割込命令系を備えている場合、解析対象取得手段１１は、これらを区別して、制御フローグラフ２３の「割込命令」の欄に登録する。
【００３０】
図４は、到達可能ステートメント集合リスト５１の一例を示す図である。図４に示す到達可能ステートメント集合リスト５１は、図３に示す制御フローグラフ２３に対応している。
到達可能ステートメント集合算出手段１２は、制御フローグラフ２３を参照し、各ステートメントに到達可能なステートメントの集合を示す到達可能ステートメント集合を算出し、到達可能ステートメント集合リスト５１を生成するものである。
ループ文では、下のステートメントから上のステートメントに戻るフローがある為、戻りを考慮して算出する必要がある。到達可能ステートメント集合の算出は、一般的に知られている「有向グラフの到達可能性判定」のアルゴリズム等を用いて実現することが可能であり、詳細は省略する。
例えば、図４の例では、Ａ１の到達可能ステートメント集合は、｛Ｌ２、Ａ１、Ｌ３、Ｌ４、Ｌ５、Ｌ６、Ｌ８、Ｌ９、Ａ２｝である。
尚、到達可能ステートメント集合は、判定箇所リスト２２、制御フローグラフ２３等と同様に、入力情報として取得するものとしても良い。すなわち、割込干渉解析装置１０が、到達可能ステートメント集合算出手段１２を具備しない構成としても良い。
【００３１】
同一パス判定手段１３は、判定箇所リスト２２から判定箇所２５を１つ取り出し、制御フローグラフ２３を参照して、低優先順位関数の２つのステートメントが同一パス上にあるか否かを判定する。判定結果が同一パス上に無い場合、同じグローバル変数にアクセスする２つのステートメントは同周期に実行されないため、割込干渉解析結果を「無し」とする。
【００３２】
図５は、判定箇所の第１アクセスステートメントと第２アクセスステートメントが同一パス上に無い場合の一例を示す図である。ステートメント番号Ｌ６５のｉｆ文で分岐しているため、第１アクセスステートメント番号Ｌ６８と第２アクセスステートメント番号Ｌ７１は同周期で実行されることはなく、同じグローバル変数「b」にアクセスしていても割込干渉はありえない。
【００３３】
同一パス判定手段１３は、到達可能ステートメント集合を用いることで、容易に同一パスの判定を行うことができる。同一パス判定手段１３は、第２アクセスステートメントの到達可能ステートメント集合に第１アクセスステートメントが含まれていない場合、第１アクセスステートメントと第２アクセスステートメントは同一パス上にないと判定する。
【００３４】
割込状態推定手段１４は、同一パス判定手段１３による割込干渉解析結果が「無し」以外の判定箇所について、制御フローグラフ２３を参照し、判定箇所２５の低優先順位関数における各ステートメントの実行前、実行後の割込状態を推定し、割込状態推定リスト４１を生成する。
【００３５】
図６は、割込状態推定リスト４１の一例を示す図である。ここで、割込状態とは、低優先順位関数のある箇所において、高優先順位関数が割り込む可能性を示すものであり、「禁止」、「許可」、「継承」の３つの状態がある。「禁止」は、割込が禁止されている状態である。例えば、割込禁止命令の実行後の割込状態は「禁止」である。「許可」は、割込まれる可能性がある状態である。例えば、割込許可命令の実行後の割込状態は「許可」である。「継承」は、呼び出し元関数の割込状態を引き継いでいる状態である。例えば、ある関数が呼び出されて実行を開始するときは、呼び出し元関数の割込状態を引き継いでいる状態なので「継承」となる。実行前の割込状態は、直前のステートメントもしくは合流点の実行後の割込状態を引き継ぐ。直前のステートメントもしくは合流点とは、制御フローとして推定対象ステートメントの直前にあたるものであり、制御フローグラフ２３から求める。
図６に示す例では、ステートメント番号「Ｌ１」の実行前の割込状態は「許可」、実行後の割込状態は「禁止」である。
【００３６】
図７、図８を用いて、合流点の割込状態の推定方法を説明する。図７は、処理フローが合流する点の割込状態を決める規則を説明する図である。図８は、合流点の割込状態決定規則を示す図である。
図７、図８に示すように、処理フローが合流する直前の各処理の割込状態に１つでも「許可」があれば、合流直後の割込状態は「許可」とする。合流する直前の各分岐処理の割込状態がすべて「禁止」であれば、合流直後の割込状態は「禁止」とする。合流する直前の各分岐処理がすべて「継承」であれば、合流直後の割込状態は「継承」とする。合流する直前の各分岐処理が「禁止」と「継承」の両方であれば、合流直後の割込状態は「継承」とする。
【００３７】
割込干渉解析手段１５は、判定箇所２５と、割込状態推定手段１４によって推定した割込状態の推定結果である割込状態推定リスト４１と、到達可能ステートメント集合算出手段１２によって求めた到達可能ステートメント集合５１とに基づいて、第１アクセスステートメントの実質的な実行前割込状態が「禁止」か否か、及び、判定箇所２５の第１アクセスステートメントから第２アクセスステートメントまでの解析対象区間に割込許可命令が含まれているか否かを判定して割込干渉有無を解析するものである。
【００３８】
図９は、解析結果の出力例を示す図である。解析結果出力手段１６は、同一パス判定手段１３と割込干渉解析手段１５によって解析した結果を出力するものである。図９に示す例では、判定箇所番号が「１」の割込干渉解析結果は、「無し」である。一方、判定箇所番号が「２」の割込干渉解析結果は、「可能性有り」である。
解析結果の出力には、結果だけでなく、解析理由を付けてもよい。解析理由とは、例えば、図９に示す判定箇所番号が「１」の割込干渉解析結果であれば、「ｍａｉｎ関数の２行目に割込禁止命令があり、５行目まで割込許可命令がないので、割込干渉はない」のように割込干渉解析結果を導いた理由である。
尚、割込干渉が発生し、障害が発生するかどうかは、最終的にはプログラム２１の設計者が判断を行う。本発明では、実際には割込干渉の可能性が無いにも関わらず、割込干渉の可能性有りと検出する誤検知を削減する。これによって、プログラム２１の設計者の負荷を大幅に軽減することができる。
【００３９】
次に、図１０から図２３を参照しながら、割込干渉解析装置１０の動作の詳細について説明する。図１０は、割込干渉解析装置１０の動作の流れを示すフローチャートである。
【００４０】
図１０に示すように、まず、割込干渉解析装置１０は、解析対象となるプログラム２１と、割込干渉有無を判定すべき箇所を示す判定箇所リスト２２と、プログラム２１の各ステートメントの実行順序を示す制御フローグラフ２３を読み込んで、内部データとして保持する（Ｓ１０１）。また、割込干渉解析装置１０は、必要に応じて、制御フローグラフ２３に追加情報を登録する。
【００４１】
次に、割込干渉解析装置１０は、到達可能ステートメント集合算出処理（Ｓ１０２）を行う。到達可能ステートメント集合算出処理は、図４に示す到達可能ステートメント集合５１を算出する処理である。尚、前述したように、割込干渉解析装置１０が、到達可能ステートメント集合算出手段１２を具備しない構成とする場合、到達可能ステートメント集合は、判定箇所リスト２２、制御フローグラフ２３等と同様に、入力情報として取得して、内部データとして保持する。
【００４２】
次に、同一パス判定処理（Ｓ１０３）について説明する。
割込干渉解析装置１０は、判定箇所リスト２２から判定箇所２５を１つ取り出し、到達可能ステートメント集合５１を参照して、判定箇所２５の低優先順位関数の第１アクセスステートメントと第２アクセスステートメントが同一パス上にあるか否かを判定する。
【００４３】
判定結果が同一パス上に無ければ、割込干渉解析装置１０は、判定箇所２５の判定箇所番号と割込干渉解析結果「無し」を対にして、割込干渉解析結果リスト６１に保持し、Ｓ１０７へ進む（Ｓ１０４のＮｏ）。
判定結果が同一パス上にあれば、割込干渉解析装置１０は、判定箇所２５の低優先順位関数について、割込状態推定リスト生成処理（Ｓ１０５）へ進む（Ｓ１０４のＹｅｓ）。
【００４４】
図１１は、割込干渉解析結果リスト６１の一例を示す図である。図１１に示す割込干渉解析結果リスト６１は、同一パス判定処理の終了した時点の中間的なデータである。
図１１の例では、例えば、判定箇所番号「１」に対しては、割込状態推定リスト生成処理（Ｓ１０５）、割込干渉解析処理（Ｓ１０６）を行わず、割込干渉解析結果に「無し」が登録されている。
【００４５】
次に、割込状態推定リスト生成処理（Ｓ１０５）について説明する。割込状態推定リスト生成処理は、図６に示す割込状態推定リスト４１を生成する処理である。
まず、割込干渉解析装置１０は、割込状態の初期状態を設定する。
割込状態推定対象関数が、メイン関数や割込処理関数自体である場合は、初期状態をその関数が実行される最初の割込状態（最初の割込状態はマイコン等の仕様により異なる。例えば、メイン関数の実行開始時の割込状態はマイコンに依存する。）に設定する。メイン関数や割込処理関数自体の初期状態は、「禁止」か「許可」のいずれかが設定される。
割込状態推定対象関数が、別の関数から呼び出される関数である場合は、初期状態を「継承」に設定する。
初期状態は、各割込状態推定対象関数について、初回の割込状態推定時に用いるものである。
【００４６】
次に、割込干渉解析装置１０は、制御フローグラフ２３から、割込状態推定対象関数の推定対象となるステートメントを１つ取り出す。
割込干渉解析装置１０は、制御フローグラフ２３を参照し、推定対象ステートメントの直前が、条件式等による分岐処理の合流点である場合は、その合流点の割込状態を推定する。
また、割込干渉解析装置１０は、制御フローグラフ２３を参照し、推定対象ステートメントの直前が、繰り返し処理の開始点を示す合流点である場合は、その合流点を開始点とする繰り返し区間の割込状態を推定する。
【００４７】
また、割込干渉解析装置１０は、推定対象ステートメントの割込状態を推定し、推定した割込状態を、ステートメント番号とともに、割込状態推定リスト４１に書き込む。推定対象ステートメントが割込禁止命令の場合は、実行後の割込状態を「禁止」、割込許可命令の場合は実行後の割込状態を「許可」にして、割込状態推定リスト４１に書き込む。
尚、推定対象ステートメントが関数呼出命令の場合は、呼び出している関数について、割込状態推定リスト生成処理を行い、推定対象ステートメントの実行後の割込状態を求める。呼び出している関数について生成された割込状態推定リスト４１の割込状態に１つでも「許可」があれば、実行後の割込状態を「許可」にして、割込状態推定リスト４１に書き込む。
割込干渉解析装置１０は、以上の処理を割込状態推定対象関数の中のすべてのステートメントに対して行う。
【００４８】
分岐処理の合流点における割込状態の推定について、図１２〜図１４を用いて具体的に説明する。図１２は、条件式による分岐処理があるプログラムの一例を示す図である。図１３は、図１２の割込状態を推定した結果を示す図である。図１４は、図１３の割込状態推定リスト４１ａを示す図である。
【００４９】
図１２に示す「Ｄｉｓｅｎａｂｌｅ」は、割込禁止命令を示している。「Ｅｎａｂｌｅ」は、割込許可命令を示している。「第１アクセスステートメント」は、グローバル変数に第１にアクセスするステートメントを示している。「第２アクセスステートメント」は、グローバル変数に第２にアクセスするステートメントを示している。「継」は、割込状態が「継続」であることを示している。「禁」は、割込状態が「禁止」であることを示している。「許」は、割込状態が「許可」であることを示している。「Ｌ１」〜「Ｌ６」は、ステートメント番号を示している。「Ａ１」は、合流点番号を示している。以下、他の図面でも同様の表記を行う。
【００５０】
図１２に示すＬ５がこの場合の推定対象ステートメントであり、Ｌ１からＬ４の割込状態は推定済みである。まず、割込干渉解析装置１０は、制御フローグラフ２３を参照し、Ｌ５の直前に、Ｌ２の条件式で分岐したＬ３とＬ４の合流点Ａ１を得る。次に、割込干渉解析装置１０は、割込状態推定リスト４１を参照し、Ｌ３とＬ４の実行後の割込状態を取得し、図８の合流点の割込状態決定規則に基づいて、Ａ１の実行前の割込状態を設定する。この例では、Ｌ３の実行後の割込状態（主合流前）は「禁止」、Ｌ４の実行後の割込状態（副合流前）は「許可」なので、Ａ１の実行前の割込状態は「許可」を設定する。次に、割込干渉解析装置１０は、Ａ１の実行後の割込状態を設定する。この例では、Ａ１の実行前の割込状態は「許可」なので、Ａ１の実行後の割込状態は「許可」を設定する。全てのステートメントに対して割込状態を推定した結果が図１３である。
割込干渉解析装置１０は、図１３に示す推定した割込状態を、合流点番号とともに図１４に示す割込状態推定リスト４１ａに書き込む。
【００５１】
このように、割込干渉解析装置１０は、割込状態推定手段１４によって、分岐処理の合流点のステートメントに対しては直前のステートメント全ての割込状態を参照して割込状態を推定する。
【００５２】
次に、繰り返し処理の合流点における割込状態の推定について、図１５〜図１９を用いて具体的に説明する。図１５は、繰り返し処理があるプログラムの一例を示す図である。図１６は、図１５の割込状態を推定した一回目の結果を示す図である。図１７は、図１６の割込状態推定リスト４１ｂを示す図である。
【００５３】
図１５に示すＬ２がこの場合の推定対象ステートメントであり、Ｌ１の割込状態は推定済である。まず、割込干渉解析装置１０は、制御フローグラフ２３から、Ｌ２の直前に、繰り返し処理の開始点であるＡ１を得る。次に、割込干渉解析装置１０は、プログラム２１と制御フローグラフ２３から、Ａ１を開始点とする繰り返し区間Ｌ２〜Ｌ６を得る。繰り返し区間の終了ステートメントは、Ｌ６である。
【００５４】
次に、割込干渉解析装置１０は、図８の合流点の割込状態決定規則に基づいて、合流点の割込状態を推定する。この例では、Ｌ１の実行後の割込状態は「禁止」なので、Ａ１の主合流前は「禁止」である。Ａ１の副合流前は、Ｌ６の実行後の割込状態が推定されておらず「不明」である。一方が「不明」の場合には、「不明」でない方の割込状態を設定する。この例では、Ａ１の実行前の割込状態は、図１６に示すように主合流前と同じ割込状態「禁止」に設定する。全てのステートメントに対して一回目の割込状態を推定した結果が図１６である。割込干渉解析装置１０は、図１６に示す推定した合流点の割込状態を、合流点番号とともに図１７に示す割込状態推定リスト４１ｂに書き込む。図１７に示す割込状態推定リスト４１ｂは、一回目の割込状態を推定した時点の中間的なデータである。
【００５５】
図１８は、図１５の割込状態を推定した二回目の結果を示す図である。図１９は、図１８の割込状態推定リスト４１ｃを示す図である。
割込干渉解析装置１０は、繰り返し区間の割込状態を推定し、図１９に示す割込状態推定リスト４１ｃに書き込む。この例では、Ｌ２からＬ６の割込状態を推定し、推定した割込状態とステートメント番号を、割込状態推定リスト４１ｃに書き込む。
【００５６】
次に、割込干渉解析装置１０は、合流点と繰り返し区間の割込状態を推定しなおし、割込状態推定リスト４１ｃに書き込む。割込干渉解析装置１０は、前回の割込状態推定結果から今回推定しなおした結果が変化しなくなるまで、割込状態の推定を繰り返す。この例では、初回の割込状態推定によりＬ６の実行後の割込状態が「許可」と判明したので、図１８に示すように、合流点Ａ１の副合流前が「不明」から「許可」となる。従って、図８の合流点の割込状態決定規則を適用して、合流点Ａ１の実行前の割込状態が「許可」になる。続いて、割込干渉解析装置１０は、Ｌ２からＬ６まで割込状態を推定する。
【００５７】
全てのステートメントに対して二回目の割込状態を推定した結果が図１８である。一回目と比較して、Ａ１の実行後の状態からＬ４の実行前の状態までが変化している。
【００５８】
割込干渉解析装置１０は、図１８に示す推定した合流点の割込状態を、合流点番号とともに図１９に示す割込状態推定リスト４１ｃに書き込む。図１６の割込状態から、図１８の割込状態に変化したので、割込干渉解析装置１０は、再度、推定を繰り返す。三回目の割込状態推定結果（不図示）は、二回目の割込状態推定結果から変化しないので、Ａ１を開始点とする繰り返し区間の割込状態の推定を終了する。この例では、図１９に示す割込状態推定リスト４１ｃが、最終的な推定結果を示すデータである。
尚、再度推定を繰り返すか否かの判定は、分岐点の割込状態の変化だけを見ればよい。これは、分岐点が変わらなければ、繰り返し区間内も変わらない為である。
【００５９】
割込状態の推定は、禁止→許可、継承→許可または禁止→継承→許可の順にしか変化しないため、割込状態の推定が変化する回数は最大２回であり、必ず収束する。
尚、分岐処理の合流点を開始点とする繰り返し区間の場合、繰り返し区間を抜け出た後のステートメントについても、再度、割込状態推定を行う。この例では、Ｌ２の分岐処理によって繰り返し区間を抜け出た後のステートメントである。
また、繰り返し処理が多重になっている場合、繰り返し区間内で別の繰り返し処理が現れたときに、上記手順によって、その繰り返し処理についても割込状態推定を行えば良い。
【００６０】
このように、割込干渉解析装置１０は、割込状態推定手段１４によって、繰り返し処理の開始地点から終了地点までの各ステートメントに対しては推定結果が変化しなくなるまで繰り返して割込状態を推定する。
【００６１】
図１０の説明に戻る。次に、割込干渉解析処理（Ｓ１０６）について説明する。
図２０は、割込干渉解析手段１５による割込干渉解析処理の流れを示すフローチャートである。図２１はプログラムの一例を示す図である。以下では、図２０の各ステップを説明しながら、図２１のプログラムに対する具体的な処理の内容も合わせて説明する。
尚、図２１に示すプログラムの各ステートメントの命令は、特に記載がなければ、割込許可命令、割込禁止命令、関数呼出命令、グローバル変数へのアクセス命令のいずれでもないものとする。
【００６２】
図２０に示すように、割込干渉解析装置１０は、まず、Ｓ１０５で生成した割込状態推定リスト４１の中から、判定箇所２５の第１アクセスステートメントＬ１＊の実行前の割込状態を取得する（Ｓ２００）。
図２１のプログラムでは、Ｌ１＊＝Ｌ３であるから、Ｌ１＊の実行前の割込状態は「禁止」である。
【００６３】
次に、割込干渉解析装置１０は、Ｌ１＊の実質的な実行前の割込状態算出処理を行う（Ｓ２０１）。割込状態推定リスト４１における「実行前の割込状態」には「継承」状態が含まれるが、「継承」状態は便宜的に定義した状態であり、実際の「実行前の割込状態」は「禁止」か「許可」のいずれかである。この「禁止」か「許可」しか取らない実際の「実行前割込状態」を「実質的な実行前の割込状態」と呼ぶこととする。
例えば、Ｓ１０５で生成した割込状態推定リスト４１における対象ステートメントの「実行前の割込状態」が「継承」であることは、対象ステートメントの所属する関数を呼び出している元のステートメント（関数呼出し文）の「実行前の割込状態」を継承するという意味である。そこで、実質的な実行前の割込状態算出処理（Ｓ２０１）では、この意味の通りに、関数呼出し元の割込状態（関数呼出し元が複数の場合はＯＲ演算を行う。）を取得し、「実質的な実行前の割込状態」を算出する。
実質的な実行前の割込状態算出処理（Ｓ２０１）は、図２２、図２３を参照して後述する。
【００６４】
次に、割込干渉解析装置１０は、判定箇所２５の第１アクセスステートメントＬ１＊の実質的な実行前の割込状態が「禁止」か否か判定する（Ｓ２０２）。
「許可」の場合は、割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する（Ｓ２０３）。
「禁止」の場合は、Ｓ２０４へ進む。
図２１のプログラムでは、Ｌ１＊の実質的な実行前の割込状態は「禁止」なので、Ｓ２０４へ進む。
【００６５】
Ｓ２０４では、割込干渉解析装置１０は、到達可能ステートメント集合リスト５１を参照し、判定箇所２５の第２アクセスステートメントＬ２＊の到達可能ステートメント集合をＡとする。
図２１のプログラムでは、Ｌ２＊＝Ｌ６であるから、Ａ＝｛Ｌ１、Ｌ２、Ｌ３、Ｌ４、Ａ１、Ｌ５｝である。
【００６６】
次に、割込干渉解析装置１０は、第２アクセスステートメントＬ２＊の到達可能ステートメント集合Ａから、ステートメント番号Ｌｎを１つ取り出す（Ｓ２０５）。
【００６７】
次に、割込干渉解析装置１０は、到達可能ステートメントリスト５１を参照し、Ｓ２０５で取り出したステートメント番号Ｌｎの到達可能ステートメント集合に、第１アクセスステートメント番号Ｌ１＊を含んでいるか否か判定する（Ｓ２０６）。
含んでいる場合は（Ｓ２０６のＹｅｓ）、ステートメント番号Ｌｎを干渉解析対象リストＢに書込み（Ｓ２０７）、Ｓ２０８へ進む。
含んでいない場合は（Ｓ２０６のＮｏ）、Ｓ２０８へ進む。
【００６８】
Ｓ２０８では、割込干渉解析装置１０は、到達可能ステートメント集合Ａのすべてのステートメントを取り出したか判定する。
すべて取り出した場合は、Ｓ２０９へ進む。
取り出していないステートメントがある場合は、Ｓ２０５へ戻る。
図２１のプログラムでは、Ａ＝｛Ｌ１、Ｌ２、Ｌ３、Ｌ４、Ａ１、Ｌ５｝から取り出されるステートメント番号の到達可能ステートメント集合の中で、Ｌ１＊（＝Ｌ３）を含むのは、「Ａ１、Ｌ５」である。従って、Ｂ＝｛Ａ１、Ｌ５｝となる。
【００６９】
Ｓ２０９では、割込干渉解析装置１０は、干渉解析対象リストＢから、ステートメント番号Ｌｋを１つ取り出す。
次に、割込干渉解析装置１０は、制御フローグラフ２３から、Ｓ２０９で取り出したステートメント番号Ｌｋが割込許可命令か否か調べる（Ｓ２１０）。
Ｌｋが割込許可命令であれば、割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する（Ｓ２１１）。
Ｌｋが割込許可命令以外であれば、Ｓ２１２へ進む。
図２１のプログラムでは、Ｂ＝｛Ａ１、Ｌ５｝に含まれる全てのステートメントが割込許可命令でないことから、Ｓ２１２へ進む。
【００７０】
Ｓ２１２では、割込干渉解析装置１０は、制御フローグラフ２３から、Ｓ２０９で取り出したステートメント番号Ｌｋが関数呼出命令か否か調べる。
Ｌｋが関数呼出命令であれば、Ｓ２１３へ進む。
Ｌｋが関数呼出命令以外であれば、Ｓ２１５へ進む。
図２１のプログラムでは、Ｂ＝｛Ａ１、Ｌ５｝に含まれる全てのステートメントが関数呼出命令でないことから、Ｓ２１５へ進む。
【００７１】
Ｓ２１３では、割込干渉解析装置１０は、割込状態推定リスト４１を参照し、Ｓ２０９で取り出したステートメント番号Ｌｋの実行後の割込状態を求め、「許可」か否か調べる。
「許可」であれば、割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する（Ｓ２１４）。
「許可」以外であれば、Ｓ２１５へ進む。
【００７２】
Ｓ２１５では、割込干渉解析装置１０は、干渉解析対象リストＢからすべてのステートメントを取り出したか判定する。
すべて取り出した場合は、Ｓ２１６へ進む。
取り出していないステートメントがある場合は、Ｓ２０９へ戻る。
前述した通り、図２１のプログラムでは、Ｂ＝｛Ａ１、Ｌ５｝に含まれる全てのステートメントが割込許可命令でもなく、関数呼出命令でもないことから、Ｓ２１６へ進む。
【００７３】
Ｓ２１６では、割込干渉解析装置１０は、割込干渉解析結果「無し」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
【００７４】
ここで、割込干渉解析処理（Ｓ１０６）の意義について説明する。前述した図２１のプログラムに対して、割込状態推定リスト生成処理（Ｓ１０５）では、第１アクセスステートメントＬ１＊（＝Ｌ３）と第２アクセスステートメントＬ２＊（＝Ｌ６）の間のステートメントの割込状態を「許可」と推定している。しかしながら、実際には、第１アクセスステートメントＬ１＊（＝Ｌ３）を通過するパスの場合には、第２アクセスステートメントＬ２＊（＝Ｌ６）までの割込状態が必ず「禁止」となる。すなわち、割込状態推定リスト生成処理（Ｓ１０５）を行うだけでは、実際には割込干渉の可能性が無いにも関わらず、割込干渉の可能性有りと検出する誤検知が頻発する恐れがある。
割込干渉解析処理（Ｓ１０６）では、前述した通り、図２１のプログラムに対して、割込干渉解析結果を「無し」と判定しているので、分岐処理や繰り返し処理を含むプログラムに対して誤検知を削減する作用があると言える。
【００７５】
図１０の説明に戻る。Ｓ１０７では、割込干渉解析装置１０は、判定箇所リスト２２のすべての判定箇所２５を取り出したか否か判定する。
すべての判定箇所２５を取り出した場合は、解析結果出力処理（Ｓ１０８）へ進む。
取り出していない判定箇所２５がある場合は、Ｓ１０３へ戻る。
【００７６】
次に、解析結果出力処理（Ｓ１０８）について説明する。
割込干渉解析装置１０は、判定箇所リスト２２と割込干渉解析結果リスト６１を合わせて、割込干渉解析結果をファイルに出力する。
【００７７】
次に、図２２、図２３を参照しながら、図２０の実質的な実行前の割込状態算出処理（Ｓ２０１）について説明する。
図２２は、実質的な実行前の割込状態算出処理の流れを示すフローチャートである。図２２に示す処理では、Ｌ１＊が所属する関数（所属関数）を呼び出す全ての呼出し元の「実質的な実行前の割込状態」が「禁止」であるか否かを調べる。一つでも「許可」があれば、Ｌ１＊の「実質的な実行前の割込状態」は割込許可状態になり得るので、「許可」を設定する。それ以外は「禁止」を設定する。
【００７８】
図２２に示すように、割込干渉解析装置１０は、Ｌ１＊の「実行前の割込状態」が「継承」か判定する（Ｓ２５１）。
「継承」でない場合（「許可」または「禁止」の場合）、割込干渉解析装置１０は、Ｌ１＊の「実行前の割込状態」を「実質的な実行前の割込状態」に設定し（Ｓ２５２）、処理を終了する。
「継承」の場合、割込干渉解析装置１０は、Ｓ２５３に進む。
【００７９】
次に、割込干渉解析装置１０は、制御フローグラフ２３を参照し、Ｌ１＊が所属する関数（所属関数）の呼出し元を取得し、関数呼出し元リストを作成する（Ｓ２５３）。
【００８０】
図２３は、関数呼出し元リスト７１の一例を示す図である。関数呼出し元リスト７１の各行は、呼出し元の文（＝関数呼出し文）が所属する関数の名称を示す「呼出し元関数名」と、呼出し元のステートメント番号を示す「呼出し元文」によって構成される。
図２３の例では、Ｌ１＊の所属関数が、関数「ｆｕｎｃ１」のステートメント番号「Ｌ５」、関数「ｆｕｎｃ３」のステートメント番号「Ｌ１０」、関数「ｆｕｎｃ３」のステートメント番号「Ｌ２１」で呼び出されていることを示している。
【００８１】
図２２の説明に戻る。
次に、割込干渉解析装置１０は、関数呼出し元リスト７１が空でないか判定する（Ｓ２５４）。Ｓ２５４における初回の処理では、関数呼出し元リスト７１が空にならないことから、割込干渉解析装置１０は、Ｓ２５６に進む。
【００８２】
次に、割込干渉解析装置１０は、関数呼出し元リスト７１から一つの呼出し元（関数呼出し元リスト７１の一行）を選択する（Ｓ２５６）。このとき、選択した呼出し元は、関数呼出し元リスト７１から削除する。
次に、割込干渉解析装置１０は、選択した呼出し元の「実質的な実行前の割込状態」を算出する（Ｓ２５７）。ここで、関数呼出し元を遡って行くとｍａｉｎ関数または割込処理を行う関数に行き着く。ｍａｉｎ関数または割込処理を行う関数は、初期状態として「禁止」か「許可」のいずれかが設定されていることから、呼出し元文の「実質的な実行前の割込状態」は「禁止」か「許可」のいずれかであることが判明する。従って、Ｓ２５７の算出結果は、「禁止」か「許可」のいずれかである。
【００８３】
次に、割込干渉解析装置１０は、Ｓ２５７の算出結果が「禁止」か否か判定する（Ｓ２５８）。
「禁止」の場合（Ｓ２５８のＹｅｓ）、割込干渉解析装置１０は、Ｓ２５４から繰り返す。Ｓ２５４において、関数呼出し元リストが空になった場合（Ｓ２５４のＮｏ）、割込干渉解析装置１０は、Ｌ１＊の「実質的な実行前の割込状態」に「禁止」を設定し（Ｓ２５５）、処理を終了する。空になっていない場合（Ｓ２５４のＹｅｓ）、割込干渉解析装置１０は、Ｓ２５６に進む。
「許可」の場合（Ｓ２５８のＮｏ）、割込干渉解析装置１０は、Ｌ１＊の「実質的な実行前の割込状態」に「許可」を設定し（Ｓ２５９）、処理を終了する。
【００８４】
Ｓ５４〜Ｓ５９の処理を行うことによって、関数呼出し元が複数の場合、少なくとも１つ「許可」があればＬ１＊の「実質的な実行前の割込状態」に「許可」が設定され、全てが「禁止」であればＬ１＊の「実質的な実行前の割込状態」に「禁止」が設定される。
【００８５】
以上の通り、第１の実施形態に係る割込干渉解析装置１０は、解析対象となるプログラム２１における割込干渉の有無を判定する箇所を示し、低優先順位関数において同一のグローバル変数にアクセスする第１アクセスステートメント及び第２アクセスステートメントを含む判定箇所リスト２２と、プログラム２１における各ステートメントの実行順序を示す制御フローグラフ２３とを取得し、制御フローグラフ２３に基づいて、各ステートメントへの到達可能ステートメント集合を算出し、到達可能ステートメント集合リスト５１を生成する。次に、制御フローグラフ２３に基づいて、各ステートメントの実行前と実行後の割込状態を推定し、割込状態推定リスト４１を生成する。次に、判定箇所リスト２２、割込状態推定リスト４１、及び到達可能ステートメント集合リスト５１に基づいて、同じグローバル変数にアクセスする第１アクセスステートメントから第２アクセスステートメントまでの解析対象区間の到達可能ステートメント集合に割込許可命令のステートメントが含まれているか否かを判定して割込干渉有無を解析し、割込干渉解析結果リスト６１として解析結果を出力する。
これらの一連の処理を行うことによって、割込干渉解析装置１０は、分岐処理や繰り返し処理を含むプログラムに対して誤検知を減らし、割込干渉の有無を適正に検出することができる。
【００８６】
＜第２の実施形態＞
次に、第２の実施形態について説明する。現在用いられている割込命令系としては、「Ｄｉｓｅｎａｂｌｅ」（禁止）と「Ｅｎａｂｌｅ」（許可）の組み合わせの他に、割込許可レベルによって割込を制御する割込命令系も存在する。これは、高優先順位関数（割込関数）にレベルを設定しておき、低優先度関数（被割込関数）には、所定のレベル以上の関数による割込のみを許可する命令を記述するというものである。従って、解析対象のプログラム２１には、複数種類の割込命令系が記述される可能性がある。第２の実施形態では、このような場合も割込干渉の有無を適正に検出できるように、解析対象のプログラム２１が複数種類の割込命令系を含む場合を考える。
【００８７】
尚、割込許可レベルによる割込命令系であっても、高優先順位関数（割込関数）が一つに特定される状況では、「禁止」または「許可」のいずれかの命令として集約して考えることができる。例えば、割込許可レベルの範囲が０〜７、高優先順位関数のレベルが「３」とする。低優先順位関数に記述される命令が、レベル４〜７以上の関数による割込を許可する命令であれば、レベル３の高優先順位関数に対しては「禁止」となり、レベル０〜３以上の関数による割込を許可する命令であればレベル３の高優先順位関数に対しては「許可」となる。
そこで、以下では、説明を簡単にする為、割込許可レベルによる割込命令系ではなく、「禁止」または「許可」の割込命令系が複数種類存在するものとして説明する。
【００８８】
図１は、本発明を具体化した割込干渉解析装置１０ａを含むシステムの概要を示す説明図である。
割込干渉解析装置１０ａのシステム概要及び各機能は、割込干渉解析手段１５ａ、割込状態推定リスト生成手段３２ａを除き、第１の実施形態と同様であるため説明を省略する。
【００８９】
割込干渉解析手段１５ａについて説明する。前提として、いずれか一つの割込命令系によって割込状態が「禁止」になっていれば、高優先順位関数は割込ができないものとする。
割込干渉解析手段１５ａは、２つの条件を併用して割込干渉有無を判定するものである。
第１の条件では、判定箇所２５の第１アクセスステートメントから第２アクセスステートメントまでの解析対象区間に、第１アクセスステートメントの実行前の割込状態を「禁止」にしている割込命令系の割込許可命令が含まれている場合はＹｅｓ、そうでない場合はＮｏと判定する。
第２の条件では、判定箇所２５の第１アクセスステートメントから第２アクセスステートメントまでの解析対象区間に含まれるすべてのステートメントの実行後の割込状態が「禁止」の場合にはＹｅｓ、そうでない場合にはＮｏと判定する。ここで、割込状態が「禁止」とは、いずれか一つの割込命令系によって割込状態が「禁止」であることを意味する。
条件１の判定結果がＹｅｓ、かつ条件２の判定結果がＮｏの場合には、割込干渉解析結果は「可能性有り」と決定する。そうでない場合には、割込干渉解析結果は「無し」と決定する。
【００９０】
割込状態推定リスト生成手段３２ａについて説明する。割込状態推定リスト生成手段３２ａは、同一パス判定手段１３で、解析結果が割込干渉無し以外の判定箇所について、制御フローグラフ２３を参照し、割込命令系の種類別に、判定箇所２５の低優先順位関数における各ステートメントの実行前、実行後の割込状態を求め、割込状態推定リスト４１を生成する。
【００９１】
次に、図２４〜図２７を参照しながら、割込干渉解析装置１０ａの動作の詳細について説明する。図２４は、割込干渉解析装置１０ａの動作の流れを示すフローチャートである。
【００９２】
まず、割込干渉解析装置１０ａは、解析対象取得処理（Ｓ３０１）を行う。解析対象取得処理（Ｓ３０１）は、第１の実施形態の解析対象取得処理（Ｓ１０１）と同様であるため説明を省略する。
【００９３】
Ｓ３０２では、割込干渉解析装置１０ａは、到達可能ステートメント集合算出処理を行う。到達可能ステートメント集合算出処理（Ｓ３０２）は、第１の実施形態の到達可能ステートメント集合算出処理（Ｓ１０２）と同様であるため説明を省略する。
【００９４】
次に、割込干渉解析装置１０ａは、同一パス判定処理（Ｓ３０３）を行う。同一パス判定処理（Ｓ３０３）は、第１の実施形態の同一パス判定処理（Ｓ１０３）と同様であるため説明を省略する。
【００９５】
割込干渉解析装置１０ａは、判定結果が同一パス上に無ければ、割込干渉解析装置１０ａは、判定箇所２５の判定箇所番号と割込干渉解析結果「無し」を対にして、割込干渉解析結果リスト６１に保持し、Ｓ３０９へ進む。
判定結果が同一パス上にあれば、割込干渉解析装置１０ａは、Ｓ３０５へ進む。
【００９６】
Ｓ３０５では、割込干渉解析装置１０ａは、制御フローグラフ２３を参照し、複数の割込命令系から１種類を取り出す。
【００９７】
次に、割込干渉解析装置１０ａは、判定箇所２５の低優先順位関数について、Ｓ３０５で取り出した割込命令系について割込状態推定リスト生成処理（Ｓ３０６）を行う。割込状態推定リスト生成処理（Ｓ３０６）は、第１の実施形態の割込状態推定リスト生成処理（Ｓ１０５）と同様であるため説明を省略する。
【００９８】
次に、割込干渉解析装置１０ａは、全ての割込命令系の種類を取り出したか判定する（Ｓ３０７）。
取り出していれば、Ｓ３０８へ進む。
取り出していない割込命令系の種類があれば、Ｓ３０５へ戻る。
【００９９】
次に、割込干渉解析装置１０ａは、割込干渉解析処理（Ｓ３０９）を行う。
図２５、図２６は、割込干渉解析手段１５ａによる割込干渉解析処理の流れを示すフローチャートである。図２７はプログラムの一例を示す図である。以下では、図２５、図２６の各ステップを説明しながら、図２７のプログラムに対する具体的な処理の内容も合わせて説明する。
尚、図２７に示す「Ｄｉｓｅｎａｂｌｅ１」は、種類１の割込禁止命令を示している。「Ｅｎａｂｌｅ１」は、種類１の割込許可命令を示している。「Ｄｉｓｅｎａｂｌｅ２」は、種類２の割込禁止命令を示している。
【０１００】
まず、割込干渉解析装置１０ａは、Ｓ３０６で生成した割込状態推定リスト４１を参照し、判定箇所２５の第１アクセスステートメントＬ１＊の実行前の割込状態を取得する（Ｓ４００）。ここで、Ｌ１＊の実行前の割込状態は、全種類の割込命令系について取得する。
【０１０１】
次に、割込干渉解析装置１０は、Ｌ１＊の実質的な実行前の割込状態算出処理を行う（Ｓ４０１）。ここで、Ｌ１＊の実質的な実行前の割込状態は、全種類の割込命令系について算出する。Ｓ４０１は、第１の実施形態の実質的な実行前の割込状態算出処理（Ｓ２０１）と同様であるため説明を省略する。
【０１０２】
次に、割込干渉解析装置１０ａは、Ｓ４０１で算出したすべて（全種類の割込命令系）の実質的な実行前の割込状態のうち、１つでも「禁止」があるか否か判定する（Ｓ４０２）。
「禁止」が１つも無ければ、Ｓ４０３へ進む。
「禁止」が１つでもあれば、Ｓ４０４へ進む。
図２７のプログラムでは、Ｌ１＊（＝Ｌ２）の実質的な実行前の割込状態は、「種類１」の割込許可命令において「禁止」となっていることから、Ｓ４０４へ進む。
【０１０３】
Ｓ４０３では、割込干渉解析装置１０ａは、判定箇所番号と割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
【０１０４】
Ｓ４０４では、割込干渉解析装置１０ａは、到達可能ステートメント集合リスト５１を参照し、判定箇所２５の第２アクセスステートメントＬ２＊の到達可能ステートメント集合をＡとする。
図２７のプログラムでは、Ｌ２＊＝Ｌ５であるから、Ａ＝｛Ｌ１、Ｌ２、Ｌ３、Ｌ４｝である。
【０１０５】
次に、割込干渉解析装置１０ａは、Ｓ４０４で求めた到達可能ステートメント集合Ａから、ステートメント番号Ｌｎを１つ取り出す（Ｓ４０５）。
次に、割込干渉解析装置１０ａは、到達可能ステートメントリスト５１を参照し、Ｓ４０５で取り出したステートメント番号Ｌｎの到達可能ステートメント集合が、第１アクセスステートメント番号Ｌ１＊を含んでいるか否か判定する（Ｓ４０６）。
含んでいる場合は、ステートメント番号Ｌｎを干渉解析対象リストＢに書込み、Ｓ４０８へ進む（Ｓ４０７）。
含んでいない場合は、Ｓ４０８へ進む。
【０１０６】
Ｓ４０８では、割込干渉解析装置１０ａは、到達可能ステートメント集合中のすべてのステートメントを取り出したか判定する。
すべて取り出した場合は、Ｓ４０９へ進む。
取り出していないステートメントがある場合は、Ｓ４０５へ戻る。
図２７のプログラムでは、Ａ＝｛Ｌ１、Ｌ２、Ｌ３、Ｌ４｝から取り出されるステートメント番号の到達可能ステートメント集合の中で、Ｌ１＊（＝Ｌ２）を含むのは、「Ｌ３、Ｌ４」である。従って、Ｂ＝｛Ｌ３、Ｌ４｝となる。
【０１０７】
Ｓ４０９では、割込干渉解析装置１０ａは、干渉解析対象リストＢから、ステートメント番号Ｌｋを１つ取り出す。
次に、割込干渉解析装置１０ａは、制御フローグラフ２３から、Ｓ４０９で取り出したステートメント番号Ｌｋが割込許可命令か否か調べる（Ｓ４１０）。
Ｌｋが割込許可命令であれば、Ｓ４１１へ進む。
Ｌｋが割込許可命令以外であれば、Ｓ４１２へ進む。
図２７のプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝のステートメントの中で、Ｌ３は割込許可命令ではないことから、Ｓ４１２へ進む。一方、Ｌ４は「種類１」の割込許可命令なので、Ｓ４１１へ進む。
【０１０８】
Ｓ４１１では、割込干渉解析装置１０ａは、ステートメント番号Ｌｋの割込許可命令の種類を、許可命令リストＣに書き込む。
図２７のプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝のステートメントの中で、Ｓ４１１に進むＬ４の割込命令系の種類が「種類１」なので、Ｃ＝｛種類１｝となる。
【０１０９】
Ｓ４１２では、割込干渉解析装置１０ａは、Ｓ４０９で取り出したステートメント番号Ｌｋが関数呼出命令か否か調べる。
Ｌｋが関数呼出命令であれば、Ｓ４１３へ進む。
Ｌｋが関数呼出命令以外であれば、Ｓ４１４へ進む。
図２７のプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝のステートメントの中で、Ｓ４１２に進むＬ３が関数呼出命令でないことから、Ｓ４１４へ進む。
【０１１０】
Ｓ４１３では、割込干渉解析装置１０ａは、呼出し先の関数に含まれている割込許可命令の割込命令系の種類を、許可命令リストＣに書き込む。
Ｓ４１４では、割込干渉解析装置１０ａは、干渉解析対象リストＢのすべてのステートメント番号を取り出したか調べる。
取り出していれば、Ｓ４１５へ進む。
取り出していなければ、Ｓ４０９に戻る。
【０１１１】
Ｓ４１５では、割込干渉解析装置１０ａは、許可命令リストＣに、第１アクセスステートメントＬ１＊の実行前の割込状態を「禁止」にしているすべての割込命令系の種類が存在するかどうか判定する。すなわち、第１アクセスステートメントＬ１＊と第２アクセスステートメントＬ２＊の間に、第１アクセスステートメントＬ１＊の実行前の割込状態を「禁止」にしている割込禁止命令と同じ種類の割込命令系の割込許可命令が全て存在するかどうか判定する。
判定結果がＮｏの場合、Ｓ４１６に進む。Ｓ４１６へ進むことは、前述した割込干渉解析手段１５ａの第１の条件による判定結果が「Ｎｏ」となることと同じである。
判定結果がＹｅｓの場合、Ｓ４１７へ進む。Ｓ４１７へ進むことは、前述した割込干渉解析手段１５ａの第１の条件による判定結果が「Ｙｅｓ」となることと同じである。
図２７に示すプログラムでは、Ｌ１＊の実行前の割込状態を「禁止」にしている割込命令系の種類は「種類１」である。また、割込許可命令リストＣは「種類１」を含む。従って、Ｓ４１５の判定結果はＹｅｓとなり、Ｓ４１７へ進む。
【０１１２】
Ｓ４１６では、割込干渉解析装置１０ａは、判定箇所番号と割込干渉解析結果「無し」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
Ｓ４１７では、割込干渉解析装置１０ａは、干渉解析対象リスト７１から、ステートメント番号Ｌｋを１つ取り出す。
次に、割込干渉解析装置１０は、Ｌｋが関数呼出し命令の場合、全ての割込命令系について、呼出し先に含まれるステートメントの実行後の割込状態のうち１つでも「禁止」が存在するか否か判定する（Ｓ４１８）。
判定結果がＮｏの場合、Ｓ４１９へ進む。
判定結果がＹｅｓの場合、Ｓ４２０へ進む。尚、Ｌｋが関数呼出し命令ではない場合、Ｓ４１８の判定を行わず、Ｓ４２０へ進む。
図２７に示すプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝のステートメントの中で、関数呼出し命令は存在しないことから、Ｓ４２０に進む。
【０１１３】
Ｓ４１９では、割込干渉解析装置１０ａは、判定箇所番号と割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
Ｓ４２０では、割込干渉解析装置１０ａは、割込状態推定リスト４１を参照し、全ての割込命令系について、Ｌｋの実行後の割込状態を取得し、１つでも「禁止」が存在するか否か判定する。
判定結果がＮｏの場合、Ｓ４２１へ進む。Ｓ４２１へ進むことは、前述した割込干渉解析手段１５ａの第２の条件による判定結果が「Ｎｏ」となることと同じである。
判定結果がＹｅｓの場合、Ｓ４２２へ進む。
図２７に示すプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝のステートメントの中で、Ｌ３の実行後の割込状態は、「種類１」が「禁止」、「種類２」が「禁止」である。また、Ｌ４の実行後の割込状態は、「種類１」が「許可」、「種類２」が「禁止」である。従って、Ｌ３とＬ４ともに、「禁止」が少なくとも１つ存在するので、Ｓ４２２に進む。
【０１１４】
Ｓ４２１では、割込干渉解析装置１０ａは、判定箇所番号と割込干渉解析結果「可能性有り」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
Ｓ４２２では、干渉解析対象リスト７１からすべてのステートメント番号を取り出したか否か判定する。
全てを取り出していたら、Ｓ４２３へ進む。Ｓ４２３へ進むことは、前述した割込干渉解析手段１５ａの第２の条件による判定結果が「Ｙｅｓ」となることと同じである。
取り出していないステートメント番号が存在すれば、Ｓ４１７へ戻る。
前述した通り、図２７に示すプログラムでは、Ｂ＝｛Ｌ３、Ｌ４｝の全てのステートメントに対してＳ４２０の判定結果がＹｅｓとなるので、Ｓ４２３に進む。
【０１１５】
Ｓ４２３では、割込干渉解析装置１０ａは、判定箇所番号と割込干渉解析結果「無し」を、割込干渉解析結果リスト６１に書き込み、割込干渉解析処理を終了する。
【０１１６】
ここで、２つの条件を併用して割込干渉有無を判定する割込干渉解析手段１５ａによる割込干渉解析処理（Ｓ３０８）の意義について説明する。前述した図２７のプログラムに対して、割込干渉解析手段１５ａの第１の条件による判定だけでは、Ｓ４１５の判定結果が「Ｙｅｓ」となり、割込干渉解析結果を「可能性有り」とするしかない。しかしながら、実際には、図２７のプログラムでは、第１アクセスステートメントから第２アクセスステートメントの間、いずれか一つの割込命令系によって割込状態が「禁止」になっているので、高優先順位関数は割込ができない。
割込干渉解析手段１５ａによる割込干渉解析処理（Ｓ３０８）では、第１の条件に加えて、第２の条件による判定も行う。これによって、前述した通り、図２７のプログラムに対して、割込干渉解析結果を「無し」と判定しているので、割込命令系が複数種類存在するプログラムに対して誤検知を削減する作用があると言える。
【０１１７】
図２４の説明に戻る。Ｓ３０９は、判定箇所リスト２２のすべての判定箇所２５を取り出したか否か判定する。
取り出していない判定箇所２５がある場合は、Ｓ３０３へ戻る。
すべての判定箇所２５を取り出した場合は、解析結果出力処理（Ｓ３１０）へ進む。解析結果出力処理（Ｓ３１０）は、第１の実施形態の解析結果出力処理（Ｓ１０８）と同様であるため説明を省略する。
【０１１８】
以上の通り、第２の実施形態に係る割込干渉解析装置１０ａは、２つの条件を併用して割込干渉有無を判定する。第１の条件では、判定箇所２５の第１アクセスステートメントから第２アクセスステートメントに到達可能なステートメント集合の中に、第１アクセスステートメントの実行前の割込状態を「禁止」にしている割込命令系の種類の割込許可命令が含まれているか否か判定する。第２の条件では、判定箇所２５の第１アクセスステートメントから第２アクセスステートメントに到達可能なステートメント集合に含まれるすべてのステートメントの実行後の割込状態が「禁止」であるか否か判定する。
これによって、割込干渉解析装置１０は、割込命令系が複数種類存在するプログラムに対して誤検知を減らし、割込干渉の有無を適正に検出することができる。
【０１１９】
以上、添付図面を参照しながら、本発明に係る割込干渉解析装置等の好適な実施形態について説明したが、本発明はかかる例に限定されない。当業者であれば、本願で開示した技術的思想の範疇内において、各種の変更例又は修正例に想到し得ることは明らかであり、それらについても当然に本発明の技術的範囲に属するものと了解される。
【符号の説明】
【０１２０】
１０、１０ａ………割込干渉解析装置
１１………解析対象情報取得手段
１２………到達可能ステートメント集合算出手段
１３………同一パス判定手段
１４………割込状態推定手段
１５、１５ａ………割込干渉解析手段
１６………解析結果出力手段
２１………プログラム
２２………判定箇所リスト
２３………制御フローグラフ
２４………解析結果ファイル
２５………判定箇所
４１、４１ａ、４１ｂ、４１ｃ………割込状態推定リスト
５１、５１ａ、５１ｂ、５１ｃ………到達可能ステートメント集合リスト
６１………割込干渉解析結果リスト
７１………関数呼出し元リスト
【図１】
2011191843.tif 000003
【図２】
2011191843.tif 000004
【図３】
2011191843.tif 000005
【図４】
2011191843.tif 000006
【図５】
2011191843.tif 000007
【図６】
2011191843.tif 000008
【図７】
2011191843.tif 000009
【図８】
2011191843.tif 000010
【図９】
2011191843.tif 000011
【図１０】
2011191843.tif 000012
【図１１】
2011191843.tif 000013
【図１２】
2011191843.tif 000014
【図１３】
2011191843.tif 000015
【図１４】
2011191843.tif 000016
【図１５】
2011191843.tif 000017
【図１６】
2011191843.tif 000018
【図１７】
2011191843.tif 000019
【図１８】
2011191843.tif 000020
【図１９】
2011191843.tif 000021
【図２０】
2011191843.tif 000022
【図２１】
2011191843.tif 000023
【図２２】
2011191843.tif 000024
【図２３】
2011191843.tif 000025
【図２４】
2011191843.tif 000026
【図２５】
2011191843.tif 000027
【図２６】
2011191843.tif 000028
【図２７】
2011191843.tif 000029