[go: up one dir, main page]

JP2019109688A - ソフトウェア評価システム - Google Patents

ソフトウェア評価システム Download PDF

Info

Publication number
JP2019109688A
JP2019109688A JP2017241989A JP2017241989A JP2019109688A JP 2019109688 A JP2019109688 A JP 2019109688A JP 2017241989 A JP2017241989 A JP 2017241989A JP 2017241989 A JP2017241989 A JP 2017241989A JP 2019109688 A JP2019109688 A JP 2019109688A
Authority
JP
Japan
Prior art keywords
function
write
area
software
read
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2017241989A
Other languages
English (en)
Inventor
彩 高木
Aya Takagi
彩 高木
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Canon Inc
Original Assignee
Canon Inc
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Canon Inc filed Critical Canon Inc
Priority to JP2017241989A priority Critical patent/JP2019109688A/ja
Publication of JP2019109688A publication Critical patent/JP2019109688A/ja
Pending legal-status Critical Current

Links

Landscapes

  • Debugging And Monitoring (AREA)

Abstract

【課題】ハードウェアの仕様等によらず、ソフトウェアによる書込競合の可能性のある領域を漏れなく抽出出来るソフトウェア評価システムを提供する。【解決手段】評価対象のソフトウェア101のソースコード102や機械語104を解析し、割込処理や外部アクセスとの書込処理を予測し、競合が発生する可能性のある箇所と、ライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域とを抽出し、競合領域候補とリードモディファイライト領域とから、重複する領域を検出して表示する。【選択図】図1

Description

