(57)【要約】      （修正有）【課題】バッファオーバーフロー攻撃に対し、攻撃者がリターンアドレスを修正することを許容するが、損害が生じる前にこの変更を検出する制御フローインテグリティ（ＣＦＩ）技術を用いつつ、かつドメインに依存せず、プログラム実行時のオーバーヘッドを抑制する。【解決手段】プログラムコード内の関数及び前記関数のコール／リターン関係である制御フローを抽出する抽出ステップＳ１０１と、前記関数の重要度を決定する決定ステップＳ１０３と、前記重要度に基づいて、前記制御フローが正しく実行するための処理命令を前記プログラムコード内に挿入する挿入ステップＳ１０５と、を備える。【選択図】図２
2019016338.tif 000002
【特許請求の範囲】
【請求項１】
プログラムコード内の関数及び前記関数のコール／リターン関係である制御フローを抽出する抽出ステップ（Ｓ１０１）と、
前記関数の重要度を決定する決定ステップ（Ｓ１０３）と、
前記重要度に基づいて、前記制御フローを正しく実行するための処理命令を前記プログラムコード内に挿入する挿入ステップ（Ｓ１０５）と、
を有するプログラム生成方法。
【請求項２】
前記処理命令は、前記制御フローが正しく実行されるかをチェックするチェック処理命令を含む、
請求項１記載のプログラム生成方法。
【請求項３】
前記プログラムコードは、第１の関数と、前記第１の関数からコールされるとともに、前記第１の関数にリターンする第２の関数とを含み、
前記処理命令は、前記第２の関数から前記第１の関数へのリターンアドレスをセキュア領域に格納するとともに、前記リターンアドレスに基づいて前記第２の関数から前記第１の関数へのリターン処理を実行するリターン処理命令を含む、
請求項１記載のプログラム生成方法。
【請求項４】
前記リターン処理命令は、前記セキュア領域に格納された前記リターンアドレスへとリターン処理を実行する、
請求項３記載のプログラム生成方法。
【請求項５】
前記リターン処理命令は、前記セキュア領域に格納されるリターンアドレスである第１のリターンアドレスと、前記第１の関数から前記第２の関数をコールする際にスタック領域に格納される前記第１の関数へのリターンアドレスである第２のリターンアドレスとを比較するとともに、前記第１及び第２のリターンアドレスが一致した場合には一致した前記第１及び第２のリターンアドレスへとリターン処理を実行する、
請求項３記載のプログラム生成方法。
【請求項６】
前記重要度は、前記関数の使用頻度に応じて定められたものである、
請求項１記載のプログラム生成方法。
【請求項７】
前記プログラムコードは、車両に搭載される電子制御装置に書き込まれるものであり、
前記重要度は、前記関数が前記車両を使用するユーザの安全性に関係する場合、前記車両を使用するユーザの安全性に応じて定められたものである、
請求項１記載のプログラム生成方法。
【請求項８】
前記処理命令は、前記重要度に基づいて実行するか否かを選択可能である、
請求項１記載のプログラム生成方法。
【請求項９】
プログラムコード内の関数のコール／リターン関係である制御フローを正しく実行するための処理命令が前記関数の重要度に基づいて前記プログラムコード内に挿入されているプログラムを実行する演算部（１０１）を有する、
電子制御装置（２０）。
【請求項１０】
前記処理命令は、前記制御フローが正しく実行されるかをチェックするチェック処理命令を含み、
当該電子制御装置はさらに、
前記チェック処理命令の出力を監視し、前記制御フローの異常を検知する検知部（１０２）と、
前記検知部の検知結果に基づき、所定の処理を行なう処理部（１０３）と、
を有する、請求項９記載の電子制御装置。
【請求項１１】
前記プログラムコードは、第１の関数と、前記第１の関数からコールされるとともに、前記第１の関数にリターンする第２の関数とを含み、
前記処理命令は、前記第２の関数から前記第１の関数へのリターンアドレスをセキュア領域に格納するとともに、前記リターンアドレスに基づいて前記第２の関数から前記第１の関数へのリターン処理を実行するリターン処理命令を含む、
請求項９記載の電子制御装置。
【請求項１２】
前記リターン処理命令は、前記セキュア領域に格納された前記リターンアドレスへとリターン処理を実行する、
請求項１１記載の電子制御装置。
【請求項１３】
前記リターン処理命令は、前記セキュア領域に格納されるリターンアドレスである第１のリターンアドレスと、前記第１の関数から前記第２の関数をコールする際にスタック領域に格納される前記第１の関数へのリターンアドレスである第２のリターンアドレスとを比較するとともに、前記第１及び第２のリターンアドレスが一致した場合には一致した前記第１及び第２のリターンアドレスへとリターン処理を実行する、
請求項１１記載の電子制御装置。
【請求項１４】
前記重要度は、前記関数の使用頻度に応じて定められたものである、
請求項９記載の電子制御装置。
【請求項１５】
前記プログラムコードは、車両に搭載される当該電子制御装置に書き込まれたものであり、
前記重要度は、前記関数が前記車両を使用するユーザの安全性に関係する場合、前記車両を使用するユーザの安全性に応じて定められたものである、
請求項９記載の電子制御装置。
【請求項１６】
プログラムコード内の関数のコール／リターン関係である制御フローを正しく実行するための処理命令であり、かつ前記関数の重要度に基づいて実行するか否かが選択可能な前記処理命令が、前記プログラムコード内に挿入されているプログラムを実行する演算部（１０１）と、
前記関数の重要度に基づいて実行する処理命令を選択する処理命令選択部（２０１）と、
を有する、
電子制御装置（２０）。
【請求項１７】
前記処理命令は、前記制御フローが正しく実行されるかをチェックするとともに、前記関数の重要度に基づいて実行可能か否かが選択可能なチェック処理命令を含み、
当該電子制御装置はさらに、
前記チェック処理命令の出力を監視し、前記制御フローの異常を検知する検知部（１０２）と、
前記検知部の検知結果に基づき、所定の処理を行なう処理部（１０３）と、
を有する、請求項１６記載の電子制御装置。
【請求項１８】
前記プログラムコードは、第１の関数と、前記第１の関数からコールされるとともに、前記第１の関数にリターンする第２の関数とを含み、
前記処理命令は、前記第２の関数から前記第１の関数へのリターンアドレスをセキュア領域に格納するとともに、前記リターンアドレスに基づいて前記第２の関数から前記第１の関数へのリターン処理を実行するリターン処理命令を含む、
請求項１６記載の電子制御装置。
【請求項１９】
前記リターン処理命令は、前記セキュア領域に格納された前記リターンアドレスへとリターン処理を実行する、
請求項１８記載の電子制御装置。
【請求項２０】
前記リターン処理命令は、前記セキュア領域に格納されるリターンアドレスである第１のリターンアドレスと、前記第１の関数から前記第２の関数をコールする際にスタック領域に格納される前記第１の関数へのリターンアドレスである第２のリターンアドレスとを比較するとともに、前記第１及び第２のリターンアドレスが一致した場合には一致した前記第１及び第２のリターンアドレスへとリターン処理を実行する、
請求項１８記載の電子制御装置。
【請求項２１】
前記プログラムコードは、車両に搭載される電子制御装置に書き込まれたものであり、
当該電子制御装置は、さらに
前記車両の動作状態を受信する動作状態検出部（３０１）と、
検出した前記動作状態に応じて前記関数の前記重要度を変更する重要度変更部（３０２）と、を有する
請求項１６記載の電子制御装置。
【請求項２２】
関数及び前記関数のコール／リターン関係である制御フローをプログラムコード内に含むプログラムであり、
前記制御フローを正しく実行するための処理命令が前記関数の重要度に基づいて前記プログラムコード内に挿入されている、
コンピュータにて実行可能なプログラム。
【請求項２３】
関数及び前記関数のコール／リターン関係である制御フローをプログラムコード内に含むプログラムであり、
前記制御フローを正しく実行するための処理命令が前記プログラムコード内に挿入されており、
前記処理命令は、前記関数の重要度に基づいて実行するか否かを選択可能である、
コンピュータにて実行可能なプログラム。
【請求項２４】
前記処理命令は、前記制御フローが正しく実行されるかをチェックするチェック処理命令を含む、
請求項２２又は２３記載のプログラム。
【請求項２５】
前記プログラムコードは、第１の関数と、前記第１の関数からコールされるとともに、前記第１の関数にリターンする第２の関数とを含み、
前記処理命令は、前記第２の関数から前記第１の関数へのリターンアドレスをセキュア領域に格納するとともに、前記リターンアドレスに基づいて前記第２の関数から前記第１の関数へのリターン処理を実行するリターン処理命令を含む、
請求項２２又は２３記載のプログラム。
【請求項２６】
前記リターン処理命令は、前記セキュア領域に格納された前記リターンアドレスへとリターン処理を実行する、
請求項２５記載のプログラム。
【請求項２７】
前記リターン処理命令は、前記セキュア領域に格納されるリターンアドレスである第１のリターンアドレスと、前記第１の関数から前記第２の関数をコールする際にスタック領域に格納される前記第１の関数へのリターンアドレスである第２のリターンアドレスとを比較するとともに、前記第１及び第２のリターンアドレスが一致した場合には一致した前記第１及び第２のリターンアドレスへとリターン処理を実行する、
請求項２５記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、バッファオーバーフロー攻撃に対して耐性を有するプログラムの生成方法および当該プログラムを搭載する電子制御装置に関し、主として自動車の車載システムに搭載されるプログラムおよび電子制御装置に関するものである。
【背景技術】
【０００２】
バッファオーバーフロー攻撃は、実行中のプログラムのメモリ内に攻撃者の作成したプログラムが送り込まれることにより実行され、この結果コンピュータの制御が奪われてしまう。具体的には、攻撃者が送り込んだプログラムによって、例えばスタックに置かれたリターンアドレスが変更され、当該プログラムに制御が移ることによりコンピュータの制御が奪われてしまうものである。
【０００３】
バッファオーバーフロー攻撃に対しては様々な解決策が提案されている、その一つに攻撃者がリターンアドレスを修正することを許容するが、損害が生じる前にこの変更を検出する制御フローインテグリティ（ＣＦＩ）技術がある。このＣＦＩ技術では、プログラムコードにおいて関数から別の関数へとコール又はリターンする際に、コール先又はリターン先の関数のＩＤをチェックし、コール先又はリターン先の関数のＩＤが許可されている場合にコール／リターン処理を実行するものである。しかし、ＣＦＩにおいては、プログラム実行に際してチェック処理に時間を要するという課題を有している。
【０００４】
かかる課題を解決するため、例えば特許文献１には、プログラム命令を特定領域のメモリに格納し、ジャンプ／リターン時に目的アドレスをマスクすることで、攻撃者が単純にジャンプ／リターンアドレスを修正しても有用な操作を行うことを制限することでチェック処理によるオーバーヘッドが生じるという課題を解決することが記載されている。
【０００５】
また、特許文献２には、時間的オーバーヘッド、および空間的オーバーヘッドを抑制しつつ、ドメイン間の実行制限を考慮して、非信頼ドメインからの関数コール時と関数リターン時のアドレスチェックを効率よく行うことが記載されている。
【０００６】
さらに、非特許文献１には、保護された領域であるシャドウコールスタック（Shadow call stack）領域に関数のリターンアドレスを格納し、当該リターンアドレスへとリターン処理を実行することにより、関数がリターンする際にリターン先のＩＤをチェックしなくとも、コール元である正しいリターン先へとリターンできることが記載されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１１−８７７８号公報
【特許文献２】特開２０１１−１２３６５８号公報
【非特許文献】
【０００８】
【非特許文献１】Martin Abadi, Mihai Budiu, Ulfar Erlingsson, and Jay Ligatti著、「Control-flow integrity」、ACM Conference on Computer and Communications Security,（米国）２００５年１１月、p.340-353
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかし、特許文献１は、従来のＣＦＩ技術とは異なるアプローチであり、ＣＦＩ技術に対して直接適用できるものではない。
【００１０】
また、特許文献２では、非信頼ドメイン内の関数コール／リターンはチェック対象外となってしまい、非信頼ドメイン内では不適切な関数コール／リターンによって、設計者の意図しない命令列を実行してしまう恐れがある。
【００１１】
さらに、非特許文献１に記載のアプローチによると、全てのリターンアドレスをシャドウコールスタック領域に格納することにより、オーバーヘッドが著しく増加してしまう恐れがある。
【００１２】
本発明の目的は、ＣＦＩ技術を用いつつ、かつドメインに依存せず、プログラム実行時のオーバーヘッドを抑制することにある。
【課題を解決するための手段】
【００１３】
上記課題を解決するために、本発明のプログラム生成方法は、プログラムコード内の関数及び前記関数のコール／リターン関係である制御フローを抽出する抽出ステップ（Ｓ１０１）と、前記関数の重要度を決定する決定ステップ（Ｓ１０３）と、前記重要度に基づいて、前記制御フローが正しく実行するための処理命令を前記プログラムコード内に挿入する挿入ステップ（Ｓ１０５）と、を有する。
【発明の効果】
【００１４】
本発明のプログラム生成方法で生成したプログラム、および当該プログラムを搭載した電子制御装置によれば、ＣＦＩ技術を用いつつ、かつドメインに依存せず、プログラム実行時のオーバーヘッドを抑制することができる。
【図面の簡単な説明】
【００１５】
【図１】実施形態１のプログラム生成方法に関係する装置および電子制御装置等の配置を示す配置図
【図２】実施形態１のプログラム生成方法の各ステップを説明する説明図
【図３】実施形態１のプログラム生成方法の抽出ステップを説明する説明図
【図４】実施形態１のプログラム生成方法で用いるリスクランクテーブルを説明する説明図
【図５】実施形態１のプログラム生成方法の決定ステップを説明する説明図
【図６】実施形態１のプログラムの生成方法の挿入ステップ、および生成したプログラムの構成を説明する説明図
【図７】実施形態１の電子制御装置の構成を示す構成図
【図８】実施形態１の電子制御装置の動作を示す説明図
【図９】実施形態２のプログラム生成方法の挿入ステップ、および生成したプログラムの構成を説明する説明図
【図１０】実施形態２の電子制御装置の構成を示す構成図
【図１１】実施形態２のプログラム生成方法で生成したプログラムの構成を説明する説明図
【図１２】実施形態２の電子制御装置の動作を示す説明図
【図１３】実施形態３のプログラム生成方法で用いるリスクランクテーブルを説明する説明図
【図１４】実施形態３のプログラム生成方法の挿入ステップ、および生成したプログラムの構成を説明する説明図
【図１５】実施形態３の電子制御装置の構成を示す説明図
【図１６】実施形態３のプログラム生成方法で生成したプログラムの構成を説明する説明図
【図１７】実施形態３の電子制御装置の動作を示す構成図
【図１８】実施形態４のプログラム生成方法の抽出ステップを説明する説明図
【図１９】実施形態４のプログラム生成方法で用いるリスクランクテーブルを説明する説明図
【図２０】実施形態４のプログラム生成方法の決定ステップを説明する説明図
【図２１】実施形態４のプログラムの生成方法の挿入ステップ、および生成したプログラムの構成を説明する説明図
【図２２】実施形態４の電子制御装置の動作を示す説明図
【図２３】実施形態４のプログラム生成方法で生成したプログラムの構成を説明する説明図
【図２４】実施形態４のプログラム生成方法で用いるリスクランクテーブルを説明する説明図
【発明を実施するための形態】
【００１６】
以下、本発明のプログラム生成方法、および当該プログラムを搭載した電子制御装置の構成及び機能について、図面を参照して説明する。なお、本発明とは、特許請求の範囲又は課題を解決するための手段の項に記載された発明を意味するものであり、以下の実施形態に限定されるものではない。また、鉤括弧内の語は、特許請求の範囲又は課題を解決するための手段の項に記載された語を意味し、同じく以下の実施形態に限定されるものではない。
また、特許請求の範囲の従属項に記載の構成及び方法、従属項に記載の構成及び方法に対応する実施形態の構成及び方法、および特許請求の範囲に記載がなく実施形態等のみに記載の構成及び方法は、本発明においては任意の構成及び方法である。
なお、各実施形態に開示の構成は、各実施形態のみで閉じるものではなく、実施形態をまたいで組み合わせることが可能である。
発明が解決しようとする課題に記載した課題は公知の課題ではなく、本発明者が独自に知見したものであり、本発明の手段と共に発明の進歩性を肯定する事実である。
【００１７】
なお、以下の実施形態は、主として自動車の車載用電子制御装置および当該電子制御装置に書き込まれるプログラムを例として説明するが、本発明は、特許請求の範囲で限定がない限り、車載用途以外の電子制御装置やプログラムも含むものである。
【００１８】
（各実施形態に共通の構成）
図１は、本発明の実施形態に共通の各種装置の配置を示すものである。自動車の車載ネットワーク１０には、Ｎ個の電子制御装置（ＥＣＵ）２０、プログラム生成装置３０、車両制御装置４０、表示装置５０、データコミュニケーションモジュール（ＤＣＭ）６０、車両動作状態取得装置７０、等が接続されている。なお、プログラム生成装置３０は、常時車載ネットワーク１０に接続されていてもよいし、必要なときのみコネクタとケーブル等を用いて接続されてもよい。また、プログラム生成装置３０に代えて、データコミュニケーションモジュール６０を介して無線通信を用いて、常時又は必要なときのみプログラム生成装置８０が接続されてもよい。
【００１９】
（実施形態１）
１．プログラム生成方法および生成された本件プログラム
図２は、本実施形態のプログラム生成方法のフロー示すフローチャートである。フローチャートの各ステップにつき、図３から図６を参照しながら説明する。なお、このプログラムの生成方法は、図１に記載の、演算装置（ＣＰＵ）およびメモリを有する専用又は汎用のプログラム生成装置３０またはプログラム生成装置８０を用いて実行されるが、これに代えて、プログラムが書き込まれる対象である電子制御装置（ＥＣＵ）２０等の内部で実行されてもよい。
【００２０】
まず、電子制御装置２０に書き込まれるプログラムの「プログラムコード」内の「関数」、および関数のコール／リターン関係である制御フローを抽出する（Ｓ１０１）。プログラムの例として、自動車のシフト状態を検出し、シフトがＰレンジ（駐車位置）にある場合は、シフトがＰレンジにあることを表示するとともに、ドアが開くことを可能とする制御（ドアロックを解除可能とする制御）を行うものを用いて説明する。
ここで、本発明の「プログラムコード」とは、機械語やアセンブリ言語で記述されたものの他、高級言語で記述されたものも含む。
また、本発明の「関数」とは、狭義の関数の他、メソッドと呼ばれるものも含む。
【００２１】
図３は、プログラムコードから抽出した関数及び制御フローを、制御フローグラフ（ＣＦＧ）として示したものである。図３の例では、プログラムコードから関数Ａないし関数Ｄが抽出されるとともに、各関数のコール／リターン関係である制御フローが抽出されている。また、関数Ｂと、関数Ｃ及びＤとは、自動車のシフトレバーがＰ（パーキング）の位置にある場合のコール／リターン関係にあることが示されている。
【００２２】
次に、プログラムコード内で用いられている関数について、関数ごとに「重要度」を規定したリスクランクテーブルを取得する（Ｓ１０２）。
本発明の「重要度」とは、所定の評価基準に基づき分類される指標であり、分類の数は複数以上であればよい。
【００２３】
具体的には、重要度とは、例えば使用機会の多少から見た重要度であり、関数の「使用頻度」に「応じて」定められたものである。
本発明の「使用頻度」とは、当該関数を実行する回数の他、当該関数を実行した合計時間など、当該関数の使用率を示すものであれば足りる。
また、本発明の「応じて」とは、直接または間接の対応関係が認められれば足りる。以下の、発明として記載された語も同様である。
【００２４】
あるいは、重要度とは、例えば機能から見た重要度であり、具体的には、車両に搭載される電子制御装置に書き込まれたプログラムコードにおいて、プログラムコード内の関数が車両を使用するユーザの安全性に関係する場合、車両を使用するユーザの安全性に「応じて」定められたものが挙げられる。例えば、誤作動があった場合にユーザが危険にさらされるような機能、誤作動があった場合にユーザが違和感を覚える程度の機能、誤作動があった場合にも正常動作のように見えユーザが気づかないような機能、などの指標が挙げられる。本実施形態では、後述の図４の通り、これら例示した指標を、順に重要度高、重要度中、重要度低の３つに分類している。
【００２５】
その他、重要度とは、例えば扱うデータの重要度であり、具体的には、関数がデータを扱う場合において、扱う個人情報やデータ自体の属性の観点での指標で分類したものが挙げられる。例えば、個人情報、車両情報、走行情報、その他情報、などの指標で分類し、順に重要度１，２，３，４とすることが考えられる。
【００２６】
図４は、本実施形態のリスクランクテーブルの例である。図３で抽出した関数のうち、Ａはメイン関数、ＢはシフトＰ状態検出に関する関数、Ｃはドア開制御に関する関数、ＤはＬＥＤ『Ｐ』点灯指示に関する関数である。攻撃等により正常フロー以外でコールされることによるユーザの安全性に対する影響度という観点で各関数の重要度を評価すると以下のようになる。Ａは、必ず実行する処理であるため、この評価軸での重要度について規定がない。Ｂは、シフトＰ状態のチェックが他の箇所でコールされたとしても、ユーザがシフトＰに入れていなければ内部で判定結果＝ＮＧ(Ｐでない)が返るだけでありユーザは気づかないので重要度は低と規定されている。Ｃは、シフトＰ以外の状態にも関わらず、ドア開制御が実行されると走行中にドアが開き、ユーザが危険にさらされる恐れがあるので重要度は高と規定されている。Ｄは、シフトＰ以外の状態にも関わらず、シフトＰのＬＥＤ点灯があるとユーザは違和感を覚えるので重要度は中と規定されている。
【００２７】
なお、このリスクランクテーブルは、プログラム生成方法を処理する装置内にデータベースとして持っていてもよいし、装置外に持っていてもよい。また、装置外に持っている場合は、リスクランクテーブル全てを取得してもよいし、Ｓ１０１で抽出した関数についてのみリスクランクテーブルを取得してもよい。
【００２８】
そして、Ｓ１０１で抽出した関数、およびＳ１０２で取得したリスクランクテーブルから、Ｓ１０１で抽出した関数の「重要度」を決定する（Ｓ１０３）。具体的には、関数Ｂは重要度低、関数Ｃは重要度高、関数Ｄは重要度中、と決定する。なお、本発明ではリスクランクテーブルの取得、及び重要度の決定にリスクランクテーブルを用いることは任意である。
【００２９】
続いて、決定した重要度に「基づいて」、制御フローが正しく実行するための処理命令をプログラムコード内に挿入する。この処理命令は、関数のコール／リターン時にコール／リターン先の関数のＩＤをチェックするチェック処理命令、及び、リターンアドレスをセキュア領域に格納するとともに、セキュア領域に格納されたリターンアドレスに基づいてリターン処理を実行するリターン処理命令の少なくとも一方を含む。なお、本実施形態１、及び、以下に示す実施形態２、３では、処理命令として、コール／リターン先の関数のＩＤをチェックするチェック処理命令を挿入している。本実施形態では、まずプログラムコード全体において、重要度が所定以上の関数を特定するとともに、重要度が所定以上の関数を対象とする制御フローを特定する（Ｓ１０４）。
ここで、本発明の「基づいて」とは、関数の重要度を反映したチェック処理命令の挿入がされていれば足り、重要度を直接指標として用いる場合の他、重要度に加えて重要度以外の要素も考慮する場合、および重要度に所定の演算を施したものを用いる場合も含む。以下同様。
【００３０】
図５は、本実施形態のＣＦＧにおいて、所定の重要度以上の関数、および当該関数を対象とする制御フローを特定した状態を示している。図中、太線で囲まれた四角形が所定の重要度以上の関数であり、太線で示された矢印が所定の重要度以上の関数を対象とする制御フローである。本実施形態では重要度が大以上の関数、および重要度が大以上の関数を対象とする制御フローを特定している。つまり、重要度が大以上の関数は関数Ｃのみであるから、関数Ｃが呼び出し元、あるいは呼び出し先に含まれる制御フローを特定している。
【００３１】
次に、本実施形態では、Ｓ１０４で特定した制御フローを対象として、制御フローが正しく実行されるかをチェックするチェック処理命令をプログラムコード内に挿入する（Ｓ１０５）。
【００３２】
図６は、チェック処理命令を挿入したプログラムを模式的にＣＦＧとして示すものである。本実施形態では、重要度高である関数Ｃを対象とする制御フローをチェックするため、関数Ｂから関数Ｃへの遷移時（関数Ｃのコール）、および関数Ｃから他の関数への遷移時のフローチェック処理を行なうチェック処理命令がそれぞれ挿入される。
【００３３】
つまり、本実施形態のプログラム生成方法で生成されたプログラム（以下、本件プログラムという）は、関数ＡないしＤ（本発明の「関数」に相当）、及び関数のコール／リターン関係である制御フロー（本発明の「制御フロー」に相当）をプログラムコード内に含むプログラムであり、制御フローが正しく実行されるかをチェックするチェック処理命令が関数の重要度に「基づいて」プログラムコード内に挿入されている、「コンピュータ」にて実行可能なプログラムである。
ここで、本発明の「コンピュータ」とは、マイコンやモジュール、電子制御装置などの部品レベルとして把握されるもののほか、カーナビゲーションシステムや携帯電話、スマートフォン等、完成品レベルとして把握されるものも含まれる。
【００３４】
なお、本実施形態では、重要度として、車両を使用するユーザの安全性の指標を用いたが、これに加えて他の重要度の指標を含めてもよい。また、重要度以外の要素を考慮してもよい。
例えば、メイン関数（関数Ａ）に関係する制御フローをチェック処理対象として加えてもよい。メイン関数はプログラム実行時に必ず実行する関数であることから、車両を使用するユーザの安全性という指標とは異なる他の重要度の指標、すなわち関数の使用頻度という重要度を含めることになる。あるいは、車両を使用するユーザの安全性という重要度以外の要素を考慮していることになる。
【００３５】
チェック処理命令の例として、あらかじめ把握している正しいコール／リターン先と、実行予定のプログラムにおけるコール／リターン先を比較して、一致すればプログラムを実行し、一致しなければプログラムの実行を停止するという命令が挙げられるが、これに限るものではない。
【００３６】
最後に、このようなチェック処理命令を挿入されたプログラムコードを有する本件プログラムが実装対象の電子制御装置２０に書き込まれる（Ｓ１０６）。
なお、上述のように、当該電子制御装置２０内で本実施形態のプログラム生成方法が実行される場合は、このステップは省略される。
【００３７】
以上のプログラム生成方法によれば、重要度に基づいてチェック対象の制御フローを限定することになるので、プログラム実行時の時間的（例えば、処理時間。以下同じ。）、空間的（例えば、保存領域の大きさ。以下同じ。）オーバーヘッドを抑制できるプログラムを生成することができる。
【００３８】
２．本件プログラムを搭載した電子制御装置
生成した本件プログラムは、車載ネットワーク１０、又はＤＣＭ６０を介して、本件プログラムが実行される電子制御装置（ＥＣＵ）に書き込まれる。なお、本件プログラムが書き込まれ、かつ実行される電子制御装置（ＥＣＵ）には、狭義の電子制御装置２０の他、車両制御部４０、表示装置５０、ＤＣＭ６０、その他車載ネットワーク１０に接続された情報処理装置すべてが含まれる。以下、電子制御装置２０を例にして説明する。
【００３９】
本件プログラムを搭載した電子制御装置２０の構成を、図７を用いて説明する。電子制御装置２０は、中央演算処理装置（ＣＰＵ）１００、及びメモリ１１０を有する。メモリ１１０には、本件プログラムが格納されている。そして、中央演算処理装置１００の演算部１０１（本発明の「演算部」に相当）は、メモリ１１０に保存した本件プログラムを読み出して実行する。本件プログラムの構成は、００３３段落に記載した通りである。
【００４０】
中央演算処理装置１００の検知部１０２（本発明の「検知部」に相当）は、本件プログラムを実行した際に実行されるチェック処理命令の出力を監視し、制御フローの異常を検知する。具体的には、あらかじめ把握している正しいコール／リターン先と、実行予定の本件プログラムにおけるコール／リターン先を比較し、これらが一致するか否かで異常を検知する。
【００４１】
中央演算処理装置１００の処理部１０３（本発明の「処理部」に相当）は、検知部１０２の検知結果に基づき、「所定の処理」を行なう。例えば、検知結果が異常を示した場合、本件プログラムの実行を停止する。あるいは、表示装置５０を通じてユーザに通知したり、本件プログラムの実行ログを保存してもよい。本件プログラムを途中で停止することが安全上困難である場合は、例えば安全確保に関する処理（例えば車両の停止等）を行った上で停止又はリセットするなどしてもよい。
ここで、本発明の「所定の処理」とは、予め定められた一定の処理の他、条件等に応じて処理内容が変わる処理も含まれる。
【００４２】
次に、電子制御装置２０の動作を、図８を用いて説明する。
中央演算処理装置１００の演算部１０１は、メモリ１１０に保存した本件プログラムを読み出して実行する（Ｓ２０１）。
【００４３】
中央演算処理装置１００の検知部１０２は、本件プログラムを実行した際に実行されるチェック処理命令の出力を監視し、制御フローの異常を検知する（Ｓ２０２）。
【００４４】
異常を検知した場合は、中央演算処理装置１００の処理部１０３は、本件プログラムの停止等の「所定の処理」を行なう（Ｓ２０３）。異常を発見しない場合は、所定の処理を行なわず引き続きプログラムの実行を継続する。
【００４５】
以上の電子制御装置においては、搭載されている本件プログラムが、重要度に基づいてチェック対象となる制御フローを限定しているので、プログラム実行時の時間的、空間的オーバーヘッドを抑制することができる。
【００４６】
また、車載用電子制御装置において、車両を使用するユーザの安全性に応じて定められた重要度に基づいてチェック処理命令を挿入することにより、車両やユーザの安全性を損なわずに効率的にオーバーヘッドを抑制することができる。
【００４７】
（実施形態２）
実施形態１では、特定した関数を対象とする制御フローをチェックするチェック処理命令を挿入した。そして、チェック処理命令自体は必ずチェック処理を実行するものであった。これに対して、本実施形態は、チェック処理命令は必ずチェック処理命令を実行するものではなく、本件プログラムの実行時にチェック処理命令が実行されるかどうかが選択可能な構成を有するものである。
【００４８】
１．プログラム生成方法および生成された本件プログラム
本実施形態のプログラム生成方法は、図２を用いて説明した実施形態１と基本的には同じである。ただし、本実施形態では、Ｓ１０４で特定される所定の重要度を、実施形態１よりも低く設定している。例えば、重要度が低以上の関数を特定し、重要度が低以上の関数が対象となる制御フローを特定する。そして、重要度が低以上の関数のコール／リターンが正しく実行されるかをチェックするチェック処理命令をプログラムコード内に挿入する（Ｓ１０５）。例えば、図４のリスクランクテーブルに基づき、重要度が低以上の関数を抽出し、関数Ｂ、関数Ｃ、関数Ｄを抽出する。
【００４９】
そして、図９に示す通り、関数Ｂ、関数Ｃ、関数Ｄがコール／リターン先となる制御フローに対し、チェック処理命令を挿入する。なお、図９において、白丸は挿入されたチェック処理命令である。ただし、実施形態１と異なり、挿入されるチェック処理命令は、重要度に応じて、チェック処理命令を実行するか否かが選択可能となっている。詳細は次項で説明する。
【００５０】
なお、本実施形態では、重要度低以上の関数の制御フローに対してチェック処理命令をプログラムコード内に挿入したが、全ての関数の制御フローを対象として挿入してもよい。
この場合を含む本件プログラムは、関数ＡないしＤ（本発明の「関数」に相当）、及び関数のコール／リターン関係である制御フロー（本発明の「制御フロー」に相当）をプログラムコード内に含むプログラムであり、制御フローが正しく実行されるかをチェックするチェック処理命令が挿入されており、チェック処理命令は、関数の重要度に基づいて実行するか否かが選択可能である、コンピュータにて実行可能なプログラムである。
【００５１】
２．本件プログラムを搭載した電子制御装置
本実施形態の電子制御装置の構成を、図１０を用いて説明する。本実施形態の電子制御装置は、図７で説明した実施形態１の構成に加え、チェック処理命令選択部２０１を有している。チェック処理命令選択部２０１は、外部から入力された情報を用いて重要度を決定する。外部から入力された情報として、ユーザ等から重要度自体が入力されることのほか、車両の動作状態、例えば車速やギア等に応じて重要度を決定することが挙げられる。動作状態の詳細は、実施形態３で説明する。
【００５２】
そして、チェック処理命令選択部２０１は、決定した重要度をふまえ、関数の「重要度」に「基づいて」、本件プログラムに挿入されたチェック処理命令のうちどのチェック処理命令を実行するかを選択する。例えば、図１１（Ａ）の通り、重要度高と決定した場合、関数Ｃのみが重要度高となっているので、関数Ｂから関数Ｃをコールする制御フロー、および関数Ｃが他の関数をコールする制御フローのみを対象とするチェック処理命令が選択される。また、図１１（Ｂ）の通り、重要度中以上と決定した場合、関数Ｄが重要度中となっているので、図１１（Ａ）の場合に加えて、関数Ｂから関数Ｄをコールする制御フロー、および関数Ｄが他の関数をコールする制御フローを対象とするチェック処理命令が選択される。さらに、図１１（Ｃ）の通り、重要度低以上と決定した場合、関数Ｂが重要度低となっているので、図１１（Ｂ）の場合に加えて、関数Ａから関数Ｂをコールする制御フローを対象とするチェック処理命令が選択される。なお、図１１において、黒丸は実行対象として選択されたチェック処理命令、白丸は実行対象外として選択されなかったチェック処理命令である。
【００５３】
そして、演算部１０１は、選択されたチェック処理命令を含め、本件プログラムを実行する。例えば、チェック処理命令選択部２０１で決定した重要度が高であれば図１１（Ａ）、重要度が中であれば図１１（Ｂ）、重要度が低であれば図１１（Ｃ）で説明した通りのチェック処理命令を実行対象として実行する。
【００５４】
次に、電子制御装置２０の動作を、図１２を用いて説明する。
チェック処理命令選択部２０１は、外部から入力された情報を用いて重要度を決定するとともに、決定された重要度を踏まえ、関数の重要度に基づいてチェック対象命令を選択する（Ｓ３０１）。
【００５５】
そして、その後決定された重要度の設定を変更する必要がある情報が外部から入力されているかどうかを確認し（Ｓ３０２）、入力されていればＳ３０１に戻り、チェック処理命令選択部２０１で新たに重要度を決定し、関数の重要度に基づいてチェック処理命令を新たに選択する。入力されていなければ、演算部１０１は、選択されたチェック処理命令を含めて本件プログラムを実行する（Ｓ３０３）。それ以降は、図８のＳ２０２，Ｓ２０３と同様である。
【００５６】
以上、本実施形態によれば、本件プログラムの実行時に、重要度に応じて実行させるチェック処理命令を変更することができ、プログラム実行時の時間的、空間的オーバーヘッドを抑制するとともに、状況に応じたプログラムのチェックを行うことができる。例えば、走行状態や走行場所によってチェック対象の制御フローを変更する例が考えられる。攻撃がユーザに及ぼす影響に鑑み、低速走行中（一般道路）では重要度高をチェック処理対象にするとともに、高速走行中（高速道路など）では重要度低以上をチェック処理対象にすることにより、特に速度域が高い状態での車両制御プログラムの実行の安全性を高めることが可能となる。
【００５７】
（実施形態３）
実施形態２では、プログラムコード内の関数自体の重要度は固定されており、外部から入力された情報を用いて重要度を決定し、関数の重要度に基づいて実行するチェック処理命令を選択した。これに対して、本実施形態では、プログラムコード内の関数自体の重要度を状況に応じて変化させるものである。
【００５８】
１．プログラム生成方法および生成された本件プログラム
本実施形態のプログラム生成方法は、図２を用いて説明した実施形態１、および実施形態２と基本的には同じである。ただし、Ｓ１０２で取得するリスクランクテーブル、およびＳ１０５のチェック処理命令を挿入する基準が異なる。
【００５９】
図１３は、本実施形態におけるリスクランクテーブルを示したものである。
本実施形態のリスクランクテーブルは、本件プログラムが実行される車両の「動作状態」に応じて、プログラムコード内の関数の重要度が変化することを示している。例えば、図１３の場合、車両の駐車時、停止時、そして走行時に分けて重要度が規定されている。
ここで、本発明の「動作状態」とは、車速、ギア、ドアロック等、車両自体の状態を表す場合の他、ブレーキやハンドル、アクセル操作等、車両の操作状態、あるいは、走行する道路、天候、周辺車両の位置等、車両の周辺状況も含む。
【００６０】
そして、重要度に基づいてチェック処理命令をプログラムコード内に挿入する（Ｓ１０５）。ただし、本実施形態では動作状態に応じて重要度が異なるため、例えば、各関数につき所定の重要度以上が何れかの動作状態で有する関数を対象に、チェック処理命令を挿入する。一例として、重要度高が何れかの動作状態で付与されている関数を対象に、チェック処理命令を挿入する。例えば図１３のリスクランクテーブルを用いる場合、関数Ｃ、関数Ｄは、重要度高が含まれている。そこで、図１４のように、関数Ｃ、および関数Ｄを対象とする制御フローをチェックするチェック処理命令を挿入する。
なお、実施形態２と同様、本実施形態においても、全ての関数の制御フローを対象として挿入してもよい。その場合を含む本件プログラムは、００５０段落に記載の通りである。
【００６１】
２．本件プログラムを搭載した電子制御装置
本実施形態の電子制御装置の構成を、図１５を用いて説明する。本実施形態の電子制御装置は、図１０で説明した実施形態２の構成に加え、動作状態検出部３０１、および重要度変更部３０２を有している。なお、本実施形態の別の態様として、図７で説明した実施形態１の構成に加え、動作状態検出部３０１、および重要度変更部３０２を有するようにしてもよい。
【００６２】
動作状態検出部３０１は、車載ネットワーク１０に接続された車両動作状況取得装置８０で検出された車両の動作状態を受信し、重要度変更部３０２に対して出力する。
【００６３】
重要度変更部３０２は、リスクランクテーブルを参照し、車両の動作状態に応じた各関数の重要度を変更する。そして、チェック処理命令選択部２０１は、決定した重要度をふまえ、関数の重要度に基づいて、本件プログラムに挿入されたチェック処理命令のうちどのチェック処理命令を実行するかを選択する。本実施形態では、以下に述べる通り、重要度が高である関数を対象とする制御フローをチェックするチェック処理命令を選択しているが、実施形態２のように重要度を決定して実行するチェック処理命令を適宜選択するようにしてもよい。リスクランクテーブルは、メモリ１１０に保存しているが、車載ネットワーク１０に接続された他の装置から読み出すようにしてもよい。
【００６４】
図１６は、図１３のリスクランクテーブルに基づいて実行される本件プログラムを模式的に示したものである。動作状態検出部３０１が、動作状態が駐車時であることを受信した場合、関数Ｃのみが重要度高となっている。そこで、チェック処理命令選択部２０１は、図１６（Ａ）の通り、関数Ｂから関数Ｃをコールする制御フロー、および関数Ｃが他の関数をコールする制御フローのみを対象とするチェック処理命令を選択する。動作状態検出部３０１が、動作状態が停止時であることを受信した場合、関数Ｃのみが重要度高となっている。そこで、チェック処理命令選択部２０１は、図１６（Ｂ）の通り、数Ｂから関数Ｃをコールする制御フロー、および関数Ｃが他の関数をコールする制御フローのみを対象とするチェック処理命令を選択する。動作状態検出部３０１が、動作状態が走行時であることを受信した場合、関数Ｃ、関数Ｄが重要度高となっている。そこで、チェック処理命令選択部２０１は、図１６（Ｃ）の通り、関数Ｃ、関数Ｄを対象とする制御フローを対象とするチェック処理命令を選択する。
【００６５】
次に、電子制御装置２０の動作を、図１７を用いて説明する。
動作状態検出部３０１は、車載ネットワーク１０に接続された車両動作状況取得装置８０で検出された車両の動作状態を受信し、重要度変更部３０２に対して出力する（Ｓ４０１）。
【００６６】
重要度変更部３０２は、車両の動作状態に応じた各関数の重要度を変更する。そして、チェック処理命令選択部２０１は、決定した重要度をふまえ、関数の重要度に基づいてチェック処理命令を選択する（Ｓ４０２）。
【００６７】
そして、その後動作状態が変更されているかどうかを確認し（Ｓ４０３）、変更されていればＳ４０１に戻る。変更されていなければ、演算部１０１は、選択されたチェック処理命令を含めて本件プログラムを実行する（Ｓ４０４）。それ以降は、図８のＳ２０２，Ｓ２０３と同様である。
【００６８】
以上、本実施形態によれば、車両の動作状態に応じて実行するチェック処理命令を変更することができ、プログラム実行時の時間的、空間的オーバーヘッドを抑制するとともに、車両の動作状態に応じた最適なチェックを行うことができる。
【００６９】
（実施形態４）
実施形態１乃至３はいずれも、制御フローを正しく実行するための処理命令として、関数のコール／リターン時にコール／リターン先の関数のＩＤをチェックするチェック処理命令をプログラムコード内に挿入する構成を示した。これに対し、本実施形態４では、処理命令として、リターンアドレスをセキュア領域に格納するとともに、セキュア領域に格納されたリターンアドレスに基づいてリターン処理を実行するリターン処理命令をプログラムコード内に挿入する実施形態を、実施形態１乃至３との相違点を中心に説明する。
【００７０】
１．プログラム生成方法および生成された本件プログラム
本実施形態のプログラム生成方法は、図２を用いて説明した実施形態１と基本的には同じである。ただし、本実施形態では、処理命令として、チェック処理命令に代わりリターン処理命令をプログラムコード内に挿入している。
【００７１】
図１８は、プログラムコードから抽出した関数及び制御フローを、制御フローグラフ（ＣＦＧ）として示したものである。図１８の例では、プログラムコードから、ハザードライト点灯制御に関する関数Ａないし関数Ｃが抽出されるとともに、各関数のコール／リターン関係である制御フローが抽出されており、プログラムコードが関数のリターン関係を含むという点で、図３の制御フローとは異なっている。この例では、関数Ａと関数Ｃ、関数Ｂと関数Ｃはそれぞれコール／リターン関係にあり、関数Ａ又は関数Ｂ（本発明の「第１の関数」に相当）から関数Ｃ（本発明の「第２の関数」に相当）がコールされるとともに、関数Ｃからコール元である関数Ａ又は関数Ｂにリターンする。
【００７２】
図１９は、本実施形態のリスクランクテーブルの例である。図１８で抽出した関数のうち、Ａは緊急ブレーキ作動に関する関数、Ｂはハザードスイッチ状態の検出に関する関数、Ｃはハザードライトの点灯に関する関数である。外部からの攻撃等により正常フロー以外でコール又はリターンされることによるユーザの安全性に対する影響度という観点で各関数の重要度を評価すると以下のようになる。Ａは、自車両が他車両などの障害物に急接近するなどの条件下で実行される関数であり、緊急ブレーキが作動しないと、自車両が障害物に衝突してユーザが危険にさらされる恐れがあるので、重要度は高と規定されている。Ｂは、ハザードスイッチ状態の検出が他の箇所でコールされたとしても、ユーザがハザードスイッチをオンにしなければ、内部で判定結果＝Ｆａｌｓｅ（ｔｒｕｅではない）が返るだけでありユーザは気づかないので重要度は低と規定されている。Ｃは、ユーザがハザードライトを手動で点灯させていないにも関わらず、ハザードが点灯しているとユーザは違和感を覚えるので、重要度は中と規定されている。
【００７３】
図２０は、本実施形態のＣＦＧにおいて、所定の重要度以上の関数、および当該関数を対象とする制御フローを特定した状態を示している。図中、太線で囲まれた四角形が所定の重要度以上の関数であり、太線で示された矢印が所定の重要度以上の関数にリターンする制御フローである。本実施形態では重要度が高以上の関数、および重要度が高以上の関数にリターンする制御フローを特定している。つまり、重要度が高以上の関数は関数Ａのみであるから、関数Ｃから関数Ａにリターンする制御フローを特定している。
【００７４】
次いで、実施形態１と同様、重要度が所定以上であると特定した制御フローに対して、リターン処理命令をプログラムコード内に挿入する。図２１は、リターン処理命令を挿入したプログラムを模式的にＣＦＧとして示すものである。本実施形態では、重要度高である関数Ａにリターンする制御フローを正しく実行するためのリターン処理命令がプログラムコード内に挿入されている。
そして、実施形態１と同様、リターン処理命令を挿入されたプログラムコードを有する本件プログラムが実装対象の電子制御装置２０に書き込まれる。
【００７５】
リターン処理命令は、関数Ａから関数Ｃをコールする際、関数Ｃから関数Ａへのリターンアドレスを「セキュア領域」に格納する。そして、セキュア領域に格納されたリターンアドレスに「基づいて」、関数Ｃから関数Ａへのリターン処理を実行する。具体的には、セキュア領域に格納されたリターンアドレスへとリターン処理を実行する。なお、本実施形態では、関数Ａから関数Ｃをコールする時にリターンアドレスをセキュア領域に格納する例を説明している。
ここで、「セキュア領域」とは、格納されるデータに対するセキュリティが確保されるメモリ領域であればよく、狭義のセキュア領域、すなわち、格納されるファイルやデータに対して、その読み書きに関してアクセス制限が施されたメモリ領域はもちろん、後述のシャドウスタック領域も含む。また、「セキュア領域」は、ＲＯＭ、ＲＡＭのいずれでもよい。「シャドウスタック領域」とは、通常のプログラム実行時にアクセスするメモリ領域から分離されたメモリ領域であればよく、例えば、明示的に指定してアクセスする拡張セグメントのデータ領域などを含む。また、「基づいて」とは、リターン処理を実行するリターンアドレスの決定において、セキュア領域に格納されたリターンアドレスを使用していれば足り、セキュア領域に格納されたリターンアドレスをリターン先として直接用いる場合の他、その他の要素を考慮する場合も含む。
【００７６】
通常、関数Ａから別の関数Ｃへとコールされる場合、関数Ａにリターンするためのリターンアドレスはスタック領域に格納され、このスタック領域に格納されたリターンアドレスへとリターン処理が行われる。しかしながら、バッファオーバーフロー攻撃を受けた場合、スタック領域に書き込まれたリターンアドレスが悪意のあるコードを格納しているメモリアドレスに上書きされてしまう。特に、関数Ｃからのリターンアドレスが関数Ｂに上書きされても、チェック処理命令だけでは、そのリターン先が誤った制御フローに改ざんされたことを検知することができない。そこで、リターン処理命令が挿入された制御フローでは、外部から保護されたセキュア領域にリターンアドレスを格納することで、コール元のリターンアドレスへのリターンを可能とする。
【００７７】
セキュア領域に格納されるデータは、外部からのアクセスに対して高いセキュリティが確保されている。例えば、セキュア領域であるシャドウスタック領域にアクセスするためには、明示的にレジスタを指定する必要があり、シャドウスタック領域は通常のプログラム実行時に読み書きされることがなく、バッファオーバーフロー攻撃に対して有効に保護された領域であるといえる。つまり、セキュア領域に格納されたリターンアドレスは、確実に正しい値であると保証される。一方、リターンアドレスを格納するためにセキュア領域を使用すると、オーバーヘッドが増加してしまう。
【００７８】
しかしながら、以上のプログラム生成方法によれば、重要度に基づいて、セキュア領域へのリターンアドレスの格納とその取得の使用回数を限定するため、オーバーヘッドの増加を抑制しながら、リターン処理の安全性を高めることができる。
【００７９】
２．本件プログラムを搭載した電子制御装置
生成した本件プログラムは、実施形態１と同様、図７に示すような電子制御装置２０に搭載される。しかしながら、後述するように、本件プログラムを搭載する電子制御装置２０においては、検知部１０２及び処理部１０３は有さなくともよい。なお、セキュア領域及びスタック領域はメモリ１１０に設けられる。
【００８０】
次に、電子制御装置２０のプログラム実行時の動作を、図２２を用いて説明する。
中央演算処理装置の演算部１０１は、メモリ１１０に保存した本件プログラムを読み出し、プログラムを開始する。
まず、プログラムコード内の関数（図２１の関数Ａ又は関数Ｂ）を実行し、次いで、別の関数（関数Ｃ）をコールする（Ｓ５０１）。ここで、リターン処理命令が挿入されている場合、リターンアドレスをセキュア領域に格納する（Ｓ５０２、Ｓ５０３）。一方、リターン処理命令が挿入されていない場合には、従来通り、リターンアドレスをスタック領域に格納する（Ｓ５０２、Ｓ５０４）。なお、本実施形態４の応用例として、リターン処理命令を実行しない場合には、Ｓ５０４の後に、図２２の点線で示すようにチェック処理命令を実行してもよい。
【００８１】
次に、コール先の関数（関数Ｃ）を実行し、コール元の関数（関数Ａ又は関数Ｃ）にリターンする（Ｓ５０５）。ここで、リターン処理命令が挿入されている場合には、セキュア領域に格納されたリターンアドレスへとリターン処理を実行する（Ｓ５０６、Ｓ５０７）。一方、リターン処理命令が挿入されていない場合には、スタック領域に格納されたリターンアドレスへとリターン処理を実行する（Ｓ５０６、Ｓ５０８）。ここでも、本実施形態４の応用例として、リターン処理命令を実行しない場合には、Ｓ５０８の後に、図２２の点線で示すようなチェック処理命令を実行してもよい。
【００８２】
なお、本実施形態４では、セキュア領域にリターンアドレスを格納しており、正しいリターンアドレスへとリターン処理を実行することができるため、実施形態１乃至３とは異なり、制御フローの異常を検知する検知部１０２、及び検知結果が異常を示した場合に所定の処理を行う処理部１０３を必要としない。
【００８３】
なお、上記実施形態によるリターン処理命令は、セキュア領域に格納されたリターンアドレスを読み出し、当該リターンアドレスへとリターン処理を実行するものである。しかしながら、リターン処理命令は、セキュア領域に格納されたリターンアドレスに「基づいて」リターン処理を実行すればよく、例えば、セキュア領域に格納されたリターンアドレスに対して更なるチェックを加えてもよい。
【００８４】
００７６段落にて述べたとおり、通常、ある関数から別の関数へとコールされる場合、リターンアドレスはスタック領域に格納される。そこで、リターン処理命令は、関数からコール元の関数へとリターンする際に、セキュア領域に格納されたリターンアドレス（本発明の「第１のリターンアドレス」に相当）と、スタック領域に格納されたリターンアドレス（本発明の「第２のリターンアドレス」に相当）とを比較し、これらのリターンアドレスが一致した場合に、一致したアドレスへとリターン処理を実行してもよい。
【００８５】
このように、リターン処理命令が、セキュア領域に格納されたリターンアドレスと、スタック領域に格納されたリターンアドレスとを比較する構成の場合、正しいリターンアドレスへとリターン処理を実行すると同時に、第２のリターンアドレスが改ざんされたという異常を検知することが可能となる。
【００８６】
３．実施形態４の変形例
（変形例１）
上記実施形態によるリターン処理命令は、実施形態１に記載のチェック処理命令と同様、リターン処理命令が挿入されている場合には必ず、セキュア領域にリターンアドレスを格納するとともに、セキュア領域に格納されたリターンアドレスへとリターン処理を実行するものであった。
しかしながら、リターン処理命令は必ずリターン処理命令を実行するものではなくともよく、実施形態２に記載のチェック処理命令と同様、本件プログラムの実行時に、関数の重要度に基づいてリターン処理命令が実行されるかどうかを選択可能な構成としてもよい。この場合、本件プログラムを生成する際は、重要度が低以上の関数を特定し、重要度が低以上の関数が対象となる制御フローを特定するとともに、重要度が低以上の関数のリターンを正しく実行させるためにリターン処理命令をプログラムコード内に挿入する。また、本変形例１の電子制御装置の構成は、図１０と基本的に同じであるが、チェック処理命令選択部２０１に代えて、リターン処理命令選択部を有する。
【００８７】
例えば、通常走行中では、リターン処理命令選択部は、図２３（Ａ）の通り、重要度高以上の関数Ａのリターンアドレスをセキュア領域に格納するリターン処理命令、及びセキュア領域に格納されたリターンアドレスに基づいてリターンを実行するリターン処理命令を選択する。一方、高速走行中では、図２３（Ｂ）の通り、リターン処理命令選択部は、重要度低以上の関数に関するリターン処理命令を実行対象とする。
【００８８】
本変形例１では、重要度に応じて実行させるリターン処理命令を変更することができ、関数のリターンの安全性を状況に応じて高めることができるとともに、セキュア領域を使用することによって生じるオーバーヘッドの増加を抑制することができる。
さらに、リターン処理命令を実行しない場合はリターンアドレスを格納するセキュア領域を無効化することにより、さらに、オーバーヘッドの増加を効率的に抑制してもよい。
【００８９】
（変形例２）
実施形態４のリターン処理命令について、実施形態３に記載のチェック処理命令と同様、プログラムコード内の関数自体の重要度を状況に応じて変化させることにより、処理命令の実行対象を動的に変化させてもよい。この場合の電子制御装置の構成は、図１５と基本的に同じであるが、チェック処理命令選択部２０１に代えて、リターン処理命令選択部を有する。
【００９０】
図２４は、状況に応じて重要度が変化する場合の本実施形態におけるリスクランクテーブルの例を示したものである。例えば、動作状態検出部３０１が、車両の動作状態が高速走行中であることを受信した場合、重要度変更部３０２は、関数Ａ及び関数Ｃを重要度高に、関数Ｂを重要度中にそれぞれ変更する。そして、リターン処理命令選択部は、重要度が高以上である関数Ａのリターンアドレスをセキュア領域に格納するリターン処理命令、及びセキュア領域に格納されたリターンアドレスに基づいてリターンを実行するリターン処理命令を実行対象として選択する。一方、動作状態検出部３０１が、車両の動作状態が低速走行中であることを受信した場合、重要度変更部３０２は、関数Ａ及び関数Ｃを重要度中に、関数Ｂを重要度低にそれぞれ変更する。そこで、リターン処理命令選択部は、関数Ａ乃至Ｃのいずれについても、リターン処理命令を実行対象として選択しない。
【００９１】
変形例２では、重要度を状況に応じて変化させることにより、車両の動作状態に応じて最適にリターン処理の安全性を高めることができるとともに、セキュア領域を使用することによって生じるオーバーヘッドの増加を効率的に抑制することができる。
また、変形例１と同様、リターン処理命令を実行しない場合はリターンアドレスを格納するセキュア領域を無効化して、オーバーヘッドの増加を抑制してもよい。
【００９２】
（その他の実施形態）
実施形態１から４では、電子制御装置２０に書き込まれた本件プログラム自体は変更されないが、プログラム自体を書き換えるようにしてもよい。例えば、処理命令の挿入位置を、使用状況や車両の動作状態に応じて変更するようにしてもよい。あるいは、実行される関数の使用頻度に応じて、処理命令の挿入位置を変更するようにしてもよい。  
【００９３】
（総括）
以上、本発明の各実施形態におけるプログラム生成方法、電子制御装置、およびプログラム生成方法で生成した本件プログラムの特徴について説明した。
【００９４】
なお、各実施形態の特徴を２以上含むようにしてもよい。つまり、各実施形態は、実施形態同士組み合わせることが可能である。例えば、実施形態２と実施形態３とを組み合わせ、実行するチェック処理命令を選択できるようにするとともに、関数自体の重要度を変化させてもよい。
【００９５】
また、実施形態１から３では、処理命令としてチェック処理命令をプログラムコード内に挿入する場合を、実施形態４では、処理命令としてリターン処理命令をプログラムコード内に挿入する場合を説明した。しかしながら、処理命令はチェック処理命令とリターン処理命令の少なくとも一方を含むものであればよく、チェック処理命令とリターン処理命令の双方を含むものであってもよい。例えば、重要度高の関数については、チェック処理命令とリターン処理命令の両方を実行してもよい。あるいは、チェック処理命令とリターン処理命令の双方が挿入されている場合には、リターン処理命令を優先的に実行し、リターン処理命令が挿入されていない関数に対してのみチェック処理命令を実行してもよい。
【００９６】
また、各実施形態に開示の構成、方法は、その要素を本発明に適宜組み合わせることができる。つまり、各実施形態に開示の要素同士が必須の組み合わせという訳ではなく、各要素を適宜発明として組み込むことが可能である。
【産業上の利用可能性】
【００９７】
本発明は、主として自動車の電子制御装置に用いられるものであるが、自動車以外の車両、例えば、二輪車、電動アシスト自転車の他、船舶、航空機などにも用いることができる。さらに、本発明はこれらの車載用途に限られるものではない。
【符号の説明】
【００９８】
２０  電子制御装置（ＥＣＵ）、１００  中央演算処理装置（ＣＰＵ）、１０１  演算部、１０２  検知部、１０３  処理部、１１０  メモリ
【図１】
2019016338.tif 000003
【図２】
2019016338.tif 000004
【図３】
2019016338.tif 000005
【図４】
2019016338.tif 000006
【図５】
2019016338.tif 000007
【図６】
2019016338.tif 000008
【図７】
2019016338.tif 000009
【図８】
2019016338.tif 000010
【図９】
2019016338.tif 000011
【図１０】
2019016338.tif 000012
【図１１】
2019016338.tif 000013
【図１２】
2019016338.tif 000014
【図１３】
2019016338.tif 000015
【図１４】
2019016338.tif 000016
【図１５】
2019016338.tif 000017
【図１６】
2019016338.tif 000018
【図１７】
2019016338.tif 000019
【図１８】
2019016338.tif 000020
【図１９】
2019016338.tif 000021
【図２０】
2019016338.tif 000022
【図２１】
2019016338.tif 000023
【図２２】
2019016338.tif 000024
【図２３】
2019016338.tif 000025
【図２４】
2019016338.tif 000026