(57)【要約】【課題】プログラムが正しい順番で遷移されたか否かの検査を的確に行うための技術を提供する。【解決手段】データ処理装置で実行されるプログラムは、複数のコードブロック（１０１１〜１０１４）に分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられており、上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤを記憶装置に書き込み、コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤを更新し、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤りを的確に検出する。【選択図】図１
2007299081.tif 000002
【特許請求の範囲】
【請求項１】
プログラムを実行するデータ処理装置における制御フロー誤り検出方法であって、
上記プログラムは、複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられており、
上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤを記憶装置に書き込み、
コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤを更新し、
上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤りを検出することを特徴とする制御フロー誤り検出方法。
【請求項２】
上記プログラムにおけるサブルーチンの先頭と上記サブルーチンが呼び出し元に戻る部分とは、互いに別のコードブロックに所属し、かつ、同一のサブルーチン中で呼び出し元に戻る復帰命令が複数存在する場合の当該複数の復帰命令は、同一のコードブロックに含まれる請求項１記載の制御フロー誤り検出方法。
【請求項３】
上記サブルーチンを呼び出すための呼び出し命令の実行前に、上記サブルーチンの先頭のコードブロックＩＤと等しくなるよう予め計算された差分値を用いて上記記憶装置のコードブロックＩＤ値を更新し、
上記呼び出し命令の実行後に、上記サブルーチンの復帰命令が存在するコードブロックＩＤ値とサブルーチン呼び出しの後のコードブロックＩＤとの差分値を用いて、上記記憶装置に格納されているコードブロックＩＤ値を更新する請求項２記載の制御フロー誤り検出方法。
【請求項４】
上記ブロックＩＤ更新処理は、実行フローを移行させるための命令が存在するコードブロックのコードブロックＩＤの期待値から、実行フローが移行する先のコードブロックＩＤの期待値を引いた値を上記コードブロック演算値とし、
上記記憶装置内のコードブロックＩＤ値から上記コードブロック演算値を減算することにより、上記コードブロックＩＤの値を更新する請求項１記載の制御フロー誤り検出方法。
【請求項５】
上記ブロックＩＤ更新処理は、更新を実行フローが移行する先のコードブロックＩＤの期待値と、実行フローを移行させる命令が存在するコードブロックのコードブロックＩＤの素数Ｐを法とする逆元との素数Ｐを法とする剰余乗算の積を上記コードブロック演算値とし、
コードブロックＩＤ記憶装置に格納された値と上記差分値の素数Ｐを法とする剰余乗算の積を計算して、コードブロックＩＤの値を更新する請求項１記載の制御フロー誤り検出方法。
【請求項６】
複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられて成るプログラムを実行するデータ処理装置であって、
上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤの書き込みを可能とする記憶装置と、
コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤの更新を可能とする演算器と、
上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤り検出を可能とする比較器と、を含むことを特徴とするデータ処理装置。
【請求項７】
複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられて成るプログラムを実行するデータ処理装置であって、
上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤの書き込みを可能とする記憶装置と、
コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤの更新を可能とする演算器と、を含み、
上記演算器は、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤りを検出する機能を含むことを特徴とするデータ処理装置。
【請求項８】
命令を解釈して実行するための命令解釈実行装置を含み、
上記命令解釈実行装置は、上記記憶装置と上記演算器とを含む請求項７記載のデータ処理装置。
【請求項９】
命令を解釈して実行するための命令解釈実行装置を含み、
上記命令解釈実行装置は、割り込み処理の発生によりプログラムカウンタの値とコードブロックＩＤ記憶装置に格納されたコードブロックＩＤ値とをスタックポインタによって示されるアドレスに格納し、プログラムカウンタ値とコードブロック値を格納するために使用したエリア分だけ、上記スタックポインタの値を変更する第１機能と、
割り込み処理から復帰する場合には、コードブロックＩＤ値とプログラムカウンタ値をスタックポインタによって示されるアドレスから取り出し、コードブロックＩＤ値を上記コードブロックＩＤ記憶装置に格納する第２機能と、
上記プログラムカウンタ値を上記プログラムカウンタに格納し、割り込みが発生した時点の次の命令から処理を続行する第３機能と、を含む請求項６又は７記載のデータ処理装置。
【請求項１０】
請求項６乃至９の何れか１項記載のデータ処理装置で実行されるプログラムのオブジェクトコーを生成するためのコンパイラであって、
コンパイルされるプログラム中の少なくとも実行フロー制御が分岐する部分と、複数の実行制御フローが合流する部分とを境界として複数のコードブロックに分割し、各々のコードブロックにコードブロックＩＤの期待値を割り付けるための第１処理と、
異なるコードブロック間で実行フローが移動する命令の直前に、コードブロックＩＤの値を更新する命令コードを挿入し、上記コードブロックＩＤの値がその期待値と等しいか否かの整合性をチェックして上記コードブロックＩＤの値がその期待値と等しくない場合は実行フロー制御に誤りがあると判断するための命令コードを各々のコードブロック中に挿入するための第２処理と、を含むことを特徴とするコンパイラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムを実行するデータ処理装置における制御フロー誤り検出技術に関する。
【背景技術】
【０００２】
ＩＣカードに代表されるセキュリティモジュールは、リバースエンジニアリングの困難性と、暗号解読の計算量的困難性により、セキュリティを保証してきた。リバースエンジニアリングを困難にする方法として、非スタンダードセルを用いる、ダミー回路の敷設、メモリのスクランブル配置、バスのスクランブル配置、テストパッドの製品チップからの切断などが行われている（非特許文献１参照）。
【０００３】
暗号解読の困難性は、暗号解読にかかる計算量が十分大きく、現実的な時間では解読できないことを安全性の根拠としている。計算量的困難性は、秘密鍵のビット長に依存しており、鍵長が長くなると、解読に必要な計算量は大きくなる。半導体技術の発達に伴い、利用可能な計算機パワーが増大するため、安全な鍵のビット長は時が経つにつれ長くなっている。
【０００４】
こうしたリバースエンジニアリングや計算量的な困難性による対策に左右されない攻撃手法として、誤動作解析アタックが存在する。誤動作解析アタックとは、何らかの方法でチップに計算誤りを起こさせ、正しい計算結果と誤った計算結果の差分を用いて、鍵情報を推定する手法で、多くの暗号に対してアタック手法が開発されている。このアタック手法の特徴は、アタックに必要な時間が非常に少ない点である。例えば、ＣＲＴ演算法を用いたＲＳＡ暗号に対する誤動作解析アタック手法では、鍵長にかかわらず、たった１回の演算誤りが得られれば、正しい値と誤った値の差分と公開鍵のモジュロＮとの最大公約数から、秘密素数ｐが得られ、その結果から秘密鍵を推定できることが知られている（例えば非特許文献２参照）。
【０００５】
秘密鍵暗号系として広く用いられているＤＥＳ暗号では、正しい演算結果と誤った結果が数個から数十個が得られると、秘密鍵を得ることができることがＥ．Ｂｉｈａｍらによって報告されている（Ｅ．Ｂｉｈａｍ，Ａ．Ｓｈａｍｉｒ，“Ａ  Ｎｅｗ  Ｃｒｙｐｔａｎａｌｙｔｉｃ  Ａｔｔａｃｋ  ｏｎ  ＤＥＳ”，ｈｔｔｐ：／／ｗｗｗ．ｊｙａ．ｃｏｍ／ｄｆａ．ｈｔｍ，１９９６）。ＤＥＳ暗号の後継暗号として提案されたＡＥＳ暗号でも途中の演算のうちの１バイトに誤計算を起こさせることができれば、２回の誤計算結果から鍵が得られる手法がＪ．Ｊ．Ｑｕｉｓｑｕａｔｅｒらによって提案されている（例えば非特許文献３参照）。これらのアタックは、アタックに必要な計算量が暗号鍵の長さにかかわらず一定か、もしくは暗号鍵のビット長のみに比例し、かつ計算量は非常に小さいという特徴がある。
【０００６】
誤動作解析アタック対策としては、暗号に応じて、（１）２回計算を行い、２回の演算結果が等しくなることを確認する方法、（２）逆計算による検算を行う方法、（３）剰余体上での縮退表現や、パリティを用いて演算の整合性をチェックする方法などが提案されている。しかし、こうした対策は、演算結果の整合性をチェックする処理を行う必要があり、チェック処理が実行されなかった場合、誤動作アタックが可能となる。
【０００７】
制御フローの誤りを検知する技術としては、以下の第１〜５方法が知られている。
【０００８】
第１方法は、プログラム中に存在するジャンプ命令の飛び先に指定されているアドレスを予めジャンプ先アドレス情報として記憶しておき、ジャンプ命令を実行する際に、ジャンプ命令実行後にプログラムカウンタに設定されるアドレスが、記憶されているジャンプ先アドレス情報の中に含まれていることを検査し、不正な制御フローの遷移を検出する方法である（例えば特許文献１，２参照）。
【０００９】
第２方法は、プログラムが格納されているメモリ領域とプログラムが格納されていないメモリ領域をフラグ情報として格納しておくか、プログラムカウンタのアドレスの有効範囲を限定しておき、プログラムが格納されていないメモリ領域をプログラムカウンタが指し示した場合に検知し誤動作と判断する方法である（例えば特許文献３参照）。
【００１０】
第３方法は、プログラムの領域毎に番号を振り、値が決められた順番通りに遷移しているのかを検査する方法である（例えば特許文献４参照）。
【００１１】
第４方法は、予めプログラムをモジュールに分割し、モジュールごとに固有の番号を付与し、実行時には実行に伴って番号を更新する一方、モジュール内で固有の番号が想定された順番でモジュールが実行された場合の期待値と等しくなることを確認する方法である（例えば特許文献５，６参照）。
値と等しいことを検査し、等しくない場合に誤動作とする方法である（例えば特許文献７参照）。
【００１２】
【特許文献１】特開平１０−６３５４１号公報
【特許文献２】特開平９−１４６７８９号公報
【特許文献３】特開平１０−００３４０７号公報
【特許文献４】特開平６−３２４９１４号公報
【特許文献５】特開昭６０−３０４５号公報
【特許文献６】特開昭５７−１９９０５６号公報
【非特許文献１】Ｗ．Ｒａｎｋｌ＆Ｗ．Ｅｆｆｉｎｇ、Ｓｍａｒｔ  Ｃａｒｄ  Ｈａｎｄｂｏｏｋ  Ｓｅｃｏｎｄ  Ｅｄｉｔｉｏｎ、ｐｐ．４１２−４２０、ＷＩＬＥＹ、２０００、ＩＳＢＮ  ０−４７１−９８８７５−８
【非特許文献２】Ｄ．Ｂｏｎｅｈ，Ｒ．Ａ．ＤｅＭｉｌｌｏ，ａｎｄ  Ｒ．Ｊ．Ｌｉｐｔｏｎ：Ｏｎ  ｔｈｅ  Ｉｍｐｏｒｔａｎｃｅ  ｏｆ  Ｃｈｅｃｋｉｎｇ  Ｃｒｙｐｔｏｇｒａｐｈｉｃ  Ｐｒｏｔｏｃｏｌｓ  ｆｏｒ  Ｆａｕｌｔｓ，ＥＵＲＯＣＲＹＰＴ’９７，ｖｏｌｕｍｅ  １２３３  ｏｆ  Ｌｅｃｔｕｒｅ  Ｎｏｔｅｓ  ｉｎ  Ｃｏｍｐｕｔｅｒ  Ｓｃｉｅｎｃｅ，ｐａｇｅｒ  ３７−５１，Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，１９９７
【非特許文献３】Ｇ．Ｐｉｒｅｔ  ａｎｄ  Ｊ．Ｊ．Ｑｕｉｄｑｕａｔｅｒ：Ａ  Ｄｉｆｆｅｒｅｎｔｉａｌ  Ｆａｕｌｔ  Ａｔｔａｃｋ  Ｔｅｃｈｎｉｑｕｅ  ａｇａｉｎｓｔ  ＳＰＮ  Ｓｔｒｕｃｔｕｒｅｓ，ｗｉｔｈ  Ａｐｐｌｉｃａｔｉｏｎ  ｔｏ  ｔｈｅ  ＡＥＳ  ａｎｄ  ＫＨＡＲＡＤ，ＣＨＥＳ  ２００３，ＬＮＣＳ  ２７７９，ｐｐ．７８−８８，Ｓｐｒｉｎｇｅｒ−Ｖｅｒｌａｇ，２００３
【発明の開示】
【発明が解決しようとする課題】
【００１３】
ジャンプ命令の飛び先のチェックによる第１方法では、ジャンプ命令以外の部分でエラーが生じ、プログラムカウンタの値そのものが変化した場合には、検出することができない。また、プログラムカウンタが決められたアドレス範囲に収まっているかを検査する第２方法では、正規のプログラムが存在するアドレス領域内での制御フローの異常遷移が起きた場合のチェックが困難とされる。プログラムをモジュールに分けて、固有の番号を付与し、ジャンプ命令などでモジュール間の遷移の際に、モジュールの固有番号を記憶し、遷移の前後のモジュール番号の組み合わせの整合性を検査する第３方法や、モジュールの遷移ごとにカウンターを更新する第４方法では、処理の順序が固定された場合や、異なる複数の処理から１つの処理に遷移するような処理フローの合流や、再帰的な呼び出しを含むような複雑なフロー制御を扱うことが不可能とされる。
【００１４】
本発明の目的は、プログラムが正しい順番で遷移されたか否かの検査を的確に行うための技術を提供することにある。
【００１５】
また本発明の別の目的は、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置を提供することにある。
【００１６】
さらに本発明の別の目的は、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置で実行されるプログラムのオブジェクトコードを生成するためのコンパイラを提供することにある。
【００１７】
本発明の上記並びにその他の目的と新規な特徴は本明細書の記述及び添付図面から明らかになるであろう。
【課題を解決するための手段】
【００１８】
本願において開示される発明のうち代表的なものの概要を簡単に説明すれば下記の通りである。
【００１９】
〔１〕プログラムを実行するデータ処理装置における制御フロー誤り検出方法において、上記プログラムは、複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられており、上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤを記憶装置に書き込み、コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤを更新し、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤りを検出する。
【００２０】
上記の手段によれば、現在実行しているコードブロックのコードブロックＩＤ値を、コードブロックＩＤ記憶装置に記憶し、実行制御のコードブロック間遷移が行われるたびに、遷移先のコードブロックＩＤ移元のコードブロックＩＤとの差分値を用いて、コードブロックＩＤ記憶装置に記憶されたＩＤ値が更新される。このため、正しい順番で遷移が行われなかった場合、コードブロックＩＤ記憶装置に格納された値は、実際に実行されているコードブロックのコードブロックＩＤの期待値と一致しないことから、コードブロックＩＤ記憶装置に記憶されたコードブロックＩＤが検査されると、比較器によって誤りが検知される。コードブロックＩＤ記憶装置に格納されたコードブロックＩＤ値の更新の際には、遷移先のコードブロックのコードブロックＩＤを代入せずに、遷移元と遷移先のコードブロックの差分値を用いて更新を行うため、差分値もしくはコードブロックＩＤ記憶装置に格納されたＩＤ値が誤っている場合は、遷移先のコードブロックのコードブロックＩＤと等しくならない。一度コードブロックＩＤ記憶装置に格納されたコードブロックＩＤの値が誤った値となると、その後のコードブロックＩＤの更新処理でも正しい値になることはないため、コードブロックＩＤの値をチェックする処理が何らかの理由、例えば外部からの攪乱により、チェックをすり抜けるようなことがあった場合でも、その後に行われるコードブロックＩＤの検査でエラーが検知される。このことが、プログラムが正しい順番で遷移されたか否かの検査を的確に行うための技術の提供を達成する。
【００２１】
〔２〕上記〔１〕において、上記プログラムにおけるサブルーチンの先頭と上記サブルーチンが呼び出し元に戻る部分とは、互いに別のコードブロックに所属し、かつ、同一のサブルーチン中で呼び出し元に戻る復帰命令が複数存在する場合の当該複数の復帰命令は、同一のコードブロックに含まれる。
【００２２】
〔３〕上記〔２〕において、上記サブルーチンを呼び出すための呼び出し命令の実行前に、上記サブルーチンの先頭のコードブロックＩＤと等しくなるよう予め計算された差分値を用いて上記記憶装置のコードブロックＩＤ値を更新し、上記呼び出し命令の実行後に、上記サブルーチンの復帰命令が存在するコードブロックＩＤ値とサブルーチン呼び出しの後のコードブロックＩＤとの差分値を用いて、上記記憶装置に格納されているコードブロックＩＤ値を更新することができる。
【００２３】
〔４〕上記〔１〕において、上記ブロックＩＤ更新処理は、実行フローを移行させるための命令が存在するコードブロックのコードブロックＩＤの期待値から、実行フローが移行する先のコードブロックＩＤの期待値を引いた値を上記コードブロック演算値とし、上記記憶装置内のコードブロックＩＤ値から上記コードブロック演算値を減算することにより、上記コードブロックＩＤの値を更新することができる。
【００２４】
〔５〕上記〔１〕において、上記ブロックＩＤ更新処理は、更新を実行フローが移行する先のコードブロックＩＤの期待値と、実行フローを移行させる命令が存在するコードブロックのコードブロックＩＤの素数Ｐを法とする逆元との素数Ｐを法とする剰余乗算の積を上記コードブロック演算値とし、コードブロックＩＤ記憶装置に格納された値と上記差分値の素数Ｐを法とする剰余乗算の積を計算して、コードブロックＩＤの値を更新することができる。
【００２５】
〔６〕複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられて成るプログラムを実行するデータ処理装置において、上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤの書き込みを可能とする記憶装置と、コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤの更新を可能とする演算器と、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤り検出を可能とする比較器とを設ける。
【００２６】
上記の構成によれば、記憶装置は、上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤの書き込みを可能とし、演算器は、コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤの更新を可能とする。比較器は、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤り検出を可能とする。このことが、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置の提供を達成する。
【００２７】
〔７〕また、複数のコードブロックに分割され、且つ、それぞれのコードブロックに固有のコードブロックＩＤが割り当てられて成るプログラムを実行するデータ処理装置において、上記プログラムの実行開始時に、実行開始アドレスに対応するコードブロックＩＤの書き込みを可能とする記憶装置と、コードブロックから別のコードブロックに制御が遷移する場合に、この２つのコードブロックのＩＤから予め求められているコードブロック演算値を用いて上記記憶装置内のコードブロックＩＤの更新を可能とする演算器とを設ける。このとき、上記記憶装置内の更新されたコードブロックＩＤと、実行対象とされるコードブロックに割り当てられているコードブロックＩＤとが等しいか否かを判別することによって制御フロー誤りを検出する機能を上記演算器に設けることができる。
【００２８】
〔８〕上記〔７〕において、上記記憶装置と上記演算器とを上記命令解釈実行装置内に設けることができる。
【００２９】
〔９〕上記〔６〕又は〔７〕において、命令を解釈して実行するための命令解釈実行装置を設け、割り込み処理の発生によりプログラムカウンタの値とコードブロックＩＤ記憶装置に格納されたコードブロックＩＤ値とをスタックポインタによって示されるアドレスに格納し、プログラムカウンタ値とコードブロック値を格納するために使用したエリア分だけ、上記スタックポインタの値を変更する第１機能と、割り込み処理から復帰する場合には、コードブロックＩＤ値とプログラムカウンタ値をスタックポインタによって示されるアドレスから取り出し、コードブロックＩＤ値を上記コードブロックＩＤ記憶装置に格納する第２機能と、上記プログラムカウンタ値を上記プログラムカウンタに格納し、割り込みが発生した時点の次の命令から処理を続行する第３機能とを、上記命令解釈実行装置に含めることができる。
。
【００３０】
〔１０〕上記〔６〕乃至〔９〕の何れかのデータ処理装置で実行されるプログラムのオブジェクトコーを生成するためのコンパイラにおいて、コンパイルされるプログラム中の少なくとも実行フロー制御が分岐する部分と、複数の実行制御フローが合流する部分とを境界として複数のコードブロックに分割し、各々のコードブロックにコードブロックＩＤの期待値を割り付けるための第１処理と、異なるコードブロック間で実行フローが移動する命令の直前に、コードブロックＩＤの値を更新する命令コードを挿入し、上記コードブロックＩＤの値がその期待値と等しいか否かの整合性をチェックして上記コードブロックＩＤの値がその期待値と等しくない場合は実行フロー制御に誤りがあると判断するための命令コードを各々のコードブロック中に挿入するための第２処理とを設ける。
【００３１】
上記の手段によれば、各々のコードブロックにコードブロックＩＤの期待値が割り付けられ、異なるコードブロック間で実行フローが移動する命令の直前に、コードブロックＩＤの値を更新する命令コードが挿入され、上記コードブロックＩＤの値がその期待値と等しいか否かの整合性がチェックされて上記コードブロックＩＤの値がその期待値と等しくない場合は実行フロー制御に誤りがあると判断するための命令コードが各々のコードブロック中に挿入される。このことが、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置で実行されるプログラムのオブジェクトコードを生成するためのコンパイラの提供を達成する。
【発明の効果】
【００３２】
本願において開示される発明のうち代表的なものによって得られる効果を簡単に説明すれば下記の通りである。
【００３３】
すなわち、本発明によれば、プログラムが正しい順番で遷移が行われたか否かの検査を的確に行うための技術を提供することができる。また、本発明によれば、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置を提供することができる。さらに本発明によれば、プログラムが正しい順番で遷移されたか否かの検査を的確に行うことができるデータ処理装置で実行されるプログラムのオブジェクトコードを生成するためのコンパイラを提供することができる。
【発明を実施するための最良の形態】
【００３４】
図７には、本発明にかかるデータ処理装置の一例とされるマイクロコンピュータが示される。このマイクロコンピュータ７０００は、本発明にかかる制御フロー誤り検出方法の実施に使用されるもので、特に制限されないが、公知の半導体集積回路製造技術により、単結晶シリコン基板などの一つの半導体基板に形成されている。
【００３５】
図７に示されるマイクロコンピュータ７０００は、バス７００６を介して取り込まれた命令を解釈して実行する中央処理装置などの命令解釈実行装置７００１、上記命令解釈実行装置７００１で実行される命令列を記憶可能な記憶装置７００２、コードブロックＩＤを記憶可能なコードブロックＩＤ記憶装置７００４、上記コードブロックＩＤ記憶装置７００４の出力データとバス７００６を介して取り込まれたデータとの比較を可能とする比較器７００３、及び上記コードブロックＩＤ記憶装置７００４の出力データとバス７００６を介して取り込まれたデータとの演算処理を可能とする演算器７００５を含む。上記演算器７００５の出力データは上記コードブロックＩＤ記憶装置７００４に伝達され、また、上記比較器７００３の出力データはバス７００６を介して上記命令解釈実行装置７００１に供給可能とされる。上記比較器７００３での比較結果は、制御フロー誤り検出結果とされ、上記命令解釈実行装置７００１では、上記制御フロー誤り検出結果に基づいて、命令解釈処理の中断や、割り込みなどの必要な措置がとられるようになっている。
【００３６】
次に、上記構成のマイクロコンピュータ７０００における制御フロー誤り検出について詳述する。
【００３７】
図２には、上記構成のマイクロコンピュータ７０００で実行されるプログラムの基本的な構成例が示される。
【００３８】
上記構成のマイクロコンピュータ７０００で実行されるプログラムは、図２に示されるように、所定の条件で予め分割された複数のコードブロック１〜４を有する。上記コードブロック１〜４は、少なくとも制御フローが分岐する箇所や、合流する箇所を境界としてプログラムを分割した単位とされ、図２に示される例では、条件１（１００２）により分岐する箇所と、処理２（１００３）と処理３（１００４）が合流する箇所が少なくともコードブロックの境界となる。また、サブルーチンの入り口は、複数の箇所から呼び出され、制御フローが合流する地点である。従って、サブルーチンの入り口はコードブロックの境界となる。同様に、サブルーチンの処理が終了して、呼び出し側のプログラムに復帰する際は、異なる呼び出し元に復帰する地点であるので、そこもコードブロック境界となる。
【００３９】
図１には、上記制御フロー誤り検出方法の流れが示される。プログラムが複数のコードブロックに分割され、各コードブロック毎にコードブロックＩＤが割り当てられているのは、図２に基づいて既に説明した通りである。また、図１における「ｃｂｉｄ」は、上記コードブロックＩＤ記憶装置７００４にアクセスするための変数を示し、「ＢＬＯＣＫ１、ＢＬＯＣＫ２、ＢＬＯＣＫ３」は予めコードブロックに割り当てられたコードブロックＩＤの期待値で、定数である。「ＤＩＦＦｉ＿ｊ」は、コードブロックｊからコードブロックｉに遷移した場合のコードブロックの差分値で、コードブロックＩＤの期待値との関係は、次式によって示される。
【００４０】
ＤＩＦＦｉ＿ｊ＝ＢＬＯＣＫｉ−ＢＬＯＣＫｊ
すなわち、新たなコードブロックＩＤは、演算器７００５において差分値を加算することで求めることができる。ここで、上記差分値が本発明におけるコードブロック演算値の一例とされる。また、本例では、図１に示されるプログラムを実行する際に、ｃｂｉｄは、コードブロック１（１０１１）に対応するコードブロックＩＤの期待値ＢＬＯＣＫ１で初期化されている。ＳＴＡＲＴ（１００１）からプログラムの実行が開始され、先ずコードブロックＩＤ記憶装置７００４に格納された値が、期待値通りであるか否かの判別が行われる（２００１）。この判別は比較器７００３によって行われる。そして上記ステップ２００１の判別において期待値と異なる場合（ＹＥＳ）は、正規の手順で呼び出されていないと判定し、エラー（２００２）とされる。この場合、上記命令解釈実行装置７００１では、命令解釈処理の中断や、割り込みなどの必要な措置がとられる。また、上記ステップ２００１の判別において、期待値と異ならない（ＮＯ）と判断された場合には、条件１が成立するか否かの判別が行われる（１００２）。この判別も上記比較器７００３で行うことができる。この判別において、条件１が成立すると判断された場合（ＹＥＳ）はコードブロック３（１０１３）に遷移される。また、上記ステップ１００２の判別において、条件１が成立しない（ＮＯ）と判断された場合には、コードブロック２（１０１２）に遷移される。コードブロック２に遷移する際には、先ず演算器７００５で差分値ＤＩＦＦ２＿１をｃｂｉｄに加算して、コードブロックＩＤ記憶装置７００４に記憶された値がコードブロック２の期待値と等しくなるようにする（２００３）。引き続いて本来の処理である処理２（１００３）が命令解釈実行装置７００１で行われ、その後、コードブロックＩＤ記憶装置７００４に格納されている値が期待値ＢＬＯＣＫ３と等しいか否か検査される（２００５）。この比較は比較器７００３で行われる。上記ステップ２００５における比較において、コードブロックＩＤ記憶装置７００４に格納されている値が期待値ＢＬＯＣＫ３と等しくない（ＹＥＳ）と判断された場合にはエラーとされ、上記命令解釈実行装置７００１において、命令解釈処理の中断や、割り込みなどの必要な措置がとられる。何らかの理由で、コードブロック１以外の場所からコードブロック２に遷移してきた場合、コードブロックＩＤ記憶装置７００４に記憶されている値はＢＬＯＣＫ１以外と仮定でき、その場合、更新処理（２００３）で計算されるコードブロックＩＤの値は、ＢＬＯＣＫ２とは等しくないため、エラーとなる。また、コードブロック１以外の場所からコードブロック２に遷移しているにもかかわらず、コードブロックＩＤ記憶装置７００４に格納されている値がＢＬＯＣＫ１と等しい場合は、遷移前のコードブロック内で行われる同様のチェックでエラーとなる。
【００４１】
コードブロック４に遷移する前に、ｃｂｉｄに格納される値がＢＬＯＣＫ４と等しくなるようにｃｂｉｄにＤＩＦＦ４＿２を加えて更新する処理（２００９）を行った後、コードブロック４（１０１４）に遷移される。
【００４２】
同様にして、コードブロック３（１０１３）でもコードブロックＩＤ記憶装置７００４の値の更新（２００４）、本来の処理３（１００４）、コードブロックＩＤ記憶装置に格納された値のチェック（２００６）が行われ、整合性が失われている場合には、エラー（２００８）とされ、上記命令解釈実行装置７００１において、命令解釈処理の中断や、割り込みなどの必要な措置がとられる。
【００４３】
また、コードブロック４（１０１４）に遷移する前に、ｃｂｉｄの値がＢＬＯＣＫ４と等しくなるように、ｃｂｉｄにＤＩＦＦ４＿３を加える処理（２０１０）を行った後、コードブロック４（１０１４）に遷移される。コードブロック４（１０１４）に遷移した直後に比較器７００３で、ｃｂｉｄの値の整合性のチェック（２０１１）が行われ、ｃｂｉｄの値がＢＬＯＣＫ４と異なる場合、エラー（２０１２）となる。
【００４４】
このようにコードブロックＩＤ記憶装置７００４内のｃｂｉｄの更新を、差分値を用いて行うことにより、実行制御フローが合流する場合でも、１回の検査で整合性を容易に確認することができる。
【００４５】
また、コードブロック２（１０１２）からコードブロック４（１０１４）への遷移において、コードブロック２（１０１２）でのｃｂｉｄの整合性のチェック（２００５）をパスできるのは、ｃｂｉｄがＢＬＯＣＫ２の時のみであり、さらにｃｂｉｄの更新処理が差分値の加算（２００９）となっているため、コードブロック４（１０１４）のｃｂｉｄの整合性チェック（２０１１）を通過できるのは、ｃｂｉｄがＢＬＯＣＫ２からＢＬＯＣＫ４に変化するケースのみである。同様に、コードブロック３（１０１３）からコードブロック４（１０１４）への遷移が正しくなるのは、コードブロック４（１０１４）のｃｂｉｄの整合性チェック（２０１１）を通過できるケース、すなわち、ｃｂｉｄがＢＬＯＣＫ３からＢＬＯＣＫ４に変化するケースのみである。したがって、制御フローが合流する場合でも、合流先のコードブロックでは合流元毎の個別チェックを行わずに済む。
【００４６】
上記の例によれば、以下の作用効果を得ることができる。
【００４７】
（１）コードブロックＩＤ記憶装置７００４内のｃｂｉｄの更新を、差分値を用いて行うことにより、実行制御フローが合流する場合でも、１回の検査で整合性を容易に確認することができる。
【００４８】
（２）具体的には、制御フローの分岐や合流を含む複雑な制御フローを有するプログラムに関して、現在実行しているコードブロックのコードブロックＩＤ値を、コードブロックＩＤ記憶装置７００４に記憶し、実行制御のコードブロック間遷移が行われるたびに、遷移先のコードブロックＩＤ移元のコードブロックＩＤとの差分値を用いて、コードブロックＩＤ記憶装置７００４に記憶されたＩＤ値が更新される。このため、正しい順番で遷移が行われなかった場合、コードブロックＩＤ記憶装置７００４に格納された値は、実際に実行されているコードブロックのコードブロックＩＤの期待値と一致しないことから、コードブロックＩＤ記憶装置７００４に記憶されたコードブロックＩＤが検査されると、比較器７００３によって誤りが検知される。コードブロックＩＤ記憶装置７００４に格納されたコードブロックＩＤ値の更新の際には、遷移先のコードブロックのコードブロックＩＤを代入せずに、遷移元と遷移先のコードブロックの差分値を用いて更新を行うため、差分値もしくはコードブロックＩＤ記憶装置７００４に格納された値のいずれか一方、もしくは両方が誤っている場合は、遷移先のコードブロックのコードブロックＩＤと等しくならない。一度コードブロックＩＤ記憶装置に格納されたコードブロックＩＤの値が誤った値となると、その後のコードブロックＩＤの更新処理でも正しい値になることはないため、コードブロックＩＤの値をチェックする処理が何らかの理由、例えば外部からの攪乱により、チェックをすり抜けるようなことがあった場合でも、その後に行われるコードブロックＩＤの検査でエラーが検知される。そしてエラーを生じた場合、上記命令解釈実行装置７００１では、アタック対策のため、命令解釈処理の中断や、割り込みなどの必要な措置がとられる。
【００４９】
（３）上記（２）の作用効果により、信頼性の高いマイクロコンピュータ７０００を提供することができる。
【００５０】
図３には、上記制御フロー誤り検出方法の別の流れが示される。
【００５１】
図３に示されるようにサブルーチンが含まれる場合には、次のように制御フロー誤り検出が行われる。
【００５２】
コードブロック１（３０１１）では、条件１が成立するか否かの判別が行われ（３００２）、コードブロック２（３０１２）では処理２（３００３）が行われ、コードブロック３（３０１３）では処理３（３００４）が行われ、コードブロック４（３０１４）では条件４が成立するか否かの判別が行われる。コードブロック５（３０１５）では処理５（３００６）が行われる。
【００５３】
サブルーチンには、必ず呼び出し元に制御を戻す復帰命令（３００７、３００８，３００９）が存在し、これら複数の復帰命令が存在するブロックのコードブロック（３０１６）は、同一のブロックとして扱う。こうすることで、図４に示されるようにサブルーチンの先頭コードブロック（４０１１）と復帰命令が存在するブロック（４０１３）の２つのコードブロックの情報のみが外部から既知であれば、複雑なコードブロック遷移４０１２の有無にかかわらず、サブルーチンを呼び出す際のコードブロックＩＤの更新とエラーチェックを行うことができる。
【００５４】
図５には、外部から見たサブルーチンのコードブロックへの分割とコードブロックＩＤの割り付け例が示される。
【００５５】
サブルーチンの先頭ブロック（５０１１）には、ＢＬＯＣＫ２をコードブロックとして割り当て、すべての復帰命令を含むコードブロック３（５０１２）のコードブロックＩＤをＢＬＯＣＫ３とする。
【００５６】
図６には、上記サブルーチンを呼び出す呼び出し側のプログラムの処理フローが示される。
【００５７】
図５に示されるサブルーチンを呼び出す直前のコードブロック（６０１１）のコードブロックＩＤにＢＬＯＣＫ１が割り当てられ、サブルーチンの呼び出し後のコードブロック（６０１４）にＢＬＯＣＫ４がコードブロックＩＤとして割り当てられているものとする。コードブロック２，３はサブルーチンに依存して決定されるコードブロックである。ここでｃｂｉｄは、コードブロックＩＤ記憶装置にアクセスするための変数を示し、ＤＩＦＦｉ＿ｊは、コードブロックｊからコードブロックｉに遷移した場合のコードブロックの差分値で、コードブロックＩＤの期待値との関係は、次式によって示される。
【００５８】
ＤＩＦＦｉ＿ｊ＝ＢＬＯＣＫｉ−ＢＬＯＣＫｊ
図６におけるコードブロック１（６０１１）を正しく実行している場合に、ｃｂｉｄの値は、ＢＬＯＣＫ１になっている。サブルーチンを呼び出す前に、ｃｂｉｄの値がサブルーチンの先頭のコードブロックのコードブロックＩＤと等しくなるように、演算器７０００において、ＣｂｉｄにＤＩＦＦ２＿１を加える処理（６００１）を行った後、サブルーチンを呼び出す（６００２）。サブルーチンが正しい実行経路で実行が行われた場合、ｃｂｉｄの値はサブルーチンからの復帰命令が存在するコードブロック（５０１２）のコードブロックＩＤである、ＢＬＯＣＫ３と等しくなるので、比較器７００３において、ｃｂｉｄの値がＢＬＯＣＫ３と等しいかをチェックし（６００３）、等しくない場合はエラー（６００４）とされる。
【００５９】
図８には、本発明にかかるデータ処理装置の一例とされるマイクロコンピュータ７０００の別の構成例が示される。
【００６０】
図８に示されるマイクロコンピュータ７０００が、図７に示されるのと大きく相違するのは、コードブロックＩＤ記憶装置７００４の値を更新するための演算器８００５が、コードブロックＩＤ記憶装置７００４に格納された値と、実行中のコードブロックＩＤの期待値との整合性をチェックするための比較手段としても使用できるように、比較結果をフラグ８０１０として出力する機能を有する点である。
【００６１】
制御フロー誤りの検出対象となる命令列７００７は、記憶装置７００２に納められており、命令列は、例えば図１に示されるように複数のコードブロックに分割され、コードブロックＩＤ記憶装置７００４の値更新（２００３，２００９，２０１０）と検査を行う命令列（２００１，２００５，２００６，２０１１）を含んでいる。記憶装置７００２に格納された命令列７００７は、バス７００６を通り、命令解釈実行装置７００１に送られ、コードブロックＩＤ記憶装置７００４の値を、バス７００６を介して初期化する。コードブロックＩＤ記憶装置７００４の値をコードブロック間の遷移に伴って更新させる際には、差分値を命令解釈実行装置７００１から演算器８００５にバス７００６を介して転送し、演算器８００５は、送られてきた差分値と、コードブロックＩＤ記憶装置７００４に格納されていた値とを用いて新たなコードブロックＩＤを計算し、その計算結果をコードブロックＩＤ記憶装置７００４に格納する。
【００６２】
上記演算器８００５は、コードブロックＩＤ記憶装置７００４に格納された値の更新に加え、コードブロックＩＤ記憶装置７００４の値と、バス７００６を通じて命令解釈実行装置７００１より送られてくるコードブロックＩＤの期待値を比較し、それが等しいか否かの結果をフラグ（ｆｌａｇ）８０１０として出力する。命令解釈実行装置７００１は、演算器８００５のフラグ８０１０の力結果に従い、期待値と実際のＩＤの値が等しい場合は実行解釈処理を続け、期待値と実際のコードブロックＩＤ記憶装置７００４に格納された値が異なる場合は、命令解釈処理の中断や、割り込みなどの必要な措置を行うように構成される。
【００６３】
図９には、本発明にかかるデータ処理装置の一例とされるマイクロコンピュータ７０００の別の構成例が示される。
【００６４】
図９に示されるマイクロコンピュータ７０００が、図８に示されるのと大きく相違するのは、コードブロックＩＤ記憶装置９００４を命令解釈装置７００１と、コードブロックＩＤ記憶装置９００４の値を更新するための演算器９００５とを命令解釈実行装置７００１の内部に実装した点である。この場合、上記コードブロックＩＤ記憶装置９００４は汎用レジスタなどによって形成することができる。また、上記演算装置９００５は、コードブロックＩＤの値の計算以外の、通常の計算処理で用いられている汎用演算装置としても用いることができるように設計することができる。さらにこの演算器９００５は、コードブロックＩＤ記憶装置９００４に格納された値と、実行中のコードブロックＩＤの期待値との整合性をチェックするための比較にも使用できるように、比較結果をフラグ９０１０として出力する機能を有する。
【００６５】
制御フロー誤りの検出対象となる命令列９００７は、記憶装置７００２に納められており、命令列は、例えば図１に示したように複数のコードブロックに分割され、コードブロックＩＤ記憶装置９００４の値更新（２００３，２００９，２０１０）と検査を行う命令列（２００１，２００５，２００６，２０１１）を含んでいる。記憶装置７００２に格納された命令列は、バス７００６を通り、命令解釈実行装置７００１に送られ、コードブロックＩＤ記憶装置９００４の値を、バス７００６を通じて初期化する。コードブロックＩＤ記憶装置の値をコードブロック間の遷移に伴って更新させる際には、記憶装置７００２内の命令列９００７中に明示的に格納されている差分値を演算器９００５に内部バス９００８を介して転送し、演算器９００５は、送られてきた差分値と、コードブロックＩＤ記憶装置９００４に格納されていた値とを用いて新たなコードブロックＩＤを計算し、それを再びコードブロックＩＤ記憶装置９００４に格納する。
【００６６】
演算器９００５は、コードブロックＩＤ記憶装置９００４に格納された値の更新に加え、コードブロックＩＤ記憶装置９００４の値と、記憶装置７００２内の命令列９００７中に明示的に格納されているコードブロックＩＤの期待値を比較し、等しいか等しくないかの結果をフラグ９０１０として出力する。命令解釈実行装置７００１は、演算器９００５のフラグ９０１０出力結果に従い、期待値と実際のＩＤの値が等しい場合は実行解釈処理を続け、期待値と実際のコードブロックＩＤ記憶装置に格納された値が異なる場合は、命令解釈処理の中断や、割り込みなどの必要な措置を行うように構成する。
【００６７】
図１０及び図１１には、上記マイクロコンピュータ７０００での割り込み発生時のスタックの使用状況が示される。
【００６８】
図１０において、使用中のエリア１１００４の先頭のアドレスはスタックポインタ１１００５によって示される。スタックポインタ１１００５が指し示すアドレスよりも下位のアドレスは、空きエリア１１００１となる。割り込みが発生すると、プログラムカウンタの値とコードブロックＩＤ記憶装置に格納されたコードブロックＩＤ値をスタックポインタ１１００５が指し示したアドレスに格納し、プログラムカウンタ値とコードブロック値を格納するために使用したエリア分だけ、スタックポインタ１１００５の値を変更する。プログラムカウンタ値とコードブロック値を記憶装置に格納した状態が図１１に示される。割り込み処理から復帰する場合には、コードブロックＩＤ値１１００２とプログラムカウンタ値１１００３をスタックポインタ１１００５が示すアドレスから取り出し、コードブロックＩＤ値をコードブロックＩＤ記憶装置に格納し、プログラムカウンタ値をプログラムカウンタに格納し、割り込みが発生した時点の次の命令から処理を続行する。
【００６９】
次に、上記マイクロコンピュータ７０００で実行されるオブジェクトコードを生成するためのコンパイラについて説明する。
【００７０】
図１２には、上記コンパイラが動作するコンピュータシステム１３００が示される。
【００７１】
図１２に示されるコンピュータシステムは、ハードディスク１３０１０、計算機１３０２０、及びリーダーライター１３０３０を含む。ハードディスク１３０１０には、コンパイラ１３０１１及びソースプログラム１３０１２が格納されている。コンパイラ１３０１１が計算機１３０２０に読み込まれて実行され、上記ソースプログラム１３０１２のコンパイルが行われる。このコンパイルにより、ソースプログラムから耐タンパ性を有するオブジェクトコード１３０１３（実行可能プログラム）が生成され、ハードディスク１３０１０に格納される。そしてこのオブジェクトコード１３０１３は、例えばカード１３０４０に内蔵されたマイクロコンピュータ７０００で実行されるプログラムとして、上記マイクロコンピュータ７０００内の記憶装置７００２（図７〜９参照）に書き込まれる。上記記憶装置７００２は、特に制限されないが、フラッシュメモリとされ、上記リーダーライター１３０３０によるオンボード書き込みが可能とされる。
【００７２】
図１３には、上記コンパイラ１３０１１による処理の流れが示される。
【００７３】
ソースリスト（１０００１）を通例の構文解析処理（１０００２）により構文解析を行い、最低限制御フローの分岐、合流を境界として、コードブロック抽出処理（１０００３）によりコードブロックに分割される。コードブロックを抽出する際、制御フローの分岐や合流点に加えて、さらに小さな単位にコードブロックを分割しても良い。分割された個々のコードブロックに対して、コードブロックＩＤ割り当て処理（１０００４）により、コードブロックＩＤの期待値の割り当てを行う。コードブロックＩＤの期待値は、異なるコードブロックではユニークな値となることが望ましいが、コードブロックＩＤの期待値に重複があっても良い。例えば通例のハッシュ関数などを用いて、重複する可能性が低いことが期待できる方法でコードブロックＩＤを割り当てることができる。最後にコードブロックＩＤ更新処理及びチェック処理追加処理（１０００５）により、コードブロックＩＤの更新処理と整合性チェック処理を実行可能プログラム中に現れるようにコードの追加を行う。この際、コードブロックＩＤの更新処理は、異なるコードブロック間の遷移に対して、すべて付加する必要があるが、コードブロックＩＤの整合性チェック処理は、全てのコードブロック内に現れなくても良い。通例の方法による実行オブジェクト生成処理（１０００６）により、コードブロックＩＤによる誤動作検知手段を有するオブジェクトコード（１０００７）を生成する。
【００７４】
以上本発明者によってなされた発明を具体的に説明したが、本発明はそれに限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能であることはいうまでもない。
【００７５】
例えば、図１におけるブロックＩＤの更新処理は、素数Ｐを法とした剰余乗算により行うことができる。コードブロックＩＤの値がＡのブロックから、コードブロックＩＤの値がＢのブロックに遷移する場合は、次式で示されるＣの値を剰余蒸散することで、コードブロックＩＤをＡからＢに更新させることができる。
【００７６】
Ｂ＝Ｃ・Ａ  ｍｏｄ  Ｐ
ここで、０＜Ａ＜Ｐかつ０＜Ｂ＜Ｐであれば、必ずＣの値が存在する。Ｃの値も０＜Ｃ＜Ｐであり、次式によって計算できる。
【００７７】
Ｃ＝Ｂ・Ａ−１  ｍｏｄ  Ｐ
Ａ−１  ｍｏｄ  Ｐは、Ｐを法とするＡの逆元であり、Ｐが素数でかつ０＜Ａ＜Ｐであれば、逆元は存在する。Ｂが０＜Ｂ＜Ｐであるので、ＢとＡ−１の値も０＜Ｃ＜Ｐとして存在する。また、Ａ−１  ｍｏｄ  Ｐは、拡張ユークリッド互除法を用いて、効率的に計算することができる。
【００７８】
以下に計算例を示す。
【００７９】
例えば、Ａ＝１２３４５，Ｂ＝７９８７，Ｐ＝６５５３７とすると、次のようになる。
【００８０】
Ａ−１  ｍｏｄ  Ｐ＝１２３４５−１  ｍｏｄ  ６５５３７＝３１６５１
従って、上記Ｃの値は、次のようになる。
【００８１】
Ｃ＝Ｂ・Ａ−１  ｍｏｄ  Ｐ＝２０３２８
このように、素数Ｐを法とした剰余乗算の積を上記コードブロック演算値とし、コードブロックＩＤ記憶装置に格納された値と上記差分値の素数Ｐを法とする剰余乗算の積を計算して、コードブロックＩＤの値を更新するようにしても、上記の例と同様の作用効果を得ることができる。
【００８２】
以上の説明では主として本発明者によってなされた発明をその背景となった利用分野であるマイクロコンピュータに適用した場合について説明したが、本発明はそれに限定されるものではなく、各種データ処理装置に広く適用することができる。
【図面の簡単な説明】
【００８３】
【図１】本発明に係る制御フロー誤り検出方法の一例が示されるフローチャートである。
【図２】上記制御フロー誤り検出方法におけるコードブロック分割を説明するためのフローチャートである。
【図３】本発明に係る制御フロー誤り検出方法の他の例が示されるフローチャートである。
【図４】本発明に係る制御フロー誤り検出方法の他の例が示されるフローチャートである。
【図５】本発明に係る制御フロー誤り検出方法の他の例が示されるフローチャートである。
【図６】本発明に係る制御フロー誤り検出方法の他の例が示されるフローチャートである。
【図７】本発明にかかるデータ処理装置の一例とされるマイクロコンピュータの構成例ブロック図である。
【図８】本発明にかかるデータ処理装置の一例とされるマイクロコンピュータの別の構成例ブロック図である。
【図９】本発明にかかるデータ処理装置の一例とされるマイクロコンピュータの別の構成例ブロック図である。
【図１０】上記マイクロコンピュータでの割り込み発生時のスタックの使用状況の説明図である。
【図１１】上記マイクロコンピュータでの割り込み発生時のスタックの使用状況の別の説明図である。
【図１２】上記コンパイラが動作するコンピュータシステムの構成例ブロック図である。
【図１３】上記コンパイラによる処理のフローチャートである。
【符号の説明】
【００８４】
１０１１〜１０１４，３０１１〜３０１６，４０１１〜４０１３，５０１１，５０１２，６０１１〜６０１４  コードブロック
７０００  マイクロコンピュータ
７００１  命令解釈実行装置
７００２  記憶装置
７００３  比較器
７００４，９００４  コードブロックＩＤ記憶装置
７００５，９００５  演算器
７００６  バス
７００７  命令列
１３０１０  ハードディスク
１３０１１  コンパイラ
１３０１２  ソースプログラム
１３０１３  オブジェクトコード
１３０２０  計算機
【図１】
2007299081.tif 000003
【図２】
2007299081.tif 000004
【図３】
2007299081.tif 000005
【図４】
2007299081.tif 000006
【図５】
2007299081.tif 000007
【図６】
2007299081.tif 000008
【図７】
2007299081.tif 000009
【図８】
2007299081.tif 000010
【図９】
2007299081.tif 000011
【図１０】
2007299081.tif 000012
【図１１】
2007299081.tif 000013
【図１２】
2007299081.tif 000014
【図１３】
2007299081.tif 000015