(57)【要約】【課題】スタック破壊の検査のための処理量を減らすこと。【解決手段】記憶部１ａは、プログラムに割り当てられたスタック領域２のうち使用済の部分領域２ａ，２ｂ，２ｃに対する第１の誤り検出符号列３を記憶する。処理部１ｂは、プログラムの実行中断時に、スタック領域２のうち、第１の誤り検出符号列３の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列４を生成する。処理部１ｂは、プログラムの実行再開時に、記憶部１ａに記憶された第１の誤り検出符号列３に差分の誤り検出符号列４を反映させた第２の誤り検出符号列５と、実行再開時において使用済の部分領域２ａ，２ｂ，２ｃ，２ｄに対して新たに生成された第３の誤り検出符号列６との照合に応じて、スタック破壊を検出する。【選択図】図１
2019046164.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第１の誤り検出符号列を記憶する記憶部と、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第１の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、前記プログラムの実行再開時に、前記記憶部に記憶された前記第１の誤り検出符号列に前記差分の誤り検出符号列を反映させた第２の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列との照合に応じて、スタック破壊を検出する処理部と、
を有する情報処理装置。
【請求項２】
前記処理部は、前記第１の誤り検出符号列に含まれる使用済の部分領域毎の第１の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第２の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第１の誤り検出符号と前記第２の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、請求項１記載の情報処理装置。
【請求項３】
前記処理部は、前記第１の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第１の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第２の誤り検出符号列を取得する、請求項１または２記載の情報処理装置。
【請求項４】
前記処理部は、スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第１のアドレスに対応する第１の部分領域を特定し、前記第１の部分領域に含まれるフレームポインタに基づいて、前記第１のアドレスよりも大きな第２のアドレスに対応する使用済の第２の部分領域を特定する、請求項１乃至３の何れか１項に記載の情報処理装置。
【請求項５】
前記処理部は、前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、請求項１乃至４の何れか１項に記載の情報処理装置。
【請求項６】
前記第１の誤り検出符号列は、前記プログラムの前回の実行中断時に前記スタック領域の使用済の部分領域に対して取得された誤り検出符号列である、請求項１乃至５の何れか１項に記載の情報処理装置。
【請求項７】
前記処理部は、実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、請求項１乃至６の何れか１項に記載の情報処理装置。
【請求項８】
プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第１の誤り検出符号列を取得し、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第１の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、
前記プログラムの実行再開時に、前記第１の誤り検出符号列に前記差分の誤り検出符号列を反映させた第２の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列との照合に応じて、スタック破壊を検出する、
処理をコンピュータに実行させるスタック破壊検出プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は情報処理装置およびスタック破壊検出プログラムに関する。
【背景技術】
【０００２】
コンピュータなどの情報処理装置によるプログラムの実行のために、メモリ上にスタックと呼ばれる領域が設けられる。スタックの記憶領域は、例えば、プログラムの手続き（例えば、関数）の呼び出し時に手続き毎に割り当てられる。１つの手続きに割り当てられたスタックの部分的な記憶領域は、スタックフレームと呼ばれることがある。スタックフレームには、例えば、手続きの実行に用いられる引数や局所変数などが格納される。
【０００３】
スタックに格納されたデータが他のプログラムやメモリ故障などによって破壊されることがある。スタックに格納されたデータの破壊は、プログラムやプログラムを実行する情報処理装置などの動作異常の要因になる。そこで、スタック領域に記憶したデータの異常を検出することが考えられている。
【０００４】
例えば、スタック領域に記憶するデータのハッシュ値を当該スタック領域に同時に保存しておき、データの異常の検出に用いるコンピュータの提案がある。この提案では、プログラムの実施時、スタック領域内のデータから再計算したハッシュ値と、保存したハッシュ値とを比較して両者が異なるときにスタック領域のデータの異常をユーザに通知する。
【０００５】
また、関数のリターン処理において、スタックのプレヴィアス・フレームポインタと配列との間に格納されたガード変数の有効性を確認することで、スタック上のバッファオーバーフローを原因とするスタックスマッシング攻撃を防止する提案もある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１０−１９８１４７号公報
【特許文献２】特開２００１−２１６１６１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
情報処理装置では、あるプログラムの実行を中断した後に当該プログラムの実行を再開することがある（例えば、実行対象のプログラムを切り替える場合）。中断されたプログラムの中断時のスタック領域のデータは、再開時まで維持される。しかし、中断から再開までの間に、他のプログラムなどによってスタック領域のデータが破壊されることもある。そこで、再開時にスタック領域の破壊の有無を判定可能にすることが考えられる。
【０００８】
例えば、プログラムの実行中断時に、当該プログラムのスタック領域の全体に対する誤り検出用の符号を、情報処理装置により生成して保存することが考えられる。情報処理装置は、当該プログラムの実行再開時に該当のスタック領域の全体の符号を再生成し、保存した符号と照合することでスタック領域の破壊の有無を判定し得る。しかし、これらの検査用の処理は、プログラムの実行中断や実行再開のときのオーバーヘッドの要因になる。
【０００９】
１つの側面では、本発明は、スタック破壊の検査のための処理量を減らすことを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、情報処理装置が提供される。情報処理装置は、記憶部と処理部とを有する。記憶部は、プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第１の誤り検出符号列を記憶する。処理部は、プログラムの実行中断時に、スタック領域のうち、第１の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、プログラムの実行再開時に、記憶部に記憶された第１の誤り検出符号列に差分の誤り検出符号列を反映させた第２の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列との照合に応じて、スタック破壊を検出する。
【発明の効果】
【００１１】
１つの側面では、スタック破壊の検査のための処理量を減らすことができる。
【図面の簡単な説明】
【００１２】
【図１】第１の実施の形態の情報処理装置を示す図である。
【図２】第２の実施の形態のサーバのハードウェア例を示す図である。
【図３】プロセッサにおけるレジスタの例を示す図である。
【図４】ＲＡＭの記憶領域の例を示す図である。
【図５】タスク切り替えの例を示す図である。
【図６】サーバの機能例を示す図である。
【図７】プログラム処理の流れに対するスタック使用量の変化の例を示す図である。
【図８】スタック領域の検査対象範囲の例を示す図である。
【図９】フレームポインタの例を示す図である。
【図１０】誤り検出符号保存テーブルの例を示す図である。
【図１１】スタック破壊の検査例を示すフローチャートである。
【図１２】差分の誤り検出符号生成の例を示すフローチャートである。
【図１３】誤り検出符号保存テーブルの更新例（その１）を示す図である。
【図１４】誤り検出符号保存テーブルの更新例（その２）を示す図である。
【図１５】誤り検出符号の照合の例を示す図である。
【図１６】検査対象の範囲の例を示す図である。
【発明を実施するための形態】
【００１３】
以下、本実施の形態について図面を参照して説明する。
［第１の実施の形態］
図１は、第１の実施の形態の情報処理装置を示す図である。情報処理装置１は、プログラムを実行するサーバコンピュータやクライアントコンピュータなどのコンピュータである。情報処理装置１は、あるプログラムの実行を中断し、その後、当該プログラムの実行を再開することがある。例えば、情報処理装置１は、あるプログラムの実行を中断している間に別のプログラムを実行する。情報処理装置１は、プログラムの実行中断時から当該プログラムの実行再開時の間において生じたスタック破壊の有無を検査する機能を提供する。「スタック破壊」は、プログラムに割り当てられたスタックに格納されたデータが他のプログラムやＲＡＭのビット故障などにより改変されることを示す。
【００１４】
情報処理装置１は、記憶部１ａおよび処理部１ｂを有する。記憶部１ａは、ＲＡＭ（Random Access Memory）などの揮発性記憶装置でもよいし、ＨＤＤ（Hard Disk Drive）やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部１ｂは、ＣＰＵ（Central Processing Unit）やマイクロプロセッサなどのプログラムを実行するプロセッサである。「プロセッサ」には、複数のプロセッサの集合（マルチプロセッサ）が含まれ得る。
【００１５】
記憶部１ａは、スタック領域２を有する。スタック領域２は、実行対象のプログラムに対して割り当てられたスタックに相当する記憶領域である。例えば、情報処理装置１では、複数のプログラムが実行される。スタック領域２は、プログラム毎に設けられる。
【００１６】
記憶部１ａは、スタック領域に対して生成された誤り検出符号列を記憶する。誤り検出符号列は、１つ以上の誤り検出符号の集合である。誤り検出符号は、スタック領域の所定領域の誤り検出に用いられる符号である。誤り検出符号として、例えば、ハッシュ値や巡回冗長検査（ＣＲＣ：Cyclic Redundancy Check）値などを用いることができる。
【００１７】
ここで、誤り検出符号は、スタック領域２のうち、使用済の部分領域に対して処理部１ｂにより生成される。スタック領域２の部分領域は、スタック領域２の一部分である。スタック領域２の部分領域は、プログラムの手続き（例えば、サブルーチン、関数またはメソッドなど）が呼び出されるたびに、手続き毎に割り当てられる。使用済の部分領域は、スタック領域２の一部分であって、ある手続きに割り当て済の領域である。使用済の部分領域は、スタックフレームと呼ばれてもよい。
【００１８】
例えば、時刻Ｔ１において、スタック領域２は、使用済の部分領域２ａ，２ｂ，２ｃおよび未使用領域２ｙを有する。なお、「時刻」は、時計が示す時刻を含む、ある程度の幅をもつ時間範囲と考えてもよい。記憶部１ａは、時刻Ｔ１のスタック領域２に対して生成された第１の誤り検出符号列３を記憶する。第１の誤り検出符号列３は、誤り検出符号Ｃ１，Ｃ２，Ｃ３（図１中、“符号Ｃ１”のように略記している）を含む。誤り検出符号Ｃ１は、時刻Ｔ１の部分領域２ａに対して生成された誤り検出符号である。誤り検出符号Ｃ２は、時刻Ｔ１の部分領域２ｂに対して生成された誤り検出符号である。誤り検出符号Ｃ３は、時刻Ｔ１の部分領域２ｃに対して生成された誤り検出符号である。第１の誤り検出符号列３は、未使用領域２ｙに対応する誤り検出符号を含まない（未使用領域２ｙに対して誤り検出符号は生成されない）。検査用に保存しておく誤り検出符号列は、プログラムの実行中断時に生成される。
【００１９】
例えば、時刻Ｔ１は、スタック領域２を用いるプログラムが実行中断された時刻である。この場合、第１の誤り検出符号列３は、（後述する時刻Ｔ２に対して）プログラムの前回の実行中断時にスタック領域２の使用済の部分領域に対して取得された誤り検出符号列であるといえる。そして、時刻Ｔ１の後、後述する時刻Ｔ２の前に、スタック領域２を用いるプログラムは実行再開されたことになる。ただし、時刻Ｔ１は、実行中断時以外のタイミングでもよい。例えば、時刻Ｔ１は、該当のプログラムが最初に実行開始されたタイミングでもよい。すなわち、処理部１ｂは、該当のプログラムを最初に実行開始したタイミングで、第１の誤り検出符号列３を取得して記憶部１ａに格納しておいてもよい。
【００２０】
処理部１ｂは、プログラムの実行中断時から実行再開時の間において生じたスタック破壊の有無を検査する。具体的には、まず、処理部１ｂは、プログラムの実行中断時に、スタック領域２のうち、第１の誤り検出符号列３の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成する。
【００２１】
例えば、時刻Ｔ２において、スタック領域２を用いるプログラムの実行が中断される場合を考える。時刻Ｔ２は、時刻Ｔ１で中断されたプログラムの実行が再開された時刻よりも後の時刻である。
【００２２】
時刻Ｔ２において、スタック領域２は、使用済の部分領域２ａ，２ｂ，２ｃ，２ｄおよび未使用領域２ｚを有する。処理部１ｂは、時刻Ｔ２のスタック領域２に対して差分の誤り検出符号列４を生成し、記憶部１ａに格納する。差分の誤り検出符号列４は、第１の誤り検出符号列３の取得時（時刻Ｔ１）での使用済の部分領域２ａ，２ｂ，２ｃ、および、当該プログラムの今回の実行中断時（時刻Ｔ２）での使用済の部分領域２ａ，２ｂ，２ｃ，２ｄの差分に対して生成される。なお、処理部１ｂは、時刻Ｔ１で該当のプログラムが実行中断されたとすると、当該プログラムの時刻Ｔ１後、時刻Ｔ２前の実行再開時にも第１の誤り検出符号列３を用いたスタック破壊の検査を行える（スタック破壊が検出されなかったので、プログラムは正常に実行再開されたことになる）。この場合、当該部分領域の差分は、前回の検査時に対する差分であるともいえる。
【００２３】
例えば、部分領域２ｄは、時刻Ｔ１では未使用領域２ｙの一部であった領域であり、時刻Ｔ１での使用済の部分領域２ａ，２ｂ，２ｃ、および、時刻Ｔ２での使用済の部分領域２ａ，２ｂ，２ｃ，２ｄの差分に相当する。また、時刻Ｔ２の部分領域２ｃに格納されているデータは、時刻Ｔ１の部分領域２ｃに格納されているデータとは異なっている。したがって、時刻Ｔ２の部分領域２ｃは、時刻Ｔ１での使用済の部分領域２ａ，２ｂ，２ｃ、および、時刻Ｔ２での使用済の部分領域２ａ，２ｂ，２ｃ，２ｄの差分に相当する。一方、時刻Ｔ１での使用済の部分領域２ａ，２ｂと時刻Ｔ２での使用済の部分領域２ａ，２ｂとは格納されているデータが同じである。したがって、時刻Ｔ２の部分領域２ａ，２ｂは、時刻Ｔ１での使用済の部分領域２ａ，２ｂ，２ｃ、および、時刻Ｔ２での使用済の部分領域２ａ，２ｂ，２ｃ，２ｄの差分に相当しない。
【００２４】
なお、処理部１ｂは、時刻Ｔ１，Ｔ２の間の部分領域毎のデータの相違を、例えば、時刻Ｔ１における誤り検出符号と時刻Ｔ２における誤り検出符号が異なるか否かにより判定することができる。時刻Ｔ２で生成した誤り検出符号と時刻Ｔ１における誤り検出符号との相違は、データの相違を意味する。時刻Ｔ２で生成した誤り検出符号と時刻Ｔ１における誤り検出符号との一致は、データの一致を意味する。
【００２５】
この場合、記憶部１ａのアドレスに対するスタックの使用済領域の成長方向およびＬＩＦＯ（Last In / First Out）の特性により、処理部１ｂは、全ての部分領域に対して誤り検出符号を生成しなくても、時刻Ｔ１，Ｔ２の間の部分領域毎のデータの相違を判定可能である。具体的には、スタックは、割り当てられたアドレス範囲のうち、最大アドレスから最小アドレスに向かって成長する。また、使用済の部分領域は、プログラムに含まれる手続き間の呼出し関係のネスト（入れ子）構造によって、新しい方から順に解放される。ここで、スタック領域２のうち、使用済領域の先頭のアドレスは、スタックポインタと呼ばれるレジスタにより示される。また、例えば、使用済の部分領域の所定位置には、直前の部分領域内の所定のアドレス（例えば、直前の部分領域の先頭アドレス）を示すポインタが含まれる。処理部１ｂは、これらのポインタに基づいて、記憶部１ａにおける各部分領域を特定する。
【００２６】
処理部１ｂは、時刻Ｔ２において、アドレスが小さい方の部分領域から１つずつ順番に誤り検出符号を生成して、時刻Ｔ１における誤り検出符号と、部分領域毎に照合する。処理部１ｂは、時刻Ｔ２で生成した誤り検出符号と時刻Ｔ１における誤り検出符号とが最初に一致した部分領域のアドレスよりも大きなアドレスが割り当てられた部分領域に関しては、上記スタックの特性により、時刻Ｔ１，Ｔ２でのデータが一致するとみなせる。
【００２７】
図１の例でいえば、部分領域２ａ，２ｂ，２ｃ，２ｄと順にアドレスは小さくなる。この場合、例えば、処理部１ｂは、部分領域２ｃに対する誤り検出符号Ｃ３ａを生成し、誤り検出符号Ｃ３と比較する。両者は相違するので、処理部１ｂは、部分領域２ｃを差分の部分領域と判断する。次に、処理部１ｂは、部分領域２ｂに対する誤り検出符号を生成し、誤り検出符号Ｃ２と比較する。両者は一致するので、処理部１ｂは、部分領域２ｂを差分の部分領域としない。この場合、処理部１ｂは、部分領域２ａも差分の部分領域としない。処理部１ｂは、時刻Ｔ２において部分領域２ａに対する誤り検出符号の生成を省略できる。処理部１ｂは、部分領域２ｄに対して誤り検出符号Ｃ４を生成する。処理部１ｂは、誤り検出符号Ｃ３ａ，Ｃ４を差分の誤り検出符号列４とする。
【００２８】
なお、上記の例では、誤り検出符号を用いて部分領域の差分を判定する方法を例示したが、他の判定方法も考えられる。例えば、記憶部１ａは、更新の有無を示すフラグを部分領域毎に記憶してもよい。フラグは、例えば、前回中断時（または前回再開時）の値を“ＦＡＬＳＥ”とし、プログラムの実行中に該当の部分領域の更新があると当該プログラムにより“ＴＲＵＥ”に変更される。処理部１ｂは、記憶部１ａに記憶された当該フラグを基に、時刻Ｔ２において部分領域の差分を判定してもよい。この場合、処理部１ｂは、時刻Ｔ２において、部分領域２ａ，２ｂの両方に対する誤り検出符号の生成を省略できる。
【００２９】
処理部１ｂは、記憶部１ａに記憶された第１の誤り検出符号列３に、差分の誤り検出符号列４を反映させた第２の誤り検出符号列５を取得し、記憶部１ａに格納する。処理部１ｂは、第１の誤り検出符号列３に対して、差分の誤り検出符号列４を適用する（例えば、更新された部分を更新し、追加された部分を追加する）ことで、第２の誤り検出符号列５を得ることができる。
【００３０】
第２の誤り検出符号列５は、誤り検出符号Ｃ１，Ｃ２，Ｃ３ａ，Ｃ４を含む。誤り検出符号Ｃ１は、時刻Ｔ２（および時刻Ｔ１）の部分領域２ａに対応する誤り検出符号である。誤り検出符号Ｃ２は、時刻Ｔ２（および時刻Ｔ１）の部分領域２ｂに対応する誤り検出符号である。誤り検出符号Ｃ３ａは、時刻Ｔ２の部分領域２ｃに対応する誤り検出符号である。誤り検出符号Ｃ４は、時刻Ｔ２の部分領域２ｄに対応する誤り検出符号である。第２の誤り検出符号列５は、未使用領域２ｚに対応する誤り検出符号を含まない。
【００３１】
処理部１ｂは、プログラムの実行再開時に、第２の誤り検出符号列５と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列６との照合に応じて、スタック破壊を検出する。
【００３２】
例えば、時刻Ｔ３において、時刻Ｔ２で中断されたプログラムの実行が再開される場合（実行の再開を試みる場合）を考える。時刻Ｔ３は、時刻Ｔ２よりも後の時刻である。時刻Ｔ３は時刻Ｔ２で中断されたプログラムの実行再開の直前ともいえる。
【００３３】
時刻Ｔ３において、スタック領域２は、使用済の部分領域２ａ，２ｂ，２ｃ，２ｄおよび未使用領域２ｚを有する。処理部１ｂは、時刻Ｔ３のスタック領域２に対して第３の誤り検出符号列６を生成し、記憶部１ａに格納する。第３の誤り検出符号列６は、誤り検出符号Ｃ１ａ，Ｃ２ａ，Ｃ３ｂ，Ｃ４ａを含む。誤り検出符号Ｃ１ａは、時刻Ｔ３の部分領域２ａに対して生成された誤り検出符号である。誤り検出符号Ｃ２ａは、時刻Ｔ３の部分領域２ｂに対して生成された誤り検出符号である。誤り検出符号Ｃ３ｂは、時刻Ｔ３の部分領域２ｃに対して生成された誤り検出符号である。誤り検出符号Ｃ４ａは、時刻Ｔ３の部分領域２ｄに対して生成された誤り検出符号である。第３の誤り検出符号列６は、未使用領域２ｚに対応する誤り検出符号を含まない。
【００３４】
処理部１ｂは、第２の誤り検出符号列５と第３の誤り検出符号列６とを照合する。ここで、処理部１ｂは、時刻Ｔ３よりも前に第２の誤り検出符号列５を取得しておいてもよいし、時刻Ｔ３における照合の直前に第２の誤り検出符号列５の取得を行ってもよい。
【００３５】
例えば、処理部１ｂは、時刻Ｔ２（および時刻Ｔ１）の部分領域２ａに対応する誤り検出符号Ｃ１と、時刻Ｔ３の部分領域２ａに対応する誤り検出符号Ｃ１ａとを照合する。誤り検出符号Ｃ１，Ｃ１ａは一致するとする。この場合、処理部１ｂは、部分領域２ａにはスタック破壊が発生していないと判断する。
【００３６】
処理部１ｂは、時刻Ｔ２（および時刻Ｔ１）の部分領域２ｂに対応する誤り検出符号Ｃ２と、時刻Ｔ３の部分領域２ｂに対応する誤り検出符号Ｃ２ａとを照合する。誤り検出符号Ｃ２，Ｃ２ａは一致するとする。この場合、処理部１ｂは、部分領域２ｂにはスタック破壊が発生していないと判断する。
【００３７】
処理部１ｂは、時刻Ｔ２の部分領域２ｃに対応する誤り検出符号Ｃ３ａと、時刻Ｔ３の部分領域２ｃに対応する誤り検出符号Ｃ３ｂとを照合する。誤り検出符号Ｃ３ａ，Ｃ３ｂは異なるとする。この場合、処理部１ｂは、部分領域２ｃにスタック破壊が発生していると判断する。
【００３８】
処理部１ｂは、時刻Ｔ２の部分領域２ｄに対応する誤り検出符号Ｃ４と、時刻Ｔ３の部分領域２ｄに対応する誤り検出符号Ｃ４ａとを照合する。誤り検出符号Ｃ４，Ｃ４ａは一致するとする。この場合、処理部１ｂは、部分領域２ｄにはスタック破壊が発生していないと判断する。
【００３９】
上記の例では、処理部１ｂは、部分領域２ｃについてスタック破壊を検出したので、スタック破壊が発生した旨をユーザに通知する（プログラムの実行再開を保留する）。処理部１ｂは、スタック破壊が検出された部分領域２ｃに関する情報（例えば、アドレスなど）をユーザに通知してもよい。これによって、スタック破壊が生じた状態で、プログラムを再開することで、当該プログラムや情報処理装置１の動作に不具合が生じることを防げる。
【００４０】
なお、処理部１ｂは、部分領域２ａ，２ｂ，２ｃ，２ｄに対してスタック破壊を検出しない場合には、該当のプログラムの実行を再開する。
情報処理装置１によれば、スタック破壊の検査のための処理量を減らすことができる。具体的には、処理部１ｂは、時刻Ｔ３において、スタック領域２のうち、使用済の部分領域２ａ，２ｂ，２ｃ，２ｄをスタック破壊の検査対象とし、未使用領域２ｚをスタック破壊の検査対象としない。このため、スタック領域２の全体に対して誤り検出符号を生成して照合を行うよりも、誤り検出符号の生成や照合のための処理量を減らせる。
【００４１】
特に、処理部１ｂは、プログラムの実行中断時（時刻Ｔ２）に、前回検査対象となった部分領域（誤り検出符号を生成済の部分領域２ａ，２ｂ，２ｃ）に対する差分の部分領域２ｃ，２ｄに対して差分の誤り検出符号列４を生成する。そして、処理部１ｂは、既存の第１の誤り検出符号列３に差分の誤り検出符号列４を反映して第２の誤り検出符号列５を得る。このとき、処理部１ｂは、部分領域２ａ，２ｂの両方または部分領域２ａの誤り検出符号の生成を省略することができる。したがって、時刻Ｔ２において、使用済の部分領域２ａ，２ｂ，２ｃ，２ｄの全てに対して誤り検出符号を生成するよりも、誤り検出符号を生成するための処理量を減らせる。
【００４２】
こうして、情報処理装置１は、プログラムの実行中断時および実行再開時にスタック破壊の検査のために行われる誤り検出符号の生成や照合の処理量を減らすことができる。その結果、プログラムの実行中断や実行再開におけるオーバーヘッド（処理負荷）を低減でき、実行中断や実行再開を高速化できる。したがって、例えば、情報処理装置１における実行対象のプログラムの切り替えを高速化できる。
【００４３】
以下では、情報処理装置１の一例として、具体的なサーバコンピュータ（以下、単にサーバと称する）を示して、情報処理装置１の機能を更に詳細に説明する。
［第２の実施の形態］
図２は、第２の実施の形態のサーバのハードウェア例を示す図である。サーバ１００は、プロセッサ１０１、ＲＡＭ１０２、ＨＤＤ１０３、画像信号処理部１０４、入力信号処理部１０５、媒体リーダ１０６およびＮＩＣ（Network Interface Card）１０７を有する。各ハードウェアはサーバ１００のバスに接続されている。
【００４４】
プロセッサ１０１は、サーバ１００の情報処理を制御するハードウェアである。プロセッサ１０１は、マルチプロセッサであってもよい。プロセッサ１０１は、例えばＣＰＵやマイクロプロセッサなどである。
【００４５】
ＲＡＭ１０２は、サーバ１００の主記憶装置（メインメモリ）である。ＲＡＭ１０２は、プロセッサ１０１に実行させるＯＳ（Operating System）のプログラムやアプリケーションプログラムの少なくとも一部を一時的に記憶する。また、ＲＡＭ１０２は、プロセッサ１０１による処理に用いる各種データを記憶する。
【００４６】
ＨＤＤ１０３は、サーバ１００の補助記憶装置である。ＨＤＤ１０３は、内蔵した磁気ディスクに対して、磁気的にデータの書き込みおよび読み出しを行う。ＨＤＤ１０３は、ＯＳのプログラム、アプリケーションプログラム、および各種データを記憶する。サーバ１００は、フラッシュメモリやＳＳＤ（Solid State Drive）などの他の種類の補助記憶装置を備えてもよく、複数の補助記憶装置を備えてもよい。
【００４７】
画像信号処理部１０４は、プロセッサ１０１からの命令に従って、サーバ１００に接続されたディスプレイ１１に画像を出力する。ディスプレイ１１として、ＣＲＴ（Cathode Ray Tube）ディスプレイや液晶ディスプレイなどを用いることができる。
【００４８】
入力信号処理部１０５は、サーバ１００に接続された入力デバイス１２から入力信号を取得し、プロセッサ１０１に出力する。入力デバイス１２として、例えば、マウスやタッチパネルなどのポインティングデバイス、キーボードなどを用いることができる。
【００４９】
媒体リーダ１０６は、記録媒体１３に記録されたプログラムやデータを読み取る装置である。記録媒体１３として、例えば、フレキシブルディスク（ＦＤ：Flexible Disk）やＨＤＤなどの磁気ディスク、ＣＤ（Compact Disc）やＤＶＤ（Digital Versatile Disc）などの光ディスク、光磁気ディスク（ＭＯ：Magneto-Optical disk）を使用できる。また、記録媒体１３として、例えば、フラッシュメモリカードなどの不揮発性の半導体メモリを使用することもできる。媒体リーダ１０６は、例えば、プロセッサ１０１からの命令に従って、記録媒体１３から読み取ったプログラムやデータをＲＡＭ１０２またはＨＤＤ１０３に格納する。
【００５０】
ＮＩＣ１０７は、ネットワーク１４を介して他の装置と通信を行う。ＮＩＣ１０７は、有線通信インタフェースでもよいし、無線通信インタフェースでもよい。
ここで、サーバ１００のＯＳは、プログラムの実行単位をタスクと呼ばれる単位で管理する。タスクは、プロセスと呼ばれることもある。サーバ１００のＯＳは、マルチタスクＯＳである。サーバ１００は、ＯＳの機能により、複数のタスクそれぞれをコンテキストスイッチにより切り替えて実行する。切り替えのタイミングは、ＯＳにより制御される。
【００５１】
図３は、プロセッサにおけるレジスタの例を示す図である。プロセッサ１０１は、汎用レジスタ１１１およびスタックポインタ１１２を有する。汎用レジスタ１１１は、アキュムレータ、ベースレジスタ、カウントレジスタおよびデータレジスタといった汎用的に利用可能なレジスタである。スタックポインタ１１２は、ＲＡＭ１０２のスタックの使用済の領域のうち、先頭のアドレスを示すレジスタである。プロセッサ１０１は、これらのレジスタ以外にも、種々のレジスタを有する。
【００５２】
図４は、ＲＡＭの記憶領域の例を示す図である。ＲＡＭ１０２は、スタック１２０、動的確保領域１３０、大域変数１４０、誤り検出符号保存テーブル１５０およびプログラム実行コード１６０を有する。
【００５３】
スタック１２０は、タスクにおける関数の引数や局所変数などを記憶する。スタック１２０は、実行対象のタスク毎に割り当てられる。また、スタック１２０の部分領域は、呼び出された関数毎に割り当てられる。１つの関数に割り当てられた部分領域は、スタックフレームと呼ばれる。
【００５４】
動的確保領域１３０は、プログラムの処理に用いられる各種のデータを格納するために動的に確保可能な領域である。
大域変数１４０は、全ての関数からアクセス可能なグローバル変数である。
【００５５】
誤り検出符号保存テーブル１５０は、スタック破壊の検査に用いられる誤り検出符号を格納するテーブルである。誤り検出符号は、例えばハッシュ値やＣＲＣ値などである。
プログラム実行コード１６０は、各種のプログラムの実行イメージである。
【００５６】
ＲＡＭ１０２には、図４で例示した以外にも種々のデータが格納され得る。
図５は、タスク切り替えの例を示す図である。図５では、一例として、２つのタスクＡ，Ｂを切り替えて順に実行する場合を示す。ただし、サーバ１００は、３以上のタスクを切り替えて実行することもできる。ここで、スタック１２０は、タスクＡに対して割り当てられたＲＡＭ１０２上のスタックであるとする。スタック１２１は、タスクＢに対して割り当てられたＲＡＭ１０２上のスタックであるとする。
【００５７】
まず、プロセッサ１０１は、タスクＡを実行している。タスクＡからタスクＢへの切り替えタイミングにおいて、プロセッサ１０１は、タスクＡのコンテキストを保存する。タスクＡのコンテキストは、タスクＡの切り替え直前におけるプロセッサ１０１のレジスタの情報である。プロセッサ１０１は、タスクＡのコンテキストを、タスクＡ情報１７１としてＲＡＭ１０２に格納する（ステップＳ１）。
【００５８】
プロセッサ１０１は、ＲＡＭ１０２に記憶されたタスクＢ情報１７２に基づいて、タスクＢのコンテキストを復元する（ステップＳ２）。
プロセッサ１０１は、復元したコンテキストに基づいて、タスクＢの実行を再開する（ステップＳ３）。
【００５９】
タスクＢからタスクＡへの切り替えタイミングにおいて、プロセッサ１０１は、タスクＢのコンテキストを、タスクＢ情報１７２としてＲＡＭ１０２に格納する（ステップＳ４）。
【００６０】
プロセッサ１０１は、ＲＡＭ１０２に記憶されたタスクＡ情報１７１に基づいて、タスクＡのコンテキストを復元する（ステップＳ５）。
そして、プロセッサ１０１は、復元したコンテキストに基づいて、タスクＡの実行を再開する（そして、タスクＡの次回中断時にはステップＳ１に戻る）。こうして、プロセッサ１０１は、コンテキストの保存および復元を繰り返すことで、タスクＡ，Ｂを切り替えて実行する。このような切り替え手法は、コンテキストスイッチと呼ばれることがある。
【００６１】
図６は、サーバの機能例を示す図である。サーバ１００は、ＯＳ１８０を有する。ＯＳ１８０は、タスク切り替え部１９０を有する。タスク切り替え部１９０は、タスク実行のスケジューリングおよびタスクの切り替えを行う。タスク切り替え部１９０は、スタック破壊の有無の検査機能を有する。具体的には、タスク切り替え部１９０は、符号保存部１９１、符号照合部１９２、検査対象選択部１９３および差分選択部１９４を有する。
【００６２】
符号保存部１９１、符号照合部１９２、検査対象選択部１９３および差分選択部１９４は、プロセッサ１０１がＲＡＭ１０２に記憶された所定のプログラム（スタック破壊検出プログラム）を実行することで実現される。以下では、各部について、主にタスクＡを例示して説明するが、タスクＢを含む他のタスクについても同様の処理を行う。
【００６３】
符号保存部１９１は、タスクＡの実行中断時に、タスクＡに対するスタック１２０の使用済領域に対する誤り検出符号を生成し、誤り検出符号保存テーブル１５０に格納する。
符号照合部１９２は、タスクＡの実行再開時に、タスクＡに対するスタック１２０の使用済領域に対する誤り検出符号を生成し、誤り検出符号保存テーブル１５０に格納されている誤り検出符号と照合することで、スタック破壊を検出する。
【００６４】
検査対象選択部１９３は、タスクＡの実行中断時において、スタックポインタ１１２に基づき、スタック１２０の使用済領域の先頭アドレスを符号保存部１９１に提供する。検査対象選択部１９３は、タスクＡの実行再開時において、スタックポインタ１１２に基づき、スタック１２０の使用済領域の先頭アドレスを符号照合部１９２に提供する。
【００６５】
差分選択部１９４は、タスクＡの実行中断時において、スタック１２０の記憶領域のうち、前回のスタック破壊の検査時からの差分の領域を符号保存部１９１に提供する。当該差分の領域は、符号保存部１９１における誤り検出符号の生成対象になる。
【００６６】
図７は、プログラム処理の流れに対するスタック使用量の変化の例を示す図である。例えば、タスクＡは、関数ｆｕｎｃ１，ｆｕｎｃ２，ｆｕｎｃ３を含む。ここで、図中、関数を“ｆｕｎｃ１（）”のように表記する。例えば、関数ｆｕｎｃ１は、関数ｆｕｎｃ２を呼び出す。関数ｆｕｎｃ２は、関数ｆｕｎｃ３を呼び出す。
【００６７】
まず、サーバ１００は、関数ｆｕｎｃ１を実行する（ステップＳＴ１）。関数ｆｕｎｃ１には、スタックフレームＦ１が割り当てられる。サーバ１００は、スタック１２０のスタックポインタ１１２（図ではＳＰ（Stack Pointer）と略記）に基づいて、スタックフレームＦ１をスタック１２０に追加する。ここで、図中、“スタックフレームＦ１”を、単に“フレームＦ１”のように略記する。また、図中、スタック１２０の先頭アドレスを上側に、最終アドレスを下側に表記する。この場合、スタックの伸長（成長）方向（スタックフレームが追加されていく方向）は、図の下側から上側に向かう方向である。スタックフレームＦ１を追加した後のスタックポインタ１１２は、スタックフレームＦ１の先頭アドレスを示す。スタック１２０のうち、スタックポインタ１１２よりも小さいアドレスで表される領域は、未使用の領域である。
【００６８】
次に、サーバ１００は、関数ｆｕｎｃ１から関数ｆｕｎｃ２を呼出し、関数ｆｕｎｃ２を実行する（ステップＳＴ２）。関数ｆｕｎｃ２には、スタックフレームＦ２が割り当てられる。サーバ１００は、スタックポインタ１１２に基づいて、スタックフレームＦ２をスタック１２０に追加する。スタックフレームＦ２を追加した後のスタックポインタ１１２は、スタックフレームＦ２の先頭アドレスを示す。
【００６９】
次に、サーバ１００は、関数ｆｕｎｃ２から関数ｆｕｎｃ３を呼出し、関数ｆｕｎｃ３を実行する（ステップＳＴ３）。関数ｆｕｎｃ３には、スタックフレームＦ３が割り当てられる。サーバ１００は、スタックポインタ１１２に基づいて、スタックフレームＦ３をスタック１２０に追加する。スタックフレームＦ３を追加した後のスタックポインタ１１２は、スタックフレームＦ３の先頭アドレスを示す。
【００７０】
更に、サーバ１００は、関数ｆｕｎｃ３から復帰し、関数ｆｕｎｃ２の実行を再開する（ステップＳＴ４）。サーバ１００は、スタックポインタ１１２に基づいて、関数ｆｕｎｃ３に割り当てられていたスタックフレームＦ３をスタック１２０から除去する。スタックフレームＦ３を除去した後のスタックポインタ１１２は、スタックフレームＦ２の先頭アドレスを示す。
【００７１】
このように、スタック１２０には、ＬＩＦＯの手順により、関数の呼出しに応じて、スタックフレームがプッシュされたり、ポップされたりする。
検査対象選択部１９３は、スタック１２０のうち、使用済の領域（使用済領域）をスタック破壊の検査対象とし、未使用の領域（未使用領域）をスタック破壊の検査対象としない。未使用領域をスタック破壊の検査対象にすると、余計な検査処理によるオーバーヘッドが増すからである。検査対象選択部１９３は、スタックポインタ１１２に基づいて、スタック１２０のうち、スタック破壊の検査対象のアドレス範囲を特定する。
【００７２】
図８は、スタック領域の検査対象範囲の例を示す図である。前述のように、スタックポインタ１１２は、スタック１２０に存在しているスタックフレームのうち、最後に追加されたスタックフレームの先頭アドレスを示す。したがって、検査対象選択部１９３は、スタック１２０のうち、スタックポインタ１１２よりも小さなアドレスで表される範囲を未使用領域と判断して、スタック破壊の検査対象外とする。また、検査対象選択部１９３は、スタック１２０のうち、スタックポインタ１１２およびスタックポインタ１１２よりも大きなアドレスで表される範囲を使用済領域と判断して、スタック破壊の検査対象とする。
【００７３】
図９は、フレームポインタの例を示す図である。例えば、スタック１２０は、最終アドレスから先頭アドレスに向かって、スタックフレームＦ１，Ｆ２，Ｆ３，・・・，Ｆｎ（ｎは自然数）を含む。スタック１２０のうち、スタックフレームＦ１，Ｆ２，Ｆ３，・・・，Ｆｎ以外の領域は、未使用領域である。スタックフレームＦ１，Ｆ２，Ｆ３，・・・，Ｆｎそれぞれのアドレスは、フレームポインタＦＰ１，ＦＰ２，ＦＰ３，・・・，ＦＰｎにより示される。例えば、フレームポインタＦＰ１は、スタックフレームＦ１の先頭アドレスを示す。例えば、フレームポインタＦＰ２は、スタックフレームＦ２の先頭アドレスを示す。例えば、フレームポインタＦＰ３は、スタックフレームＦ３の先頭アドレスを示す。例えば、フレームポインタＦＰｎは、スタックフレームＦｎの先頭アドレスを示す。この場合、フレームポインタＦＰｎは、スタックポインタ１１２で示されるアドレスに相当する。
【００７４】
例えば、スタックフレームは、直前のスタックフレームを示すフレームポインタを所定の位置に格納している。具体的には、スタックフレームＦ２は、フレームポインタＦＰ１を含む。スタックフレームＦ３は、フレームポインタＦＰ２を含む。スタックフレームＦｎは、スタックフレームＦ（ｎ−１）を示すフレームポインタＦＰ（ｎ−１）を含む。
【００７５】
図１０は、誤り検出符号保存テーブルの例を示す図である。誤り検出符号保存テーブル１５０は、ＲＡＭ１０２に格納されている。誤り検出符号保存テーブル１５０は、タスクＡに関する情報を保持する。タスクＢを含む他のタスクについても、タスク毎に、誤り検出符号保存テーブル１５０が設けられる。誤り検出符号保存テーブル１５０は、エントリ番号、誤り検出符号およびフレームポインタの項目を含む。
【００７６】
エントリ番号の項目には、誤り検出符号保存テーブル１５０のレコード（エントリと称する）の識別番号が登録される。誤り検出符号の項目には、スタックフレームに対して計算された誤り検出符号が登録される。フレームポインタの項目には、該当のスタックフレームを示すフレームポインタが登録される。
【００７７】
ここで、誤り検出符号保存テーブル１５０において、エントリ番号が大きいエントリを上位エントリと呼ぶこととする。エントリ番号が大きいエントリほど、フレームポインタが示す値（アドレス）は小さい。また、誤り検出符号保存テーブル１５０において、エントリ番号が小さいエントリを下位エントリと呼ぶこととする。エントリ番号が小さいエントリほど、フレームポインタが示す値（アドレス）は大きい。
【００７８】
例えば、誤り検出符号保存テーブル１５０には、エントリ番号が“ｎ”、誤り検出符号が“ｃｏｄｅ（ｎ）”、フレームポインタが“ＦＰｎ”というエントリを含む。このエントリは、エントリ番号“ｎ”であり、フレームポインタＦＰｎのスタックフレームＦｎに対して取得された誤り検出符号が“ｃｏｄｅ（ｎ）”であることを示す。
【００７９】
誤り検出符号保存テーブル１５０には、スタック１２０における他のスタックフレームについても同様に、誤り検出符号が登録される。
次に、サーバ１００によるスタック破壊の検査の手順を説明する。タスク切り替え部１９０は、コンテキストスイッチを実行するタイミングで、下記の手順を開始する。
【００８０】
図１１は、スタック破壊の検査例を示すフローチャートである。以下、図１１に示す処理をステップ番号に沿って説明する。
（Ｓ１１）タスク切り替え部１９０は、実行中断するタスク（ここでは、一例としてタスクＡとする）のコンテキストを保存する。
【００８１】
（Ｓ１２）符号保存部１９１は、実行中断する該当のタスクＡの誤り検出符号の生成が初回であるか否かを判定する。初回である場合、符号保存部１９１は、ステップＳ１３に処理を進める。初回でない場合、符号保存部１９１は、ステップＳ１５に処理を進める。例えば、符号保存部１９１は、タスクＡに対する誤り検出符号保存テーブル１５０を生成済でなければ、タスクＡについて初回の誤り検出符号の生成であり、生成済であれば、タスクＡについて初回の誤り検出符号の生成ではないと判定する。
【００８２】
（Ｓ１３）検査対象選択部１９３は、スタックポインタ１１２により示されるアドレスを符号保存部１９１に通知する。符号保存部１９１は、スタックポインタ１１２および各フレームポインタに基づいて、スタック１２０に存在する全てのスタックフレームに対し、スタックフレーム毎に、誤り検出符号を生成する。すなわち、符号保存部１９１は、スタック１２０の使用済領域の全域に対して、スタックフレーム毎に生成された誤り検出符号を含む誤り検出符号列を生成する。
【００８３】
（Ｓ１４）符号保存部１９１は、スタックフレームのフレームポインタに対応付けて、当該スタックフレームに対して生成された誤り検出符号を、ＲＡＭ１０２に格納する。具体的には、符号保存部１９１は、タスクＡに対する誤り検出符号保存テーブル１５０を生成し、誤り検出符号保存テーブル１５０に、スタックフレームのフレームポインタと、当該スタックフレームの誤り検出符号とを登録する。そして、符号保存部１９１は、ステップＳ１６に処理を進める。
【００８４】
（Ｓ１５）符号保存部１９１は、差分の誤り検出符号の生成を行う。差分の誤り検出符号の生成手順の詳細は、後述される。そして、符号保存部１９１は、ステップＳ１６に処理を進める。
【００８５】
（Ｓ１６）検査対象選択部１９３は、再開するタスク（ここでは、一例としてタスクＢとする）のスタックポインタにより示されるアドレスを符号照合部１９２に通知する。符号照合部１９２は、検査対象選択部１９３により通知されたアドレスおよび再開するタスクＢの誤り検出符号保存テーブルに基づいて、タスクＢのスタック１２１の使用済領域に関して誤り検出符号を照合する。符号照合部１９２は、誤り検出符号の照合を、スタックフレーム毎に実行する。具体的には、符号照合部１９２は、スタック１２１のスタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブルに記憶された誤り検出符号と比較し、一致するか否かを判定する。符号照合部１９２は、スタック１２１の全てのスタックフレームについて、誤り検出符号が一致すれば、照合成功であり、スタック１２１に関してスタック破壊は生じていないと判断する。符号照合部１９２は、スタック１２１の少なくとも１つのスタックフレームについて、誤り検出符号が一致していなければ、照合失敗であり、スタック１２１に関してスタック破壊が生じていると判断する。
【００８６】
（Ｓ１７）符号照合部１９２は、照合に成功したか否かを判定する。照合に成功した場合、符号照合部１９２は、ステップＳ１８に処理を進める。照合に失敗した場合、符号照合部１９２は、ステップＳ２０に処理を進める。
【００８７】
（Ｓ１８）タスク切り替え部１９０は、再開するタスクＢのコンテキストを復元する。
（Ｓ１９）タスク切り替え部１９０は、復元したコンテキストに基づいて、再開するタスクＢの実行を再開する。そして、タスク切り替え部１９０は、処理を終了する。
【００８８】
（Ｓ２０）タスク切り替え部１９０は、スタック破壊をユーザに通知する。例えば、タスク切り替え部１９０は、スタック破壊が発生した旨のメッセージを、ディスプレイ１１に表示することで、スタック破壊を通知してもよい。あるいは、タスク切り替え部１９０は、スタック破壊が発生した旨のメッセージを、ネットワーク１４を介して他のコンピュータに送信することで、スタック破壊を通知してもよい。このとき、タスク切り替え部１９０は、スタック１２１のうち、スタック破壊が検出されたスタックフレームを示す情報（例えば、当該スタックフレームのアドレスなど）を当該通知に含めてもよい。そして、タスク切り替え部１９０は、処理を終了する。
【００８９】
図１２は、差分の誤り検出符号生成の例を示すフローチャートである。以下、図１２に示す処理をステップ番号に沿って説明する。以下に示す手順は、図１１のステップＳ１５に相当する。
【００９０】
（Ｓ１０１）差分選択部１９４は、誤り検出符号保存テーブル１５０の最上位エントリＦＰｎと、スタック１２０の最上位フレームのアドレスＳＰとを比較する。ここで、ＦＰｎは、誤り検出符号保存テーブル１５０における、最上位エントリのフレームポインタで示されるアドレスである。アドレスＳＰは、スタックポインタ１１２で示されるアドレスである。なお、スタック１２０のうち、アドレスが小さい方のスタックフレームを「上位フレーム」と呼び、アドレスが大きい方のスタックフレームを「下位フレーム」と呼ぶことがある。
【００９１】
（Ｓ１０２）差分選択部１９４は、ＳＰ≦ＦＰｎであるか否かを判定する。ＳＰ≦ＦＰｎである場合、差分選択部１９４は、ステップＳ１０３に処理を進める。ＳＰ＞ＦＰｎである場合、差分選択部１９４は、ステップＳ１０４に処理を進める。
【００９２】
（Ｓ１０３）差分選択部１９４は、スタック１２０の最上位フレームを比較フレームとする。ここで、「最上位フレーム」は、スタック１２０のスタックポインタ１１２で示されるスタックフレームである。そして、差分選択部１９４は、ステップＳ１０５に処理を進める。
【００９３】
（Ｓ１０４）差分選択部１９４は、誤り検出符号保存テーブル１５０の最上位エントリに対応するスタック１２０のスタックフレームを比較フレームとする。ここで、差分選択部１９４は、「最上位エントリに対応するスタック１２０のスタックフレーム」を次のようにして特定する。まず、差分選択部１９４は、誤り検出符号保存テーブル１５０のエントリ数ｋ（ｋは１以上の整数）を求める。そして、差分選択部１９４は、スタック１２０の最下位フレームから上位へ向かって数えてｋ番目のスタックフレームを、ステップＳ１０４における「最上位エントリに対応するスタック１２０のスタックフレーム」と特定し、比較フレームとする。そして、差分選択部１９４は、ステップＳ１０５に処理を進める。
【００９４】
（Ｓ１０５）差分選択部１９４は、比較フレームに対応する誤り検出符号保存テーブル１５０のエントリを比較エントリとする。ここで、差分選択部１９４は、「比較フレームに対応する誤り検出符号保存テーブル１５０のエントリ」を次のようにして特定する。まず、差分選択部１９４は、スタック１２０のフレームポインタを辿ることで、比較フレームよりも下位のスタックフレームの個数ｍ（ｍは０以上の整数）を求める。そして、差分選択部１９４は、誤り検出符号保存テーブル１５０の最下位エントリから上位へ向かって数えてｍ＋１番目のエントリを、ステップＳ１０５における「比較フレームに対応する誤り検出符号保存テーブル１５０のエントリ」と特定し、比較エントリとする。
【００９５】
（Ｓ１０６）差分選択部１９４は、比較フレームのフレームポインタＦＰｘと比較エントリのフレームポインタＦＰｙとを比較する。
（Ｓ１０７）差分選択部１９４は、ＦＰｘ＝ＦＰｙであるか否かを判定する。ＦＰｘ＝ＦＰｙである場合、差分選択部１９４は、ステップＳ１０８に処理を進める。ＦＰｘ＝ＦＰｙでない場合、差分選択部１９４は、ステップＳ１１０に処理を進める。
【００９６】
（Ｓ１０８）差分選択部１９４は、比較フレームの誤り検出符号ｃｏｄｅ（ｘ）を生成し、比較エントリの誤り検出符号ｃｏｄｅ（ｙ）と比較する。
（Ｓ１０９）差分選択部１９４は、ｃｏｄｅ（ｘ）＝ｃｏｄｅ（ｙ）であるか否かを判定する。ｃｏｄｅ（ｘ）＝ｃｏｄｅ（ｙ）である場合、差分選択部１９４は、ステップＳ１１１に処理を進める。ｃｏｄｅ（ｘ）＝ｃｏｄｅ（ｙ）でない場合、差分選択部１９４は、ステップＳ１１０に処理を進める。
【００９７】
（Ｓ１１０）差分選択部１９４は、比較フレームを１つ下位のスタックフレーム（現比較フレームよりもアドレスが大きい方のスタックフレーム）に変更する。そして、差分選択部１９４は、ステップＳ１０５に処理を進める。
【００９８】
（Ｓ１１１）差分選択部１９４は、比較フレームより上位のスタックフレームに対して誤り検出符号を生成するように、符号保存部１９１に通知する。符号保存部１９１は、差分選択部１９４からの通知に応じて、比較エントリより上位の誤り検出符号保存テーブル１５０のエントリを、スタック１２０の最上位フレーム（最上位のスタックフレーム）から比較フレームまでの情報で更新する。すなわち、符号保存部１９１は、スタック１２０の最上位フレームから比較フレームの１つ上位のスタックフレームまでについて、スタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブル１５０の該当のエントリを生成した誤り検出符号で更新する。すなわち、符号保存部１９１は、スタック１２０の使用済領域の一部（前回との差分の領域）について、スタックフレーム毎に生成された誤り検出符号を含む誤り検出符号列を生成する。なお、符号保存部１９１は、ステップＳ１０８を実行することで既に誤り検出符号を生成済のスタックフレームに対しては、ステップＳ１１１での誤り検出符号の生成を省略し、ステップＳ１０８で生成された誤り検出符号を用いることができる。そして、符号保存部１９１は、処理を終了する。
【００９９】
このように、差分選択部１９４は、タスクＡの前回の実行中断時に取得された第１の誤り検出符号列に含まれるスタックフレーム（部分領域）毎の第１の誤り検出符号と、タスクＡの今回の実行中断時におけるスタックフレーム毎の第２の誤り検出符号とを、スタックフレームのアドレスの小さい方から順に、スタックフレーム毎に照合する。差分選択部１９４は、第１の誤り検出符号と第２の誤り検出符号とが最初に一致したスタックフレームのアドレスよりも小さいアドレスに対応するスタックフレームを、前回と今回とでのスタックフレームの差分と特定する。これにより、前回から内容が変更されたスタックフレームを適切に特定することができる。そして、スタック１２０の全てのスタックフレームについて変更有無の判定を行わずに済み、差分のスタックフレームを特定する処理を高速化できる。
【０１００】
また、差分選択部１９４は、第１の誤り検出符号列の一部の符号に関する差分の誤り検出符号列に含まれる符号への置き換え、および、第１の誤り検出符号列に対する差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで、現在のスタック１２０の使用済領域に対する第２の誤り検出符号列を取得する。これにより、スタック１２０に対する最新の誤り検出符号列を生成するために、スタック１２０の全スタックフレームに対する誤り検出符号列を生成するよりも、当該最新の誤り検出符号列の生成処理を高速化できる。
【０１０１】
更に、差分選択部１９４は、スタックポインタ１１２に基づいてスタック１２０に属する使用済の部分領域のうちの第１のアドレスに対応する第１の部分領域を特定する。差分選択部１９４は、特定した第１の部分領域に含まれるフレームポインタに基づいて、第１のアドレスよりも大きな第２のアドレスに対応する使用済の第２の部分領域を特定する。これにより、スタック１２０を利用するために用いられるスタックポインタ１１２やフレームポインタに基づいて、スタック１２０のうち、誤り検出符号の生成対象の部分および誤り検出符号の照合対象の部分を効率的に特定することができる。
【０１０２】
ここで、ステップＳ１１０において、スタック１２０の全てのスタックフレームを処理済の場合、比較フレームの１つ下位のスタックフレームが存在しないこともある。この場合、差分選択部１９４は、スタック１２０に存在する全てのスタックフレームについて誤り検出符号を生成するように、符号保存部１９１に通知する。そして、符号保存部１９１は、スタック１２０に存在する全てのスタックフレームについて、スタックフレーム毎に誤り検出符号を生成し、誤り検出符号保存テーブル１５０の各エントリを更新して、処理を終了する。ただし、この場合も、符号保存部１９１は、ステップＳ１０８で誤り検出符号を生成済のスタックフレームがある場合には、該当のスタックフレームに対する誤り検出符号の生成を省略し、ステップＳ１０８で生成された誤り検出符号を用いることができる。
【０１０３】
また、ステップＳ１０７において、フレームポインタＦＰｘ，ＦＰｙの比較を行う理由は、比較フレームが前回検査時とは別の関数のスタックフレームに入れ替わっている場合、フレームポインタが変更されている可能性が高いからである。この場合、前回の誤り検出符号を流用することはできず、今回、再生成を要することになる。
【０１０４】
次に、差分の誤り検出符号による既存の誤り検出符号の更新方法の具体例を説明する。
図１３は、誤り検出符号保存テーブルの更新例（その１）を示す図である。タスクの切り替えに伴って、タスクＡの実行を中断する場合を考える。例えば、タスクＡの中断のタイミングにおいて、スタック１２０は、最終アドレスから先頭アドレスに向かう順に、スタックフレームＦ１，Ｆ２，Ｆ３，Ｆ４，Ｆ５，Ｆ６を含む。また、スタック１２０は、未使用領域を含む。誤り検出符号保存テーブル１５１は、タスクＡに対応する更新前の誤り検出符号保存テーブルである。誤り検出符号保存テーブル１５２は、タスクＡに対応する更新後の誤り検出符号保存テーブルである。
【０１０５】
例えば、タスクＡの中断のタイミングにおいて、誤り検出符号保存テーブル１５１は、エントリ＃１，＃２，＃３，＃４の４つのエントリを含む。
この場合、まず、差分選択部１９４は、誤り検出符号保存テーブル１５１の最上位エントリのアドレス（フレームポインタ）ＦＰｎ＝ＦＰ４と、スタック１２０の最上位フレームのアドレス（スタックポインタ）ＳＰ＝ＦＰ６とを比較する。ＳＰ＞ＦＰｎであるため（ステップＳ１０２  Ｎｏ）、差分選択部１９４は、誤り検出符号保存テーブル１５１の最上位エントリ＃４に対応するスタック１２０のスタックフレームを比較フレームとする（ステップＳ１０４）。具体的には、誤り検出符号保存テーブル１５１のエントリ数ｋ＝４である。そして、差分選択部１９４は、スタック１２０の最下位フレーム（スタックフレームＦ１）から数えてｋ＝４番目のスタックフレームＦ４を比較フレームとする。比較エントリは、誤り検出符号保存テーブル１５１のエントリ＃４である。
【０１０６】
そして、差分選択部１９４は、スタックフレームＦ４のフレームポインタ（ＦＰｘ）と誤り検出符号保存テーブル１５１のエントリ＃４のフレームポインタ（ＦＰｙ）と、を比較する。両者は一致している（ＦＰｘ＝ＦＰｙ）とする。また、差分選択部１９４は、誤り検出符号保存テーブル１５１のエントリ＃４に記録された誤り検出符号と、スタックフレームＦ４を基に再生成した誤り検出符号とを照合する。これら２つの誤り検出符号は相違しているとする（ステップＳＴ１１）。
【０１０７】
次に、差分選択部１９４は、比較フレームを１つ下位のスタックフレームＦ３に変更する。比較エントリは、誤り検出符号保存テーブル１５１のエントリ＃３である。
差分選択部１９４は、スタックフレームＦ３のフレームポインタ（ＦＰｘ）と誤り検出符号保存テーブル１５１のエントリ＃３のフレームポインタ（ＦＰｙ）とを比較する。両者は一致している（ＦＰｘ＝ＦＰｙ）とする。また、差分選択部１９４は、誤り検出符号保存テーブル１５１のエントリ＃３に記録された誤り検出符号と、スタックフレームＦ３を基に再生成した誤り検出符号とを照合する。これら２つの誤り検出符号は一致しているとする（ステップＳＴ１２）。
【０１０８】
すると、符号保存部１９１は、比較エントリであるエントリ＃３より上位の誤り検出符号保存テーブル１５１のエントリを、スタック１２０の最上位フレーム（スタックフレームＦ６）から比較フレームの１つ上位のスタックフレームＦ４までの情報で更新する。すなわち、符号保存部１９１は、スタックフレームＦ４，Ｆ５，Ｆ６それぞれに対して差分の誤り検出符号を生成し、誤り検出符号保存テーブル１５１を更新する（ステップＳＴ１３）。その結果、誤り検出符号保存テーブル１５１のエントリ＃４の誤り検出符号は更新され、誤り検出符号保存テーブル１５１にエントリ＃５，＃６のエントリが追加される。なお、符号保存部１９１は、スタックフレームＦ３に対して再生成された誤り検出符号と等しいと判定されたエントリ＃３と、エントリ＃３よりも下位のエントリ＃２，＃１については、誤り検出符号を作り直さずに再利用する（ステップＳＴ１４）。
【０１０９】
誤り検出符号保存テーブル１５２は、誤り検出符号保存テーブル１５１の更新後を示す。誤り検出符号保存テーブル１５２のエントリ＃１，＃２，＃３は、再利用されたエントリである。誤り検出符号保存テーブル１５２のエントリ＃４は、今回変更されたエントリである。誤り検出符号保存テーブル１５２のエントリ＃５，＃６は、今回追加されたエントリである。
【０１１０】
こうして、符号保存部１９１は、差分の誤り検出符号を生成し、前回の誤り検出符号を再利用して、スタック１２０の使用済領域に対する最新の誤り検出符号列を得る。
図１４は、誤り検出符号保存テーブルの更新例（その２）を示す図である。引き続き、タスクの切り替えに伴って、タスクＡの実行を中断する場合を考える。例えば、タスクＡの中断のタイミングにおいて、スタック１２０は、最終アドレスから先頭アドレスに向かう順に、スタックフレームＦ１，Ｆ２，Ｆ３，Ｆ４，Ｆ５を含む。また、スタック１２０は、未使用領域を含む。誤り検出符号保存テーブル１５３は、タスクＡに対応する更新前の誤り検出符号保存テーブルである。誤り検出符号保存テーブル１５４は、タスクＡに対応する更新後の誤り検出符号保存テーブルである。
【０１１１】
例えば、タスクＡの中断のタイミングにおいて、誤り検出符号保存テーブル１５３は、エントリ＃１，＃２，＃３，＃４，＃５，＃６の６つのエントリを含む。
この場合、まず、差分選択部１９４は、誤り検出符号保存テーブル１５３の最上位エントリのアドレスＦＰｎ＝ＦＰ６と、スタック１２０の最上位フレームのアドレスＳＰ＝ＦＰ５とを比較する。ＳＰ≦ＦＰｎであるため（ステップＳ１０２  Ｙｅｓ）、差分選択部１９４は、スタック１２０の最上位のスタックフレームＦ５を比較フレームとする（ステップＳ１０３）。
【０１１２】
差分選択部１９４は、フレームポインタを辿ることで、スタックフレームＦ５の下位に、スタックフレームＦ１，Ｆ２，Ｆ３，Ｆ４の４つのスタックフレームがあることを特定し、ｍ＝４とする。そして、差分選択部１９４は、誤り検出符号保存テーブル１５３の最下位エントリから数えてｍ＋１＝５番目のエントリ＃５を、比較エントリとする（ステップＳ１０５）。
【０１１３】
そして、差分選択部１９４は、スタックフレームＦ５のフレームポインタ（ＦＰｘ）と誤り検出符号保存テーブル１５３のエントリ＃５のフレームポインタ（ＦＰｙ）とを比較する。両者は一致している（ＦＰｘ＝ＦＰｙ）とする。また、差分選択部１９４は、誤り検出符号保存テーブル１５３のエントリ＃５に記録された誤り検出符号と、スタックフレームＦ５を基に再生成した誤り検出符号とを照合する。これら２つの誤り検出符号は相違しているとする（ステップＳＴ２１）。
【０１１４】
次に、差分選択部１９４は、比較フレームを１つ下位のスタックフレームＦ４に変更する。比較エントリは、誤り検出符号保存テーブル１５３のエントリ＃４である。
差分選択部１９４は、スタックフレームＦ４のフレームポインタ（ＦＰｘ）と誤り検出符号保存テーブル１５３のエントリ＃４のフレームポインタ（ＦＰｙ）とを比較する。両者は一致している（ＦＰｘ＝ＦＰｙ）とする。また、差分選択部１９４は、誤り検出符号保存テーブル１５３のエントリ＃４に記録された誤り検出符号と、スタックフレームＦ４を基に再生成した誤り検出符号とを照合する。これら２つの誤り検出符号は相違しているとする（ステップＳＴ２２）。
【０１１５】
次に、差分選択部１９４は、比較フレームを１つ下位のスタックフレームＦ３に変更する。比較エントリは、誤り検出符号保存テーブル１５３のエントリ＃３である。
差分選択部１９４は、スタックフレームＦ３のフレームポインタ（ＦＰｘ）と誤り検出符号保存テーブル１５３のエントリ＃３のフレームポインタ（ＦＰｙ）とを比較する。両者は一致している（ＦＰｘ＝ＦＰｙ）とする。また、差分選択部１９４は、誤り検出符号保存テーブル１５３のエントリ＃３に記録された誤り検出符号と、スタックフレームＦ３を基に再生成した誤り検出符号とを照合する。これら２つの誤り検出符号は一致しているとする（ステップＳＴ２３）。
【０１１６】
すると、符号保存部１９１は、比較エントリであるエントリ＃３より上位の誤り検出符号保存テーブル１５３のエントリを、スタック１２０の最上位フレーム（スタックフレームＦ５）から比較フレームの１つ上位のスタックフレームＦ４までの情報で更新する。すなわち、符号保存部１９１は、スタックフレームＦ４，Ｆ５それぞれに対して差分の誤り検出符号を生成し、誤り検出符号保存テーブル１５３を更新する（ステップＳＴ２４）。その結果、誤り検出符号保存テーブル１５３のエントリ＃４，＃５の誤り検出符号は更新され、エントリ＃６は削除される。
【０１１７】
なお、符号保存部１９１は、スタックフレームＦ３に対して再生成された誤り検出符号と等しいと判定されたエントリ＃３と、エントリ＃３よりも下位のエントリ＃２，＃１については、誤り検出符号を作り直さずに再利用する（ステップＳＴ２５）。
【０１１８】
誤り検出符号保存テーブル１５４は、誤り検出符号保存テーブル１５３の更新後を示す。誤り検出符号保存テーブル１５４のエントリ＃１，＃２，＃３は、再利用されたエントリである。誤り検出符号保存テーブル１５４のエントリ＃４，＃５は、今回変更されたエントリである。
【０１１９】
こうして、符号保存部１９１は、差分の誤り検出符号を生成し、前回の誤り検出符号を再利用して、スタック１２０の使用済領域に対する最新の誤り検出符号列を得る。
図１５は、誤り検出符号の照合の例を示す図である。タスクの切り替えに伴って、中断されていたタスクＡの実行を再開する場合を考える。誤り検出符号保存テーブル１５５は、タスクＡの前回の中断時の誤り検出符号列を記録したテーブルである。
【０１２０】
符号照合部１９２は、検査対象選択部１９３からスタック１２０のうち、スタックフレームＦｎの先頭アドレス（スタックポインタ１１２）の通知を受け付ける。符号照合部１９２は、スタックフレームＦｎおよびスタックフレームＦｎよりも下位のスタックフレームを、使用済領域として認識する。符号照合部１９２は、スタックポインタ１１２およびフレームポインタで示されるアドレスを辿り、スタックフレームＦｎよりも下位の各スタックフレームＦ１，Ｆ２，Ｆ３，・・・を特定する。符号照合部１９２は、スタックフレームＦ１，Ｆ２，Ｆ３，・・・，Ｆｎのそれぞれに対して、誤り検出符号（照合用の誤り検出符号列２０１）を生成する（ステップＳＴ３１）。誤り検出符号列２０１は、誤り検出符号ｃｏｄｅ（ａ１），ｃｏｄｅ（ａ２），ｃｏｄｅ（ａ３），・・・，ｃｏｄｅ（ａｎ）を含む。誤り検出符号ｃｏｄｅ（ａ１）は、スタックフレームＦ１を基に生成された誤り検出符号である。誤り検出符号ｃｏｄｅ（ａ２）は、スタックフレームＦ２を基に生成された誤り検出符号である。誤り検出符号ｃｏｄｅ（ａ３）は、スタックフレームＦ３を基に生成された誤り検出符号である。誤り検出符号ｃｏｄｅ（ａｎ）は、スタックフレームＦｎを基に生成された誤り検出符号である。
【０１２１】
符号照合部１９２は、再生成された誤り検出符号列２０１と誤り検出符号保存テーブル１５５に記録されている誤り検出符号列とを、スタックフレーム毎に照合する。例えば、符号照合部１９２は、スタックフレームＦ１について、再生成された誤り検出符号ｃｏｄｅ（ａ１）と、誤り検出符号保存テーブル１５５に記録されている誤り検出符号ｃｏｄｅ（１）とを照合する。同様に、符号照合部１９２は、スタックフレームＦ２，Ｆ３，・・・，Ｆｎについても、再生成された誤り検出符号ｃｏｄｅ（ａ２），ｃｏｄｅ（ａ３），・・・，ｃｏｄｅ（ａｎ）と、誤り検出符号保存テーブル１５５に記録されている誤り検出符号ｃｏｄｅ（２），ｃｏｄｅ（３），・・・，ｃｏｄｅ（ｎ）とを照合する。
【０１２２】
符号照合部１９２は、照合により、全ての誤り検出符号の組が一致すれば、スタック破壊が生じていないと判断し、タスクＡの実行を再開する。一方、符号照合部１９２は、照合により、少なくとも１つの誤り検出符号の組が一致しなければ、スタック破壊が生じていると判断し、タスクＡの実行再開を中止して、スタック破壊が発生した旨をユーザに通知する。
【０１２３】
そして、符号照合部１９２は、スタック１２０のうち検査対象の範囲を削減することで、スタック破壊の検査に伴う処理量を減らすことができる。具体的には次の通りである。
図１６は、検査対象の範囲の例を示す図である。図１６（Ａ）は、スタック１２０のうち、使用済領域を検査対象とし、未使用領域を検査対象外とする例を示す。図１６（Ｂ）は、スタック１２０のうち、全ての領域を検査対象とする例を示す。
【０１２４】
図１６（Ａ）では、スタック１２０が領域Ｒ１，Ｒ２，Ｒ３に分割されている。領域Ｒ１は、使用済領域であり、かつ、前回の検査時（すなわち、前回のタスクＡの中断時、または、タスクＡの再開時）から格納されているデータに変更がない領域である。領域Ｒ１に属するスタックフレームについては、前回の検査時における誤り検出符号を今回の検査に再利用することができる。また、領域Ｒ１は、誤り検出符号の照合によるスタック破壊の検査対象である。
【０１２５】
領域Ｒ２は、使用済領域であり、かつ、前回の検査時から格納されているデータの書き換えが発生した領域である。領域Ｒ２に属するスタックフレームについては、前回の検査時における誤り検出符号を再利用することができず、タスクＡの中断時に誤り検出符号の生成を要する。また、領域Ｒ２は、誤り検出符号の照合によるスタック破壊の検査対象である。
【０１２６】
領域Ｒ３は、未使用領域である。領域Ｒ３は、誤り検出符号の照合によるスタック破壊の検査対象外である。
すなわち、サーバ１００は、タスクＡの実行中断時に、スタック１２０のうちのスタックフレーム（使用済の部分領域）の差分以外の領域に対する誤り検出符号の更新を省略する。また、サーバ１００は、タスクＡの実行再開時に、スタック１２０のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する。
【０１２７】
例えば、スタック１２０の全体サイズに対する領域Ｒ１のサイズの比は、０．２であるとする。また、スタック１２０の全体サイズに対する領域Ｒ２のサイズの比は、０．４であるとする。更に、スタック１２０の全体サイズに対する領域Ｒ３のサイズの比は、０．４であるとする。
【０１２８】
一方、図１６（Ｂ）で示されるように、常に、スタック１２０の領域全体をスタック破壊の検査対象とすることも考えられる。ここで、スタック１２０の全体サイズを１とし、処理対象となる領域のサイズに処理量が比例すると考えると、図１６（Ａ）の場合と、図１６（Ｂ）の場合とで、おおよその処理量を比較することができる。
【０１２９】
例えば、図１６（Ａ）の場合では、符号保存部１９１は、タスクＡの実行中断時に、領域Ｒ２に対する誤り検出符号の生成を行う（処理量０．４）。また、符号照合部１９２は、タスクＡの実行再開時に、領域Ｒ２に対する誤り検出符号の生成および照合を行う（処理量０．４）。ただし、ここでは、タスクＡの実行再開時における誤り検出符号の生成および照合を１つの処理と捉えて処理量を評価している。更に、符号照合部１９２は、タスクＡの実行再開時に、領域Ｒ１に対する誤り検出符号の生成および照合を行う（処理量０．２）。図１６（Ａ）の場合、タスクＡの実行中断および実行再開の１セットにおいて、スタック破壊の検査のために、０．４＋０．４＋０．２＝１の処理量が生じる。
【０１３０】
図１６（Ｂ）の場合では、符号保存部１９１は、タスクＡの実行時に、スタック１２０の全領域に対する誤り検出符号の生成を行う（処理量１）。また、符号照合部１９２は、タスクＡの実行再開時に、スタック１２０の全領域に対する誤り検出符号の生成および照合を行う（処理量１）。したがって、図１６（Ｂ）の場合、タスクＡの実行中断および実行再開の１セットにおいて、スタック破壊の検査のために、１＋１＝２の処理量が生じる。
【０１３１】
そして、図１６（Ａ）の場合の処理量１と、図１６（Ｂ）の場合の処理量２とを比較すると、図１６（Ａ）の場合（使用済領域のみを検査対象とする場合）の方が、図１６（Ｂ）の場合（スタック領域全体を検査対象とする場合）よりも処理量が小さい。
【０１３２】
なお、上記の処理量の比較において、タスクＡの実行再開時における誤り検出符号の生成および照合を別個の処理と捉えて処理量を評価することもできる。その場合、図１６（Ａ）の場合のスタック破壊の検査のための処理量は、領域Ｒ２，Ｒ３に対する実行再開時の処理量がそれぞれ、０．４＋０．４＝０．８、０．２＋０．２＝０．４と評価されることから、０．４＋０．８＋０．４＝１．６である。また、図１６（Ｂ）の場合のスタック破壊の検査のための処理量は、１＋１＋１＝３である。このようにより厳密に処理量を評価した場合でも図１６（Ａ）の場合の方が、図１６（Ｂ）の場合よりも処理量が小さい。
【０１３３】
こうして、サーバ１００は、スタック破壊検査のための処理量を減らすことができる。その結果、タスク切り替えに伴う処理負荷を低減でき、タスク切り替えを高速に行える。特に、サーバ１００ではＯＳ１８０の制御により、タスク切り替えが頻繁に行われる。このため、タスク切り替えの処理負荷の低減や高速化は、サーバ１００の性能改善へ大きく貢献する。
【０１３４】
なお、第１の実施の形態の情報処理は、処理部１ｂにプログラムを実行させることで実現できる。また、第２の実施の形態の情報処理は、プロセッサ１０１にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体１３に記録できる。
【０１３５】
例えば、プログラムを記録した記録媒体１３を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体１３に記録されたプログラムまたは他のコンピュータから受信したプログラムを、ＲＡＭ１０２やＨＤＤ１０３などの記憶装置に格納し（インストールし）、当該記憶装置からプログラムを読み込んで実行してもよい。
【０１３６】
以上の第１，第２の実施の形態を含む実施形態に関し、更に以下の付記を開示する。
（付記１）  プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第１の誤り検出符号列を記憶する記憶部と、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第１の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、前記プログラムの実行再開時に、前記記憶部に記憶された前記第１の誤り検出符号列に前記差分の誤り検出符号列を反映させた第２の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列との照合に応じて、スタック破壊を検出する処理部と、
を有する情報処理装置。
【０１３７】
（付記２）  前記処理部は、前記第１の誤り検出符号列に含まれる使用済の部分領域毎の第１の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第２の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第１の誤り検出符号と前記第２の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、付記１記載の情報処理装置。
【０１３８】
（付記３）  前記処理部は、前記第１の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第１の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第２の誤り検出符号列を取得する、付記１または２記載の情報処理装置。
【０１３９】
（付記４）  前記処理部は、スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第１のアドレスに対応する第１の部分領域を特定し、前記第１の部分領域に含まれるフレームポインタに基づいて、前記第１のアドレスよりも大きな第２のアドレスに対応する使用済の第２の部分領域を特定する、付記１乃至３の何れか１つに記載の情報処理装置。
【０１４０】
（付記５）  前記処理部は、前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、付記１乃至４の何れか１つに記載の情報処理装置。
【０１４１】
（付記６）  前記第１の誤り検出符号列は、前記プログラムの前回の実行中断時に前記スタック領域の使用済の部分領域に対して取得された誤り検出符号列である、付記１乃至５の何れか１つに記載の情報処理装置。
【０１４２】
（付記７）  前記処理部は、実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、付記１乃至６の何れか１つに記載の情報処理装置。
【０１４３】
（付記８）  プログラムに割り当てられたスタック領域のうち使用済の部分領域に対する第１の誤り検出符号列を取得し、
前記プログラムの実行中断時に、前記スタック領域のうち、前記第１の誤り検出符号列の取得時および今回の実行中断時での使用済の部分領域の差分に対して差分の誤り検出符号列を生成し、
前記プログラムの実行再開時に、前記第１の誤り検出符号列に前記差分の誤り検出符号列を反映させた第２の誤り検出符号列と、実行再開時において使用済の部分領域に対して新たに生成された第３の誤り検出符号列との照合に応じて、スタック破壊を検出する、
処理をコンピュータに実行させるスタック破壊検出プログラム。
【０１４４】
（付記９）  前記プログラムの実行中断時に、前記第１の誤り検出符号列に含まれる使用済の部分領域毎の第１の誤り検出符号と、前記プログラムの今回の実行中断時における使用済の部分領域毎の第２の誤り検出符号とを、部分領域に対応するアドレスの小さい方から順に、部分領域毎に照合し、前記第１の誤り検出符号と前記第２の誤り検出符号とが最初に一致した部分領域のアドレスよりも小さいアドレスに対応する部分領域を、使用済の部分領域の前記差分と特定する、付記８記載のスタック破壊検出プログラム。
【０１４５】
（付記１０）  前記第１の誤り検出符号列の一部の符号に関する前記差分の誤り検出符号列に含まれる符号への置き換え、および、前記第１の誤り検出符号列に対する前記差分の誤り検出符号列に含まれる符号の追加の少なくとも一方を行うことで前記第２の誤り検出符号列を取得する、付記８または９記載のスタック破壊検出プログラム。
【０１４６】
（付記１１）  スタックポインタに基づいて前記スタック領域に属する使用済の部分領域のうちの第１のアドレスに対応する第１の部分領域を特定し、前記第１の部分領域に含まれるフレームポインタに基づいて、前記第１のアドレスよりも大きな第２のアドレスに対応する使用済の第２の部分領域を特定する、付記８乃至１０の何れか１つに記載のスタック破壊検出プログラム。
【０１４７】
（付記１２）  前記プログラムの実行中断時に、前記スタック領域のうちの使用済の部分領域の前記差分以外の領域に対する誤り検出符号の更新を省略し、前記プログラムの実行再開時に、前記スタック領域のうちの未使用の領域に対する誤り検出符号の生成および照合を省略する、付記８乃至１１の何れか１つに記載のスタック破壊検出プログラム。
【０１４８】
（付記１３）  前記取得では、前記プログラムの前回の実行中断時に前記第１の誤り検出符号列を取得する、付記８乃至１２の何れか１つに記載のスタック破壊検出プログラム。
【０１４９】
（付記１４）  実行対象を前記プログラムから他のプログラムに切り替える際に、前記プログラムの実行を中断する、付記８乃至１３の何れか１つに記載のスタック破壊検出プログラム。
【符号の説明】
【０１５０】
１  情報処理装置
１ａ  記憶部
１ｂ  処理部
２  スタック領域
２ａ，２ｂ，２ｃ，２ｄ  部分領域
２ｙ，２ｚ  未使用領域
３  第１の誤り検出符号列
４  差分の誤り検出符号列
５  第２の誤り検出符号列
６  第３の誤り検出符号列
【図１】
2019046164.tif 000003
【図２】
2019046164.tif 000004
【図３】
2019046164.tif 000005
【図４】
2019046164.tif 000006
【図５】
2019046164.tif 000007
【図６】
2019046164.tif 000008
【図７】
2019046164.tif 000009
【図８】
2019046164.tif 000010
【図９】
2019046164.tif 000011
【図１０】
2019046164.tif 000012
【図１１】
2019046164.tif 000013
【図１２】
2019046164.tif 000014
【図１３】
2019046164.tif 000015
【図１４】
2019046164.tif 000016
【図１５】
2019046164.tif 000017
【図１６】
2019046164.tif 000018