本発明は、ソフトウェアによるリソースへの書込競合のリスクを持つ箇所を検出するソフトウェア評価システムに関するものである。
従来の、論理装置によるリソースへの書込競合のリスクを持つ箇所を検出する技術に、シミュレーションによる衝突検出の技術がある(たとえば、特許文献1参照)。
特許文献1は論理装置の動作シミュレーションに関する技術であるが、論理装置の設計仕様に基づき複数のスレッドをシミュレーションし、ハードウェアリソースに対するリード/ライト動作の競合状態を判定する技術が示されている。
特開2002−279011号公報
動的な検証は、処理のタイミングや、実行時の内部状態により処理内容が異なる。
ソフトウェアの書込競合はごく限られたタイミングでのみ発生する現象のため、動的な検証で検出するには様々な実行条件で検証を行う必要がある。
しかし複雑な制御を行うソフトウェアや、ソフトウェア上の多くの領域がソフトウェア外と双方向で書込を行うようなソフトウェアにおいては、全ての領域において書込競合が発生しないことを動的検証によって漏れなく評価することは非常に困難であった。
また、機器組込系ソフトウェア上では、書込の競合が発生するリスクを持つ領域と、そのリスクのない領域との区別がないため、静的に検証することが困難であった。このため従来は外部の機器と双方向から書き込む可能性のある領域について、設計仕様を設計者が解釈し、レビュー等で確認していた。しかし、設計者によるレビュー確認では、設計者のスキルや、見逃し、ハードウェアが変更される等の理由でレビュー後に外部の機器と双方向から書き込む可能性のある領域が変更される等の理由で十分な確認が出来るとは言えない。
本発明の目的は、ハードウェアの仕様等によらず、ソフトウェアによる書込競合の可能性のある領域を漏れなく抽出出来るソフトウェア評価システムを提供することにある。
上記目的を達成するために、本発明は、評価対象のソフトウェアによる書き込みが競合する可能性がある箇所を検出するソフトウェア評価システムであって、
前記ソフトウェアを解析し、該ソフトウェアによる書き込みが競合する可能性がある候補に関する情報を競合領域候補として抽出して記憶する候補検出機能と、
前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域として記憶するリードモディファイライト領域抽出機能と、
前記競合領域候補と、前記リードモディファイライト領域とから重複する領域を検出する重複検出機能と、
前記重複検出機能によって検出された結果に基づいて、前記ソフトウェアにおける前記競合する可能性のあるライト処理が記述された位置の情報を出力する結果出力機能と
を備えたことを特徴とする。
また、本発明は、上記ソフトウェア評価システムとしてコンピュータを機能させることを特徴とするプログラムである。
以上説明したように、本発明によれば、ハードウェアの仕様等によらず、書込競合の可能性のある領域を漏れなく抽出出来るようになる。
実施例1によるソフトウェア評価システム100の機能ブロック図 実施例1〜6による連携装置を実現するハードウェア構成図 実施例1による競合領域候補検出機能110の処理のフローチャート 実施例1解析対象関数の情報の推移を説明する図 実施例1による割込処理との競合領域候補131を概念的に示す図 リードモディファイライト領域抽出機能120の処理を示すフローチャート リードモディファイライト領域132を概念的に示す図 実施例5によるソフトウェア評価システム100の機能ブロック図 実施例5による競合領域候補検出機能110の処理を示すフローチャート 実施例1による検出結果出力機能の出力結果の一例 実施例5による競合領域候補検出機能110の検知結果を概念的に示す図 実施例6によるソフトウェア評価システム100の機能ブロック図 実施例6による競合領域候補検出機能110の処理を示すフローチャート 実施例6によるリードアクセス領域情報の格納情報を概念的に示す図 実施例4によるソフトウェア評価システム100の機能ブロック図 実施例2によるソフトウェア評価システム100の機能ブロック図 実施例2で割込ハンドラ検出機能111が関連付けて記憶する情報例 実施例2によるリードモディファイライト領域132の一例 図18(A)を対応位置検出機能141によって置換した一例 実施例2のリードモディファイライト領域抽出機能の処理フローチャート 実施例2による競合有無判断機能143の一例 実施例3によるソフトウェア評価システム100の機能ブロック図 実施例3の競合有無判断機能の出力結果をメモリアドレスでソートした例 実施例3による割込ハンドラの定義を概念的に示す図 実施例3による出力の一例を示す図
以下に図面を参照して、この発明を実施するための形態を、実施例に基づいて例示的に詳しく説明する。本発明の趣旨を逸脱しない範囲内で実施例の構成を適宜変形したり変更したりすることにより得られる構成も本発明に含まれる。以下の複数の実施例の構成を適宜組み合わせて得られる構成も、本発明に含まれる。また、各実施例における機能および処理はそれぞれ単一のコンピュータ装置で実現してもよいし、必要に応じた複数のコンピュータ装置による分散処理によって実現するようにしてもよい。複数のコンピュータ装置で構成される場合は、互いに通信可能なようにLocal Area Network(LAN)などで接続されている。あるいは、機能および処理の一部をクラウドコンピューティングによって実現してもよい。
本発明においてソフトウェア評価システムは、コンピュータシステム201上でプログラムを実行することで実現でき、そのハードウェア構成を図2に示す。図2の本体部202のハードディスク208には、ソフトウェア評価システムの各機能を実現するためのプ
ログラムが格納される。中央処理装置(CPU)206は、プログラム及び各種データを主記憶装置207にロードして実行することで、コンピュータシステム201はソフトウェア評価システムとして動作する。なお、表示装置203は、本体部202からの指示により画面表示を行う。また、キーボード204は、このコンピュータシステム201にユーザの指示や文字情報を入力するためのものである。さらに、マウス205は、表示装置203上の任意の位置を指定することによりその位置に表示されていたアイコン等に応じた指示を入力するためのものである。本発明のソフトウェア評価システムを実現できるコンピュータシステムのハードウェア構成は図2のものに限られず、複数のコンピュータ装置を含むシステム等の種々のコンピュータシステムによって実現できる。なお、明細書及び図面を通じて、書込(書き込み)は、ライト(又はライトアクセス)と同義として用いる。また、読出(読出し)は、リード(又はリードアクセス)又は参照と同義として用いる。リソースとしてのメモリ等の記憶領域を単に領域という。
図1は本実施例によるソフトウェア評価システム100の機能ブロック図である。
評価システム100は、競合領域候補検出機能110、リードモディファイライト領域抽出機能120、重複領域検出機能130、検出結果出力機能140とからなる。
競合領域候補検出機能110は、評価対象ソフトウェア101を解釈し、割込処理内での書換領域を全て抽出し、これを割込処理との競合領域候補131として検出する。ここで、評価対象ソフトウェア101は、まず、C言語、C++、アセンブリ言語などで記述されたソースコード102、及び、前記ソースコード102に対応する機械語で記述されたオブジェクトコード(以下、単に「機械語」という。)104を含む。評価対象ソフトウェア102はさらにソースコード102上のいずれの処理が機械語104のいずれの処理に展開されているのかを示す、ソースコードと機械語の対応情報103を含む。ここでは、競合領域候補検出機能110は、候補検出機能に対応する。また、重複領域検出機能130は、重複検出機能に対応する。
競合領域候補検出機能110は、割込ハンドラ検出機能111、指定関数解析機能118、指定関数実体探索機能119、呼出関数検出機能112、ライトアクセス領域検出機能113から構成される。ここで、指定関数解析機能118は、関数解析機能に対応する。また、呼出関数検出機能112は、呼出検出機能に対応する。
割込ハンドラ検出機能111は、評価対象ソフトウェア101を読み込み、評価対象ソフトウェア101上にいずれの割込ハンドラが存在するのかを検出する。割込ハンドラ検出機能111が、評価対象ソフトウェア101としてC言語やC++等の高級言語を読み込む場合は、コンパイラごとの割込関数を定義する書式(割込関数定義書式)が存在する。このため、前記割込関数定義書式に従って割込ハンドラ名を取得することが出来る。
割込ハンドラ検出機能111が機械語104を読み込む場合は、割込ハンドラの情報は、以下(1)から(3)いずれかの方法で取得する。
(1)リターン命令を抽出する。
一般に、割込みハンドラからのリターン命令は、通常の関数のリターン命令とは異なる命令コードが割り当てられる。まず割込ハンドラ用のリターン命令を見つけ出すことで割込ハンドラの終了箇所を検知し、次いで当該関数の開始箇所を見つければ割込ハンドラの処理コードを特定できる。関数の開始箇所を見付ける処理は既存技術のため説明を省略する。
(2)割込みベクタから抽出する。
対象マイコンについて割込みハンドラの先頭アドレスがどのアドレスに定義されるかが指定された割込ベクタ定義情報を元に割込みベクタを特定する。
(3)コンパイラごとの割込関数定義書式を元に抽出する。
指定関数解析機能118は、評価対象ソフトウェア101のソースコード102または、機械語104を探索し、指定される関数の開始から終了までを解析する機能である。指
定関数解析機能118は、指定関数実体探索機能119、呼出関数検出機能112、ライトアクセス領域検出機能113の3つの機能を有する。ここで、指定関数実体探索機能118は、実体探索機能に対応する。
指定関数実体探索機能119は、指定される関数情報から、まず当該関数の処理内容コードが評価対象ソフトウェア101上のいずれに存在するのか探索する機能である。
ここで、指定関数解析機能118への関数の指定方法は、解析対象がソースコード102である場合はたとえばソースコード上の関数の名称、解析対象が機械語104である場合には、メモリ領域上の関数の実体アドレス等の方法がある。
前者では、指定関数解析機能118は、ソースコードを探索し、同名称の関数の実体の記述位置を取得する。後者では、指定関数解析機能118は、機械語104上の当該アドレスの情報を参照することで関数の実体の情報を取得する。
指定関数解析機能118は、指定される関数の実体を検出すると、当該関数の解析を開始する。
呼出関数検出機能112は、評価対象ソフトウェア101に記載される関数コールを検知する関数コール検出機能である。呼出関数検出機能112は、取得した関数情報を内部メモリに記憶する。ここで記憶する関数情報は、前記指定関数実体探索機能119が関数の実体を探索するのに足る情報とする。
ライトアクセス領域検出機能113は、評価対象ソフトウェア101を解析し、評価対象ソフトウェア101の書込処理のアクセスアドレス、及びアクセスバイト数を検出する機能である。評価対象ソフトウェア101がソースコードである場合は、書込処理が変数名でなされることがあるため、コンパイラによって生成されるアドレスマップから当該変数のリソースがメモリ領域上のいずれのアドレスに、何バイト分を割り振られているかを取得する。
競合領域候補検出機能110は、割込ハンドラ検出機能111によって検出した割込ハンドラ情報を、解析対象関数として指定関数解析機能118へ渡すことにより、指定関数解析機能118が当該割込ハンドラの実体を解析する。これにより、当該割込ハンドラに記述の関数コール処理とライトアクセス処理を抽出することが出来る。競合領域候補検出機能110は、全ての割込ハンドラ情報と、指定関数解析機能118内で検出した関数コール情報とを指定関数解析機能118へ渡すことで、割込ハンドラ及び、割込ハンドラ内のすべての下位関数の実体の解析が可能になる。競合領域候補検出機能110は、ライトアクセス領域検出機能113の検出結果を割込処理との競合領域候補131として内部メモリに記憶する。図5は割込処理との競合領域候補131の例である。メモリ領域上のアドレスを1バイト単位で記している。
リードモディファイライト領域抽出機能120は、評価対象ソフトウェア101における機械語104を解析し、評価対象のソフトウェアのリードモディファイライト処理を検出する。検出すると、機械語104のファイル上の記述位置、及びメモリ領域上のライトアクセスアドレス、及びアクセスバイト数をリードモディファイライト領域132として記憶する。
リードモディファイライト領域132の例を図7に示す。評価対象ソフトウェア101は複数ファイルで構成されることも有り得る。このため、ファイル名などのファイル特定情報、ライトアクセスが記載される行数情報、及びリードモディファイライトの対象となるメモリ領域上のライトアクセスアドレス、及びアクセスバイト数を関連づけて記憶している。
重複領域検出機能130は、前記割込処理との競合領域候補131と、前記リードモディファイライト領域132とを比較して検出結果を検出結果出力機能140へ渡す機能である。
重複領域検出機能130は、割込処理との競合領域候補131及びリードモディファイライト領域132に格納されている評価対象ソフトウェア101上のアクセスアドレス、
及びアクセスサイズを比較し、重なるアドレス領域があれば、重複領域と見なす。同一の領域が、ソフトウェア101上の複数個所でリードモディファイライト処理に展開されていることがあるため、リードモディファイライト領域132を全て検索して重複領域を検出する。
この処理を、割込処理との競合領域候補131に格納される領域全てに行う。重複領域検出機能130は、リードモディファイライト領域132の情報のうち、重複領域と見なした情報のみを検出結果出力機能140へ渡す。
検出結果出力機能140は、評価対象ソフトウェア101上のいずれの処理が書込競合の危険があるのかを示す機能であり、対応位置検出機能141と対応位置表示機能142を持つ。対応位置検出機能141は、機械語104のリードモディファイライト処理に対応するソースコード102の処理を検出する機能である。
リードモディファイライト領域抽出機能120が抽出するライトアクセス処理の記述位置情報は機械語104の位置情報である。このため、検出結果出力機能140は、対応位置検出機能141を用いて、検出結果に対するソースコード102上の処理位置情報を取得する。
ここで、対応位置検出機能141が読み込むソースコードと機械語の対応情報103は、コンパイラがコンパイル時に生成するものであって、このソースコードと機械語の対応情報103の生成方法は公知の技術によるため、詳述は省略する。
尚、今回は対応位置検出機能141を検出結果出力機能140へ持たせたが、リードモディファイライト領域抽出機能120へ持たせてもよい。その場合、リードモディファイライト領域抽出機能120は対象となるライトアクセス処理を検知すると、対応位置検出機能141を用いて対応するソースコード102上の処理位置情報を取得する。さらに、リードモディファイライト領域132へソースコード102上の処理位置情報、及びライトアクセスアドレス、及びライトアクセスバイト数を記憶する。
対応位置表示機能142は、検出結果と評価対象ソフトウェア101とを対応付けて表示する機能である。
図10(A)から(C)は対応位置表示機能142の一例である。
図10(A)は、ソースコード102と、重複領域検出機能130の検出結果を照合し、競合の可能性のある処理に印をつけて表示している。
また、図10(B)および(C)は重複領域検出機能130の検出結果を一覧表で出力する例である。図10(B)は検出結果をそのまま一覧表にしているのに対し、図10(C)は書込処理の競合の危険のある領域に変数名を付加している。この変数名の取得方法は、ソースコード102における対象処理の記述箇所情報を既に持っているため、前記記述箇所にて書込処理がなされている変数名を取得することで実現できる。
尚、一覧表の表示形式は、図10(B)(C)のように表形式でもいいし、テキストファイル様に示しても良い。また、図10の(B)(C)の各行とソースコード102とを紐付けておき、ユーザによる入力機器からの操作によって、図10(A)のように当該記述箇所を表示してもよい。前記入力機器からの操作は、たとえばユーザがマウスで当該行をクリックする、キーボードで当該行を選択しEnterボタンを押す等の操作が挙げられる。
本実施例を詳細に説明する。
図3、図4、図5は、競合領域候補検出機能110を説明する図である。
図3は本実施例の競合領域候補検出機能110の処理の概要を示すフローチャートであり、図4は割込ハンドラ検出機能111、及び呼出関数検出機能112が共通で使用する解析対象関数の情報の推移を説明する図である。図5は割込処理との競合領域候補131を概念的に示す図である。
競合領域候補検出機能110は、解析指示を受けて、評価対象ソフトウェア101を解析する(S301)。評価対象ソフトウェア101を順次解析し(S302)、割込ハン
ドラの定義情報を見付けるたびに(S303)、解析対象関数として、発見した割込ハンドラを解析対象関数のスタックに記憶する(S304)。
評価対象ソフトウェア101を全て解析し終えると、競合領域候補検出機能110は、S304で記憶した解析対象関数情報を見る(S305)。この時点で、解析対象関数の情報は図4の(A)のようになる。図4(A)は解析対象関数情報を、関数名と状態とで記憶している。状態は未解析、解析中、解析済の3つの状態を持つ。
未解析の解析対象関数が存在する場合には、評価対象ソフトウェア101を解析し、解析対象の関数の実体を探索する(S306)。
解析対象関数を見付けると、解析対象関数内の解析処理に移る。競合領域候補検出機能110は、解析対象関数を順次解析する。解析対象関数内にライトアクセスが有る場合には(S307)、割込処理との競合領域候補131を確認し、割込処理との競合領域候補131に登録済の領域か否かを確認する(S308)。未登録の場合は、割込処理との競合領域候補131に当該領域を評価対象ソフトウェア101上の記述位置と併せて格納する(S309)。割込処理との競合領域候補131の情報は、たとえば図5のようになる。図5は解析対象関数内でライトアクセスがなされるアドレス領域を記憶したものの概念図である。メモリアドレスを1バイト単位で記憶する。
S308において、ライトアクセス領域が既に割込処理との競合領域候補131に登録済みの場合は、再登録はせず次の処理(S310)へ進む。
次いで、競合領域候補検出機能110は、評価対象ソフトウェア110の解析対象関数の終端まで解析したか否かを確認する(S310)。
終端まで解析を終えていない場合は、再びS307へ戻り解析を続ける。
S307にてライトアクセスを発見しなかった場合、次いで解析中の処理命令が関数コール命令であるか否かを判断する(S311)。解析中の処理命令が関数コール命令であった場合、そのコールされる関数が解析対象関数のスタック内に存在するか否かを判断する(S312)。存在しない場合には、解析対象関数として、今発見したコールされる関数を解析対象関数のスタックへ登録する(S313)。この処理において、解析対象関数のスタックは図4の(B)のようになる。図4(B)は、解析中の割込みハンドラの関数名が「intr_FncB」、発見された関数名が「FncB_subProc01」である事例である。「intr_FncB」が「解析中」として登録されており、解析によって発見された関数「FncB_subProc01」が、解析対象関数情報の最後尾に「未解析」として追加登録される。
S312で登録済みの場合は、再登録はせず次の処理(S310)へ進む。
このようにして、競合領域候補検出機能110は、解析対象の関数を順次解析する。S310にて、解析対象の関数内を全て解析し終えたと判断したら、解析対象関数のスタックにて、現在解析中の関数の状態を「解析済」とし(S314)、再びS305へ戻って、次に解析すべき関数が有るか否かを判断する。
解析対象関数のスタック内全ての関数を解析し終えたら、割込ハンドラ及びその下位関数内のライトアクセス領域を全て記憶したとして、処理を終える。
次いで、リードモディファイライト領域抽出機能120について図6、図7を用いて述べる。
図6はリードモディファイライト領域抽出機能120の処理の概要を示すフローチャートであり、図7はリードモディファイライト領域132を概念的に示す図である。
リードモディファイライト領域抽出機能120は、評価対象ソフトウェア101の全ての処理を解析対象とする。
リードモディファイライト領域抽出機能120は、解析対象のソフトウェアを順次読み込み、まずソフトウェアに記載のリード処理を探す。具体的には、メモリから値を取得し、内部のレジスタへ格納する処理を探す(S601)。
S601にてリード処理を見付けると、次いで演算処理を探す。S601にて見付けられたリード処理において値を格納したレジスタに対して、当該レジスタを用いた演算処理を行っているか否かを判断する(S602)。この演算処理は数ステップに渡ることがあり、かつ演算の結果を別レジスタへ格納することがあるため、演算処理で値が格納されるレジスタを一時的に記憶する。
次いで、評価対象ソフトウェア101のライト処理を探す。評価対象ソフトウェア101がメモリへ書き込む処理を行っており、かつ書込先メモリ領域がS601で読み出した領域で、かつ書込値がS602で演算に使用した領域である場合に、リードモディファイライトのライト処理であると認識する(S603)。リードモディファイライト処理であると判断したら、当該ライト処理が記述される評価対象ソフトウェア101内の記述位置、及びライト領域とをリードモディファイライト領域132であるとして記憶する(S604)。
S601〜S603の条件を満たさない場合、すなわちS601からS603までの間に他の処理が入る場合には、リードモディファイライト処理ではないと判断する。具体的には、S601からS603までの間に関数コールや、他のメモリ領域へのリードアクセスまたはライトアクセスを行う場合はリードモディファイライト処理ではないと判断する。また、S601からS603までの処理が所定ステップ以上である場合も検出対象から除外する。
評価対象ソフトウェア101の全ての処理を解析したら、処理を終了する(S605)。
上記処理を終えた時のリードモディファイライト領域132の概念図が図7となる。図7は、機械語104上のライトアクセス処理位置、及びライトアクセスアドレス、及びライトアクセスバイト数を、ライトアクセス処理毎に対応付けて記憶している。
本実施例では、リードモディファイライト領域132の情報が評価対象ソフトウェア101の記述位置順に格納されているが、S604での記憶時に、ライトアドレス順に格納しても良い。
重複領域検出機能130は、割込処理との競合領域候補131、及びリードモディファイライト領域132とを比較し、重複する領域を全て抽出する。
ここで、重複する領域とは、部分的に重複するものも全て抽出対象とする。例えば、割込処理との競合領域候補131にメモリアドレス0x2000が格納されており、かつリードモディファイライト領域132にメモリアドレス0x2000−2003へのライトアクセス情報が格納されている場合を例とする。このような場合には、領域0x2000−2003へのライトアクセス情報は抽出対象である。
検出結果出力機能140は、重複領域検出機能130の結果と、評価対象ソフトウェア101を照合して、ソフトウェア上のいずれの処理が書込競合の危険があるのかを示す。
このとき、リードモディファイライト領域抽出機能120が解析する評価対象ソフトウェア101は機械語104であるため、検出結果出力機能140はソースコード102上の処理位置に置換して出力する。この処理については前述したため省略する。
実施例1では、検出結果出力機能140は、書込競合の危険のある処理について、割込ハンドラ内外を問わずに表示していた。
しかしながら、たとえば割込ハンドラの優先度が全て等しい場合には、割込ハンドラ内に記述された書込処理は、競合によって自らの書込処理が打ち消されることは有っても、割込ハンドラ外での書込処理を打ち消すことはない。同様に、割込ハンドラ外に記述された書込処理は、競合によって割込ハンドラ内の書込処理を打ち消すことは有っても、自らの処理が打ち消されることはない。
また、割込ごとに優先度が設定されている場合は、割込ハンドラ同士でも競合が発生する可能性が有る。
本実施例では、多重割込の許可/不許可や割込の優先度、割込禁止区間を考慮して、競合の発生する可能性のある箇所を示す方法について述べる。
図16は本実施例によるソフトウェア評価システム100の機能ブロック図である。
評価対象ソフトウェア101、及びリードモディファイライト領域抽出機能120、重複領域検出機能130は実施例1と同一のため説明を省略する。
競合領域候補検出機能110における割込ハンドラ検出機能111は、割込優先度検出機能122を持つ。ここで、割込優先度検出機能122は、優先度検出機能に対応する。
割込優先度検出機能122は、ソースコード102または機械語104から、多重割込の許可/不許可情報や割込の優先度情報を検出する機能である。
多重割込の許可/不許可情報や割込ハンドラの優先度情報の取得方法は、割込ハンドラ名の取得方法と同様に、ソースコード102から取得する場合、及び機械語104から取得することが出来る。さらに、対象のCPUの割込み仕様に基づく割込優先度の指定コードに従って取得することが出来る。
競合領域候補検出機能110は、割込ハンドラ検出機能111にて割込ハンドラを検出する際に、割込優先度検出機能122から多重割込の許可/不許可情報や割込の優先度情報を取得し、併せて記憶する。
図17は、割込ハンドラ検出機能111が割込ハンドラ情報を記憶するときの、関連付けて記憶する情報の一例である。
解析対象関数情報を、関数名と状態、及び優先度と多重割込の許可/不許可の設定を関連づけて記憶している。
また、リードモディファイライト領域抽出機能120は、関数情報検出機能123及び割込可否検出機能124を持つ。ここで、関数情報検出機能123は、情報検出機能に対応する。また、割込可否検出機能124は、可否検出機能に対応する。
関数情報検出機能123は、機械語104に記載の関数の開始命令を検知し、当該関数の特定情報を取得する。たとえば、当該関数の開始時のメモリアドレス情報を取得する。
割込可否検出機能124は、機械語104に記載の、割込の許可/禁止を定義する命令を取得する。
リードモディファイライト領域抽出機能120は、リードモディファイライト領域132に格納する情報として、実施例1記載の情報に加えて、関数情報検出機能123で取得した関数特定情報と、割込可否検出機能124の割込の許可/禁止情報を関連づける。
リードモディファイライト領域抽出機能120がリードモディファイライト領域132を出力する処理について、図19のフローチャートを用いて詳述する。
リードモディファイライト領域抽出機能120は、指示を受けて、機械語104を解釈開始する(S1901)。このとき、未解析の機械語104が有る限り、S1902からS1908の処理を行う(S1902)。
解釈した機械語104の命令が関数の開始命令の場合(S1903)、当該関数のメモリアドレス上の開始アドレスを記憶する。あわせて、リードモディファイライト領域抽出機能120は、処理開始時に持っている割込ハンドラの特定情報に従い、全ての割込ハンドラが関連付けられる割込の許可/禁止状態情報を、「許可」状態にする(S1904)。ここで、前記割込の許可/禁止状態情報は、リードモディファイライト領域抽出機能120が内部に持っている情報であり、評価対象ソフトウェア101の内部状態情報とは異なるものである。
リードモディファイライト領域抽出機能120は、リードモディファイライト領域132へ当該情報を出力し、最終的には検出結果出力機能140が競合の可能性を算出する際に使用する。検出結果出力機能140の処理については後述する。
機械語を解析し、当該命令が割込の許可/禁止を定義する命令であれば(S1905)、リードモディファイライト領域抽出機能120が内部に持っている割込の許可/禁止状
態情報を当該命令処理後の状態に更新する(S1906)。
S1905で解釈した機械語において当該命令が割込の許可/禁止を定義する命令でなければ、当該機械語が、リードモディファイライト処理のライト命令であるか否かを判断する(S1907)。解釈した機械語が当該ライト命令であった場合には、S1904で取得した関数の開始アドレスと、S1906で取得した割込の許可/禁止状態を、実施例1の情報に加えてリードモディファイライト領域132として出力する(S1908)。S1907で解釈した機械語がリードモディファイライト処理におけるライト命令ではない場合には、S1908をスキップする。S1902からS1908の処理を解釈する機械語が有る限り繰り返す。
図18(A)は、本実施例におけるリードモディファイライト領域132の一例である。
記述箇所、及びライトアクセス領域情報については実施例1で述べたため説明を省略する。
関数特定情報として、リードモディファイライト領域抽出機能120がS1904で取得した関数の開始アドレスを出力する。
また、割込禁止情報として、リードモディファイライト領域抽出機能120が内部に持っている割込の許可/禁止状態を出力する。
ここで、当該割込の許可/禁止状態は、リードモディファイライト処理におけるライト命令が為された時分における割込の許可/禁止状態である。
割込の許可/禁止状態は動的に変更されるため、書込処理の競合の可能性を判断するためには、ライト命令実行ごとの割込許可/禁止状態が必要である。
静的解析では、解析中の関数が呼び出されるときの割込許可/禁止状態を判断出来ない。そのため、関数が呼び出されたときには全ての割込ハンドラが割込許可なされているものとし、関数の先頭から当該ライト命令が記載されるまでの処理で割込禁止がなされているもののみを割込禁止状態の割込ハンドラとして取り扱う。
図18(A)では割込禁止命令がなされている割込関数情報として関数名を記載しているが、これは例であり、割込ハンドラを特定出来る情報が出力されればよい。
また、図18(A)で関数特定情報として当該関数のアドレスマップ上の先頭アドレスを記載したが、これに限られない。実施例1のように対応位置検出機能141をリードモディファイライト領域抽出機能120へ持たせる場合には、関数特定情報をソースコード102上の特定情報としてもよい。
図16の機能ブロック図において、検出結果出力機能140は、対応位置検出機能141、及び対応位置表示機能142、及び競合有無判断機能143及び表示対象切替機能144を持つ。ここで、競合有無判断機能143は、競合判断機能に対応する。また、表示対象切替機能144は、表示切替機能に対応する。
対応位置検出機能141、及び対応位置表示機能142は実施例1で述べたため説明を省略する。
競合有無判断機能143は、重複領域検出機能130の検出結果を間引く機能である。競合領域候補検出機能110の割込優先度検出機能122の検出結果と、重複領域検出機能130の割込禁止情報とを比較し、当該リードモディファイライト処理の実行時に、割込が発生する可能性の有無を判断する。割込が発生しないと判断したライト命令については、ソースコードとの照合対象から除外する。
競合有無判断機能143の動作を例を用いて説明する。
例えば、割込優先度検出機能122の検出結果を図17、図18(A)を対応位置検出機能141によってソースコード102の記述箇所及び関数特定情報に置換したものを図18(B)とする。尚、図18(B)の各要素に書込番号という数値情報を付加したが、これは本実施例の説明のためにユニークな数値を割り振ったもので、処理とは無関係であ
る。
競合有無判断機能143は、割込優先度検出機能122の検出結果とリードモディファイライト領域132とから、割込関数内での書込対象アドレスを、当該割込関数の割込優先度及び多重割込の許可状態と関連付けて記憶する。この例を図20とする。
図20は、評価対象ソフトウェア101のソースコード102における割込ハンドラはintr_FncA及びintr_FncB及びintr_FncCの3つのみである例を示す。図20に示すように、intr_FncA及びintr_FncB及びintr_FncCは、各々アドレス0x1000から0x1002、及び0x1008に対して書込処理を行っている。
次いで図18(B)の各ライト命令情報と、図20の割込ハンドラ内書込アドレス情報を比較して、競合の可能性の有無を判断する。
たとえば図18(B)の関数特定情報がintr_FncAの情報(書込番号1から4)については、図20のとおりintr_FncAの割込優先度が最高かつ多重割込が不許可であるため、書込処理の競合の可能性が無いと判断する。
また、図18(B)の関数特定情報がintr_FncBの情報については、図20によるとintr_FncAの割込優先度と同じだが、多重割込が許可されているため、intr_FncAまたはintr_FncBが呼び出される可能性が有る。図18(B)において、intr_FncBのライト命令情報は書込番号12及び書込番号13である。書込番号12のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がないことから、intr_FncAまたはintr_FncBが呼び出されると書込処理の競合が発生する可能性が有ると言える。
書込番号13のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がintr_FncA及びintr_FncBであるため、書込処理の競合が発生する可能性が無いと言える。
また、書込番号7及び8のライト命令情報は、割込処理内の処理実行時に割込禁止命令がなされている割込関数情報がintr_FncA及びintr_FncBであるため、書込処理の競合が発生する可能性が無いと言える。
書込番号9のライト命令情報は、処理実行時に割込禁止命令がなされている割込関数情報がintr_FncA及びintr_FncBであり、かつ自身も多重割込が禁止されているため、書込処理の競合が発生する可能性が無いと言える。
書込番号10のライト命令情報は、割込関数ではないが、処理実行時に割込禁止命令がなされている割込関数情報がintr_FncA及びintr_FncB及びintr_FncCであり、全ての割込関数が禁止されていると判断出来る。このため、書込処理の競合が発生する可能性が無いと言える。
競合有無判断機能143は、以上のようにして重複領域検出機能130の検出結果を間引く。
表示対象切替機能144は、外部からの指示を受け、ソースコード102との照合範囲を切り替える機能である。
前述のとおり、リードモディファイライト処理におけるライト命令には、競合発生時に自らが書き込んだ情報が消されるもの、及び他関数が書き込んだ情報を消してしまうものが存在する。
表示対象切替機能144は、外部からの指示に従い、ソースコード102との照合対象を以下(1)から(3)のいずれかとする。
(1)競合発生時に自らが書き込んだ情報が消されるもののみを表示させる。
(2)競合発生時に他関数が書き込んだ情報を消してしまうもののみを表示させる。
(3)競合発生時に自らが書き込んだ情報が消されるもの、他関数が書き込んだ情報を消してしまうものの両方を表示させる。
(1)は割込ハンドラ内の書込処理が対象となる。
重複領域検出機能の検出結果には、各ライト処理がなされる関数特定情報が付随されて
いるため、前記関数特定情報と、割込ハンドラ検出機能111の検出結果から、前記対象の書込処理のみをソースコード102と照合する。
(2)は割込ハンドラ外の書込処理や、複数の割込ハンドラ内で書込処理がなされる場合の、優先度が低い割込ハンドラにおける書込処理が対象となる。
重複領域検出機能の検出結果には、各ライト処理がなされる関数特定情報が付随されているため、前記関数特定情報と、割込ハンドラ検出機能111の検出結果から、前記対象の書込処理のみをソースコード102と照合する。
(3)は競合有無判断機能143の判断結果をソースコード102との照合対象とする。
以上のようにして、多重割込の許可/不許可や割込の優先度、割込禁止区間を考慮して、競合の発生する可能性のある箇所を示すことが出来る。
実施例2では、検出結果出力機能140に於いて、外部からの指示に従い、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものを選択的に表示する方法について述べた。
本実施例では、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものについて関係性を調査し、ソースコード102上のどの処理が競合に影響し合うのかを表示する方法について述べる。
図21は本実施例によるソフトウェア評価システム100の機能ブロック図である。
検出結果出力機能140は、実施例2の各機能に加え、関係性検出機能145を持つ。
関係性検出機能145は、書込処理の競合が発生したときに、書込処理を打ち消すものと、当該書込処理によって書込処理が打ち消されるものについて、各々の処理がソースコード102上のいずれの箇所に記述されるのかを対応付けて記憶する機能である。
関係性検出機能145は、競合領域候補検出機能110の割込優先度検出機能122の検出結果と、競合有無判断機能143の検出結果を比較することで関係性を取得する。
関係性検出機能145は、競合有無判断機能143の出力結果を読み込み、ライトアクセス領域毎に情報をソートする。競合有無判断機能143の出力結果には、ライトアクセス領域のアドレス情報、アクセスバイト数、そのライトアクセスを行う関数特定情報、ソースコード102上の記述位置情報が格納される。このため、メモリアドレスの1バイト毎にソートすると、そのアドレスへ書込処理を行う関数がいずれか、及び記述位置が分かる。
図22は、競合有無判断機能143の出力結果をメモリアドレスの1バイト毎にソートした例である。メモリアドレス1バイトごとに、当該アドレスへの書込処理を行う関数の識別情報、及び当該関数内でのソースコード102上の記述位置情報を持つ。同一関数内の複数個所で書込処理を行うことが有る。
図22は、アドレス0x1000について関数intr_FncAでは5箇所での書込処理がなされていることを示している。
また、ソースコード102には2バイトや4バイトなどの多バイトでアクセスする記述がなされることがある。その場合は、異なるアドレスについて同一の記述箇所情報が格納される。たとえば、図22のアドレス0x1000、及び0x1001のintr_FncBの記載行150、180、220が多バイトアクセスを示している。
ここで、割込ハンドラの定義が図23(A)のとおりだとすると、自関数の処理中に割込が発生する可能性のある割込ハンドラ情報は、図23(B)のとおりである。
intr_FncAは割込優先度が最高で、かつ多重割込を禁止していることから、intr_FncAの処理中に他の割込処理が発生することはない。
intr_FncBは割込優先度は最高だが、多重割込を許可しているため、自らを含めて、割込優先度が同レベルの割込処理が発生することが有り得る。
割込ハンドラがintr_FncAからintr_FncFまでで全てだとすると、そ
の他の関数、すなわち割込ハンドラ外の関数についても、競合が発生する可能性のある割込ハンドラはintr_FncAからintr_FncFまでとなる。
検出結果出力機能140は、対応位置表示機能142にてソースコード102上に競合の可能性のある書込処理を提示する際に、図22のソート情報に基づき、以下のとおり表示する。
(1)表示中の関数の処理中に割り込まれる可能性が有る割込ハンドラでの書込処理
書込処理を打ち消してしまう可能性が有る処理として表示する。
(2)表示中の関数が割込ハンドラで、かつ表示中の関数の処理中に割り込まれる可能性がない関数での書込処理
書込処理を打ち消されてしまう可能性が有る処理として表示する。
図24は、本実施例の出力の一例を示す図である。
図24では、ソースコード102が割込ハンドラintr_FncC上でグローバル変数val_1への書込処理を行っている。
検出結果出力機能140は、ソースコード102上に競合の可能性がある書込処理としてval_1への書込処理を黒枠でくくって表示している。それとともに、書込処理が打ち消す可能性が有る箇所、及び書込処理を打ち消される可能性のある箇所を併記している。
例では書込処理を打ち消す可能性が有る箇所、及び書込処理を打ち消される可能性のある箇所を併記しているが、いずれか一方を表示しても良いし、評価システム100外部からの入力に従い表示/非表示を切り替えても良い。たとえば、評価システム100に、「表示する」ボタンを設け、ユーザが「表示する」ボタンにたとえばマウスでクリックする等の働きかけを行うと表示するようにしてもよい。また、ユーザが当該黒枠にくくられた範囲にマウスなどでカーソルを重ねあわせたときのみ表示させるようにしてもよい。
尚、本実施例では、関係性検出機能145が競合有無判断機能143の出力結果を読み込んで処理を行うものとしたが、これは例であり、読み込み対象の情報は競合有無判断機能143の出力結果に限定しない。競合有無判断機能143からは書込処理がなされる関数特定情報、及びソースコード102上の記述箇所、書込アドレス情報を得ているため、前記情報を持つ情報であれば、前記競合有無判断機能143にかわり、処理が可能である。具体的には、重複領域検出機能130の検出結果や、対応位置検出機能141による処理の前後の情報いずれかなどを読み込み対象としてもよい。
以上のようにして、競合によって書込処理が打ち消されるもの、及び書込処理を打ち消すものについて関係性を調査し、ソースコード102上のどの処理が競合に影響し合うのかを表示することが出来る。
実施例1では評価対象ソフトウェア101がコンパイル対象のソースコード102で記述されることを前提としていた。
ここでは評価対象ソフトウェア101がアセンブラで記述されるときの評価対象ソフトウェア101におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出するシステムについて述べる。
図15は本実施形態によるソフトウェア評価システム100の機能ブロック図である。
評価対象ソフトウェア101はアセンブリ言語で記述されるソースコード102を持つ。
また、検出結果出力機能140は、対応位置表示機能142を持つ。対応位置表示機能142については実施例1で述べた通りのため、説明は省略する。
競合領域候補検出機能110は、アセンブリ言語で記述されるソースコード102を解釈し、割込処理との競合領域候補131を出力する。
リードモディファイライト領域抽出機能120も、同様にアセンブリ言語で記述されるソースコード102を解釈し、リードモディファイライト領域132を出力する。
競合領域候補検出機能110及びリードモディファイライト領域抽出機能120がソースコード102を解釈する方法については、実施例1の機械語を解釈する方法と同様であるため説明を省略する。
重複領域検出機能130についても実施例1と同様であるため説明を省略する。
検出結果出力機能140は、重複領域検出機能130から検出結果を受け取ると、前記検出結果情報とアセンブリ言語で記述されるソースコード102とを照合し、ソースコード102における書込競合の可能性のある処理を表示する。
ここで、競合領域候補検出機能110と、リードモディファイライト領域抽出機能120が解釈するソースコードは同一である。また、実施例1と異なり、最終的に検出結果出力機能が、競合の可能性のある処理として表示する対象のソースコードも、前記競合領域候補検出機能110と、リードモディファイライト領域抽出機能120が解釈するソースコードと同一である。
従って、実施例1で必要だった対応位置検出機能141は不要となり、競合領域候補検出機能110は重複領域検出機能130から渡されるソースコード上の処理位置(ファイル名、記載行等)に従って結果を表示することが出来る。
以上のようにして、評価対象ソフトウェア101がアセンブラで記述されるときの評価対象ソフトウェア101におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出することが出来る。
実施例1、2、3では、評価対象ソフトウェア101におけるリードモディファイライト処理と、自身の割込処理との競合の可能性のある処理を抽出するシステムについて述べた。
実施例5では、評価対象ソフトウェア101におけるリードモディファイライト処理と、評価対象ソフトウェア101の外部(以後、外部装置と記載する)からの変更処理との競合の可能性のある処理を抽出するシステムについて述べる。
評価対象ソフトウェア101を人が読み書きしやすい言語で記述し、対象機器が実行可能な言語に変換するためにコンパイルするものがある。
コンパイルの際に、評価対象ソフトウェア101上で取り扱うグローバル変数はコンパイラの任意の領域に割り振られる。
しかしながら、評価対象ソフトウェア101が外部装置と共通で使用する領域については、評価対象ソフトウェア101が所定領域にアクセスする必要が有る。
このため、コンパイル後のリソース割り振り位置をコンパイラへ指定する定義方法として、volatile宣言というものが存在する。volatile宣言により、ソフトウェアは指定領域へアクセスすることが出来たり、任意のグローバル変数のリソースを指定領域へ割り振ることが出来るようになる。
また、volatile宣言することにより、コンパイラの最適化により該当領域を一時領域(レジスタ等)に置き換えられることを防ぐことができる。
本実施例では、このvolatile宣言に着目し、volatile宣言がなされている領域は、すなわちリソースが別領域に割り振られると困る領域であって、ソフトウェア外部と共用する領域の可能性があると判断する。
更に、外部装置との書込処理の競合が発生して困る領域というのは、評価対象ソフトウェア101が外部装置の出力値を参照し、かつ自らも同領域を更新する領域に限られる。
外部装置とメモリ領域を共有していたとしても、評価対象ソフトウェア101が当該領域に参照のみを行い、書き込まない場合には、リード/モディファイ/ライト処理がそもそも存在しないため問題が無い。
本実施例では、volatile宣言がなされる領域のうち、評価対象ソフトウェア1
01がリードアクセスする領域であって、リードモディファイライト命令に展開される箇所を、外部装置との競合が発生する可能性が有る領域として報知する方法を説明する。
図8は本実施形態によるソフトウェア評価システム100の機能ブロック図である。
評価対象ソフトウェア101、及び検出結果出力機能140は、実施例1と同一であるため説明を省略する。
競合領域候補検出機能110は、volatile領域検出機能114と、リードアクセス領域検出機能115とからなる。
volatile領域検出機能114は、評価対象ソフトウェア101のソースコード102を読み込み、volatile宣言される変数名、及びアクセスアドレスを検出する。この検出結果を図示しないvolatile領域情報として記憶する。volatile宣言がアクセスアドレスに対して行われる場合には、アクセスサイズが複数バイト数に渡ることがあるため、1バイト単位で記憶する。
リードアクセス領域検出機能115は、前記volatile領域情報のうち、以下(1)または(2)の条件を満たす領域情報を外部アクセス領域候補131として記憶する。
(1)リードアクセス処理がなされる変数名が前記volatile領域情報に格納される変数名と同一である。
(2)リードアクセスアドレス及びリードアクセスバイト数から、前記volatile領域情報に格納されるアクセスアドレスと重なる。
リードモディファイライト領域抽出機能120及びリードモディファイライト領域132は、実施例1と同一であるため説明を省略する。
重複領域検出機能130は、外部アクセス領域候補131とリードモディファイライト領域132のアドレス情報を比較し、重複する領域を書込処理の競合が発生する可能性が有る領域として検出し、検出結果を検出結果出力機能140へ渡す。
図9は本実施例の競合領域候補検出機能110の処理の概要を示すフローチャートである。
競合領域候補検出機能110は、解析指示を受けて、評価対象ソフトウェア101のソースコード102を解析する(S901)。
前記ソースコード102を順次解析し(S902)、volatile宣言される定義情報を見付けるたびに(S903)、volatile領域情報として、発見したメモリアドレスを1バイト単位で記憶する(S904)。このとき記憶するvolatile領域情報の例を図11(A)に示す。
図11(A)はvolatile領域情報として、発見したメモリアドレスを1バイト単位で記憶しているものである。volatile宣言される定義情報が「0x1002から2バイト」のように複数バイトで定義される場合は、「0x1002」及び「0x1003」という複数のメモリアドレスとして記憶する。
競合領域候補検出機能110は、ソースコード102を全て解析し終えると、評価対象ソフトウェア101を再度解析する処理に移る。
ここで、S901からS904の処理は解析対象として評価対象ソフトウェア101のソースコード102を解析したが、以後の処理は、ソースコード102で行っても機械語104で行っても構わない。
競合領域候補検出機能110は、評価対象ソフトウェア101を解析し(S905)、評価対象ソフトウェア101における参照処理を探索する。評価対象ソフトウェア101における参照処理を見付けると(S906)、volatile領域情報として記憶したアドレスを参照し、解析中のソフトウェアの参照メモリアドレスと一致するか否かを調べる。参照処理のリードアクセスサイズが複数バイトにまたがる場合は、全てのアクセスアドレスについて調査する(S907)。
volatile領域情報と、リードアクセス領域が重なる場合には、重なるメモリア
ドレスについて、外部アクセス領域候補131へ格納する。ただし対象のメモリアドレスが外部アクセス領域候補131へ既に格納済の場合は格納せずS905へ戻る(S908)。重なる参照先の領域がとして未だ格納されていない領域である場合のみ外部アクセス領域候補131へ格納する(S909)。
S905からS909の処理を、評価対象ソフトウェア101の全てに対して行うと、外部アクセス領域候補131は、図11(B)のような、前記volatile領域情報図11(A)を間引いたものとなる。
重複領域検出機能130は、前記外部アクセス領域候補131と、リードモディファイライト領域132の情報を比較して、重複する領域を検出する。当該処理を含め、以降の処理は実施例1と同様のため説明を省略する。
以上のようにして、評価対象ソフトウェア101の外部装置からの変更処理との競合の可能性のある処理を、評価対象ソフトウェア101のソースコード102と照合して示すことが出来る。
実施例5では、外部装置がアクセスする可能性のある領域を推測する方法として、volatile宣言に着目した。
実施例6では、外部装置がアクセスする可能性のある領域を推測する方法として、ソフトウェアが読み出し処理のみを行う領域に着目する方法について述べる。ここでいう領域とはソフトウェアのアクセス単位を示す。すなわち、ソフトウェアが当該領域に対して読出しのみを行っているということは、ソフトウェアの「外部」から変更される領域であると推測し、当該領域に着目する。これに対してCPUがアクセス可能な単位がソフトウェアのアクセス単位と一致しない場合には、次のような場合に競合が発生し得る。すなわち、CPUによるアクセス領域内に前述のソフトウェアにより読出しのみ行っている領域と、それとは異なる、ソフトウェアによる書込を行っている領域が存在する場合である。
ソースコードと、コンパイルにより生成される機械語とで、ライトアクセスのバイト数が異なる場合がある。
以下に例を2つ挙げる。
第1の例として、ビットフィールドで定義される領域を挙げる。
ビットフィールドで定義される領域について、ソースコード上はあたかもビットアクセスしているように記述することが可能である。
しかしメモリや外部リソースに対するビット単位でのアクセス命令を持たないCPUの場合には、ビットアクセス命令をコンパイラがリードモディファイライト処理に展開することにより複数ステップでビット単位のアクセス処理を実現している。
ここで、外部装置との書込処理の競合が発生すると、ソフトウェアは外部装置の書込値を検知することが出来ない。
第2の例として、マイコンのアクセス境界仕様やコンパイラの最適化処理が挙げられる。
ソースコード上は1バイトアクセスで記載されていても、コンパイル時に2バイトや4バイト等の異なるアクセスバイト数の処理に展開されることがある。
このとき、ソフトウェア作成者が意図しない範囲まで書込処理を行ってしまうことになり、外部装置との書込処理の競合が発生する可能性が生じる。
この問題を解決するため、本実施例では、ソフトウェアが意図して読み出し及び書き込みを行っているアドレスを検出し、前記意図しているアドレスのうち読出処理のみを行っているアドレスを「外部装置からの変更処理があるアドレス」として検出する。その後、当該ソフトウェアと対応する機械語について、リードモディファイライト領域での書込アドレスを検出して、先に検出した「外部装置からの変更処理があるアドレス」と一致する処理を「外部装置との書込処理の競合が発生する可能性がある処理」とする。ここで算出した「外部装置との書込処理の競合が発生する可能性がある処理」を、ソースコードと照合して表示する。
図12は本実施形態によるソフトウェア評価システム100の機能ブロック図である。
評価対象ソフトウェア101、及びリードモディファイライト領域抽出機能120、リードモディファイライト領域132、重複領域検出機能130、検出結果出力機能140は実施例4と同一のため説明を省略する。
競合領域候補検出機能110は、リードアクセス領域検出機能116及びライトアクセス領域検出機能117及び外部アクセス領域候補検出機能121を持つ。ここで、外部アクセス領域候補検出機能121は、外部アクセス候補検出機能に対応する。
リードアクセス領域検出機能116は、評価対象ソフトウェア101のソースコード102を解析し、前記ソースコード102によるリードアクセス処理が為されている領域について抽出する機能である。
ライトアクセス領域検出機能117は、評価対象ソフトウェア101のソースコード102を解析し、前記ソースコード102によるライトアクセス処理が為されている領域について抽出する機能である。
外部アクセス領域候補検出機能121は、リードアクセス領域検出機能116が検出したリードアクセス領域と、ライトアクセス領域検出機能117が検出したライトアクセス領域とを比較する。そして、同一アドレスについて両者がアクセスしており、かつアクセス対象ビットが異なる領域を外部アクセス領域候補131として抽出する。
図13は本実施例の競合領域候補検出機能110の処理の概要を示すフローチャートである。
競合領域候補検出機能110は、解析指示を受けて、評価対象ソフトウェア101のソースコード102を解析する(S1201)。
前記ソースコード102を順次解析し(S1202)、参照処理を見付けるたびに(S1203)、リードアクセス領域情報として、発見したメモリアドレスを1バイト単位で記憶する(S1204)。詳述しないが、本実施例でも実施例1と同様に、ソースコード上における当該参照処理の記述位置の情報も記憶しておく。
このとき、ソースコード102がビットフィールド定義される場合は、アクセス対象ビットを合わせて記憶する。
リードアクセス領域情報の例を図14に示す。
リードアクセス領域情報は、アドレス、及びバイトアクセスかビットアクセスかを示す情報、及びビットアクセス時にのみ格納されるリードアクセス対象ビット情報を格納する。
アドレス0x1000は、ビットフィールド定義される領域へのリードアクセスを示す。ソースコード102にはビット0からビット4までのリードアクセスが為されていることを示す。
アドレス0x1001は、ビット4のみにリードアクセスが為されていることを示す。
アドレス0x1003、0x1004、0x1008、0x100A、0x100Bはソースコード102はバイトアクセスしていることを示す。ソースコード102には「0x100Aから2バイト」と言った多バイトアクセスが記載されていることがあるが、リードアクセス領域情報には1バイト単位で情報を格納する。
競合領域候補検出機能110は、ソースコード102を全て解析し終えると、評価対象ソフトウェア101を再度解析する処理に移る。
競合領域候補検出機能110は、評価対象ソフトウェア101を解析し(S1205)、評価対象ソフトウェア101における書込処理を探索する。評価対象ソフトウェア101における書込処理を見付けると(S1206)、書込アドレス及び書込サイズまたは書込対象ビットを取得する。
前記書込アドレスと、前記リードアクセス領域とを比較し、一致する領域またはビット
があれば(S1207)、リードアクセス領域情報から一致部分を削除する(S1208)。
例えば、リードアクセス領域情報が図14(A)である場合に、ソースコード102がアドレス0x1000のビット3に対して書込処理を行っていた場合には、0x1000のビット3はリードアクセス領域として記憶されている。このため、対象情報をリードアクセス領域情報から削除する。削除後のリードアクセス領域情報は図14(B)のようになる。
また、リードアクセス領域情報が図14(A)である場合に、ソースコード102がアドレス0x1008に対して2バイトの書込処理を行っていた場合には、0x1008、0x1009はリードアクセス領域として記憶されている。このため、対象情報をリードアクセス領域情報から削除する。削除後のリードアクセス領域情報は図14(C)のようになる。
さらに、リードアクセス領域情報が図14(A)である場合に、ソースコード102がアドレス0x100Aのビット4に対して書込処理を行っていた場合には、リードアクセス領域情報は図14(D)のようになる。すなわち、リードアクセス領域情報のアドレス0x100Aの、バイトアクセスを示す情報を取り下げ、かつビットアクセスかを示す情報のビット4以外をセットする。
S1205からS1209の処理を、評価対象ソフトウェア101の全てに対して行うと、リードアクセス領域情報はソースコード102におけるリードアクセスのみを抽出した情報になる。これを外部アクセス領域候補131として記憶する(S1209)。
重複領域検出機能130は、前記外部アクセス領域候補131と、リードモディファイライト領域132の情報を比較して、重複する領域を検出する。当該処理を含め、以降の処理は実施例1と同様のため説明を省略する。
以上のようにして、評価対象ソフトウェア101の外部装置からの変更処理との競合の可能性のある処理を、評価対象ソフトウェア101のソースコード102と照合して示すことが出来る。
更に、読出し処理のみを行う領域をvolataile宣言された領域で絞り込むことで、より正確に外部装置により更新される領域を抽出することができる。その場合には、本実施例の競合領域候補検出機能に実施例5のvolatile領域検出機能を追加し、外部アクセス領域候補検出機能にvolataile宣言領域で絞り込む処理を追加することで実現できる。
100…評価システム、101…評価対象ソフトウェア、110…競合領域候補検出機能、120…リードモディファイライト領域抽出機能、130…重複領域検出機能、140…検出結果出力機能

