(57)【要約】      （修正有）【課題】ハードウェアの仕様等によらず、ソフトウェアによる書込競合の可能性のある領域を漏れなく抽出出来るソフトウェア評価システムを提供する。【解決手段】評価対象のソフトウェア１０１のソースコード１０２や機械語１０４を解析し、割込処理や外部アクセスとの書込処理を予測し、競合が発生する可能性のある箇所と、ライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域とを抽出し、競合領域候補とリードモディファイライト領域とから、重複する領域を検出して表示する。【選択図】図１
2019109688.tif 000002
【特許請求の範囲】
【請求項１】
評価対象のソフトウェアによる書き込みが競合する可能性がある箇所を検出するソフトウェア評価システムであって、
前記ソフトウェアを解析し、該ソフトウェアによる書き込みが競合する可能性がある候補に関する情報を競合領域候補として抽出して記憶する候補検出機能と、
前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域として記憶するリードモディファイライト領域抽出機能と、
前記競合領域候補と、前記リードモディファイライト領域とから重複する領域を検出する重複検出機能と、
前記重複検出機能によって検出された結果に基づいて、前記ソフトウェアにおける前記競合する可能性のあるライト処理が記述された位置の情報を出力する結果出力機能と
を備えたことを特徴とするソフトウェア評価システム。
【請求項２】
前記候補検出機能は、前記ソフトウェアのソースコード又は該ソースコードに対応する機械語で記述されたオブジェクトコードを読み込んで解析することを特徴とする請求項１に記載のソフトウェア評価システム。
【請求項３】
前記リードモディファイライト領域抽出機能は、前記ソフトウェアのソースコードに対応する機械語で記述されたオブジェクトコードを読み込んで解析することを特徴とする請求項１又は２に記載のソフトウェア評価システム。
【請求項４】
前記候補検出機能及び前記リードモディファイライト領域抽出機能に読み込まれて解析される前記ソフトウェアはアセンブラで記述されていることを特徴とする請求項１に記載のソフトウェア評価システム。
【請求項５】
前記候補検出機能は、
前記ソフトウェアを解析して、該ソフトウェアに含まれる割込ハンドラを検出する割込ハンドラ検出機能と、
指定された指定関数を対象として解析する関数解析機能とを有し、
前記関数解析機能は、
前記ソフトウェアを解析し、前記指定関数の処理内容コードが該ソフトウェア上のいずれに存在するかを探索する実体探索機能と、
前記指定関数を解析し、該解析の対象である解析対象関数が関数コールを含み、該コールされる関数がまだ指定されていないときには、該コールされる関数を指定関数として指定する呼出検出機能と、
前記指定関数を解析し、該指定関数に含まれるライト処理を検出し、該検出されたライトアクセスがなされる領域の情報と、該ライト処理が前記ソフトウェアにおいて記述された箇所を特定する情報を競合領域候補として記憶するライトアクセス領域検出機能とを有し、
前記割込ハンドラ検出機能によって検出された割込ハンドラは、指定関数として指定され、前記関数解析機能に渡されることを特徴とする請求項１乃至３のいずれか１項に記載のソフトウェア評価システム。
【請求項６】
前記割込ハンドラ検出機能は、
前記ソフトウェアを実現する機械語で記述されたオブジェクトコードを読み込み、
前記割込ハンドラのリターン命令を検出することで該割込ハンドラの終了箇所を検知し、該リターン命令から前記オブジェクトコードを遡って読み込み、該割込ハンドラの処理
コードを検出することを特徴とする請求項５に記載のソフトウェア評価システム。
【請求項７】
前記割込ハンドラ検出機能は、
前記ソフトウェアを実現する機械語で記述されたオブジェクトコードを読み込み、
前記ソフトウェアが実行されるマイコンについて割込ハンドラの先頭アドレスが定義されるアドレスを指定する割込ベクタ定義情報に基づいて割込ハンドラの先頭アドレスを特定することにより割込ハンドラを検出することを特徴とする請求項５に記載のソフトウェア評価システム。
【請求項８】
前記割込ハンドラ検出機能は、
前記ソフトウェアのソースコードをコンパイルして得られる機械語で記述されたオブジェクトコードを読み込み、
前記ソースコードをコンパイルするコンパイラごとの割込関数を定義する書式に基づいて割込ハンドラの先頭アドレスを特定することにより割込ハンドラを検出することを特徴とする請求項５に記載のソフトウェア評価システム。
【請求項９】
前記リードモディファイライト領域抽出機能は、
前記ソフトウェアを解析し、メモリから値を取得してレジスタへ格納するリード処理と、
前記リード処理により値が格納されたレジスタを用いた演算処理と、
前記リード処理において値を取得した前記メモリの領域に対して、前記演算処理において用いられたレジスタの領域に格納された値を書き込むライト処理と
を検出することにより、リードモディファイライト処理を特定し、前記ライト処理が前記ソフトウェアにおいて記述された記述位置及び書き込み先のメモリの領域をリードモディファイライト領域として記憶することを特徴とする請求項５乃至８のいずれか１項に記載のソフトウェア評価システム。
【請求項１０】
前記リード処理から、前記ライト処理までの処理が所定ステップ以上である場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項９に記載のソフトウェア評価システム。
【請求項１１】
前記リード処理を検出してから、前記ライト処理を検出するまでに、関数コール命令を検出した場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項９に記載のソフトウェア評価システム。
【請求項１２】
前記リード処理を検出してから、前記ライト処理を検出するまでに、他のメモリアドレスに対するリード処理又はライト処理を検出した場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項９に記載のソフトウェア評価システム。
【請求項１３】
前記割込ハンドラ検出機能は、割込ごとの割込優先度及び多重割込の禁止又は許可情報を検出する優先度検出機能を有し、前記候補検出機能は、前記ライトアクセスがなされる領域を特定する情報と関連付けて、前記割込ごとの割込優先度及び多重割込の禁止又は許可情報を、競合領域候補として記憶し、
前記リードモディファイライト領域抽出機能は、前記ソフトウェアを解析して、当該ソフトウェアに含まれる関数を特定する関数情報を取得する情報検出機能と、前記関数情報によって特定される関数を先頭から解析することによって、割込の許可又は禁止を定義する命令の情報を取得する可否検出機能とを有し、前記リードモディファイライト処理に含まれるライト処理を含む関数の関数情報及び該関数を解析して取得された割込の許可又は禁止を定義する命令に基づく割込の許可又は禁止に関する情報を、前記リードモディファイライト処理の前記ソフトウェアにおける記述箇所を特定する情報及び書き込み先の領域
を特定する情報に関連付けて、リードモディファイライト領域として記憶し、
前記結果出力機能は、前記重複検出機能によって検出された結果に対して、前記競合領域候補の情報と、前記リードモディファイライト領域の情報とに基づいて、リードモディファイライト処理による割込処理の発生の有無を判断する競合判断機能を有することを特徴とする請求項５乃至１２のいずれか１項に記載のソフトウェア評価システム。
【請求項１４】
前記結果出力機能は、
前記ソフトウェアにおける前記競合する可能性のあるライトアクセス処理が記述された位置を出力する場合に、
競合発生時に自らが書き込んだ情報が消されるライトアクセス処理、
競合発生時に他の関数が書き込んだ情報を消すライトアクセス処理、
又は、競合発生時に自らが書き込んだ情報が消されるライトアクセス処理及び他の関数が書き込んだ情報を消すライトアクセス処理
のいずれが記述された位置を出力するかを切り替える表示切替機能を有することを特徴とする請求項１３に記載のソフトウェア評価システム。
【請求項１５】
前記結果出力機能は、
前記優先度検出機能の検出結果と前記競合判断機能の検出結果を比較し、ライトアクセス処理との競合が発生した時に、該ライトアクセス処理が他のライトアクセス処理を打つ消す可能性のあるものか、該ライトアクセス処理が他のライトアクセス処理によって打ち消される可能性のあるものかについて、該ライトアクセス処理が前記ソフトウェアのいずれの位置に記述されるかと対応付けて記憶する関係性検出機能を有することを特徴とする請求項１４に記載のソフトウェア評価システム。
【請求項１６】
前記結果出力機能は、
前記関係性検出機能によって記憶された情報に基づき、
前記ソフトウェア上に競合の可能性のあるライト処理の記述箇所を表示するとともに、該ライト処理が打ち消す可能性のある箇所及び該ライト処理を打ち消される可能性がある箇所の少なくともいずれか一方を表示することを特徴とする請求項１５に記載のソフトウェア評価システム。
【請求項１７】
前記リードモディファイライト領域抽出機能は、
前記ソフトウェアを解析し、メモリから値を取得してレジスタへ格納するリード処理と、
前記リード処理により値が格納されたレジスタを用いた演算処理と、
前記リード処理において値を取得した前記メモリの領域に対して、前記演算処理において用いられたレジスタの領域に格納された値を書き込むライト処理と
を検出することにより、リードモディファイライト処理を特定し、前記ライト処理が前記ソフトウェアにおいて記述された記述位置及び書き込み先のメモリの領域をリードモディファイライト領域として記憶することを特徴とする請求項１乃至４のいずれか１項に記載のソフトウェア評価システム。
【請求項１８】
前記候補検出機能は、前記ソフトウェアを解析して、該ソフトウェアによる書き込みが、外部装置による書き込みと競合する可能性がある領域の情報を領域候補の情報として出力し、
前記リードモディファイライト領域抽出機能は、前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域の情報として出力することを特徴とする請求項１乃至４のいずれか１項に記載のソフトウェア評価シ
ステム。
【請求項１９】
前記候補検出機能は、
前記ソフトウェアを解析して、ｖｏｌａｔｉｌｅ宣言がなされた領域を抽出し、該ｖｏｌａｔｉｌｅ宣言される変数名と、該ｖｏｌａｔｉｌｅ宣言がなされた変数によるアクセスアドレスに関する情報を、ｖｏｌａｔｉｌｅ領域情報として記憶するｖｏｌａｔｉｌｅ領域検出機能と、
前記ｖｏｌａｔｉｌｅ領域情報のうち、前記ソフトウェアに含まれるリード処理との関係に関する条件を満たす情報を含む外部アクセス領域候補の情報として記憶するリードアクセス領域検出機能とを含むことを特徴とする請求項１８に記載のソフトウェア評価システム。
【請求項２０】
前記候補検出機能は、
前記ソフトウェアを解析して、リード処理がなされている領域を検出して、リードアクセス領域として記憶するリードアクセス領域検出機能と、
前記ソフトウェアを解析して、ライト処理がなされている領域を検出して、ライトアクセス領域として記憶するライトアクセス領域検出機能と、
前記リードアクセス領域と前記ライトアクセス領域とを比較し、前記リード処理と前記ライト処理が同一アドレスにアクセスし、かつ、アクセス対象ビットが異なる領域の情報を外部アクセス領域候補の情報として記憶する外部アクセス候補検出機能とを有することを特徴とする請求項１８に記載のソフトウェア評価システム。
【請求項２１】
請求項１乃至２０のいずれか１項に記載のソフトウェア評価システムとしてコンピュータを機能させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェアによるリソースへの書込競合のリスクを持つ箇所を検出するソフトウェア評価システムに関するものである。
【背景技術】
【０００２】
従来の、論理装置によるリソースへの書込競合のリスクを持つ箇所を検出する技術に、シミュレーションによる衝突検出の技術がある（たとえば、特許文献１参照）。
特許文献１は論理装置の動作シミュレーションに関する技術であるが、論理装置の設計仕様に基づき複数のスレッドをシミュレーションし、ハードウェアリソースに対するリード／ライト動作の競合状態を判定する技術が示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００２−２７９０１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
動的な検証は、処理のタイミングや、実行時の内部状態により処理内容が異なる。
ソフトウェアの書込競合はごく限られたタイミングでのみ発生する現象のため、動的な検証で検出するには様々な実行条件で検証を行う必要がある。
しかし複雑な制御を行うソフトウェアや、ソフトウェア上の多くの領域がソフトウェア外と双方向で書込を行うようなソフトウェアにおいては、全ての領域において書込競合が発生しないことを動的検証によって漏れなく評価することは非常に困難であった。
また、機器組込系ソフトウェア上では、書込の競合が発生するリスクを持つ領域と、そのリスクのない領域との区別がないため、静的に検証することが困難であった。このため従来は外部の機器と双方向から書き込む可能性のある領域について、設計仕様を設計者が解釈し、レビュー等で確認していた。しかし、設計者によるレビュー確認では、設計者のスキルや、見逃し、ハードウェアが変更される等の理由でレビュー後に外部の機器と双方向から書き込む可能性のある領域が変更される等の理由で十分な確認が出来るとは言えない。
【０００５】
本発明の目的は、ハードウェアの仕様等によらず、ソフトウェアによる書込競合の可能性のある領域を漏れなく抽出出来るソフトウェア評価システムを提供することにある。
【課題を解決するための手段】
【０００６】
上記目的を達成するために、本発明は、評価対象のソフトウェアによる書き込みが競合する可能性がある箇所を検出するソフトウェア評価システムであって、
前記ソフトウェアを解析し、該ソフトウェアによる書き込みが競合する可能性がある候補に関する情報を競合領域候補として抽出して記憶する候補検出機能と、
前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域として記憶するリードモディファイライト領域抽出機能と、
前記競合領域候補と、前記リードモディファイライト領域とから重複する領域を検出する重複検出機能と、
前記重複検出機能によって検出された結果に基づいて、前記ソフトウェアにおける前記競合する可能性のあるライト処理が記述された位置の情報を出力する結果出力機能と
を備えたことを特徴とする。
【０００７】
また、本発明は、上記ソフトウェア評価システムとしてコンピュータを機能させることを特徴とするプログラムである。
【発明の効果】
【０００８】
以上説明したように、本発明によれば、ハードウェアの仕様等によらず、書込競合の可能性のある領域を漏れなく抽出出来るようになる。
【図面の簡単な説明】
【０００９】
【図１】実施例１によるソフトウェア評価システム１００の機能ブロック図
【図２】実施例１〜６による連携装置を実現するハードウェア構成図
【図３】実施例１による競合領域候補検出機能１１０の処理のフローチャート
【図４】実施例１解析対象関数の情報の推移を説明する図
【図５】実施例１による割込処理との競合領域候補１３１を概念的に示す図
【図６】リードモディファイライト領域抽出機能１２０の処理を示すフローチャート
【図７】リードモディファイライト領域１３２を概念的に示す図
【図８】実施例５によるソフトウェア評価システム１００の機能ブロック図
【図９】実施例５による競合領域候補検出機能１１０の処理を示すフローチャート
【図１０】実施例１による検出結果出力機能の出力結果の一例
【図１１】実施例５による競合領域候補検出機能１１０の検知結果を概念的に示す図
【図１２】実施例６によるソフトウェア評価システム１００の機能ブロック図
【図１３】実施例６による競合領域候補検出機能１１０の処理を示すフローチャート
【図１４】実施例６によるリードアクセス領域情報の格納情報を概念的に示す図
【図１５】実施例４によるソフトウェア評価システム１００の機能ブロック図
【図１６】実施例２によるソフトウェア評価システム１００の機能ブロック図
【図１７】実施例２で割込ハンドラ検出機能１１１が関連付けて記憶する情報例
【図１８（Ａ）】実施例２によるリードモディファイライト領域１３２の一例
【図１８（Ｂ）】図１８（Ａ）を対応位置検出機能１４１によって置換した一例
【図１９】実施例２のリードモディファイライト領域抽出機能の処理フローチャート
【図２０】実施例２による競合有無判断機能１４３の一例
【図２１】実施例３によるソフトウェア評価システム１００の機能ブロック図
【図２２】実施例３の競合有無判断機能の出力結果をメモリアドレスでソートした例
【図２３】実施例３による割込ハンドラの定義を概念的に示す図
【図２４】実施例３による出力の一例を示す図
【発明を実施するための形態】
【実施例１】
【００１０】
以下に図面を参照して、この発明を実施するための形態を、実施例に基づいて例示的に詳しく説明する。本発明の趣旨を逸脱しない範囲内で実施例の構成を適宜変形したり変更したりすることにより得られる構成も本発明に含まれる。以下の複数の実施例の構成を適宜組み合わせて得られる構成も、本発明に含まれる。また、各実施例における機能および処理はそれぞれ単一のコンピュータ装置で実現してもよいし、必要に応じた複数のコンピュータ装置による分散処理によって実現するようにしてもよい。複数のコンピュータ装置で構成される場合は、互いに通信可能なようにＬｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ（ＬＡＮ）などで接続されている。あるいは、機能および処理の一部をクラウドコンピューティングによって実現してもよい。
本発明においてソフトウェア評価システムは、コンピュータシステム２０１上でプログラムを実行することで実現でき、そのハードウェア構成を図２に示す。図２の本体部２０２のハードディスク２０８には、ソフトウェア評価システムの各機能を実現するためのプ
ログラムが格納される。中央処理装置（ＣＰＵ）２０６は、プログラム及び各種データを主記憶装置２０７にロードして実行することで、コンピュータシステム２０１はソフトウェア評価システムとして動作する。なお、表示装置２０３は、本体部２０２からの指示により画面表示を行う。また、キーボード２０４は、このコンピュータシステム２０１にユーザの指示や文字情報を入力するためのものである。さらに、マウス２０５は、表示装置２０３上の任意の位置を指定することによりその位置に表示されていたアイコン等に応じた指示を入力するためのものである。本発明のソフトウェア評価システムを実現できるコンピュータシステムのハードウェア構成は図２のものに限られず、複数のコンピュータ装置を含むシステム等の種々のコンピュータシステムによって実現できる。なお、明細書及び図面を通じて、書込(書き込み)は、ライト（又はライトアクセス）と同義として用いる。また、読出（読出し）は、リード（又はリードアクセス）又は参照と同義として用いる。リソースとしてのメモリ等の記憶領域を単に領域という。
【００１１】
図１は本実施例によるソフトウェア評価システム１００の機能ブロック図である。
評価システム１００は、競合領域候補検出機能１１０、リードモディファイライト領域抽出機能１２０、重複領域検出機能１３０、検出結果出力機能１４０とからなる。
競合領域候補検出機能１１０は、評価対象ソフトウェア１０１を解釈し、割込処理内での書換領域を全て抽出し、これを割込処理との競合領域候補１３１として検出する。ここで、評価対象ソフトウェア１０１は、まず、Ｃ言語、Ｃ＋＋、アセンブリ言語などで記述されたソースコード１０２、及び、前記ソースコード１０２に対応する機械語で記述されたオブジェクトコード（以下、単に「機械語」という。）１０４を含む。評価対象ソフトウェア１０２はさらにソースコード１０２上のいずれの処理が機械語１０４のいずれの処理に展開されているのかを示す、ソースコードと機械語の対応情報１０３を含む。ここでは、競合領域候補検出機能１１０は、候補検出機能に対応する。また、重複領域検出機能１３０は、重複検出機能に対応する。
【００１２】
競合領域候補検出機能１１０は、割込ハンドラ検出機能１１１、指定関数解析機能１１８、指定関数実体探索機能１１９、呼出関数検出機能１１２、ライトアクセス領域検出機能１１３から構成される。ここで、指定関数解析機能１１８は、関数解析機能に対応する。また、呼出関数検出機能１１２は、呼出検出機能に対応する。
割込ハンドラ検出機能１１１は、評価対象ソフトウェア１０１を読み込み、評価対象ソフトウェア１０１上にいずれの割込ハンドラが存在するのかを検出する。割込ハンドラ検出機能１１１が、評価対象ソフトウェア１０１としてＣ言語やＣ＋＋等の高級言語を読み込む場合は、コンパイラごとの割込関数を定義する書式（割込関数定義書式）が存在する。このため、前記割込関数定義書式に従って割込ハンドラ名を取得することが出来る。
割込ハンドラ検出機能１１１が機械語１０４を読み込む場合は、割込ハンドラの情報は、以下（１）から（３）いずれかの方法で取得する。
（１）リターン命令を抽出する。
一般に、割込みハンドラからのリターン命令は、通常の関数のリターン命令とは異なる命令コードが割り当てられる。まず割込ハンドラ用のリターン命令を見つけ出すことで割込ハンドラの終了箇所を検知し、次いで当該関数の開始箇所を見つければ割込ハンドラの処理コードを特定できる。関数の開始箇所を見付ける処理は既存技術のため説明を省略する。
（２）割込みベクタから抽出する。
対象マイコンについて割込みハンドラの先頭アドレスがどのアドレスに定義されるかが指定された割込ベクタ定義情報を元に割込みベクタを特定する。
（３）コンパイラごとの割込関数定義書式を元に抽出する。
【００１３】
指定関数解析機能１１８は、評価対象ソフトウェア１０１のソースコード１０２または、機械語１０４を探索し、指定される関数の開始から終了までを解析する機能である。指
定関数解析機能１１８は、指定関数実体探索機能１１９、呼出関数検出機能１１２、ライトアクセス領域検出機能１１３の３つの機能を有する。ここで、指定関数実体探索機能１１８は、実体探索機能に対応する。
指定関数実体探索機能１１９は、指定される関数情報から、まず当該関数の処理内容コードが評価対象ソフトウェア１０１上のいずれに存在するのか探索する機能である。
ここで、指定関数解析機能１１８への関数の指定方法は、解析対象がソースコード１０２である場合はたとえばソースコード上の関数の名称、解析対象が機械語１０４である場合には、メモリ領域上の関数の実体アドレス等の方法がある。
前者では、指定関数解析機能１１８は、ソースコードを探索し、同名称の関数の実体の記述位置を取得する。後者では、指定関数解析機能１１８は、機械語１０４上の当該アドレスの情報を参照することで関数の実体の情報を取得する。
指定関数解析機能１１８は、指定される関数の実体を検出すると、当該関数の解析を開始する。
呼出関数検出機能１１２は、評価対象ソフトウェア１０１に記載される関数コールを検知する関数コール検出機能である。呼出関数検出機能１１２は、取得した関数情報を内部メモリに記憶する。ここで記憶する関数情報は、前記指定関数実体探索機能１１９が関数の実体を探索するのに足る情報とする。
ライトアクセス領域検出機能１１３は、評価対象ソフトウェア１０１を解析し、評価対象ソフトウェア１０１の書込処理のアクセスアドレス、及びアクセスバイト数を検出する機能である。評価対象ソフトウェア１０１がソースコードである場合は、書込処理が変数名でなされることがあるため、コンパイラによって生成されるアドレスマップから当該変数のリソースがメモリ領域上のいずれのアドレスに、何バイト分を割り振られているかを取得する。
競合領域候補検出機能１１０は、割込ハンドラ検出機能１１１によって検出した割込ハンドラ情報を、解析対象関数として指定関数解析機能１１８へ渡すことにより、指定関数解析機能１１８が当該割込ハンドラの実体を解析する。これにより、当該割込ハンドラに記述の関数コール処理とライトアクセス処理を抽出することが出来る。競合領域候補検出機能１１０は、全ての割込ハンドラ情報と、指定関数解析機能１１８内で検出した関数コール情報とを指定関数解析機能１１８へ渡すことで、割込ハンドラ及び、割込ハンドラ内のすべての下位関数の実体の解析が可能になる。競合領域候補検出機能１１０は、ライトアクセス領域検出機能１１３の検出結果を割込処理との競合領域候補１３１として内部メモリに記憶する。図５は割込処理との競合領域候補１３１の例である。メモリ領域上のアドレスを１バイト単位で記している。
【００１４】
リードモディファイライト領域抽出機能１２０は、評価対象ソフトウェア１０１における機械語１０４を解析し、評価対象のソフトウェアのリードモディファイライト処理を検出する。検出すると、機械語１０４のファイル上の記述位置、及びメモリ領域上のライトアクセスアドレス、及びアクセスバイト数をリードモディファイライト領域１３２として記憶する。
リードモディファイライト領域１３２の例を図７に示す。評価対象ソフトウェア１０１は複数ファイルで構成されることも有り得る。このため、ファイル名などのファイル特定情報、ライトアクセスが記載される行数情報、及びリードモディファイライトの対象となるメモリ領域上のライトアクセスアドレス、及びアクセスバイト数を関連づけて記憶している。
【００１５】
重複領域検出機能１３０は、前記割込処理との競合領域候補１３１と、前記リードモディファイライト領域１３２とを比較して検出結果を検出結果出力機能１４０へ渡す機能である。
重複領域検出機能１３０は、割込処理との競合領域候補１３１及びリードモディファイライト領域１３２に格納されている評価対象ソフトウェア１０１上のアクセスアドレス、
及びアクセスサイズを比較し、重なるアドレス領域があれば、重複領域と見なす。同一の領域が、ソフトウェア１０１上の複数個所でリードモディファイライト処理に展開されていることがあるため、リードモディファイライト領域１３２を全て検索して重複領域を検出する。
この処理を、割込処理との競合領域候補１３１に格納される領域全てに行う。重複領域検出機能１３０は、リードモディファイライト領域１３２の情報のうち、重複領域と見なした情報のみを検出結果出力機能１４０へ渡す。
【００１６】
検出結果出力機能１４０は、評価対象ソフトウェア１０１上のいずれの処理が書込競合の危険があるのかを示す機能であり、対応位置検出機能１４１と対応位置表示機能１４２を持つ。対応位置検出機能１４１は、機械語１０４のリードモディファイライト処理に対応するソースコード１０２の処理を検出する機能である。
リードモディファイライト領域抽出機能１２０が抽出するライトアクセス処理の記述位置情報は機械語１０４の位置情報である。このため、検出結果出力機能１４０は、対応位置検出機能１４１を用いて、検出結果に対するソースコード１０２上の処理位置情報を取得する。
ここで、対応位置検出機能１４１が読み込むソースコードと機械語の対応情報１０３は、コンパイラがコンパイル時に生成するものであって、このソースコードと機械語の対応情報１０３の生成方法は公知の技術によるため、詳述は省略する。
尚、今回は対応位置検出機能１４１を検出結果出力機能１４０へ持たせたが、リードモディファイライト領域抽出機能１２０へ持たせてもよい。その場合、リードモディファイライト領域抽出機能１２０は対象となるライトアクセス処理を検知すると、対応位置検出機能１４１を用いて対応するソースコード１０２上の処理位置情報を取得する。さらに、リードモディファイライト領域１３２へソースコード１０２上の処理位置情報、及びライトアクセスアドレス、及びライトアクセスバイト数を記憶する。
対応位置表示機能１４２は、検出結果と評価対象ソフトウェア１０１とを対応付けて表示する機能である。
図１０（Ａ）から（Ｃ）は対応位置表示機能１４２の一例である。
図１０（Ａ）は、ソースコード１０２と、重複領域検出機能１３０の検出結果を照合し、競合の可能性のある処理に印をつけて表示している。
また、図１０（Ｂ）および（Ｃ）は重複領域検出機能１３０の検出結果を一覧表で出力する例である。図１０（Ｂ）は検出結果をそのまま一覧表にしているのに対し、図１０（Ｃ）は書込処理の競合の危険のある領域に変数名を付加している。この変数名の取得方法は、ソースコード１０２における対象処理の記述箇所情報を既に持っているため、前記記述箇所にて書込処理がなされている変数名を取得することで実現できる。
尚、一覧表の表示形式は、図１０（Ｂ）（Ｃ）のように表形式でもいいし、テキストファイル様に示しても良い。また、図１０の（Ｂ）（Ｃ）の各行とソースコード１０２とを紐付けておき、ユーザによる入力機器からの操作によって、図１０（Ａ）のように当該記述箇所を表示してもよい。前記入力機器からの操作は、たとえばユーザがマウスで当該行をクリックする、キーボードで当該行を選択しＥｎｔｅｒボタンを押す等の操作が挙げられる。
【００１７】
本実施例を詳細に説明する。
図３、図４、図５は、競合領域候補検出機能１１０を説明する図である。
図３は本実施例の競合領域候補検出機能１１０の処理の概要を示すフローチャートであり、図４は割込ハンドラ検出機能１１１、及び呼出関数検出機能１１２が共通で使用する解析対象関数の情報の推移を説明する図である。図５は割込処理との競合領域候補１３１を概念的に示す図である。
競合領域候補検出機能１１０は、解析指示を受けて、評価対象ソフトウェア１０１を解析する（Ｓ３０１）。評価対象ソフトウェア１０１を順次解析し（Ｓ３０２）、割込ハン
ドラの定義情報を見付けるたびに（Ｓ３０３）、解析対象関数として、発見した割込ハンドラを解析対象関数のスタックに記憶する（Ｓ３０４）。
評価対象ソフトウェア１０１を全て解析し終えると、競合領域候補検出機能１１０は、Ｓ３０４で記憶した解析対象関数情報を見る（Ｓ３０５）。この時点で、解析対象関数の情報は図４の（Ａ）のようになる。図４（Ａ）は解析対象関数情報を、関数名と状態とで記憶している。状態は未解析、解析中、解析済の３つの状態を持つ。
未解析の解析対象関数が存在する場合には、評価対象ソフトウェア１０１を解析し、解析対象の関数の実体を探索する（Ｓ３０６）。
【００１８】
解析対象関数を見付けると、解析対象関数内の解析処理に移る。競合領域候補検出機能１１０は、解析対象関数を順次解析する。解析対象関数内にライトアクセスが有る場合には（Ｓ３０７）、割込処理との競合領域候補１３１を確認し、割込処理との競合領域候補１３１に登録済の領域か否かを確認する（Ｓ３０８）。未登録の場合は、割込処理との競合領域候補１３１に当該領域を評価対象ソフトウェア１０１上の記述位置と併せて格納する（Ｓ３０９）。割込処理との競合領域候補１３１の情報は、たとえば図５のようになる。図５は解析対象関数内でライトアクセスがなされるアドレス領域を記憶したものの概念図である。メモリアドレスを１バイト単位で記憶する。
Ｓ３０８において、ライトアクセス領域が既に割込処理との競合領域候補１３１に登録済みの場合は、再登録はせず次の処理（Ｓ３１０）へ進む。
次いで、競合領域候補検出機能１１０は、評価対象ソフトウェア１１０の解析対象関数の終端まで解析したか否かを確認する（Ｓ３１０）。
終端まで解析を終えていない場合は、再びＳ３０７へ戻り解析を続ける。
【００１９】
Ｓ３０７にてライトアクセスを発見しなかった場合、次いで解析中の処理命令が関数コール命令であるか否かを判断する（Ｓ３１１）。解析中の処理命令が関数コール命令であった場合、そのコールされる関数が解析対象関数のスタック内に存在するか否かを判断する（Ｓ３１２）。存在しない場合には、解析対象関数として、今発見したコールされる関数を解析対象関数のスタックへ登録する（Ｓ３１３）。この処理において、解析対象関数のスタックは図４の（Ｂ）のようになる。図４（Ｂ）は、解析中の割込みハンドラの関数名が「ｉｎｔｒ＿ＦｎｃＢ」、発見された関数名が「ＦｎｃＢ＿ｓｕｂＰｒｏｃ０１」である事例である。「ｉｎｔｒ＿ＦｎｃＢ」が「解析中」として登録されており、解析によって発見された関数「ＦｎｃＢ＿ｓｕｂＰｒｏｃ０１」が、解析対象関数情報の最後尾に「未解析」として追加登録される。
Ｓ３１２で登録済みの場合は、再登録はせず次の処理（Ｓ３１０）へ進む。
このようにして、競合領域候補検出機能１１０は、解析対象の関数を順次解析する。Ｓ３１０にて、解析対象の関数内を全て解析し終えたと判断したら、解析対象関数のスタックにて、現在解析中の関数の状態を「解析済」とし（Ｓ３１４）、再びＳ３０５へ戻って、次に解析すべき関数が有るか否かを判断する。
解析対象関数のスタック内全ての関数を解析し終えたら、割込ハンドラ及びその下位関数内のライトアクセス領域を全て記憶したとして、処理を終える。
【００２０】
次いで、リードモディファイライト領域抽出機能１２０について図６、図７を用いて述べる。
図６はリードモディファイライト領域抽出機能１２０の処理の概要を示すフローチャートであり、図７はリードモディファイライト領域１３２を概念的に示す図である。
リードモディファイライト領域抽出機能１２０は、評価対象ソフトウェア１０１の全ての処理を解析対象とする。
リードモディファイライト領域抽出機能１２０は、解析対象のソフトウェアを順次読み込み、まずソフトウェアに記載のリード処理を探す。具体的には、メモリから値を取得し、内部のレジスタへ格納する処理を探す（Ｓ６０１）。
Ｓ６０１にてリード処理を見付けると、次いで演算処理を探す。Ｓ６０１にて見付けられたリード処理において値を格納したレジスタに対して、当該レジスタを用いた演算処理を行っているか否かを判断する（Ｓ６０２）。この演算処理は数ステップに渡ることがあり、かつ演算の結果を別レジスタへ格納することがあるため、演算処理で値が格納されるレジスタを一時的に記憶する。
次いで、評価対象ソフトウェア１０１のライト処理を探す。評価対象ソフトウェア１０１がメモリへ書き込む処理を行っており、かつ書込先メモリ領域がＳ６０１で読み出した領域で、かつ書込値がＳ６０２で演算に使用した領域である場合に、リードモディファイライトのライト処理であると認識する（Ｓ６０３）。リードモディファイライト処理であると判断したら、当該ライト処理が記述される評価対象ソフトウェア１０１内の記述位置、及びライト領域とをリードモディファイライト領域１３２であるとして記憶する（Ｓ６０４）。
Ｓ６０１〜Ｓ６０３の条件を満たさない場合、すなわちＳ６０１からＳ６０３までの間に他の処理が入る場合には、リードモディファイライト処理ではないと判断する。具体的には、Ｓ６０１からＳ６０３までの間に関数コールや、他のメモリ領域へのリードアクセスまたはライトアクセスを行う場合はリードモディファイライト処理ではないと判断する。また、Ｓ６０１からＳ６０３までの処理が所定ステップ以上である場合も検出対象から除外する。
評価対象ソフトウェア１０１の全ての処理を解析したら、処理を終了する（Ｓ６０５）。
【００２１】
上記処理を終えた時のリードモディファイライト領域１３２の概念図が図７となる。図７は、機械語１０４上のライトアクセス処理位置、及びライトアクセスアドレス、及びライトアクセスバイト数を、ライトアクセス処理毎に対応付けて記憶している。
本実施例では、リードモディファイライト領域１３２の情報が評価対象ソフトウェア１０１の記述位置順に格納されているが、Ｓ６０４での記憶時に、ライトアドレス順に格納しても良い。
重複領域検出機能１３０は、割込処理との競合領域候補１３１、及びリードモディファイライト領域１３２とを比較し、重複する領域を全て抽出する。
ここで、重複する領域とは、部分的に重複するものも全て抽出対象とする。例えば、割込処理との競合領域候補１３１にメモリアドレス０ｘ２０００が格納されており、かつリードモディファイライト領域１３２にメモリアドレス０ｘ２０００−２００３へのライトアクセス情報が格納されている場合を例とする。このような場合には、領域０ｘ２０００−２００３へのライトアクセス情報は抽出対象である。
検出結果出力機能１４０は、重複領域検出機能１３０の結果と、評価対象ソフトウェア１０１を照合して、ソフトウェア上のいずれの処理が書込競合の危険があるのかを示す。
このとき、リードモディファイライト領域抽出機能１２０が解析する評価対象ソフトウェア１０１は機械語１０４であるため、検出結果出力機能１４０はソースコード１０２上の処理位置に置換して出力する。この処理については前述したため省略する。
【実施例２】
【００２２】
実施例１では、検出結果出力機能１４０は、書込競合の危険のある処理について、割込ハンドラ内外を問わずに表示していた。
しかしながら、たとえば割込ハンドラの優先度が全て等しい場合には、割込ハンドラ内に記述された書込処理は、競合によって自らの書込処理が打ち消されることは有っても、割込ハンドラ外での書込処理を打ち消すことはない。同様に、割込ハンドラ外に記述された書込処理は、競合によって割込ハンドラ内の書込処理を打ち消すことは有っても、自らの処理が打ち消されることはない。
また、割込ごとに優先度が設定されている場合は、割込ハンドラ同士でも競合が発生する可能性が有る。
本実施例では、多重割込の許可／不許可や割込の優先度、割込禁止区間を考慮して、競合の発生する可能性のある箇所を示す方法について述べる。
【００２３】
図１６は本実施例によるソフトウェア評価システム１００の機能ブロック図である。
評価対象ソフトウェア１０１、及びリードモディファイライト領域抽出機能１２０、重複領域検出機能１３０は実施例１と同一のため説明を省略する。
競合領域候補検出機能１１０における割込ハンドラ検出機能１１１は、割込優先度検出機能１２２を持つ。ここで、割込優先度検出機能１２２は、優先度検出機能に対応する。
割込優先度検出機能１２２は、ソースコード１０２または機械語１０４から、多重割込の許可／不許可情報や割込の優先度情報を検出する機能である。
多重割込の許可／不許可情報や割込ハンドラの優先度情報の取得方法は、割込ハンドラ名の取得方法と同様に、ソースコード１０２から取得する場合、及び機械語１０４から取得することが出来る。さらに、対象のＣＰＵの割込み仕様に基づく割込優先度の指定コードに従って取得することが出来る。
競合領域候補検出機能１１０は、割込ハンドラ検出機能１１１にて割込ハンドラを検出する際に、割込優先度検出機能１２２から多重割込の許可／不許可情報や割込の優先度情報を取得し、併せて記憶する。
【００２４】
図１７は、割込ハンドラ検出機能１１１が割込ハンドラ情報を記憶するときの、関連付けて記憶する情報の一例である。
解析対象関数情報を、関数名と状態、及び優先度と多重割込の許可／不許可の設定を関連づけて記憶している。
また、リードモディファイライト領域抽出機能１２０は、関数情報検出機能１２３及び割込可否検出機能１２４を持つ。ここで、関数情報検出機能１２３は、情報検出機能に対応する。また、割込可否検出機能１２４は、可否検出機能に対応する。
関数情報検出機能１２３は、機械語１０４に記載の関数の開始命令を検知し、当該関数の特定情報を取得する。たとえば、当該関数の開始時のメモリアドレス情報を取得する。
割込可否検出機能１２４は、機械語１０４に記載の、割込の許可／禁止を定義する命令を取得する。
リードモディファイライト領域抽出機能１２０は、リードモディファイライト領域１３２に格納する情報として、実施例１記載の情報に加えて、関数情報検出機能１２３で取得した関数特定情報と、割込可否検出機能１２４の割込の許可／禁止情報を関連づける。
【００２５】
リードモディファイライト領域抽出機能１２０がリードモディファイライト領域１３２を出力する処理について、図１９のフローチャートを用いて詳述する。
リードモディファイライト領域抽出機能１２０は、指示を受けて、機械語１０４を解釈開始する（Ｓ１９０１）。このとき、未解析の機械語１０４が有る限り、Ｓ１９０２からＳ１９０８の処理を行う（Ｓ１９０２）。
解釈した機械語１０４の命令が関数の開始命令の場合（Ｓ１９０３）、当該関数のメモリアドレス上の開始アドレスを記憶する。あわせて、リードモディファイライト領域抽出機能１２０は、処理開始時に持っている割込ハンドラの特定情報に従い、全ての割込ハンドラが関連付けられる割込の許可／禁止状態情報を、「許可」状態にする（Ｓ１９０４）。ここで、前記割込の許可／禁止状態情報は、リードモディファイライト領域抽出機能１２０が内部に持っている情報であり、評価対象ソフトウェア１０１の内部状態情報とは異なるものである。
リードモディファイライト領域抽出機能１２０は、リードモディファイライト領域１３２へ当該情報を出力し、最終的には検出結果出力機能１４０が競合の可能性を算出する際に使用する。検出結果出力機能１４０の処理については後述する。
機械語を解析し、当該命令が割込の許可／禁止を定義する命令であれば（Ｓ１９０５）、リードモディファイライト領域抽出機能１２０が内部に持っている割込の許可／禁止状
態情報を当該命令処理後の状態に更新する（Ｓ１９０６）。
Ｓ１９０５で解釈した機械語において当該命令が割込の許可／禁止を定義する命令でなければ、当該機械語が、リードモディファイライト処理のライト命令であるか否かを判断する（Ｓ１９０７）。解釈した機械語が当該ライト命令であった場合には、Ｓ１９０４で取得した関数の開始アドレスと、Ｓ１９０６で取得した割込の許可／禁止状態を、実施例１の情報に加えてリードモディファイライト領域１３２として出力する（Ｓ１９０８）。Ｓ１９０７で解釈した機械語がリードモディファイライト処理におけるライト命令ではない場合には、Ｓ１９０８をスキップする。Ｓ１９０２からＳ１９０８の処理を解釈する機械語が有る限り繰り返す。
【００２６】
図１８（Ａ）は、本実施例におけるリードモディファイライト領域１３２の一例である。
記述箇所、及びライトアクセス領域情報については実施例１で述べたため説明を省略する。
関数特定情報として、リードモディファイライト領域抽出機能１２０がＳ１９０４で取得した関数の開始アドレスを出力する。
また、割込禁止情報として、リードモディファイライト領域抽出機能１２０が内部に持っている割込の許可／禁止状態を出力する。
ここで、当該割込の許可／禁止状態は、リードモディファイライト処理におけるライト命令が為された時分における割込の許可／禁止状態である。
割込の許可／禁止状態は動的に変更されるため、書込処理の競合の可能性を判断するためには、ライト命令実行ごとの割込許可／禁止状態が必要である。
静的解析では、解析中の関数が呼び出されるときの割込許可／禁止状態を判断出来ない。そのため、関数が呼び出されたときには全ての割込ハンドラが割込許可なされているものとし、関数の先頭から当該ライト命令が記載されるまでの処理で割込禁止がなされているもののみを割込禁止状態の割込ハンドラとして取り扱う。
図１８（Ａ）では割込禁止命令がなされている割込関数情報として関数名を記載しているが、これは例であり、割込ハンドラを特定出来る情報が出力されればよい。
また、図１８（Ａ）で関数特定情報として当該関数のアドレスマップ上の先頭アドレスを記載したが、これに限られない。実施例１のように対応位置検出機能１４１をリードモディファイライト領域抽出機能１２０へ持たせる場合には、関数特定情報をソースコード１０２上の特定情報としてもよい。
【００２７】
図１６の機能ブロック図において、検出結果出力機能１４０は、対応位置検出機能１４１、及び対応位置表示機能１４２、及び競合有無判断機能１４３及び表示対象切替機能１４４を持つ。ここで、競合有無判断機能１４３は、競合判断機能に対応する。また、表示対象切替機能１４４は、表示切替機能に対応する。
対応位置検出機能１４１、及び対応位置表示機能１４２は実施例１で述べたため説明を省略する。
競合有無判断機能１４３は、重複領域検出機能１３０の検出結果を間引く機能である。競合領域候補検出機能１１０の割込優先度検出機能１２２の検出結果と、重複領域検出機能１３０の割込禁止情報とを比較し、当該リードモディファイライト処理の実行時に、割込が発生する可能性の有無を判断する。割込が発生しないと判断したライト命令については、ソースコードとの照合対象から除外する。
【００２８】
競合有無判断機能１４３の動作を例を用いて説明する。
例えば、割込優先度検出機能１２２の検出結果を図１７、図１８（Ａ）を対応位置検出機能１４１によってソースコード１０２の記述箇所及び関数特定情報に置換したものを図１８（Ｂ）とする。尚、図１８（Ｂ）の各要素に書込番号という数値情報を付加したが、これは本実施例の説明のためにユニークな数値を割り振ったもので、処理とは無関係であ
る。
競合有無判断機能１４３は、割込優先度検出機能１２２の検出結果とリードモディファイライト領域１３２とから、割込関数内での書込対象アドレスを、当該割込関数の割込優先度及び多重割込の許可状態と関連付けて記憶する。この例を図２０とする。
図２０は、評価対象ソフトウェア１０１のソースコード１０２における割込ハンドラはｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢ及びｉｎｔｒ＿ＦｎｃＣの３つのみである例を示す。図２０に示すように、ｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢ及びｉｎｔｒ＿ＦｎｃＣは、各々アドレス０ｘ１０００から０ｘ１００２、及び０ｘ１００８に対して書込処理を行っている。
次いで図１８（Ｂ）の各ライト命令情報と、図２０の割込ハンドラ内書込アドレス情報を比較して、競合の可能性の有無を判断する。
たとえば図１８（Ｂ）の関数特定情報がｉｎｔｒ＿ＦｎｃＡの情報（書込番号１から４）については、図２０のとおりｉｎｔｒ＿ＦｎｃＡの割込優先度が最高かつ多重割込が不許可であるため、書込処理の競合の可能性が無いと判断する。
また、図１８（Ｂ）の関数特定情報がｉｎｔｒ＿ＦｎｃＢの情報については、図２０によるとｉｎｔｒ＿ＦｎｃＡの割込優先度と同じだが、多重割込が許可されているため、ｉｎｔｒ＿ＦｎｃＡまたはｉｎｔｒ＿ＦｎｃＢが呼び出される可能性が有る。図１８（Ｂ）において、ｉｎｔｒ＿ＦｎｃＢのライト命令情報は書込番号１２及び書込番号１３である。書込番号１２のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がないことから、ｉｎｔｒ＿ＦｎｃＡまたはｉｎｔｒ＿ＦｎｃＢが呼び出されると書込処理の競合が発生する可能性が有ると言える。
書込番号１３のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢであるため、書込処理の競合が発生する可能性が無いと言える。
また、書込番号７及び８のライト命令情報は、割込処理内の処理実行時に割込禁止命令がなされている割込関数情報がｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢであるため、書込処理の競合が発生する可能性が無いと言える。
書込番号９のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢであり、かつ自身も多重割込が禁止されているため、書込処理の競合が発生する可能性が無いと言える。
書込番号１０のライト命令情報は、割込関数ではないが、処理実行時に割込禁止命令がなされている割込関数情報がｉｎｔｒ＿ＦｎｃＡ及びｉｎｔｒ＿ＦｎｃＢ及びｉｎｔｒ＿ＦｎｃＣであり、全ての割込関数が禁止されていると判断出来る。このため、書込処理の競合が発生する可能性が無いと言える。
競合有無判断機能１４３は、以上のようにして重複領域検出機能１３０の検出結果を間引く。
【００２９】
表示対象切替機能１４４は、外部からの指示を受け、ソースコード１０２との照合範囲を切り替える機能である。
前述のとおり、リードモディファイライト処理におけるライト命令には、競合発生時に自らが書き込んだ情報が消されるもの、及び他関数が書き込んだ情報を消してしまうものが存在する。
表示対象切替機能１４４は、外部からの指示に従い、ソースコード１０２との照合対象を以下（１）から（３）のいずれかとする。
（１）競合発生時に自らが書き込んだ情報が消されるもののみを表示させる。
（２）競合発生時に他関数が書き込んだ情報を消してしまうもののみを表示させる。
（３）競合発生時に自らが書き込んだ情報が消されるもの、他関数が書き込んだ情報を消してしまうものの両方を表示させる。
（１）は割込ハンドラ内の書込処理が対象となる。
重複領域検出機能の検出結果には、各ライト処理がなされる関数特定情報が付随されて
いるため、前記関数特定情報と、割込ハンドラ検出機能１１１の検出結果から、前記対象の書込処理のみをソースコード１０２と照合する。
（２）は割込ハンドラ外の書込処理や、複数の割込ハンドラ内で書込処理がなされる場合の、優先度が低い割込ハンドラにおける書込処理が対象となる。
重複領域検出機能の検出結果には、各ライト処理がなされる関数特定情報が付随されているため、前記関数特定情報と、割込ハンドラ検出機能１１１の検出結果から、前記対象の書込処理のみをソースコード１０２と照合する。
（３）は競合有無判断機能１４３の判断結果をソースコード１０２との照合対象とする。
以上のようにして、多重割込の許可／不許可や割込の優先度、割込禁止区間を考慮して、競合の発生する可能性のある箇所を示すことが出来る。
【実施例３】
【００３０】
実施例２では、検出結果出力機能１４０に於いて、外部からの指示に従い、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものを選択的に表示する方法について述べた。
本実施例では、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものについて関係性を調査し、ソースコード１０２上のどの処理が競合に影響し合うのかを表示する方法について述べる。
図２１は本実施例によるソフトウェア評価システム１００の機能ブロック図である。
検出結果出力機能１４０は、実施例２の各機能に加え、関係性検出機能１４５を持つ。
関係性検出機能１４５は、書込処理の競合が発生したときに、書込処理を打ち消すものと、当該書込処理によって書込処理が打ち消されるものについて、各々の処理がソースコード１０２上のいずれの箇所に記述されるのかを対応付けて記憶する機能である。
関係性検出機能１４５は、競合領域候補検出機能１１０の割込優先度検出機能１２２の検出結果と、競合有無判断機能１４３の検出結果を比較することで関係性を取得する。
関係性検出機能１４５は、競合有無判断機能１４３の出力結果を読み込み、ライトアクセス領域毎に情報をソートする。競合有無判断機能１４３の出力結果には、ライトアクセス領域のアドレス情報、アクセスバイト数、そのライトアクセスを行う関数特定情報、ソースコード１０２上の記述位置情報が格納される。このため、メモリアドレスの１バイト毎にソートすると、そのアドレスへ書込処理を行う関数がいずれか、及び記述位置が分かる。
【００３１】
図２２は、競合有無判断機能１４３の出力結果をメモリアドレスの１バイト毎にソートした例である。メモリアドレス１バイトごとに、当該アドレスへの書込処理を行う関数の識別情報、及び当該関数内でのソースコード１０２上の記述位置情報を持つ。同一関数内の複数個所で書込処理を行うことが有る。
図２２は、アドレス０ｘ１０００について関数ｉｎｔｒ＿ＦｎｃＡでは５箇所での書込処理がなされていることを示している。
また、ソースコード１０２には２バイトや４バイトなどの多バイトでアクセスする記述がなされることがある。その場合は、異なるアドレスについて同一の記述箇所情報が格納される。たとえば、図２２のアドレス０ｘ１０００、及び０ｘ１００１のｉｎｔｒ＿ＦｎｃＢの記載行１５０、１８０、２２０が多バイトアクセスを示している。
ここで、割込ハンドラの定義が図２３（Ａ）のとおりだとすると、自関数の処理中に割込が発生する可能性のある割込ハンドラ情報は、図２３（Ｂ）のとおりである。
ｉｎｔｒ＿ＦｎｃＡは割込優先度が最高で、かつ多重割込を禁止していることから、ｉｎｔｒ＿ＦｎｃＡの処理中に他の割込処理が発生することはない。
ｉｎｔｒ＿ＦｎｃＢは割込優先度は最高だが、多重割込を許可しているため、自らを含めて、割込優先度が同レベルの割込処理が発生することが有り得る。
割込ハンドラがｉｎｔｒ＿ＦｎｃＡからｉｎｔｒ＿ＦｎｃＦまでで全てだとすると、そ
の他の関数、すなわち割込ハンドラ外の関数についても、競合が発生する可能性のある割込ハンドラはｉｎｔｒ＿ＦｎｃＡからｉｎｔｒ＿ＦｎｃＦまでとなる。
検出結果出力機能１４０は、対応位置表示機能１４２にてソースコード１０２上に競合の可能性のある書込処理を提示する際に、図２２のソート情報に基づき、以下のとおり表示する。
（１）表示中の関数の処理中に割り込まれる可能性が有る割込ハンドラでの書込処理
書込処理を打ち消してしまう可能性が有る処理として表示する。
（２）表示中の関数が割込ハンドラで、かつ表示中の関数の処理中に割り込まれる可能性がない関数での書込処理
書込処理を打ち消されてしまう可能性が有る処理として表示する。
【００３２】
図２４は、本実施例の出力の一例を示す図である。
図２４では、ソースコード１０２が割込ハンドラｉｎｔｒ＿ＦｎｃＣ上でグローバル変数ｖａｌ＿１への書込処理を行っている。
検出結果出力機能１４０は、ソースコード１０２上に競合の可能性がある書込処理としてｖａｌ＿１への書込処理を黒枠でくくって表示している。それとともに、書込処理が打ち消す可能性が有る箇所、及び書込処理を打ち消される可能性のある箇所を併記している。
【００３３】
例では書込処理を打ち消す可能性が有る箇所、及び書込処理を打ち消される可能性のある箇所を併記しているが、いずれか一方を表示しても良いし、評価システム１００外部からの入力に従い表示／非表示を切り替えても良い。たとえば、評価システム１００に、「表示する」ボタンを設け、ユーザが「表示する」ボタンにたとえばマウスでクリックする等の働きかけを行うと表示するようにしてもよい。また、ユーザが当該黒枠にくくられた範囲にマウスなどでカーソルを重ねあわせたときのみ表示させるようにしてもよい。
尚、本実施例では、関係性検出機能１４５が競合有無判断機能１４３の出力結果を読み込んで処理を行うものとしたが、これは例であり、読み込み対象の情報は競合有無判断機能１４３の出力結果に限定しない。競合有無判断機能１４３からは書込処理がなされる関数特定情報、及びソースコード１０２上の記述箇所、書込アドレス情報を得ているため、前記情報を持つ情報であれば、前記競合有無判断機能１４３にかわり、処理が可能である。具体的には、重複領域検出機能１３０の検出結果や、対応位置検出機能１４１による処理の前後の情報いずれかなどを読み込み対象としてもよい。
以上のようにして、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものについて関係性を調査し、ソースコード１０２上のどの処理が競合に影響し合うのかを表示することが出来る。
【実施例４】
【００３４】
実施例１では評価対象ソフトウェア１０１がコンパイル対象のソースコード１０２で記述されることを前提としていた。
ここでは評価対象ソフトウェア１０１がアセンブラで記述されるときの評価対象ソフトウェア１０１におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出するシステムについて述べる。
図１５は本実施形態によるソフトウェア評価システム１００の機能ブロック図である。
評価対象ソフトウェア１０１はアセンブリ言語で記述されるソースコード１０２を持つ。
また、検出結果出力機能１４０は、対応位置表示機能１４２を持つ。対応位置表示機能１４２については実施例１で述べた通りのため、説明は省略する。
【００３５】
競合領域候補検出機能１１０は、アセンブリ言語で記述されるソースコード１０２を解釈し、割込処理との競合領域候補１３１を出力する。
リードモディファイライト領域抽出機能１２０も、同様にアセンブリ言語で記述されるソースコード１０２を解釈し、リードモディファイライト領域１３２を出力する。
競合領域候補検出機能１１０及びリードモディファイライト領域抽出機能１２０がソースコード１０２を解釈する方法については、実施例１の機械語を解釈する方法と同様であるため説明を省略する。
重複領域検出機能１３０についても実施例１と同様であるため説明を省略する。
検出結果出力機能１４０は、重複領域検出機能１３０から検出結果を受け取ると、前記検出結果情報とアセンブリ言語で記述されるソースコード１０２とを照合し、ソースコード１０２における書込競合の可能性のある処理を表示する。
ここで、競合領域候補検出機能１１０と、リードモディファイライト領域抽出機能１２０が解釈するソースコードは同一である。また、実施例１と異なり、最終的に検出結果出力機能が、競合の可能性のある処理として表示する対象のソースコードも、前記競合領域候補検出機能１１０と、リードモディファイライト領域抽出機能１２０が解釈するソースコードと同一である。
従って、実施例１で必要だった対応位置検出機能１４１は不要となり、競合領域候補検出機能１１０は重複領域検出機能１３０から渡されるソースコード上の処理位置（ファイル名、記載行等）に従って結果を表示することが出来る。
以上のようにして、評価対象ソフトウェア１０１がアセンブラで記述されるときの評価対象ソフトウェア１０１におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出することが出来る。
【実施例５】
【００３６】
実施例１、２、３では、評価対象ソフトウェア１０１におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出するシステムについて述べた。
実施例５では、評価対象ソフトウェア１０１におけるリードモディファイライト処理と、評価対象ソフトウェア１０１の外部（以後、外部装置と記載する）からの変更処理との競合の可能性のある処理を抽出するシステムについて述べる。
評価対象ソフトウェア１０１を人が読み書きしやすい言語で記述し、対象機器が実行可能な言語に変換するためにコンパイルするものがある。
コンパイルの際に、評価対象ソフトウェア１０１上で取り扱うグローバル変数はコンパイラの任意の領域に割り振られる。
しかしながら、評価対象ソフトウェア１０１が外部装置と共通で使用する領域については、評価対象ソフトウェア１０１が所定領域にアクセスする必要が有る。
このため、コンパイル後のリソース割り振り位置をコンパイラへ指定する定義方法として、ｖｏｌａｔｉｌｅ宣言というものが存在する。ｖｏｌａｔｉｌｅ宣言により、ソフトウェアは指定領域へアクセスすることが出来たり、任意のグローバル変数のリソースを指定領域へ割り振ることが出来るようになる。
また、ｖｏｌａｔｉｌｅ宣言することにより、コンパイラの最適化により該当領域を一時領域（レジスタ等）に置き換えられることを防ぐことができる。
【００３７】
本実施例では、このｖｏｌａｔｉｌｅ宣言に着目し、ｖｏｌａｔｉｌｅ宣言がなされている領域は、すなわちリソースが別領域に割り振られると困る領域であって、ソフトウェア外部と共用する領域の可能性があると判断する。
更に、外部装置との書込処理の競合が発生して困る領域というのは、評価対象ソフトウェア１０１が外部装置の出力値を参照し、かつ自らも同領域を更新する領域に限られる。
外部装置とメモリ領域を共有していたとしても、評価対象ソフトウェア１０１が当該領域に参照のみを行い、書き込まない場合には、リード／モディファイ／ライト処理がそもそも存在しないため問題が無い。
本実施例では、ｖｏｌａｔｉｌｅ宣言がなされる領域のうち、評価対象ソフトウェア１
０１がリードアクセスする領域であって、リードモディファイライト命令に展開される箇所を、外部装置との競合が発生する可能性が有る領域として報知する方法を説明する。
【００３８】
図８は本実施形態によるソフトウェア評価システム１００の機能ブロック図である。
評価対象ソフトウェア１０１、及び検出結果出力機能１４０は、実施例１と同一であるため説明を省略する。
競合領域候補検出機能１１０は、ｖｏｌａｔｉｌｅ領域検出機能１１４と、リードアクセス領域検出機能１１５とからなる。
ｖｏｌａｔｉｌｅ領域検出機能１１４は、評価対象ソフトウェア１０１のソースコード１０２を読み込み、ｖｏｌａｔｉｌｅ宣言される変数名、及びアクセスアドレスを検出する。この検出結果を図示しないｖｏｌａｔｉｌｅ領域情報として記憶する。ｖｏｌａｔｉｌｅ宣言がアクセスアドレスに対して行われる場合には、アクセスサイズが複数バイト数に渡ることがあるため、１バイト単位で記憶する。
リードアクセス領域検出機能１１５は、前記ｖｏｌａｔｉｌｅ領域情報のうち、以下（１）または（２）の条件を満たす領域情報を外部アクセス領域候補１３１として記憶する。
（１）リードアクセス処理がなされる変数名が前記ｖｏｌａｔｉｌｅ領域情報に格納される変数名と同一である。
（２）リードアクセスアドレス及びリードアクセスバイト数から、前記ｖｏｌａｔｉｌｅ領域情報に格納されるアクセスアドレスと重なる。
リードモディファイライト領域抽出機能１２０及びリードモディファイライト領域１３２は、実施例１と同一であるため説明を省略する。
重複領域検出機能１３０は、外部アクセス領域候補１３１とリードモディファイライト領域１３２のアドレス情報を比較し、重複する領域を書込処理の競合が発生する可能性が有る領域として検出し、検出結果を検出結果出力機能１４０へ渡す。
【００３９】
図９は本実施例の競合領域候補検出機能１１０の処理の概要を示すフローチャートである。
競合領域候補検出機能１１０は、解析指示を受けて、評価対象ソフトウェア１０１のソースコード１０２を解析する（Ｓ９０１）。
前記ソースコード１０２を順次解析し（Ｓ９０２）、ｖｏｌａｔｉｌｅ宣言される定義情報を見付けるたびに（Ｓ９０３）、ｖｏｌａｔｉｌｅ領域情報として、発見したメモリアドレスを１バイト単位で記憶する（Ｓ９０４）。このとき記憶するｖｏｌａｔｉｌｅ領域情報の例を図１１（Ａ）に示す。
図１１（Ａ）はｖｏｌａｔｉｌｅ領域情報として、発見したメモリアドレスを１バイト単位で記憶しているものである。ｖｏｌａｔｉｌｅ宣言される定義情報が「０ｘ１００２から２バイト」のように複数バイトで定義される場合は、「０ｘ１００２」及び「０ｘ１００３」という複数のメモリアドレスとして記憶する。
競合領域候補検出機能１１０は、ソースコード１０２を全て解析し終えると、評価対象ソフトウェア１０１を再度解析する処理に移る。
ここで、Ｓ９０１からＳ９０４の処理は解析対象として評価対象ソフトウェア１０１のソースコード１０２を解析したが、以後の処理は、ソースコード１０２で行っても機械語１０４で行っても構わない。
競合領域候補検出機能１１０は、評価対象ソフトウェア１０１を解析し（Ｓ９０５）、評価対象ソフトウェア１０１における参照処理を探索する。評価対象ソフトウェア１０１における参照処理を見付けると（Ｓ９０６）、ｖｏｌａｔｉｌｅ領域情報として記憶したアドレスを参照し、解析中のソフトウェアの参照メモリアドレスと一致するか否かを調べる。参照処理のリードアクセスサイズが複数バイトにまたがる場合は、全てのアクセスアドレスについて調査する（Ｓ９０７）。
ｖｏｌａｔｉｌｅ領域情報と、リードアクセス領域が重なる場合には、重なるメモリア
ドレスについて、外部アクセス領域候補１３１へ格納する。ただし対象のメモリアドレスが外部アクセス領域候補１３１へ既に格納済の場合は格納せずＳ９０５へ戻る（Ｓ９０８）。重なる参照先の領域がとして未だ格納されていない領域である場合のみ外部アクセス領域候補１３１へ格納する（Ｓ９０９）。
Ｓ９０５からＳ９０９の処理を、評価対象ソフトウェア１０１の全てに対して行うと、外部アクセス領域候補１３１は、図１１（Ｂ）のような、前記ｖｏｌａｔｉｌｅ領域情報図１１（Ａ）を間引いたものとなる。
重複領域検出機能１３０は、前記外部アクセス領域候補１３１と、リードモディファイライト領域１３２の情報を比較して、重複する領域を検出する。当該処理を含め、以降の処理は実施例１と同様のため説明を省略する。
以上のようにして、評価対象ソフトウェア１０１の外部装置からの変更処理との競合の可能性のある処理を、評価対象ソフトウェア１０１のソースコード１０２と照合して示すことが出来る。
【実施例６】
【００４０】
実施例５では、外部装置がアクセスする可能性のある領域を推測する方法として、ｖｏｌａｔｉｌｅ宣言に着目した。
実施例６では、外部装置がアクセスする可能性のある領域を推測する方法として、ソフトウェアが読み出し処理のみを行う領域に着目する方法について述べる。ここでいう領域とはソフトウェアのアクセス単位を示す。すなわち、ソフトウェアが当該領域に対して読出しのみを行っているということは、ソフトウェアの「外部」から変更される領域であると推測し、当該領域に着目する。これに対してＣＰＵがアクセス可能な単位がソフトウェアのアクセス単位と一致しない場合には、次のような場合に競合が発生し得る。すなわち、ＣＰＵによるアクセス領域内に前述のソフトウェアにより読出しのみ行っている領域と、それとは異なる、ソフトウェアによる書込を行っている領域が存在する場合である。
ソースコードと、コンパイルにより生成される機械語とで、ライトアクセスのバイト数が異なる場合がある。
以下に例を２つ挙げる。
第１の例として、ビットフィールドで定義される領域を挙げる。
ビットフィールドで定義される領域について、ソースコード上はあたかもビットアクセスしているように記述することが可能である。
しかしメモリや外部リソースに対するビット単位でのアクセス命令を持たないＣＰＵの場合には、ビットアクセス命令をコンパイラがリードモディファイライト処理に展開することにより複数ステップでビット単位のアクセス処理を実現している。
ここで、外部装置との書込処理の競合が発生すると、ソフトウェアは外部装置の書込値を検知することが出来ない。
第２の例として、マイコンのアクセス境界仕様やコンパイラの最適化処理が挙げられる。
ソースコード上は１バイトアクセスで記載されていても、コンパイル時に２バイトや４バイト等の異なるアクセスバイト数の処理に展開されることがある。
このとき、ソフトウェア作成者が意図しない範囲まで書込処理を行ってしまうことになり、外部装置との書込処理の競合が発生する可能性が生じる。
この問題を解決するため、本実施例では、ソフトウェアが意図して読み出し及び書き込みを行っているアドレスを検出し、前記意図しているアドレスのうち読出処理のみを行っているアドレスを「外部装置からの変更処理があるアドレス」として検出する。その後、当該ソフトウェアと対応する機械語について、リードモディファイライト領域での書込アドレスを検出して、先に検出した「外部装置からの変更処理があるアドレス」と一致する処理を「外部装置との書込処理の競合が発生する可能性がある処理」とする。ここで算出した「外部装置との書込処理の競合が発生する可能性がある処理」を、ソースコードと照合して表示する。
【００４１】
図１２は本実施形態によるソフトウェア評価システム１００の機能ブロック図である。
評価対象ソフトウェア１０１、及びリードモディファイライト領域抽出機能１２０、リードモディファイライト領域１３２、重複領域検出機能１３０、検出結果出力機能１４０は実施例４と同一のため説明を省略する。
競合領域候補検出機能１１０は、リードアクセス領域検出機能１１６及びライトアクセス領域検出機能１１７及び外部アクセス領域候補検出機能１２１を持つ。ここで、外部アクセス領域候補検出機能１２１は、外部アクセス候補検出機能に対応する。
リードアクセス領域検出機能１１６は、評価対象ソフトウェア１０１のソースコード１０２を解析し、前記ソースコード１０２によるリードアクセス処理が為されている領域について抽出する機能である。
ライトアクセス領域検出機能１１７は、評価対象ソフトウェア１０１のソースコード１０２を解析し、前記ソースコード１０２によるライトアクセス処理が為されている領域について抽出する機能である。
外部アクセス領域候補検出機能１２１は、リードアクセス領域検出機能１１６が検出したリードアクセス領域と、ライトアクセス領域検出機能１１７が検出したライトアクセス領域とを比較する。そして、同一アドレスについて両者がアクセスしており、かつアクセス対象ビットが異なる領域を外部アクセス領域候補１３１として抽出する。
【００４２】
図１３は本実施例の競合領域候補検出機能１１０の処理の概要を示すフローチャートである。
競合領域候補検出機能１１０は、解析指示を受けて、評価対象ソフトウェア１０１のソースコード１０２を解析する（Ｓ１２０１）。
前記ソースコード１０２を順次解析し（Ｓ１２０２）、参照処理を見付けるたびに（Ｓ１２０３）、リードアクセス領域情報として、発見したメモリアドレスを１バイト単位で記憶する（Ｓ１２０４）。詳述しないが、本実施例でも実施例１と同様に、ソースコード上における当該参照処理の記述位置の情報も記憶しておく。
このとき、ソースコード１０２がビットフィールド定義される場合は、アクセス対象ビットを合わせて記憶する。
【００４３】
リードアクセス領域情報の例を図１４に示す。
リードアクセス領域情報は、アドレス、及びバイトアクセスかビットアクセスかを示す情報、及びビットアクセス時にのみ格納されるリードアクセス対象ビット情報を格納する。
アドレス０ｘ１０００は、ビットフィールド定義される領域へのリードアクセスを示す。ソースコード１０２にはビット０からビット４までのリードアクセスが為されていることを示す。
アドレス０ｘ１００１は、ビット４のみにリードアクセスが為されていることを示す。
アドレス０ｘ１００３、０ｘ１００４、０ｘ１００８、０ｘ１００Ａ、０ｘ１００Ｂはソースコード１０２はバイトアクセスしていることを示す。ソースコード１０２には「０ｘ１００Ａから２バイト」と言った多バイトアクセスが記載されていることがあるが、リードアクセス領域情報には１バイト単位で情報を格納する。
【００４４】
競合領域候補検出機能１１０は、ソースコード１０２を全て解析し終えると、評価対象ソフトウェア１０１を再度解析する処理に移る。
競合領域候補検出機能１１０は、評価対象ソフトウェア１０１を解析し（Ｓ１２０５）、評価対象ソフトウェア１０１における書込処理を探索する。評価対象ソフトウェア１０１における書込処理を見付けると（Ｓ１２０６）、書込アドレス及び書込サイズまたは書込対象ビットを取得する。
前記書込アドレスと、前記リードアクセス領域とを比較し、一致する領域またはビット
があれば（Ｓ１２０７）、リードアクセス領域情報から一致部分を削除する（Ｓ１２０８）。
例えば、リードアクセス領域情報が図１４（Ａ）である場合に、ソースコード１０２がアドレス０ｘ１０００のビット３に対して書込処理を行っていた場合には、０ｘ１０００のビット３はリードアクセス領域として記憶されている。このため、対象情報をリードアクセス領域情報から削除する。削除後のリードアクセス領域情報は図１４（Ｂ）のようになる。
また、リードアクセス領域情報が図１４（Ａ）である場合に、ソースコード１０２がアドレス０ｘ１００８に対して２バイトの書込処理を行っていた場合には、０ｘ１００８、０ｘ１００９はリードアクセス領域として記憶されている。このため、対象情報をリードアクセス領域情報から削除する。削除後のリードアクセス領域情報は図１４（Ｃ）のようになる。
さらに、リードアクセス領域情報が図１４（Ａ）である場合に、ソースコード１０２がアドレス０ｘ１００Ａのビット４に対して書込処理を行っていた場合には、リードアクセス領域情報は図１４（Ｄ）のようになる。すなわち、リードアクセス領域情報のアドレス０ｘ１００Ａの、バイトアクセスを示す情報を取り下げ、かつビットアクセスかを示す情報のビット４以外をセットする。
Ｓ１２０５からＳ１２０９の処理を、評価対象ソフトウェア１０１の全てに対して行うと、リードアクセス領域情報はソースコード１０２におけるリードアクセスのみを抽出した情報になる。これを外部アクセス領域候補１３１として記憶する（Ｓ１２０９）。
【００４５】
重複領域検出機能１３０は、前記外部アクセス領域候補１３１と、リードモディファイライト領域１３２の情報を比較して、重複する領域を検出する。当該処理を含め、以降の処理は実施例１と同様のため説明を省略する。
以上のようにして、評価対象ソフトウェア１０１の外部装置からの変更処理との競合の可能性のある処理を、評価対象ソフトウェア１０１のソースコード１０２と照合して示すことが出来る。
更に、読出し処理のみを行う領域をｖｏｌａｔａｉｌｅ宣言された領域で絞り込むことで、より正確に外部装置により更新される領域を抽出することができる。その場合には、本実施例の競合領域候補検出機能に実施例５のｖｏｌａｔｉｌｅ領域検出機能を追加し、外部アクセス領域候補検出機能にｖｏｌａｔａｉｌｅ宣言領域で絞り込む処理を追加することで実現できる。
【符号の説明】
【００４６】
１００…評価システム、１０１…評価対象ソフトウェア、１１０…競合領域候補検出機能、１２０…リードモディファイライト領域抽出機能、１３０…重複領域検出機能、１４０…検出結果出力機能
【図１】
2019109688.tif 000003
【図２】
2019109688.tif 000004
【図３】
2019109688.tif 000005
【図４】
2019109688.tif 000006
【図５】
2019109688.tif 000007
【図６】
2019109688.tif 000008
【図７】
2019109688.tif 000009
【図８】
2019109688.tif 000010
【図９】
2019109688.tif 000011
【図１０】
2019109688.tif 000012
【図１１】
2019109688.tif 000013
【図１２】
2019109688.tif 000014
【図１３】
2019109688.tif 000015
【図１４】
2019109688.tif 000016
【図１５】
2019109688.tif 000017
【図１６】
2019109688.tif 000018
【図１７】
2019109688.tif 000019
【図１８（Ａ）】
2019109688.tif 000020
【図１８（Ｂ）】
2019109688.tif 000021
【図１９】
2019109688.tif 000022
【図２０】
2019109688.tif 000023
【図２１】
2019109688.tif 000024
【図２２】
2019109688.tif 000025
【図２３】
2019109688.tif 000026
【図２４】
2019109688.tif 000027