(57)【要約】【課題】整数値に限らず、その適用範囲が広いプログラム難読化方法およびプログラムを提供することを目的とする。【解決手段】ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるとともに、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加し、制御変数を符号化する。【選択図】図１
2008077400.tif 000002
【特許請求の範囲】
【請求項１】
プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法であって、
プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、
前記制御変数を符号化する第２のステップと、
を備えたことを特徴とするプログラム難読化方法。
【請求項２】
前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、
該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、
前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、
ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、
前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、
を備えたことを特徴とする請求項１に記載のプログラム難読化方法。
【請求項３】
前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、
を備えたことを特徴とする請求項１または請求項２に記載のプログラム難読化方法。
【請求項４】
プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法をコンピュータに実行させるためのプログラムであって、
プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、
前記制御変数を符号化する第２のステップと、
を備えたことを特徴とするプログラム。
【請求項５】
前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、
該切り出したブロックの実行順序を制御するための制御変数を宣言するステップと、
前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、
ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、
前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、
を備えたことを特徴とする請求項４に記載のプログラム。
【請求項６】
前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択する第ステップと、
ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、
前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、
を備えたことを特徴とする請求項４または請求項５に記載のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法およびプログラムに関する。
【背景技術】
【０００２】
一般に、ソフトウェアには、価値のあるアルゴリズムおよびコンテンツの暗号鍵等、利用者に対して秘密にすべき情報が含まれる場合がある。一方で、ソフトウェアを解析するための技術（ＲＥ：Ｒｅｖｅｒｓｅ  Ｅｎｇｉｎｅｅｒｉｎｇ）も数多く開発されているのが現状である。このため、これらの技術によりソフトウェアが解析されると、不正者に秘密情報が入手されるという脅威が考えられる。
【０００３】
こうした脅威に対し、ソフトウェアの仕様を保ったまま、ソフトウェアの解析を困難にする難読化という技術がある。例えば、変数の符号化によるソフトウェアの難読化として、ソースコード中の変数を線形変換により符号化する方法が提案されている（例えば、非特許文献１参照。）。この方法では、単一の変数ｘを線形変換により、変数Ｘ（＝ａｘ＋ｂ）を符号化することで、ソフトウェアの解析を難しくすることを意図するものであり、ここでは、線形変換の際に用いる整数ａ，ｂが秘密鍵となる。また、この方法では、ソースコード中の変数の値や演算を隠蔽することを目的としている。
【０００４】
また、元のプログラムで用いられている変数の個数、ならびに当該変数間の参照・代入関係を秘匿し、かつ、秘密鍵の候補数を多くして耐性の高いプログラムの難読化を実現する技術も開示されている（例えば、特許文献１参照。）。
【非特許文献１】佐藤他、信学技報、Ｖｏｌ．ＩＴ−２００２−４９，ｐｐ．１３−１８，Ｍａｒ．２００２“データの符号化と演算子の変換によるプログラムの難読化手法”
【特許文献１】特開２００６−７９３４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記の非特許文献１に開示された技術によれば、ソースコード中の変数の値や演算を秘匿することはできても、難読化前のソースコードで用いられている変数の個数、ならびに変数間における参照・代入の関係を秘匿することは不可能であった。また、秘密鍵の候補数は少なく、秘密鍵の全数探索による攻撃についても脆弱であると考えられる。
【０００６】
また、上記の特許文献１に開示された技術においては、プログラムに含まれる整数値を符号化の対象としているため、算術演算をほとんど含まないプログラムや実数型のみの変数のみが使われているプログラムに対しては、効果が小さいという問題がある。
【０００７】
そこで、本発明は、上述の課題に鑑みてなされたものであり、整数値に限らず、その適用範囲が広いプログラム難読化方法およびプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
本発明は、上記の課題を解決するために以下の事項を提案している。
【０００９】
（１）本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法であって、プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、前記制御変数を符号化する第２のステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００１０】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができる。
【００１１】
（２）本発明は、（１）のプログラム難読化方法について、前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００１２】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定する方法として、ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、切り出したブロックを並列に並べ、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加する。
【００１３】
（３）本発明は、（１）または（２）のプログラム難読化方法について、前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、を備えたことを特徴とするプログラム難読化方法を提案している。
【００１４】
この発明によれば、符号化を施すｎ個（但し、ｎは正整数）の変数を任意に選択し、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の制御変数を符号化する。
【００１５】
したがって、プログラム中のｎ個の制御変数を線形変換により同時にｍ個の制御変数に符号化するため、プログラム中で用いられている制御変数の個数を秘匿すると同時に、制御変数間の参照および代入関係も秘匿することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【００１６】
（４）本発明は、プログラムに含まれるアルゴリズムの解析を困難にするためのプログラム難読化方法をコンピュータに実行させるためのプログラムであって、プログラムの制御構造を平滑化し、該プログラムの実行順序を管理する制御変数を設定する第１のステップと、前記制御変数を符号化する第２のステップと、を備えたことを特徴とするプログラムを提案している。
【００１７】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができ、こうした処理をプログラムにより自動的に実行することができる。
【００１８】
（５）本発明は、（４）のプログラムについて、前記第１のステップが、ソースコードに含まれる連続した命令を、ブロック単位に切り出すステップと、該切り出したブロックの実行順序を制御するための制御変数を設定するステップと、前記切り出したブロックのそれぞれに、制御変数がとるべき値を割当てるステップと、ｓｗｉｔｃｈ文またはｉｆ文を用いて、前記切り出したブロックを並列に並べるステップと、前記制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加するステップと、を備えたことを特徴とするプログラムを提案している。
【００１９】
この発明によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定する方法として、ソースコードに含まれる連続した命令を、ブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する。そして、切り出したブロックのそれぞれに、制御変数がとるべき値を割当て、ｓｗｉｔｃｈ文またはｉｆ文を用いて、切り出したブロックを並列に並べ、制御変数の値を次に実行されるブロックに割当てられた制御変数値に書き換える処理をそれぞれ切り出したブロックの最後に付加する。
【００２０】
（６）本発明は、（１）または（２）のプログラムについて、前記第２のステップが、符号化を施すｎ個（但し、ｎは正整数）の制御変数を任意に選択するステップと、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成するステップと、前記生成した行列およびベクトルを変換鍵として前記ｎ個の制御変数を線形変換して同時にｍ個の制御変数を符号化するステップと、を備えたことを特徴とするプログラムを提案している。
【００２１】
この発明によれば、符号化を施すｎ個（但し、ｎは正整数）の変数を任意に選択し、ｍ×ｎの行列（但し、ｍは、ｍ≧ｎの正整数）およびｍ次元の任意のベクトルを生成する。そして、生成した行列およびベクトルを変換鍵としてｎ個の変数を線形変換して同時にｍ個の制御変数を符号化する。
【００２２】
したがって、プログラム中のｎ個の制御変数を線形変換により同時にｍ個の制御変数に符号化するため、プログラム中で用いられている制御変数の個数を秘匿すると同時に、制御変数間の参照および代入関係も秘匿することができ、こうした処理をプログラムにより自動的に実行することができる。また、変換鍵として行列およびベクトルを用いるため鍵の候補数を多くすることができる。このことにより、耐性の高いソフトウェアの難読化を実現することができる。
【発明の効果】
【００２３】
本発明によれば、プログラムに制御変数を導入して、その変数を符号化の対象とすることから、直接符号化できる変数を含まないプログラムに対しても、耐性の高いソフトウェアの難読化を実現することができるという効果がある。
【００２４】
また、本発明の技術を用いることにより、各種サービスにおけるセキュリティを向上させることができる。具体的には、Ｊａｖａ（登録商標）やＢｒｅｗ（登録商標）等のソフトウェアに関する著作権を保護するとともに、不正にプログラムの解析を試みる不正者への情報漏えいを的確に防止できるという効果がある。
【発明を実施するための最良の形態】
【００２５】
以下、本発明の実施形態について、図面を用いて、詳細に説明する。
なお、本実施形態における構成要素は適宜、既存の構成要素等との置き換えが可能であり、また、他の既存の構成要素との組合せを含む様々なバリエーションが可能である。したがって、本実施形態の記載をもって、特許請求の範囲に記載された発明の内容を限定するものではない。
【００２６】
＜処理フロー＞
図１、図３から図７を用いて、本発明の実施形態に係るプログラム難読化方法の一般的な処理について説明する。
【００２７】
まず、図３に示すように、ソースコード（プログラム）に含まれる連続する命令を、ブロック（図中、Ｂ１；、Ｂ２；、Ｂ３；）として切り出す（ステップＳ１０１）。次に、ブロックの実行順番を制御するための制御変数（図４に示す「ｉｎｔ  ｃ」）を宣言する（ステップＳ１０２）。
【００２８】
更に、各ブロック（図３のＢ１；、Ｂ２；、Ｂ３；）に、制御変数がとるべき値（図５に示すＢ１；に対しては「５」、Ｂ２；に対しては「９」、Ｂ３；に対しては「４」）を割り当てる（ステップＳ１０３）。
【００２９】
次に、図６に示すように、ｓｗｉｔｃｈ文またはｉｆ文を用いて、各ブロックを並列に並べる（ステップＳ１０４）。なお、条件分岐命令の判定文では、制御変数の値と、ステップＳ１０３において各ブロックに割り当てられた値が等しいかどうかが判定され、制御変数の値と等しい値が割り当てられたブロックの先頭に制御が移る。
【００３０】
更に、図７に示すように、制御変数の値を次に実行されるブロックに割り当てられた値に書き換える処理（図７に示す、ブロックＢ１；におけるｃ＝９、ブロックＢ２；におけるｃ＝４）を各ブロックの最後に追加する（ステップＳ１０５）。そして、制御変数を符号化する処理を行う（ステップＳ１０６）。
【００３１】
＜制御変数の符号化処理＞
次に、図２を用いて、制御変数の符号化処理について説明する。
【００３２】
まず、プログラムの中から、難読化の対象として符号化を施すｎ個（ｎは整数数）の制御変数を任意に選択する。この操作で選ばれたｎ個の制御変数をｘ１，ｘ２・・・，ｘｎとする（ステップＳ２０１）。
【００３３】
次に、ｍ×ｎ型行列Ａ、ｍ次元ベクトルｃを任意に生成し、これらを秘密鍵とする（ステップＳ２０２）。但し、ｍは、ｍ≧ｎなる正整数である。
【００３４】
更に、生成した行列Ａおよびベクトルｃを用いて以下の変換式（１）を定義する（ステップＳ２０３）。
【００３５】
【数１】
2008077400.tif 000003
【００３６】
ここで、Ｘ１，Ｘ２，・・・，Ｘｍは、難読化後のソフトウェアで用いられる符号化されたｍ個の制御変数である。
【００３７】
上記した変換式をｎ個の制御変数ｘ１，ｘ２，・・・，ｘｎに関するｍ本の連立方程式と見なし、それぞれの制御変数について上記連立方程式を解く。その結果、それぞれの制御変数ｘ１，ｘ２，・・・，ｘｎに関して以下の（２）で示す復号式が成立する（ステップＳ２０４）。
【００３８】
【数２】
2008077400.tif 000004
【００３９】
この復号式により、元のプログラム中のそれぞれの制御変数ｘ１，ｘ２，・・・，ｘｎの値を復号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍを用いて表すことが可能になる。
この手順では、ｍ本の連立方程式から、ｎ個の制御変数ｘ１，ｘ２・・・ｘｎの値を求める。このため、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍの間には、ｍ−ｎ個の自明でない以下の関係式（３）が成り立つことになる。
【００４０】
【数３】
2008077400.tif 000005
【００４１】
この自明でない関係式を用いることにより、上記の復号式における各制御変数Ｘ１，Ｘ２，・・・，Ｘｍの係数を可変とすることができる。
【００４２】
次に、プログラム中で用いられている制御変数ｘ１，ｘ２，・・・，ｘｎを以下の規則に従い、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍで置き換える（ステップＳ２０５）。具体的には、アルゴリズム中の制御変数ｘｉに対する代入命令ｘｉ←ｕを、以下の演算式（４）で示されるように、制御変数Ｘ１，Ｘ２，・・・ＸＭに対する代入命令に置き換える。
【００４３】
【数４】
2008077400.tif 000006
【００４４】
この代入命令が実行されると、符号化されたｍ個全ての制御変数Ｘ１，Ｘ２，・・・Ｘｍが、同時に変更される。つまり、プログラム中で参照されている制御変数ｘｊを、ステップＳ２０４の処理で求めた復号式ｘｊ（Ｘ１，Ｘ２，・・・Ｘｍ）を用いて、制御変数Ｘ１，Ｘ２，・・・Ｘｍの式に置き換える。
【００４５】
後処理として、符号化された制御変数Ｘ１，Ｘ２，・・・，Ｘｍへの初期値を与える。また、連続する制御変数Ｘ１，Ｘ２，・・・Ｘｍへの代入命令のマージを行う（ステップＳ２０６）。
【００４６】
具体的には、上記したステップＳ２０５の処理により、プログラム中の制御変数ｘ１，ｘ２，・・・，ｘｎは、全てＸ１，Ｘ２，・・・，Ｘｍで置き換えられる。これらの制御変数の初期値は、自明でない関係式ｆ１，ｆ２，・・・ｆｍ−ｎを満たす任意の整数とする。
【００４７】
また、ステップＳ２０５の処理により生成された、符号化された制御変数Ｘ１，Ｘ２，・・・Ｘｍへの代入命令の中で、連続するものをマージする。
【００４８】
プログラムの解析が十分に困難であると判定されれば、難読化処理を終了する（ステップＳ２０７の「ＹＥＳ」）。一方、さらなる難読化が必要であると判定されれば（ステップＳ２０７の「ＮＯ」）、ステップＳ２０１からステップＳ２０６までの処理を繰り返し実行する。
【００４９】
＜具体的なプログラムを例示した処理の流れ＞
以下、具体的なプログラムを例示し、本実施形態に係るプログラム難読化方法の処理の流れについて、図８から図１４を用いて説明する。なお、図８は、本実施形態に係るプログラム難読化方法により処理を行う元のソースコードを示している。
【００５０】
まず、図８に示す処理前のソースコードについて、連続する命令を図９に示すように、「／＊ブロック１＊／」、「／＊ブロック２＊／」、「／＊ブロック３＊／」として分割する処理を行う。
【００５１】
次に、図１０に示すように、「ｉｎｔ  ｃ１、ｃ２；」という制御変数の宣言を追加する処理を行う。更に、図１１に示すように、「／＊ブロック１＊／」には、「／＊ｃ１＝５；ｃ２＝３＊／」、「／＊ブロック２＊／」には、「／＊ｃ１＝９；ｃ２＝２＊／」、「／＊ブロック３＊／」には、「／＊ｃ１＝４；ｃ２＝６＊／」という各ブロックにおいて、制御変数が取るべき値を割り付ける。そして、図１２に示すように、ｉｆ文を用いて、各ブロックを並列に並べることにより、制御構造を平坦化したソースコードを作成する。
【００５２】
そして、図１３に示すように、各ブロックの末尾に、「ｃ１＝ｃ２＝３；」および「ｃ１＋＝２；」、「ｃ１＝ｃ１＋ｃ２＋１；」および「ｃ２＋＋；」、「ｃ１＝＝ｃ２；」および「ｃ２＝＝９；」、「ｃ１＝ｃ２＋＋；」および「ｃ２――；」という制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を追加したソースコードを作成する。そして、上記の符号化処理（図２参照）を行うことにより、図１４に示す制御変数ｃ１、ｃ２をｄ１、ｄ２、ｄ３に符号化したソースコードが得られる。
【００５３】
以上、説明したように、本実施形態によれば、プログラムの制御構造を平滑化し、プログラムの実行順序を管理する制御変数を設定して、制御変数を符号化する。したがって、これにより、整数値に限らず、制御変数についても符号化の対象とすることができる。
【００５４】
なお、説明した本実施形態は、演算装置もしくはコンピュータにより実現されるものであり、特に、コンピュータにおいては、上述のステップＳ１０１からステップＳ１０６で実行される処理およびその手順をコンピュータ読み取り可能な記録媒体に記録し、この記録媒体に記録されたプログラムをコンピュータに読み込ませ、実行することによって本発明のプログラム難読化方法を実現することができる。ここでいうコンピュータとは、ＯＳや周辺装置等のハードウェアを含む。
【００５５】
また、「コンピュータ」は、ＷＷＷ（Ｗｏｒｌｄ  Ｗｉｄｅ  Ｗｅｂ）システムを利用している場合であれば、ホームページ提供環境（あるいは表示環境）も含むものとする。また、「コンピュータ読み取り可能な記録媒体」フレキシブルディスク、光磁気ディスク、ＲＯＭ、ＣＤ−ＲＯＭ等の可搬媒体、コンピュータシステムに内蔵されるハードディスク等の記憶装置のことをいう。更に、インターネット等のネットワークや電話回線等の通信回線を介してプログラムが送信された場合のシステムやクライアントとなるコンピュータシステム内部の揮発性メモリ（ＲＡＭ）のように、一定時間プログラムを保持しているものも含むものとする。
【００５６】
また、上記プログラムは、このプログラムを記憶装置等に格納したコンピュータシステムから、伝送媒体を介して、あるいは、伝送媒体中の伝送波により他のコンピュータシステムに伝送されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク（通信網）や電話回線等の通信回線（通信線）のように情報を伝送する機能を有する媒体のことをいう。
【００５７】
また、上記プログラムは、前述した機能の一部を実現するためのものであっても良い。更に、前述した機能をコンピュータシステムにすでに記録されているプログラムとの組合せで実現できるもの、いわゆる差分ファイル（差分プログラム）であっても良い。
【００５８】
以上、この発明の実施形態につき、図面を参照して詳述してきたが、具体的な構成はこの実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の設計等も含まれる。
【図面の簡単な説明】
【００５９】
【図１】本実施形態に係る処理フローである。
【図２】本実施形態に係る制御変数の符号化処理を示すフローである。
【図３】ソースコードに含まれる連続する命令をブロックとして切り出す処理の概念図である。
【図４】ソースコードの実行順序を制御するための制御変数を宣言する処理の概念図である。
【図５】各ブロックに制御変数として取るべき値を割当てる処理の概念図である。
【図６】ｓｗｉｔｃｈ文またはｉｆ文を用いて、各ブロックを並列に並べる処理の概念図である。
【図７】制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を各ブロックの最後に追加する処理の概念図である。
【図８】本実施形態に係る処理を行う前のソースコードを示す図である。
【図９】連続する命令をブロック１、２、３に分割したソースコードを示す図である。
【図１０】制御変数の宣言を追加したソースコードを示す図である。
【図１１】各ブロックに制御変数の取るべき値を割当てたソースコードを示す図である。
【図１２】制御構造を平坦化したソースコードを示す図である。
【図１３】制御変数の値を次に実行されるブロックに割当てられた値に書き換える処理を各ブロックの末尾に追加したソースコードを示す図である。
【図１４】制御変数を符号化したソースコードを示す図である。
【図１】
2008077400.tif 000007
【図２】
2008077400.tif 000008
【図３】
2008077400.tif 000009
【図４】
2008077400.tif 000010
【図５】
2008077400.tif 000011
【図６】
2008077400.tif 000012
【図７】
2008077400.tif 000013
【図８】
2008077400.tif 000014
【図９】
2008077400.tif 000015
【図１０】
2008077400.tif 000016
【図１１】
2008077400.tif 000017
【図１２】
2008077400.tif 000018
【図１３】
2008077400.tif 000019
【図１４】
2008077400.tif 000020