Claims (21)

  1. 評価対象のソフトウェアによる書き込みが競合する可能性がある箇所を検出するソフトウェア評価システムであって、
    前記ソフトウェアを解析し、該ソフトウェアによる書き込みが競合する可能性がある候補に関する情報を競合領域候補として抽出して記憶する候補検出機能と、
    前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域として記憶するリードモディファイライト領域抽出機能と、
    前記競合領域候補と、前記リードモディファイライト領域とから重複する領域を検出する重複検出機能と、
    前記重複検出機能によって検出された結果に基づいて、前記ソフトウェアにおける前記競合する可能性のあるライト処理が記述された位置の情報を出力する結果出力機能と
    を備えたことを特徴とするソフトウェア評価システム。
  2. 前記候補検出機能は、前記ソフトウェアのソースコード又は該ソースコードに対応する機械語で記述されたオブジェクトコードを読み込んで解析することを特徴とする請求項1に記載のソフトウェア評価システム。
  3. 前記リードモディファイライト領域抽出機能は、前記ソフトウェアのソースコードに対応する機械語で記述されたオブジェクトコードを読み込んで解析することを特徴とする請求項1又は2に記載のソフトウェア評価システム。
  4. 前記候補検出機能及び前記リードモディファイライト領域抽出機能に読み込まれて解析される前記ソフトウェアはアセンブラで記述されていることを特徴とする請求項1に記載のソフトウェア評価システム。
  5. 前記候補検出機能は、
    前記ソフトウェアを解析して、該ソフトウェアに含まれる割込ハンドラを検出する割込ハンドラ検出機能と、
    指定された指定関数を対象として解析する関数解析機能とを有し、
    前記関数解析機能は、
    前記ソフトウェアを解析し、前記指定関数の処理内容コードが該ソフトウェア上のいずれに存在するかを探索する実体探索機能と、
    前記指定関数を解析し、該解析の対象である解析対象関数が関数コールを含み、該コールされる関数がまだ指定されていないときには、該コールされる関数を指定関数として指定する呼出検出機能と、
    前記指定関数を解析し、該指定関数に含まれるライト処理を検出し、該検出されたライトアクセスがなされる領域の情報と、該ライト処理が前記ソフトウェアにおいて記述された箇所を特定する情報を競合領域候補として記憶するライトアクセス領域検出機能とを有し、
    前記割込ハンドラ検出機能によって検出された割込ハンドラは、指定関数として指定され、前記関数解析機能に渡されることを特徴とする請求項1乃至3のいずれか1項に記載のソフトウェア評価システム。
  6. 前記割込ハンドラ検出機能は、
    前記ソフトウェアを実現する機械語で記述されたオブジェクトコードを読み込み、
    前記割込ハンドラのリターン命令を検出することで該割込ハンドラの終了箇所を検知し、該リターン命令から前記オブジェクトコードを遡って読み込み、該割込ハンドラの処理
    コードを検出することを特徴とする請求項5に記載のソフトウェア評価システム。
  7. 前記割込ハンドラ検出機能は、
    前記ソフトウェアを実現する機械語で記述されたオブジェクトコードを読み込み、
    前記ソフトウェアが実行されるマイコンについて割込ハンドラの先頭アドレスが定義されるアドレスを指定する割込ベクタ定義情報に基づいて割込ハンドラの先頭アドレスを特定することにより割込ハンドラを検出することを特徴とする請求項5に記載のソフトウェア評価システム。
  8. 前記割込ハンドラ検出機能は、
    前記ソフトウェアのソースコードをコンパイルして得られる機械語で記述されたオブジェクトコードを読み込み、
    前記ソースコードをコンパイルするコンパイラごとの割込関数を定義する書式に基づいて割込ハンドラの先頭アドレスを特定することにより割込ハンドラを検出することを特徴とする請求項5に記載のソフトウェア評価システム。
  9. 前記リードモディファイライト領域抽出機能は、
    前記ソフトウェアを解析し、メモリから値を取得してレジスタへ格納するリード処理と、
    前記リード処理により値が格納されたレジスタを用いた演算処理と、
    前記リード処理において値を取得した前記メモリの領域に対して、前記演算処理において用いられたレジスタの領域に格納された値を書き込むライト処理と
    を検出することにより、リードモディファイライト処理を特定し、前記ライト処理が前記ソフトウェアにおいて記述された記述位置及び書き込み先のメモリの領域をリードモディファイライト領域として記憶することを特徴とする請求項5乃至8のいずれか1項に記載のソフトウェア評価システム。
  10. 前記リード処理から、前記ライト処理までの処理が所定ステップ以上である場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項9に記載のソフトウェア評価システム。
  11. 前記リード処理を検出してから、前記ライト処理を検出するまでに、関数コール命令を検出した場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項9に記載のソフトウェア評価システム。
  12. 前記リード処理を検出してから、前記ライト処理を検出するまでに、他のメモリアドレスに対するリード処理又はライト処理を検出した場合には、リードモディファイライト処理ではないと判断することを特徴とする請求項9に記載のソフトウェア評価システム。
  13. 前記割込ハンドラ検出機能は、割込ごとの割込優先度及び多重割込の禁止又は許可情報を検出する優先度検出機能を有し、前記候補検出機能は、前記ライトアクセスがなされる領域を特定する情報と関連付けて、前記割込ごとの割込優先度及び多重割込の禁止又は許可情報を、競合領域候補として記憶し、
    前記リードモディファイライト領域抽出機能は、前記ソフトウェアを解析して、当該ソフトウェアに含まれる関数を特定する関数情報を取得する情報検出機能と、前記関数情報によって特定される関数を先頭から解析することによって、割込の許可又は禁止を定義する命令の情報を取得する可否検出機能とを有し、前記リードモディファイライト処理に含まれるライト処理を含む関数の関数情報及び該関数を解析して取得された割込の許可又は禁止を定義する命令に基づく割込の許可又は禁止に関する情報を、前記リードモディファイライト処理の前記ソフトウェアにおける記述箇所を特定する情報及び書き込み先の領域
    を特定する情報に関連付けて、リードモディファイライト領域として記憶し、
    前記結果出力機能は、前記重複検出機能によって検出された結果に対して、前記競合領域候補の情報と、前記リードモディファイライト領域の情報とに基づいて、リードモディファイライト処理による割込処理の発生の有無を判断する競合判断機能を有することを特徴とする請求項5乃至12のいずれか1項に記載のソフトウェア評価システム。
  14. 前記結果出力機能は、
    前記ソフトウェアにおける前記競合する可能性のあるライトアクセス処理が記述された位置を出力する場合に、
    競合発生時に自らが書き込んだ情報が消されるライトアクセス処理、
    競合発生時に他の関数が書き込んだ情報を消すライトアクセス処理、
    又は、競合発生時に自らが書き込んだ情報が消されるライトアクセス処理及び他の関数が書き込んだ情報を消すライトアクセス処理
    のいずれが記述された位置を出力するかを切り替える表示切替機能を有することを特徴とする請求項13に記載のソフトウェア評価システム。
  15. 前記結果出力機能は、
    前記優先度検出機能の検出結果と前記競合判断機能の検出結果を比較し、ライトアクセス処理との競合が発生した時に、該ライトアクセス処理が他のライトアクセス処理を打つ消す可能性のあるものか、該ライトアクセス処理が他のライトアクセス処理によって打ち消される可能性のあるものかについて、該ライトアクセス処理が前記ソフトウェアのいずれの位置に記述されるかと対応付けて記憶する関係性検出機能を有することを特徴とする請求項14に記載のソフトウェア評価システム。
  16. 前記結果出力機能は、
    前記関係性検出機能によって記憶された情報に基づき、
    前記ソフトウェア上に競合の可能性のあるライト処理の記述箇所を表示するとともに、該ライト処理が打ち消す可能性のある箇所及び該ライト処理を打ち消される可能性がある箇所の少なくともいずれか一方を表示することを特徴とする請求項15に記載のソフトウェア評価システム。
  17. 前記リードモディファイライト領域抽出機能は、
    前記ソフトウェアを解析し、メモリから値を取得してレジスタへ格納するリード処理と、
    前記リード処理により値が格納されたレジスタを用いた演算処理と、
    前記リード処理において値を取得した前記メモリの領域に対して、前記演算処理において用いられたレジスタの領域に格納された値を書き込むライト処理と
    を検出することにより、リードモディファイライト処理を特定し、前記ライト処理が前記ソフトウェアにおいて記述された記述位置及び書き込み先のメモリの領域をリードモディファイライト領域として記憶することを特徴とする請求項1乃至4のいずれか1項に記載のソフトウェア評価システム。
  18. 前記候補検出機能は、前記ソフトウェアを解析して、該ソフトウェアによる書き込みが、外部装置による書き込みと競合する可能性がある領域の情報を領域候補の情報として出力し、
    前記リードモディファイライト領域抽出機能は、前記ソフトウェアを解析して、該ソフトウェアに含まれるリードモディファイライト処理を抽出し、該リードモディファイライト処理におけるライト処理の該ソフトウェアにおける記述箇所を特定する情報及びライトアクセスがなされる領域を特定する情報を含むリードモディファイライト領域の情報として出力することを特徴とする請求項1乃至4のいずれか1項に記載のソフトウェア評価シ
    ステム。
  19. 前記候補検出機能は、
    前記ソフトウェアを解析して、volatile宣言がなされた領域を抽出し、該volatile宣言される変数名と、該volatile宣言がなされた変数によるアクセスアドレスに関する情報を、volatile領域情報として記憶するvolatile領域検出機能と、
    前記volatile領域情報のうち、前記ソフトウェアに含まれるリード処理との関係に関する条件を満たす情報を含む外部アクセス領域候補の情報として記憶するリードアクセス領域検出機能とを含むことを特徴とする請求項18に記載のソフトウェア評価システム。
  20. 前記候補検出機能は、
    前記ソフトウェアを解析して、リード処理がなされている領域を検出して、リードアクセス領域として記憶するリードアクセス領域検出機能と、
    前記ソフトウェアを解析して、ライト処理がなされている領域を検出して、ライトアクセス領域として記憶するライトアクセス領域検出機能と、
    前記リードアクセス領域と前記ライトアクセス領域とを比較し、前記リード処理と前記ライト処理が同一アドレスにアクセスし、かつ、アクセス対象ビットが異なる領域の情報を外部アクセス領域候補の情報として記憶する外部アクセス候補検出機能とを有することを特徴とする請求項18に記載のソフトウェア評価システム。
  21. 請求項1乃至20のいずれか1項に記載のソフトウェア評価システムとしてコンピュータを機能させることを特徴とするプログラム。
