(19)【発行国】日本国特許庁(JP)
(12)【公報種別】特許公報(B2)
(11)【特許番号】
(24)【登録日】2023-07-20
(45)【発行日】2023-07-28
(54)【発明の名称】異常検出方法、異常検出プログラム、異常検出装置、書き換え方法、書き換えプログラム及び書き換え装置
(51)【国際特許分類】
G06F 11/07 20060101AFI20230721BHJP
【FI】
G06F11/07 151
G06F11/07 140H
(21)【出願番号】P 2020058221
(22)【出願日】2020-03-27
【審査請求日】2022-02-07
(73)【特許権者】
【識別番号】314012076
【氏名又は名称】パナソニックIPマネジメント株式会社
(74)【代理人】
【識別番号】100109210
【氏名又は名称】新居 広守
(74)【代理人】
【識別番号】100137235
【氏名又は名称】寺谷 英作
(74)【代理人】
【識別番号】100131417
【氏名又は名称】道坂 伸一
(72)【発明者】
【氏名】大賀 健司
(72)【発明者】
【氏名】村田 紀文
(72)【発明者】
【氏名】上田 恭子
【審査官】浦口 幸宏
(56)【参考文献】
【文献】特開平04-364531(JP,A)
【文献】実開平05-064933(JP,U)
【文献】特開昭63-055644(JP,A)
【文献】特開平03-268034(JP,A)
【文献】特開2000-172532(JP,A)
(58)【調査した分野】(Int.Cl.,DB名)
G06F 11/07
G06F 11/28-11/36
H04L 12/00-12/66
H04L 41/00-101/695
(57)【特許請求の範囲】
【請求項1】
分岐命令に対応する分岐先アドレスを2回以上読み出し、
読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、
読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行し、
同一の前記分岐先アドレスは、
プログラムが置かれたメモリ領域において、2つの異なるメモリ領域に保持され、
前記読み出しでは、前記分岐先アドレスを前記
2つの異なるメモリ領域から2回以上読み出す
異常検出方法。
【請求項2】
前記異常検出方法では、特定の条件が満たされた場合に前記読み出しが行われ、前記特定の条件が満たされない場合には前記読み出しが行われない
請求項
1に記載の異常検出方法。
【請求項3】
前記特定の条件は、前記分岐命令に対応する分岐先アドレスを2回以上読み込んだときに追加で必要となるメモリ容量が一定以下となる条件である
請求項
2に記載の異常検出方法。
【請求項4】
前記特定の条件は、前記分岐命令に対応する分岐先アドレスを2回以上読み込んだときに追加で必要となる処理時間が一定以下となる条件である
請求項
2に記載の異常検出方法。
【請求項5】
前記特定の条件は、読み出そうとしている分岐先アドレスに対応する分岐命令の優先順位が一定以上であるという条件である
請求項
2に記載の異常検出方法。
【請求項6】
請求項1~
5のいずれか1項に記載の異常検出方法をコンピュータに実行させるための異常検出プログラム。
【請求項7】
プログラムにおける分岐命令を検出する検出部と、
検出された前記分岐命令に対応する分岐先アドレスを2回以上読み出す読み出し部と、
読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定する判定部と、
読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する実行部と、を備え、
同一の前記分岐先アドレスは、
プログラムが置かれたメモリ領域において、2つの異なるメモリ領域に保持され、
前記読み出し部は、前記分岐先アドレスを前記
2つの異なるメモリ領域から2回以上読み出す
異常検出装置。
【請求項8】
プログラムの書き換え方法であって、
前記プログラムにおける分岐命令を検出し、
検出された前記分岐命令を異常検出命令に書き換え、
前記異常検出命令は、
前記分岐命令に対応する分岐先アドレスを2回以上読み出し、
読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、
読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令であり、
同一の前記分岐先アドレスは、
プログラムが置かれたメモリ領域において、2つの異なるメモリ領域に保持され、
前記読み出しでは、前記分岐先アドレスを前記
2つの異なるメモリ領域から2回以上読み出す
書き換え方法。
【請求項9】
前記書き換え方法では、特定の条件が満たされた場合に前記書き換えが行われ、前記特定の条件が満たされない場合には前記書き換えが行われない
請求項
8に記載の書き換え方法。
【請求項10】
前記特定の条件は、前記分岐命令を前記異常検出命令に書き換えたときに追加で必要となるメモリ容量が一定以下となる条件である
請求項
9に記載の書き換え方法。
【請求項11】
前記特定の条件は、前記分岐命令を前記異常検出命令に書き換えたときに追加で必要となる処理時間が一定以下となる条件である
請求項
9に記載の書き換え方法。
【請求項12】
前記特定の条件は、書き換えようとしている分岐命令の優先順位が一定以上であるという条件である
請求項
9に記載の書き換え方法。
【請求項13】
請求項
8~
12のいずれか1項に記載の書き換え方法をコンピュータに実行させるための書き換えプログラム。
【請求項14】
プログラムの書き換え装置であって、
前記プログラムにおける分岐命令を検出する検出部と、
検出された前記分岐命令を異常検出命令に書き換える書き換え部と、を備え、
前記異常検出命令は、
前記分岐命令に対応する分岐先アドレスを2回以上読み出し、
読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、
読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令であり、
同一の前記分岐先アドレスは、
プログラムが置かれたメモリ領域において、2つの異なるメモリ領域に保持され、
前記読み出しでは、前記分岐先アドレスを前記
2つの異なるメモリ領域から2回以上読み出す
書き換え装置。
【発明の詳細な説明】
【技術分野】
【0001】
本開示は、異常検出方法、異常検出プログラム、異常検出装置、書き換え方法、書き換えプログラム及び書き換え装置に関する。
【背景技術】
【0002】
従来、関数コール又は割り込み関数の発生時において、復帰アドレスを退避するスタックを多重化する装置が開示されている(例えば特許文献1)。これにより、関数復帰時の異常を検出できる。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
しかしながら、上記特許文献1では、関数復帰時の異常を検出できるが、関数分岐時の異常を検出することについては開示されていない。
【0005】
そこで、本開示では、関数分岐時の異常を検出できる異常検出方法等を提供する。
【課題を解決するための手段】
【0006】
本開示の一態様に係る異常検出方法は、分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する処理を含む。
【0007】
本開示の一態様に係る異常検出プログラムは、上記の異常検出方法をコンピュータに実行させるためのプログラムである。
【0008】
本開示の一態様に係る異常検出装置は、プログラムにおける分岐命令を検出する検出部と、検出された前記分岐命令に対応する分岐先アドレスを2回以上読み出す読み出し部と、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定する判定部と、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する実行部と、を備える。
【0009】
本開示の一態様に係る書き換え方法は、プログラムの書き換え方法であって、前記プログラムにおける分岐命令を検出し、検出された前記分岐命令を異常検出命令に書き換える処理を含み、前記異常検出命令は、前記分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令である。
【0010】
本開示の一態様に係る書き換えプログラムは、上記の書き換え方法をコンピュータに実行させるためのプログラムである。
【0011】
本開示の一態様に係る書き換え装置は、プログラムの書き換え装置であって、前記プログラムにおける分岐命令を検出する検出部と、検出された前記分岐命令を異常検出命令に書き換える書き換え部と、を備え、前記異常検出命令は、前記分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令である。
【0012】
なお、これらの包括的又は具体的な態様は、システム、方法、集積回路、コンピュータプログラムまたはコンピュータ読み取り可能なCD-ROMなどの記録媒体で実現されてもよく、システム、方法、集積回路、コンピュータプログラム及び記録媒体の任意な組み合わせで実現されてもよい。また、記録媒体は、非一時的な記録媒体であってもよい。
【発明の効果】
【0013】
本開示の一態様に係る異常検出方法等は、関数分岐時の異常を検出できる。
【図面の簡単な説明】
【0014】
【
図1】
図1は、実施の形態1に係る異常検出方法の一例を示すフローチャートである。
【
図2A】
図2Aは、比較例に係るプログラムの一例及び一時異常発生時の状況を示す図である。
【
図2B】
図2Bは、実施の形態1に係る異常検出プログラムの一例及び一時異常発生時の状況を示す図である。
【
図3A】
図3Aは、比較例に係るプログラムの一例及び恒久異常発生時の状況を示す図である。
【
図3B】
図3Bは、実施の形態1に係る異常検出プログラムの他の一例及び恒久異常発生時の状況を示す図である。
【
図4】
図4は、実施の形態1に係る異常検出装置の一例を示すブロック図である。
【
図5】
図5は、実施の形態2に係る書き換え方法の一例を示すフローチャートである。
【
図6】
図6は、実施の形態2に係る書き換え方法の具体例を模式的に表す図である。
【
図7】
図7は、実施の形態2に係る書き換え装置の一例を示すブロック図である。
【発明を実施するための形態】
【0015】
本開示の一態様に係る異常検出方法は、分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する処理を含む。
【0016】
これによれば、分岐命令に対応する分岐先アドレスが、プログラムカウンタ(PC)に代入される前に2回以上読み出されて、それぞれが一致した場合のみ分岐命令が実行され(つまり、分岐先アドレスがPCに代入され)、一致していない場合に異常検出処理が実行されるため、関数分岐時の異常を検出できる。
【0017】
例えば、前記分岐先アドレスは、1つのメモリ領域に保持され、前記読み出しでは、前記分岐先アドレスを前記1つのメモリ領域から2回以上読み出してもよい。
【0018】
これによれば、1つのメモリ領域からそれぞれ時間間隔を空けて2回以上分岐先アドレスを読み出すという時間的冗長性を利用することで、宇宙線に誘起されるビットステータスの反転等の一時異常を検出できる。また、1つのメモリ領域を利用することから、メモリの使用量を抑制できる。
【0019】
例えば、前記分岐先アドレスは、異なるメモリ領域に保持され、前記読み出しでは、前記分岐先アドレスを前記異なるメモリ領域から2回以上読み出してもよい。
【0020】
これによれば、異なるメモリ領域から2回以上分岐先アドレスを読み出すという空間的冗長性を利用することで、製造ばらつき又は経年劣化等による異常等の恒久異常を検出できる。また、異なるメモリ領域からそれぞれ時間間隔を空けて2回以上分岐先アドレスを読み出すという時間的冗長性も利用することで、恒久異常だけでなく一時異常も検出できる。
【0021】
例えば、前記異常検出方法では、特定の条件が満たされた場合に前記読み出しが行われ、前記特定の条件が満たされない場合には前記読み出しが行われなくてもよい。
【0022】
プログラムに存在する全ての分岐命令に対して、対応する分岐先アドレスが2回以上読み出されて異常検出のための処理が実行されると、処理負荷が増大する。これに対して、特定の条件が満たされた場合にのみ分岐先アドレスの読み出しが実行されることで、処理負荷を抑制できる。
【0023】
本開示の一態様に係る異常検出プログラムは、上記の異常検出方法をコンピュータに実行させるためのプログラムである。
【0024】
これによれば、関数分岐時の異常を検出できる異常検出プログラムを提供できる。
【0025】
本開示の一態様に係る異常検出装置は、プログラムにおける分岐命令を検出する検出部と、検出された前記分岐命令に対応する分岐先アドレスを2回以上読み出す読み出し部と、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定する判定部と、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する実行部と、を備える。
【0026】
これによれば、関数分岐時の異常を検出できる異常検出装置を提供できる。
【0027】
本開示の一態様に係る書き換え方法は、プログラムの書き換え方法であって、前記プログラムにおける分岐命令を検出し、検出された前記分岐命令を異常検出命令に書き換える処理を含み、前記異常検出命令は、前記分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令である。
【0028】
これによれば、既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換え方法を提供できる。
【0029】
例えば、前記書き換え方法では、特定の条件が満たされた場合に前記書き換えが行われ、前記特定の条件が満たされない場合には前記書き換えが行われなくてもよい。
【0030】
プログラムに存在する全ての分岐命令に対して、書き換えの処理が実行されると、処理負荷が増大する。これに対して、特定の条件が満たされた場合にのみ書き換えの処理が実行されることで、処理負荷を抑制できる。
【0031】
本開示の一態様に係る書き換えプログラムは、上記の書き換え方法をコンピュータに実行させるためのプログラムである。
【0032】
これによれば、既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換えプログラムを提供できる。
【0033】
本開示の一態様に係る書き換え装置は、プログラムの書き換え装置であって、前記プログラムにおける分岐命令を検出する検出部と、検出された前記分岐命令を異常検出命令に書き換える書き換え部と、を備え、前記異常検出命令は、前記分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された前記分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された前記分岐先アドレスのそれぞれが一致している場合、前記分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令である。
【0034】
これによれば既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換え装置を提供できる。
【0035】
以下、実施の形態について、図面を参照しながら具体的に説明する。
【0036】
なお、以下で説明する実施の形態は、いずれも包括的又は具体的な例を示すものである。以下の実施の形態で示される数値、形状、材料、構成要素、構成要素の配置位置及び接続形態、ステップ、ステップの順序などは、一例であり、本開示を限定する主旨ではない。
【0037】
(実施の形態1)
実施の形態1について
図1から
図4を用いて説明する。実施の形態1では、関数分岐時の異常を検出できる異常検出方法、異常検出方法をコンピュータに実行させるための異常検出プログラム及び異常検出装置について説明する。
【0038】
異常検出方法は、プログラムにおける分岐命令(関数呼び出し命令)が実行される際の異常を検出する方法である。プログラムにおける分岐命令は、ジャンプ先の関数の命令コードが格納される分岐先アドレス(例えば関数ポインタの値)がPCに代入されることで実行される。このとき、ジャンプ先のアドレス、すなわち分岐先アドレスが何らかの要因で書き換えられることがある。例えば、書き換えられたアドレスがアクセス不可のメモリ領域だった場合には、Abort例外として異常検出が可能であり、或いは、書き換えられたアドレスがアクセス可能だが無効命令(例えばコード領域外)だった場合には、無効命令例外として異常検出が可能である。しかし、書き換えられたアドレスがコード領域だった場合、例外処理ができないか遅れるため、プログラムが暴走するおそれがある。例えば、誤ったジャンプ先の関数の完了時には、スタックに正しい復帰アドレスが退避されていないため、誤った復帰アドレスをスタックからポップすることで、PCが再度想定外の値となる。例えば、車載製品のプログラムがこのような想定外の動作をしてしまうと、事故等の要因になりかねない。このため、このような異常を検出する必要がある。
【0039】
図1は、実施の形態1に係る異常検出方法の一例を示すフローチャートである。
【0040】
まず、分岐命令に対応する分岐先アドレスを2回以上読み出す処理(ステップS1)が行われる。例えば、当該読み出しでは、分岐先アドレスを1つのメモリ領域から2回以上読み出してもよいし、分岐先アドレスを異なるメモリ領域から2回以上読み出してもよい。
【0041】
次に、読み出された分岐先アドレスのそれぞれが一致しているか否かを判定する処理(ステップS2)が行われる。例えば、読み出された分岐先アドレスがそれぞれ異なるレジスタに格納され、異なるレジスタに格納された分岐先アドレスのそれぞれが一致しているか否かが判定される。
【0042】
そして、読み出された分岐先アドレスのそれぞれが一致している場合(ステップS2でYes)、分岐命令を実行する処理(ステップS3)が行われる。例えば、読み出された分岐先アドレスのそれぞれが一致している場合、PCに分岐先アドレスが代入されることで、分岐命令が実行される。
【0043】
読み出された分岐先アドレスのそれぞれが一致していない場合(ステップS2でNo)、異常検出処理を実行する処理(ステップS4)が行われる。異常検出処理は、例えば例外処理である。例えば、読み出された分岐先アドレスのそれぞれが一致していない場合、PCに例外処理命令に対応するアドレスが代入されることで、異常検出処理が実行される。
【0044】
このように、分岐命令に対応する分岐先アドレスが、PCに代入される前に2回以上読み出されて、それぞれが一致した場合のみ分岐命令が実行され(つまり、分岐先アドレスがPCに代入され)、一致していない場合に異常検出処理が実行されるため、関数分岐時の異常を検出できる。
【0045】
例えば、異常検出方法におけるステップは、コンピュータ(コンピュータシステム)によって実行されてもよい。そして、本開示は、異常検出方法に含まれるステップを、コンピュータに実行させるための異常検出プログラムとして実現できる。さらに、本開示は、異常検出プログラムを記録したCD-ROM等である非一時的なコンピュータ読み取り可能な記録媒体として実現できる。
【0046】
例えば、本開示が、異常検出プログラム(ソフトウェア)で実現される場合には、コンピュータのCPU、メモリ及び入出力回路等のハードウェア資源を利用して異常検出プログラムが実行されることによって、異常検出方法に含まれる各ステップが実行される。つまり、CPUがデータをメモリ又は入出力回路等から取得して演算したり、演算結果をメモリ又は入出力回路等に出力したりすることによって、各ステップが実行される。
【0047】
異常検出方法及び異常検出プログラムの具体例について、
図2Aから
図3Bを用いて説明する。なお、異常検出プログラムは、アセンブリ言語等のような低水準言語により実現されてもよいし、C言語等のような高水準言語により実現されてもよい。
【0048】
図2Aは、比較例に係るプログラムの一例及び一時異常発生時の状況を示す図である。
【0049】
図2Aの上側には、比較例に係るプログラム1000を示し、
図2Aの下側にはプログラム1000が実行されるときに一時異常が発生したときの状況を示す。
【0050】
プログラム1000は、関数func1()及び関数func2()を含むプログラムであり、例えばソースコードで模式的に表現されている。関数func1()及び関数func2()は、それぞれ分岐命令である。ここでは、関数func2()に着目する。
【0051】
図2Aの下側に示されるように、プログラム1000の置かれたメモリに保持された関数func2()に対応する分岐先アドレス(例えば0xDE00_0000)がPCに代入されることで、関数func2()が実行される。しかし、分岐先アドレスがPCに代入される際に、宇宙線に誘起されるビットステータスの反転等の一時異常が発生した場合、一時異常によって書き換えられた分岐先アドレス(例えば0xBE00_0000)がPCに代入され、プログラムが暴走するおそれがある。
【0052】
図2Bは、実施の形態1に係る異常検出プログラムの一例及び一時異常発生時の状況を示す図である。
【0053】
図2Bの上側には、実施の形態1に係る異常検出プログラム1001を示し、
図2Bの下側には異常検出プログラム1001が実行されるときに一時異常が発生したときの状況を示す。
【0054】
例えば、関数func2()に対応する分岐先アドレスは、1つのメモリ領域に保持され、異常検出プログラム1001では、関数func2()に対応する分岐先アドレスが1つのメモリ領域から2回以上読み出される。例えば、
図2Bに示されるように、1つのメモリ領域から関数func2()に対応する分岐先アドレスが読み出されて、関数アドレス一時保存用変数A(例えばレジスタA)に格納され(ステップS1A)、1つのメモリ領域から関数func2()に対応する分岐先アドレスが再度読み出されて、関数アドレス一時保存用変数B(例えばレジスタB)に格納される(ステップS1B)。ここでのステップS1A及びステップS1Bは、
図1に示される異常検出方法におけるステップS1に対応する。なお、分岐先アドレスが読み出される時間間隔は、異常検出プログラム1001を実行するコンピュータの性能等に応じて適宜決定される。
【0055】
図2Bの下側に示されるように、ステップS1Aにおける分岐先アドレスの1回目の読み出しでは、一時異常が発生せずレジスタAに正しい分岐先アドレス(例えば0xDE00_0000)が格納されることがわかる。ステップS1Bにおける分岐先アドレスの2回目の読み出しでは、一時異常が発生しており、レジスタBに一時異常によって書き換えられた分岐先アドレス(例えば0xBE00_0000)が格納されることがわかる。
【0056】
次に、異常検出プログラム1001では、読み出された分岐先アドレスのそれぞれが一致しているか否かが判定される(ステップS2)。ここでのステップS2は、
図1に示される異常検出方法におけるステップS2に対応する。
【0057】
図2Bの下側に示されるように、ステップS2における判定では、レジスタAに格納された分岐先アドレスとレジスタBに格納された分岐先アドレスとが一致しているか否かが判定される。
【0058】
異常検出プログラム1001では、読み出された分岐先アドレスのそれぞれが一致している場合、関数func2()が実行される(ステップS3)。すなわち、関数func2()に対応する分岐先アドレスがPCに代入される。ここでのステップS3は、
図1に示される異常検出方法におけるステップS3に対応する。
【0059】
異常検出プログラム1001では、読み出された分岐先アドレスのそれぞれが一致していない場合、異常検出処理として例えば例外処理が実行される。すなわち、例外処理命令に対応するアドレスがPCに代入される。ここでのステップS4は、
図1に示される異常検出方法におけるステップS4に対応する。
【0060】
このように、1つのメモリ領域からそれぞれ時間間隔を空けて2回以上分岐先アドレスを読み出すという時間的冗長性を利用することで、宇宙線に誘起されるビットステータスの反転等の一時異常を検出できる。
【0061】
図3Aは、比較例に係るプログラムの一例及び恒久異常発生時の状況を示す図である。
【0062】
図3Aの上側には、比較例に係るプログラム1000を示し、
図3Aの下側にはプログラム1000が実行されるときに恒久異常が発生したときの状況を示す。
【0063】
プログラム1000は、
図2Aで説明したものと同じであるため説明は省略する。
【0064】
図3Aの下側に示されるように、プログラム1000の置かれたメモリに保持された関数func2()に対応する分岐先アドレス(例えば0xDE00_0000)がPCに代入されることで、関数func2()が実行される。しかし、製造ばらつき又は経年劣化等によるメモリの異常等の恒久異常が発生した場合、メモリに保持された分岐先アドレスが書き換えられ、恒久異常によって書き換えられた分岐先アドレス(例えば0xBE00_0000)がPCに代入され、プログラムが暴走するおそれがある。
【0065】
図3Bは、実施の形態1に係る異常検出プログラムの他の一例及び恒久異常発生時の状況を示す図である。
【0066】
図3Bの上側には、実施の形態1に係る異常検出プログラム1002を示し、
図3Bの下側には異常検出プログラム1002が実行されるときに恒久異常が発生したときの状況を示す。
【0067】
例えば、関数func2()に対応する分岐先アドレスは、異なるメモリ領域に保持され、異常検出プログラム1002では、関数func2()に対応する分岐先アドレスが異なるメモリ領域から2回以上読み出される。例えば、
図3Bに示されるように、メモリ領域1から関数func2()に対応する分岐先アドレスが読み出されて、関数アドレス一時保存用変数A(例えばレジスタA)に格納され(ステップS1A)、メモリ領域2から関数func2()に対応する分岐先アドレスが読み出されて、関数アドレス一時保存用変数B(例えばレジスタB)に格納される(ステップS1B)。ここでのステップS1A及びステップS1Bは、
図1に示される異常検出方法におけるステップS1に対応する。
【0068】
図3Bの下側に示されるように、ステップS1Aにおける分岐先アドレスのメモリ領域1からの読み出しでは、メモリ領域1には恒久異常が発生しておらずレジスタAに正しい分岐先アドレス(例えば0xDE00_0000)が格納されることがわかる。ステップS1Bにおける分岐先アドレスのメモリ領域2からの読み出しでは、メモリ領域2に恒久異常が発生しており、レジスタBに恒久異常によって書き換えられた分岐先アドレス(例えば0xBE00_0000)が格納されることがわかる。
【0069】
次に、異常検出プログラム1002では、読み出された分岐先アドレスのそれぞれが一致しているか否かが判定される(ステップS2)。ここでのステップS2は、
図1に示される異常検出方法におけるステップS2に対応する。
【0070】
図3Bの下側に示されるように、ステップS2における判定では、レジスタAに格納された分岐先アドレスとレジスタBに格納された分岐先アドレスとが一致しているか否かが判定される。
【0071】
異常検出プログラム1002では、読み出された分岐先アドレスのそれぞれが一致している場合、関数func2()が実行される(ステップS3)。すなわち、関数func2()に対応する分岐先アドレスがPCに代入される。ここでのステップS3は、
図1に示される異常検出方法におけるステップS3に対応する。
【0072】
異常検出プログラム1002では、読み出された分岐先アドレスのそれぞれが一致していない場合、異常検出処理として例えば例外処理が実行される。すなわち、例外処理命令に対応するアドレスがPCに代入される。ここでのステップS4は、
図1に示される異常検出方法におけるステップS4に対応する。
【0073】
このように、異なるメモリ領域から2回以上分岐先アドレスを読み出すという空間的冗長性を利用することで、製造ばらつき又は経年劣化等による異常等の恒久異常を検出できる。なお、異なるメモリ領域からそれぞれ時間間隔を空けて2回以上分岐先アドレスを読み出すという時間的冗長性も利用することで、恒久異常だけでなく一時異常も検出できる。
【0074】
なお、プログラムには、数多くの分岐命令が存在する場合があり、プログラムに存在する全ての分岐命令に対して、対応する分岐先アドレスが2回以上読み出されて異常検出のための処理が実行されると、処理負荷が増大する。そこで、異常検出方法では、特定の条件が満たされた場合に上記読み出しが行われ、特定の条件が満たされない場合には上記読み出しが行われなくてもよい。例えば、特定の条件は、分岐命令に対応する分岐先アドレスを2回以上読み込んだときに追加で必要となるメモリ容量又は処理時間等が、一定以下となるという条件である。また、例えば、各分岐命令について、プログラムにおいて実行される頻度に応じて優先順位が付けられていてもよく、特定の条件は、読み出そうとしている分岐先アドレスに対応する分岐命令の優先順位が一定以上であるという条件であってもよい。このように、特定の条件が満たされた場合にのみ分岐先アドレスの読み出しが実行されることで、処理負荷を抑制できる。
【0075】
例えば、本開示は、関数分岐時の異常を検出できる異常検出装置として実現できる。
【0076】
図4は、実施の形態1に係る異常検出装置10の一例を示すブロック図である。なお、
図4には、異常検出装置10の他に分岐命令を含むプログラム及び各種命令に対応するアドレス等を保持するメモリ20、並びに、PC30が示されている。メモリ20及びPC30は、異常検出装置10に備えられていてもよい。なお、分岐命令を含むプログラム及び各種命令に対応するアドレス等は、1つのメモリ20に保持されていてもよいし、複数のメモリに分かれて保持されていてもよい。
【0077】
異常検出装置10は、プロセッサ及びメモリ等を含むコンピュータである。メモリは、プロセッサにより実行される制御プログラムを記憶することができる。異常検出装置10は、検出部11、読み出し部12、判定部13、実行部14及び記憶回路15を備える。検出部11、読み出し部12、判定部13及び実行部14は、メモリに格納された制御プログラムを実行するプロセッサ等によって実現される。
【0078】
検出部11は、メモリ20に置かれたプログラムにおける分岐命令を検出する。
【0079】
読み出し部12は、検出部11によって検出された分岐命令に対応する分岐先アドレスを2回以上読み出す。例えば、読み出し部12は、分岐先アドレスを2回読み出し、1回目に読み出した分岐先アドレスを記憶回路15のレジスタAに格納し、2回目に読み出した分岐先アドレスを記憶回路15のレジスタBに格納する。なお、ここでは、ある分岐命令に対応する分岐先アドレスが1つのメモリ領域に保持され、読み出し部12は、分岐先アドレスを1つのメモリ領域から2回以上読み出す例を示しているが、ある分岐命令に対応する分岐先アドレスが異なるメモリ領域に保持され、読み出し部12は、分岐先アドレスを異なるメモリ領域から2回以上読み出してもよい。
【0080】
判定部13は、読み出された分岐先アドレスのそれぞれが一致しているか否かを判定する。例えば、判定部13は、1回目に読み出されてレジスタAに格納された分岐先アドレスと、2回目に読み出されてレジスタBに格納された分岐先アドレスとが一致しているか否かを判定する。
【0081】
実行部14は、読み出された分岐先アドレスのそれぞれが一致している場合、分岐命令を実行し、読み出された前記分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する。実行部14は、読み出された分岐先アドレスのそれぞれが一致している場合、例えば、分岐命令に対応する分岐先アドレスとしてレジスタBに格納された分岐先アドレスをPC30に代入することで、分岐命令を実行する。なお、実行部14は、読み出された分岐先アドレスのそれぞれが一致している場合に、分岐命令に対応する分岐先アドレスとしてレジスタAに格納された分岐先アドレスをPC30に代入することで、分岐命令を実行してもよい。実行部14は、読み出された分岐先アドレスのそれぞれが一致していない場合、例えば、例外処理命令に対応するアドレスをPC30に代入することで、異常検出処理を実行する。
【0082】
なお、上述した特定の条件が満たされた場合に、検出部11は、メモリ20に置かれたプログラムにおける分岐命令を検出してもよく、読み出し部12は、検出された分岐命令に対応する分岐先アドレスを2回以上読み出してもよい。
【0083】
このように、本開示は、関数分岐時の異常を検出できる異常検出装置10(ハードウェア)として実現でき、ソフトウェアによる方式と比較して、メモリ資源の削減が可能となる。
【0084】
(実施の形態2)
実施の形態2について
図5から
図7を用いて説明する。実施の形態2では、既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換え方法、書き換えプログラム及び書き換え装置について説明する。
【0085】
図5は、実施の形態2に係る書き換え方法の一例を示すフローチャートである。
【0086】
まず、プログラムにおける分岐命令を検出する処理(ステップS11)が行われる。なお、実施の形態1で説明したように、処理負荷の抑制のために、プログラムに存在する複数の分岐命令のうちの一部の分岐命令を検出する処理が行われてもよい。
【0087】
次に、検出された分岐命令を異常検出命令に書き換える処理(ステップS12)が行われる。異常検出命令は、分岐命令に対応する分岐先アドレスを2回以上読み出し、読み出された分岐先アドレスのそれぞれが一致しているか否かを判定し、読み出された分岐先アドレスのそれぞれが一致している場合、分岐命令を実行し、読み出された分岐先アドレスのそれぞれが一致していない場合、異常検出処理を実行する命令である。
【0088】
実施の形態2に係る書き換え方法の具体例について、
図6を用いて説明する。
【0089】
図6は、実施の形態2に係る書き換え方法の具体例を模式的に表す図である。
【0090】
図6に示されるように、例えば、プログラム1000における分岐命令(関数func2())が検出されることで、プログラム1000における関数func2()が、異常検出命令に書き換えられる。これにより、既存のプログラム1000を、関数分岐時の異常を検出できる異常検出プログラム1001に書き換えることができる。なお、既存のプログラム1000が異常検出プログラム1002に書き換えられてもよい。
【0091】
なお、プログラムには、数多くの分岐命令が存在する場合があり、プログラムに存在する全ての分岐命令に対して、書き換えの処理が実行されると、処理負荷が増大する。そこで、書き換え方法では、特定の条件が満たされた場合に上記書き換えが行われ、特定の条件が満たされない場合には上記書き換えが行われなくてもよい。例えば、特定の条件は、分岐命令を異常検出命令に書き換えたときに追加で必要となるメモリ容量又は処理時間等が、一定以下となるという条件である。また、例えば、各分岐命令について、プログラムにおいて実行される頻度に応じて優先順位が付けられていてもよく、特定の条件は、書き換えようとしている分岐命令の優先順位が一定以上であるという条件であってもよい。このように、特定の条件が満たされた場合にのみ書き換えの処理が実行されることで、処理負荷を抑制できる。
【0092】
例えば、本開示は、既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換え装置として実現できる。
【0093】
図7は、実施の形態2に係る書き換え装置100の一例を示すブロック図である。なお、
図7には、書き換え装置100の他に分岐命令を含むプログラム及び各種命令に対応するアドレス等を保持するメモリ20が示されている。なお、分岐命令を含むプログラム及び各種命令に対応するアドレス等は、1つのメモリ20に保持されていてもよいし、複数のメモリに分かれて保持されていてもよい。
【0094】
書き換え装置100は、プロセッサ及びメモリ等を含むコンピュータである。メモリは、プロセッサにより実行される制御プログラムを記憶することができる。書き換え装置100は、検出部101及び書き換え部102を備える。検出部101及び書き換え部102は、メモリに格納された制御プログラムを実行するプロセッサ等によって実現される。
【0095】
検出部101は、メモリ20に置かれたプログラムにおける分岐命令を検出する。
【0096】
書き換え部102は、検出部101によって検出された分岐命令を異常検出命令に書き換える。例えば、書き換え部102は、検出された分岐命令に対応する分岐先アドレス及び例外処理命令に対応するアドレス等を用いて書き換えを実行する。
【0097】
なお、上述した特定の条件が満たされた場合に、検出部101は、メモリ20に置かれたプログラムにおける分岐命令を検出してもよく、書き換え部102は、検出された分岐命令を異常検出命令に書き換えてもよい。
【0098】
このように、本開示は、既存のプログラムを、関数分岐時の異常を検出できる異常検出プログラムに書き換えることができる書き換え装置100(ハードウェア)として実現できる。
【0099】
例えば、書き換え方法におけるステップは、コンピュータ(コンピュータシステム)によって実行されてもよい。そして、本開示は、書き換え方法に含まれるステップを、コンピュータに実行させるための書き換えプログラムとして実現できる。さらに、本開示は、書き換えプログラムを記録したCD-ROM等である非一時的なコンピュータ読み取り可能な記録媒体として実現できる。
【0100】
例えば、本開示が、書き換えプログラム(ソフトウェア)で実現される場合には、コンピュータのCPU、メモリ及び入出力回路等のハードウェア資源を利用して書き換えプログラムが実行されることによって、書き換え方法に含まれる各ステップが実行される。つまり、CPUがデータをメモリ又は入出力回路等から取得して演算したり、演算結果をメモリ又は入出力回路等に出力したりすることによって、各ステップが実行される。
【0101】
(その他の実施の形態)
以上のように、本開示に係る技術の例示として実施の形態を説明した。しかしながら、本開示に係る技術は、これに限定されず、適宜、変更、置き換え、付加、省略等を行った実施の形態にも適用可能である。例えば、以下のような変形例も本開示の一実施の形態に含まれる。
【0102】
上記実施の形態の異常検出装置10及び書き換え装置100に含まれる各構成要素は、専用又は汎用の回路として実現されてもよい。
【0103】
また、上記実施の形態の異常検出装置10及び書き換え装置100に含まれる各構成要素は、集積回路(IC:Integrated Circuit)であるLSI(Large Scale Integration)として実現されてもよい。
【0104】
また、集積回路はLSIに限られず、専用回路又は汎用プロセッサで実現されてもよい。プログラム可能なFPGA(Field Programmable Gate Array)、又は、LSI内部の回路セルの接続及び設定が再構成可能なリコンフィギュラブル・プロセッサが、利用されてもよい。
【0105】
さらに、半導体技術の進歩又は派生する別技術によりLSIに置き換わる集積回路化の技術が登場すれば、当然、その技術を用いて、異常検出装置10及び書き換え装置100に含まれる各構成要素の集積回路化が行われてもよい。
【0106】
その他、実施の形態に対して当業者が思いつく各種変形を施して得られる形態、本開示の趣旨を逸脱しない範囲で各実施の形態における構成要素及び機能を任意に組み合わせることで実現される形態も本開示に含まれる。
【産業上の利用可能性】
【0107】
本開示は、分岐命令を含むプログラムを使用する装置等に適用できる。
【符号の説明】
【0108】
10 異常検出装置
11、101 検出部
12 読み出し部
13 判定部
14 実行部
15 記憶回路
20 メモリ
30 PC
100 書き換え装置
102 書き換え部
1000 プログラム
1001、1002 異常検出プログラム