JP2017241989A 2017-12-18 2017-12-18 ソフトウェア評価システム Pending JP2019109688A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2017241989A JP2019109688A (ja) 2017-12-18 2017-12-18 ソフトウェア評価システム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2017241989A JP2019109688A (ja) 2017-12-18 2017-12-18 ソフトウェア評価システム

Publications (1)

Publication Number Publication Date
JP2019109688A true JP2019109688A (ja) 2019-07-04

Family

ID=67179834

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017241989A Pending JP2019109688A (ja) 2017-12-18 2017-12-18 ソフトウェア評価システム

Country Status (1)

Country Link
JP (1) JP2019109688A (ja)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113806153A (zh) * 2021-09-15 2021-12-17 深圳市创成微电子有限公司 一种芯片验证方法
JPWO2022113425A1 (ja) * 2020-11-30 2022-06-02

Cited By (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPWO2022113425A1 (ja) * 2020-11-30 2022-06-02
WO2022113425A1 (ja) * 2020-11-30 2022-06-02 三菱電機株式会社 ソースコードを解析する方法、プログラムおよび装置
JP7250223B2 (ja) 2020-11-30 2023-03-31 三菱電機株式会社 ソースコードを解析する方法、プログラムおよび装置
CN113806153A (zh) * 2021-09-15 2021-12-17 深圳市创成微电子有限公司 一种芯片验证方法
CN113806153B (zh) * 2021-09-15 2023-10-24 深圳市创成微电子有限公司 一种芯片验证方法

Similar Documents

Publication Publication Date Title
US7752605B2 (en) Precise data-race detection using locksets
US11397575B2 (en) Microservices graph generation
US5926638A (en) Program debugging system for debugging a program having graphical user interface
JP2009129179A (ja) プログラム並列化支援装置およびプログラム並列化支援方法
CN102193810A (zh) 模块间内联候选标识
US20100275190A1 (en) Method of converting program code of program running in multi-thread to program code causing less lock collisions, computer program and computer system for the same
US10649744B1 (en) Systems and methods for handling renaming of programming constructs in programming environments
JPH0883185A (ja) コンパイラ
US6839893B2 (en) Debugger capable of providing warnings for unreachable breakpoints
JP6080826B2 (ja) 制御装置の制御プログラムに影響を与えるための方法
Kähkönen et al. Unfolding based automated testing of multithreaded programs
JP2019109688A (ja) ソフトウェア評価システム
US20110167415A1 (en) Language processing apparatus, language processing method, and computer program product
US20080034359A1 (en) Software transactional protection of managed pointers
CN106407104A (zh) 一种用于检测与内存空间释放相关的缺陷的方法及系统
KR102185294B1 (ko) 병렬 프로그램의 소스 코드 분석 장치 및 방법, 기록매체
CN112559035A (zh) 用于管理代码文本的笔记的方法和装置
JP7812346B2 (ja) プログラム検証支援システム、及びプログラム検証支援方法
US10698802B1 (en) Method and system for generating a validation test
JP2021002276A (ja) 分析プログラム、プログラム分析方法およびプログラム分析装置
CN114296794B (zh) 一种代码重定位方法及装置
JP2015153323A (ja) シンボリック実行プログラム、シンボリック実行方法及びシンボリック実行装置
JP6091471B2 (ja) ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム
KR20250172203A (ko) 다이렉트 팔로우 멀티그래프를 간략화 하는 장치 및 방법
US7627859B2 (en) Method for configuring non-script language library files to be run as scripts

Legal Events

Date Code Title Description
RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20181116