(57)【特許請求の範囲】
【請求項１】
プログラムコードを生成するためのプログラムコード生成装置であって、
複数のプログラム要素とプログラム要素間の関係とを示すモデル図から、分岐のプログラム要素である分岐要素を特定する分岐要素特定部と、
前記モデル図から、前記分岐要素の分岐先毎に分岐先を構成する一連のプログラム要素である分岐先グループを特定するグループ特定部と、
前記プログラムコードの中での各分岐先グループの並び順を決定する順序決定部と
を備えるプログラムコード生成装置。
【請求項２】
前記分岐要素特定部は、各プログラム要素の種別に基づいて前記分岐要素を特定する
請求項１に記載のプログラムコード生成装置。
【請求項３】
前記分岐要素特定部は、前記分岐要素の種別を指定する分岐要素ルールを用いて、前記分岐要素ルールによって指定される種別に属するプログラム要素が前記分岐要素であると判定する
請求項２に記載のプログラムコード生成装置。
【請求項４】
前記順序決定部は、各分岐先グループが重要属性を有するプログラム要素を含むか否かに基づいて各分岐先グループの重要レベルを判定し、各分岐先グループの重要レベルに基づいて各分岐先グループの前記並び順を決定する
請求項１に記載のプログラムコード生成装置。
【請求項５】
前記順序決定部は、各分岐先グループの中のプログラム要素の構成に基づいて各分岐先グループの重要レベルを判定し、各分岐先グループの重要レベルに基づいて各分岐先グループの前記並び順を決定する
請求項１に記載のプログラムコード生成装置。
【請求項６】
前記順序決定部は、各分岐先グループの中の各プログラム要素の内容に基づいて各分岐先グループの重要レベルを判定し、各分岐先グループの重要レベルに基づいて各分岐先グループの前記並び順を決定する
請求項１に記載のプログラムコード生成装置。
【請求項７】
前記順序決定部は、重要レベルの昇順で前記並び順を決定する
請求項４から請求項６のいずれか１項に記載のプログラムコード生成装置。
【請求項８】
前記順序決定部は、重要レベルと順序との関係を指定する順序ルールに従って前記並び順を決定する
請求項４から請求項６のいずれか１項に記載のプログラムコード生成装置。
【請求項９】
前記順序決定部は、決定された前記並び順が前記分岐要素によって特定される並び順と異なる場合、決定された前記並び順に合致するように前記分岐要素を変更する
請求項４から請求項８のいずれか１項に記載のプログラムコード生成装置。
【請求項１０】
前記モデル図に基づいて前記プログラムコードを生成するコード生成部を備え、
前記プログラムコードが、各分岐先グループの前記並び順で、各分岐先グループに対応するコードを含む
請求項１から請求項９のいずれか１項に記載のプログラムコード生成装置。
【請求項１１】
前記プログラムコード生成装置は、決定された前記並び順が前記分岐要素によって特定される並び順と異なる場合に前記分岐要素が強調された状態で前記モデル図を表示する出力部を備える
請求項１から請求項１０のいずれか１項に記載のプログラムコード生成装置。
【請求項１２】
プログラムコードを生成するためのプログラムコード生成プログラムであって、
複数のプログラム要素とプログラム要素間の関係とを示すモデル図から、分岐のプログラム要素である分岐要素を特定する分岐要素特定処理と、
前記モデル図から、前記分岐要素の分岐先毎に分岐先を構成する一連のプログラム要素である分岐先グループを特定するグループ特定処理と、
前記プログラムコードの中での各分岐先グループの並び順を決定する順序決定処理と
をコンピュータに実行させるためのプログラムコード生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムコードを自動で生成するための技術に関するものである。
【背景技術】
【０００２】
事前に作成されたプログラム仕様に基づいてソースコードのようなプログラムコードを自動に生成する方法がある。
例えば、プログラム仕様を示すモデル図に基づいてプログラムコードを生成する方法がある。モデル図は、複数のブロックとブロック間を接続する接続線とで構成される。各ブロックには、処理手順の要素が定義される。具体的には、各ブロックには、ひとまとまりのデータ処理が定義される。モデル図において、プログラムが入力値を取得してからプログラムが出力値を出力するまでの処理手順、または、プログラムがイベントを受信してからプログラムがイベントに対応する処理を完了するまでの処理手順が記述される。また、モデル図には制御構造も記述される。【０００３】
特許文献１は、モデル図からプログラムコードを生成する技術を開示している。
特許文献１に開示された技術では、モデル図の各ブロックに事前に値が設定され、プログラムコードが生成される際に開発者がコード生成で重視する特性（コードサイズまたは速度など）を選択し、同じモデル図から特性の異なるプログラムコードが出力される。【０００４】
特許文献２および特許文献３には、モデル図を不適切なブロック図のパターンと比較し、モデル図が不適切なモデル図のパターンと一致する場合に、モデル図が不適切であることを通知する技術が開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００６−３０１９８９号公報
【特許文献２】特開２０１１−１３８８７号公報
【特許文献３】特開２０１６−５７７１５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ハードウェアに対する攻撃である故障注入攻撃が存在する。
故障注入攻撃は、ハードウェアに対して物理的な刺激等を与えて意図的な故障を発生させる攻撃である。故障注入攻撃によって、ソフトウェアで実現されるセキュリティ対策を回避する攻撃が可能である。具体的には、故障注入攻撃により、プログラム命令をスキップさせる。これにより、プログラムの制御フローが変更されるため、セキュリティ対策が回避される。
根本的に、故障注入攻撃をソフトウェアの実装だけで防ぐことはできない。
しかし、制御フローが変更されても最悪の事態に陥らないようにすることが必要である。【０００７】
一方、特許文献１、特許文献２および特許文献３のいずれに開示された技術も、モデル図が表す制御フローに関して考慮していない。そのため、これらの技術によって生成されたプログラムコードは、故障注入攻撃に対して脆弱であると考えられる。【０００８】
本発明は、故障注入攻撃に対して脆弱でないプログラムコードを生成することができるようにすることを目的とする。
【課題を解決するための手段】
【０００９】
本発明のプログラムコード生成装置は、
複数のプログラム要素とプログラム要素間の関係とを示すモデル図から、分岐のプログラム要素である分岐要素を特定する分岐要素特定部と、
前記モデル図から、前記分岐要素の分岐先毎に分岐先を構成する一連のプログラム要素である分岐先グループを特定するグループ特定部と、
プログラムコードの中での各分岐先グループの並び順を決定する順序決定部とを備える。
【発明の効果】
【００１０】
本発明によれば、プログラムコードの中での各分岐先グループの並び順を決定することができる。そのため、決定された並び順で各分岐先グループに対応するコードを含むプログラムコードを生成することができる。したがって、故障注入攻撃に対して脆弱でないプログラムコードを生成することが可能となる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１におけるプログラムコード生成装置１００の構成図。
【図２】実施の形態１におけるプログラムコード生成方法のフローチャート。
【図３】実施の形態１におけるモデル図２００の具体例を示す図。
【図４】実施の形態１における分岐要素ルール２１０の具体例を示す図。
【図５】実施の形態１における分岐先グループの特定（Ｓ１２０）のフローチャート。
【図６】実施の形態１における順序決定処理（Ｓ１４０）のフローチャート。
【図７】実施の形態１におけるコード生成処理（Ｓ１５０）のフローチャート。
【図８】実施の形態１におけるコード変換ルール２２０の構成図。
【図９】実施の形態１における一般変換ルール２２１の具体例を示す図。
【図１０】実施の形態１におけるブロック変換ルール２２２の具体例を示す図。
【図１１】実施の形態１における振る舞い変換ルール２２３の具体例を示す図。
【図１２】実施の形態１におけるヘッダファイル２３０の具体例を示す図。
【図１３】実施の形態１におけるソースファイル２４０の具体例を示す図。
【図１４】実施の形態１におけるプログラムコード生成装置１００のハードウェア構成図。
【発明を実施するための形態】
【００１２】
実施の形態および図面において、同じ要素および対応する要素には同じ符号を付している。同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
【００１３】
実施の形態１．
プログラムコードを自動で生成する形態について、図１から図１３に基づいて説明する。
【００１４】
＊＊＊構成の説明＊＊＊
図１に基づいて、プログラムコード生成装置１００の構成を説明する。
プログラムコード生成装置１００は、プロセッサ９０１とメモリ９０２と補助記憶装置９０３と入出力インタフェース９０４といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
【００１５】
プロセッサ９０１は、演算処理を行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）であり、他のハードウェアを制御する。例えば、プロセッサ９０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、またはＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
メモリ９０２は揮発性の記憶装置である。メモリ９０２は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ９０２はＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。メモリ９０２に記憶されたデータは必要に応じて補助記憶装置９０３に保存される。
補助記憶装置９０３は不揮発性の記憶装置である。例えば、補助記憶装置９０３は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、またはフラッシュメモリである。補助記憶装置９０３に記憶されたデータは必要に応じてメモリ９０２にロードされる。
入出力インタフェース９０４は入力装置および出力装置が接続されるポートである。例えば、入出力インタフェース９０４はＵＳＢ端子であり、入力装置はキーボードおよびマウスであり、出力装置はディスプレイである。ＵＳＢはＵｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓの略称である。
【００１６】
プログラムコード生成装置１００は、分岐要素特定部１１０とグループ特定部１２０と順序決定部１３０とコード生成部１４０といったソフトウェア要素を備える。ソフトウェア要素はソフトウェアで実現される要素である。
【００１７】
補助記憶装置９０３には、分岐要素特定部１１０とグループ特定部１２０と順序決定部１３０とコード生成部１４０としてコンピュータを機能させるためのプログラムコード生成プログラムが記憶されている。プログラムコード生成プログラムは、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
さらに、補助記憶装置９０３にはＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が記憶されている。ＯＳの少なくとも一部は、メモリ９０２にロードされて、プロセッサ９０１によって実行される。
つまり、プロセッサ９０１は、ＯＳを実行しながら、プログラムコード生成プログラムを実行する。
プログラムコード生成プログラムを実行して得られるデータは、メモリ９０２、補助記憶装置９０３、プロセッサ９０１内のレジスタまたはプロセッサ９０１内のキャッシュメモリといった記憶装置に記憶される。
【００１８】
補助記憶装置９０３はデータを記憶する記憶部１９１として機能する。但し、他の記憶装置が、補助記憶装置９０３の代わりに、又は、補助記憶装置９０３と共に、記憶部１９１として機能してもよい。
入出力インタフェース９０４は、データの入力を受け付ける受付部１９２として機能する。さらに、入出力インタフェース９０４は、データを出力する出力部１９３として機能する。
【００１９】
プログラムコード生成装置１００は、プロセッサ９０１を代替する複数のプロセッサを備えてもよい。複数のプロセッサは、プロセッサ９０１の役割を分担する。
【００２０】
プログラムコード生成プログラムは、磁気ディスク、光ディスクまたはフラッシュメモリ等の不揮発性の記憶媒体にコンピュータ読み取り可能に記憶することができる。不揮発性の記憶媒体は、一時的でない有形の媒体である。
【００２１】
＊＊＊動作の説明＊＊＊
プログラムコード生成装置１００の動作はプログラムコード生成方法に相当する。また、プログラムコード生成方法の手順はプログラムコード生成プログラムの手順に相当する。
【００２２】
図２に基づいて、プログラムコード生成方法を説明する。
ステップＳ１１０において、受付部１９２は、モデル図２００を受け付ける。そして、記憶部１９１は、受け付けられたモデル図２００を記憶部１９１に記憶する。
具体的には、利用者がプログラムコード生成装置１００にモデル図２００を入力し、受付部１９２は、プログラムコード生成装置１００に入力されたモデル図２００を受け付ける。そして、記憶部１９１は、受け付けられたモデル図２００を記憶する。
【００２３】
モデル図２００は、実行プログラムの仕様を表すデータであり、複数のプログラム要素とプログラム要素間の関係とを示す。
プログラム要素は、入出力データ、制御および処理など、実行プログラムを構成する要素である。
【００２４】
図３に、モデル図２００の具体例を示す。
モデル図２００は、複数の処理ブロック（Ｂ０〜Ｂ８）と、複数のデータブロック（Ｄ１〜Ｄ４）と、複数のピン（Ｐ１〜Ｐ６）とを含んでいる。さらに、モデル図２００は、処理ブロックとデータブロックとピンとを互いに接続する接続線を含んでいる。
処理ブロックは、データ処理または制御処理を表すプログラム要素である。
データブロックは、入出力データを表すプログラム要素である。
ピンは、入出力データの属性を表すプログラム要素である。
接続線は、プログラム要素間の関係を示す有向線である。図３において、接続線として矢印が用いられており、矢印の方向は手順またはデータの流れを表している。
【００２５】
各プログラム要素には、ＩＤ（Ｉｄｅｎｔｉｆｉｅｒ）および名称が設定される。ＩＤは、プログラムコード生成方法における処理で使用される。名称は、利用者に提示される。プログラム要素に付されている符号（Ｂ０〜Ｂ８、Ｄ１〜Ｄ４およびＰ１〜Ｐ６）は、プログラム要素のＩＤに相当する。
【００２６】
処理ブロック（Ｂ０〜Ｂ８）には、種別、内容、属性情報およびコメントなどの内部データが設定されている。
【００２７】
処理ブロックの種別は、データ処理または制御処理の種類を識別する。
例えば、開始、終了、振る舞い呼び出し、アクションおよびデシジョンなどの種別がある。
【００２８】
処理ブロックの種別において、開始は手順の開始を意味し、終了は手順の終了を意味する。
振る舞い呼び出しは、振る舞いの呼び出しを意味する。振る舞いは、予め定められた処理であり、１つ以上の命令によって実現される。具体的には、振る舞いは関数に相当する。
アクションは、データ処理の実行を意味する。
デシジョンは、制御処理の実行を意味する。
【００２９】
処理ブロックＢ０の種別は開始である。つまり、処理ブロックＢ０は、手順の開始を表している。
処理ブロックＢ０の属性情報は、処理ブロックＢ０から始まる手順が関数の手順であることを示している。
さらに、処理ブロックＢ０の属性情報は、「関数」、戻り値の型「ｉｎｔ」および引数「ｉｎｔ  ａｒｇｃ，  ｃｈａｒ  ＊ａｒｇｖ［］」を示している。「関数」は、処理ブロックＢ０から始まる手順が関数の手順であることを意味する。
【００３０】
処理ブロックＢ１の種別はアクションである。つまり、処理ブロックＢ１は、データ処理を表している。処理ブロックＢ１の内容は、具体的なデータ処理を示している。
【００３１】
処理ブロックＢ２の種別は振る舞い呼び出しである。処理ブロックＢ２の内容は、振る舞いの名称「ＡｕｔｈＵｓｅｒ」を示している。つまり、処理ブロックＢ２は、ＡｕｔｈＵｓｅｒという振る舞いの呼び出しを表している。
【００３２】
処理ブロックＢ３の種別はデシジョンである。処理ブロックＢ３の内容は、分岐条件「ｒｅｓｕｌｔ＝＝１」および２つの分岐先「Ｂ５」「Ｂ４」を示している。つまり、処理ブロックＢ３は、分岐制御を表している。分岐条件「ｒｅｓｕｌｔ＝＝１」を満たす場合の分岐先は処理ブロックＢ５であり、分岐条件「ｒｅｓｕｌｔ＝＝１」を満たさない場合の分岐先は処理ブロックＢ４である。
【００３３】
処理ブロックＢ４の種別はアクションである。つまり、処理ブロックＢ４は、データ処理を表している。処理ブロックＢ４の内容は、具体的なデータ処理を示している。
【００３４】
処理ブロックＢ５の種別はアクションである。つまり、処理ブロックＢ５は、データ処理を表している。処理ブロックＢ５の内容は、具体的なデータ処理を示している。
【００３５】
処理ブロックＢ６の種別は振る舞い呼び出しである。処理ブロックＢ６の内容は、振る舞いの名称「ＥｘｅｃＰｒｏｇｒａｍ」を示している。つまり、処理ブロックＢ６は、ＥｘｅｃＰｒｏｇｒａｍという振る舞いの呼び出しを表している。
処理ブロックＢ６の属性情報は、重要属性「重要処理」を示している。つまり、処理ブロックＢ６は、重要な処理ブロックである。重要な処理ブロックは、重要な処理を表すプログラム要素である。
【００３６】
処理ブロックＢ７の種別は終了である。つまり、処理ブロックＢ７は、手順の終了を表している。
処理ブロックＢ７の属性情報は、戻り値「１」を示している。
【００３７】
処理ブロックＢ８の種別は終了である。つまり、処理ブロックＢ８は、手順の終了を表している。
処理ブロックＢ８の属性情報は、戻り値「０」を示している。
【００３８】
データブロック（Ｄ１〜Ｄ４）には、データ名、つまり、変数名が設定されている。
データブロックＤ１は、処理ブロックＢ１から出力されて処理ブロックＢ２に入力されるデータ「ｕｓｅｒ＿ｉｄ」を表している。
データブロックＤ２は、処理ブロックＢ１から出力されて処理ブロックＢ２に入力されるデータ「ｐａｓｓｗｏｒｄ」を表している。
データブロックＤ３は、処理ブロックＢ２から出力されるデータ「ｒｅｓｕｌｔ」を表している。
データブロックＤ４は、処理ブロックＢ６に入力されるデータ「ｂａｃｋｕｐ．ｅｘｅ」を表している。
【００３９】
ピン（Ｐ１〜Ｐ６）には、データ属性が必要に応じて設定されている。図３において、「ａｒｇ」は引数を意味しており、「ｒｅｔ」は戻り値を意味している。
ピンＰ３は、データ「ｕｓｅｒ＿ｉｄ」が振る舞い「ＡｕｔｈＵｓｅｒ」に対する第１引数であることを表している。
ピンＰ４は、データ「ｐａｓｓｗｏｒｄ」が振る舞い「ＡｕｔｈＵｓｅｒ」に対する第２引数であることを表している。
ピンＰ５は、データ「ｒｅｓｕｌｔ」が振る舞い「ＡｕｔｈＵｓｅｒ」からの戻り値であることを表している。
ピンＰ６は、データ「ｂａｃｋｕｐ．ｅｘｅ」が振る舞い「ＥｘｅｃＰｒｏｇｒａｍ」に対する第１引数であることを表している。
【００４０】
モデル図２００は、階層的な構造を表現することが可能なデータ形式で記述される。
例えば、モデル図２００は、ＸＭＬまたはＪＳＯＮなどのデータ形式で記述される。ＸＭＬは、Ｅｘｔｅｎｓｉｂｌｅ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅの略称である。ＪＳＯＮは、ＪａｖａＳｃｒｉｐｔ  Ｏｂｊｅｃｔ  Ｎｏｔａｔｉｏｎの略称である。ＪａｖａＳｃｒｉｐｔは登録商標である。
【００４１】
図２に戻り、ステップＳ１２０を説明する。
ステップＳ１２０において、分岐要素特定部１１０は、モデル図２００から分岐要素を特定する。
分岐要素は、分岐のプログラム要素である。分岐のプログラム要素は、分岐制御を表すプログラム要素である。例えば、分岐要素は、Ｃ言語におけるｉｆ文およびｅｌｓｅ文に相当するプログラム要素である。
【００４２】
具体的には、分岐要素特定部１１０は、各プログラム要素の種別に基づいて分岐要素を特定する。
分岐要素特定部１１０は、分岐要素を特定するために分岐要素ルール２１０を用いる。分岐要素ルール２１０は、分岐要素の種別を指定するルールであり、記憶部１９１に予め記憶されている。
分岐要素特定部１１０は、分岐要素ルール２１０によって指定される種別に属するプログラム要素が分岐要素であると判定する。
【００４３】
図４に、分岐要素ルール２１０の具体例を示す。
分岐要素ルール２１０は、処理種別とルール値とのそれぞれの欄を有する。それぞれの欄は互いに対応付けられている。
処理種別の欄は、処理種別を示す。処理種別は、処理ブロックの種別である。
ルール値の欄は、処理種別が分岐種別であるか否かを示す。分岐種別は、分岐要素に該当する処理ブロックの種別である。ルール値「１」は処理種別が分岐種別であることを意味しており、ルール値「０」は処理種別が分岐種別でないことを意味している。
【００４４】
図４において、分岐種別は「デシジョン」である。
したがって、分岐要素特定部１１０は、種別「デシジョン」が設定されている処理ブロックが分岐要素であると判定する。
【００４５】
「アクション」または「振る舞い呼び出し」に属する処理ブロックの中で分岐処理が行われる場合がある。その場合、「アクション」に属する処理ブロックの記述を解釈するためにパーサが必要である。また、「振る舞い呼び出し」に属する処理ブロックから呼び出される振る舞いのモデル図が必要である。実施の形態において、パーサおよび振る舞いのモデル図について説明を省略する。
【００４６】
分岐要素ルール２１０は、自然言語とプログラミング言語とのいずれで記述されてもよい。
【００４７】
図２に戻り、ステップＳ１２０の説明を続ける。
グループ特定部１２０は、モデル図２００から、分岐要素の分岐先毎に分岐先グループを特定する。分岐先グループは、分岐先を構成する一連のプログラム要素である。
【００４８】
図５に基づいて、分岐先グループの特定（Ｓ１２０）を説明する。
ステップＳ１２１において、分岐要素特定部１１０は、モデル図２００から、未選択の処理ブロックを１つ選択する。
具体的には、分岐要素特定部１１０は、開始の処理ブロックから終了の処理ブロックまで接続線を辿りながら、処理ブロックを１つずつ選択する。
【００４９】
ステップＳ１２２において、分岐要素特定部１１０は、選択された処理ブロックが分岐要素であるか判定する。
【００５０】
具体的には、分岐要素特定部１１０は以下のように動作する。
まず、分岐要素特定部１１０は、選択された処理ブロックから種別を取得する。
次に、分岐要素特定部１１０は、取得された種別と同じ処理種別を分岐要素ルール２１０から選択する。
次に、分岐要素特定部１１０は、選択された処理種別に対応付けられたルール値を分岐要素ルール２１０から取得する。
そして、分岐要素特定部１１０は、取得されたルール値が１であるか判定する。
取得されたルール値が１である場合、選択された処理ブロックは分岐要素である。
【００５１】
選択された処理ブロックが分岐要素である場合、処理はステップＳ１２３に進む。
選択された処理ブロックが分岐要素でない場合、処理はステップＳ１２４に進む。
【００５２】
ステップＳ１２３において、グループ特定部１２０は、分岐要素の分岐先毎に分岐先グループを特定する。
具体的には、グループ特定部１２０は、分岐要素の分岐先毎に分岐先から接続線を辿りながら、一連のプログラム要素を特定する。
【００５３】
図３のモデル図２００において、分岐要素は処理ブロックＢ３である。
処理ブロックＢ３の分岐先は、処理ブロックＢ５および処理ブロックＢ４である。
処理ブロックＢ５から接続線を辿ることによって得られる一連のプログラム要素は、処理ブロックＢ５、処理ブロックＢ６および処理ブロックＢ８である。したがって、グループ特定部１２０は、処理ブロックＢ５と処理ブロックＢ６と処理ブロックＢ８との組を第１分岐先グループとして特定する。
処理ブロックＢ４から接続線を辿ることによって得られる一連のプログラム要素は、処理ブロックＢ４および処理ブロックＢ７である。したがって、グループ特定部１２０は、処理ブロックＢ４と処理ブロックＢ７との組を第２分岐先グループとして特定する。
【００５４】
図５に戻り、ステップＳ１２３の説明を続ける。
グループ特定部１２０は分岐情報を生成し、記憶部１９１は分岐情報を記憶する。
分岐情報は、分岐要素と各分岐先グループとを特定する情報である。具体的には、分岐要素を特定する情報は分岐要素のＩＤであり、分岐先グループを特定する情報は分岐先グループを構成する各プログラム要素のＩＤである。
【００５５】
次に、ステップＳ１２４を説明する。
ステップＳ１２４において、分岐要素特定部１１０は、未選択の処理ブロックが有るか判定する。
未選択の処理ブロックが有る場合、処理はステップＳ１２１に進む。
未選択の処理ブロックが無い場合、分岐先グループの特定（Ｓ１２０）は終了する。
【００５６】
分岐先グループの特定（Ｓ１２０）により、分岐要素毎に分岐情報が生成され、各分岐情報が記憶部１９１に記憶される。
【００５７】
図２に戻り、ステップＳ１３０から説明を続ける。
ステップＳ１３０において、順序決定部１３０は、モデル図２００から分岐先グループが特定されたか判定する。
具体的には、順序決定部１３０は、少なくとも１つの分岐情報が記憶部１９１に記憶されているか判定する。少なくとも１つの分岐情報が記憶部１９１に記憶されている場合、順序決定部１３０は、モデル図２００から分岐先グループが特定されたと判定する。
モデル図２００から分岐先グループが特定された場合、処理はステップＳ１４０に進む。
モデル図２００から分岐先グループが特定されなかった場合、処理はステップＳ１５０に進む。
【００５８】
ステップＳ１４０において、順序決定部１３０は、プログラムコードの中での各分岐先グループの並び順を決定する。
具体的には、順序決定部１３０は、各分岐先グループが重要属性を有するプログラム要素を含むか否かに基づいて各分岐先グループの重要レベルを判定する。そして、順序決定部１３０は、各分岐先グループの重要レベルに基づいて各分岐先グループの並び順を決定する。
【００５９】
また、順序決定部１３０は、決定された並び順が分岐要素によって特定される並び順と異なる場合、決定された並び順に合致するように分岐要素を変更する。
【００６０】
図６に基づいて、順序決定処理（Ｓ１４０）の手順を説明する。
ステップＳ１４１において、順序決定部１３０は、未選択の分岐情報を１つ選択する。
ステップＳ１４２からステップＳ１４８までの処理は、ステップＳ１４１で選択された分岐情報に対して実行される。
【００６１】
ステップＳ１４２において、順序決定部１３０は、選択された分岐情報から、未選択の分岐先グループを１つ選択する。
ステップＳ１４３およびステップＳ１４４は、ステップＳ１４２で選択された分岐先グループに対して実行される。
【００６２】
ステップＳ１４３において、順序決定部１３０は、選択された分岐先グループの重要レベルを判定する。
【００６３】
具体的には、順序決定部１３０は、分岐先グループの重要レベルを以下のように判定する。
順序決定部１３０は、重要要素が分岐先グループに含まれるか判定する。重要要素は、重要属性が設定されているプログラム要素である。
重要要素が分岐先グループに含まれる場合、順序決定部１３０は、分岐先グループの要素数を数える。分岐先グループの要素数は、分岐先グループに含まれるプログラム要素の数である。具体的には、分岐先グループの要素数は、分岐先グループに含まれる処理ブロックの数である。分岐先グループの要素数が、分岐先グループの重要レベルとして用いられる。図３において、処理ブロックＢ５、処理ブロックＢ６および処理ブロックＢ８が第１分岐先グループを構成している。第１分岐先グループは、重要属性「重要処理」が設定されている処理ブロックＢ６を含めて、３つの処理ブロックを含んでいる。したがって、第１分岐先グループの重要レベルは「３」である。
重要要素が分岐先グループに含まれない場合、順序決定部１３０は、分岐先グループの重要レベルを最低レベルにする。具体的には、順序決定部１３０は、分岐先グループの重要レベルを「０」にする。図３において、処理ブロックＢ４および処理ブロックＢ７が第２分岐先グループを構成している。第２分岐先グループは、重要属性「重要処理」が設定されている処理ブロックを含んでいない。したがって、第２分岐先グループの重要レベルは「０」である。
【００６４】
ステップＳ１４４において、順序決定部１３０は、未選択の分岐先グループが有るか判定する。
未選択の分岐先グループが有る場合、処理はステップＳ１４２に進む。
未選択の分岐先グループが無い場合、処理はステップＳ１４５に進む。
【００６５】
ステップＳ１４５において、順序決定部１３０は、各分岐先グループの重要レベルを互いに比較することによって、各分岐先グループの重要レベルが異なるか判定する。
但し、順序決定部１３０は、重要要素を含んでいない分岐先グループを除外する。つまり、順序決定部１３０は、重要要素を含んでいる各分岐先グループを対象にして比較および判定を行う。
各分岐先グループの重要レベルが異なる場合、つまり、同じ重要レベルを有する２つ以上の分岐先グループが存在しない場合、処理はステップＳ１４６に進む。
各分岐先グループの重要レベルが異ならない場合、つまり、同じ重要レベルを有する２つ以上の分岐先グループが存在する場合、処理はステップＳ１４８に進む。
【００６６】
ステップＳ１４６において、順序決定部１３０は、各分岐先グループの重要レベルに基づいて、各分岐先グループの並び順を決定する。
具体的には、順序決定部１３０は、重要レベルの昇順で並び順を決定する。例えば、第１分岐先グループの重要レベルが「３」であり、第２分岐先グループの重要レベルが「０」である場合、これらの分岐先グループの並び順は「第２分岐先グループ→第１分岐先グループ」の順である。
そして、順序決定部１３０は、各分岐先グループの並び順を分岐情報に登録する。
【００６７】
ステップＳ１４７において、順序決定部１３０は、決定された並び順が分岐要素によって特定される並び順と異なる場合、決定された並び順に合致するように分岐要素を変更する。
具体的には、順序決定部１３０は以下のように動作する。
まず、順序決定部１３０は、分岐要素の内容が示す分岐条件と２つ以上の分岐先とに基づいて、各分岐先の並び順を判定する。
次に、順序決定部１３０は、各分岐先の並び順を分岐先グループの並び順と比較する。
各分岐先の並び順が分岐先グループの並び順と異なる場合、順序決定部１３０は、分岐要素の内容が示す分岐条件を変更する。
図３のモデル図２００において、分岐要素は処理ブロックＢ３である。処理ブロックＢ３の分岐条件は「ｒｅｓｕｌｔ＝＝１」であり、分岐条件を満たす場合の分岐先は処理ブロックＢ５であり、分岐条件を満たさない場合の分岐先は処理ブロックＢ４である。この場合、分岐先の並び順は「Ｂ５→Ｂ４」である。この並び順を「Ｂ４→Ｂ５」に変更したい場合、順序決定部１３０は、分岐条件「ｒｅｓｕｌｔ＝＝１」を「ｒｅｓｕｌｔ！＝１」に変更する。
【００６８】
ステップＳ１４８において、順序決定部１３０はエラーメッセージを生成し、出力部１９３はエラーメッセージをディスプレイに表示する。
一つの分岐要素に対して同じ重要レベルを有する２つ以上の分岐先グループが存在する場合、各分岐先グループを適切な順序で並べることができない。そのため、エラーメッセージが表示される。
ステップＳ１４７の後、順序決定処理（Ｓ１４０）は終了する。さらに、順序決定処理（Ｓ１４０）の後の処理が行われない。つまり、プログラムコードが生成されない。
【００６９】
ステップＳ１４９において、順序決定部１３０は、未選択の分岐情報が有るか判定する。
未選択の分岐情報が有る場合、処理はステップＳ１４１に進む。
未選択の分岐情報が無い場合、順序決定処理（Ｓ１４０）は終了する。
【００７０】
図２に戻り、ステップＳ１５０を説明する。
ステップＳ１５０において、コード生成部１４０は、モデル図２００に基づいて、プログラムコードを生成する。
プログラムコードは、各分岐先グループの並び順で、各分岐先グループに対応するコードを含む。
【００７１】
図７に基づいて、コード生成処理（Ｓ１５０）を説明する。
ステップＳ１５１において、コード生成部１４０は、モデル図２００とコード変換ルール２２０と分岐情報とを記憶部１９１から読み込む。
コード変換ルール２２０は、モデル図２００をプログラムコードに変換するためのルールであり、記憶部１９１に予め記憶されている。
【００７２】
図８に基づいて、コード変換ルール２２０の構成を説明する。
コード変換ルール２２０は、一般変換ルール２２１とブロック変換ルール２２２と振る舞い変換ルール２２３とを含んでいる。
一般変換ルール２２１は、モデル図２００の表現に関わらない一般的な変換ルールである。
ブロック変換ルール２２２は、モデル図２００の表現に関わる変換ルールである。
振る舞い変換ルール２２３は、振る舞いに対応する関数に関わる変換ルールである。
【００７３】
図９に、一般変換ルール２２１の具体例を示す。
一般変換ルール２２１は、項目と変換ルールとのそれぞれの欄を有する。それぞれの欄は互いに対応付けられている。
項目の欄は、プログラム要素を指定している。
変換ルールの欄は、プログラム要素の名称を指定している。
例えば、一般変換ルール２２１は、モデル図のファイル名（拡張子は除く）を関数名として用いることを指定している。
【００７４】
図１０に、ブロック変換ルール２２２の具体例を示す。
ブロック変換ルール２２２は、種別と変換ルールとのそれぞれの欄を有する。それぞれの欄は互いに対応付けられている。
種別の欄は、処理ブロックの種別を指定している。
変換ルールの欄は、処理ブロックに対応するコードを記述する方法を指定している。
例えば、ブロック変換ルール２２２は、種別「デシジョン」を有する処理ブロックにおいて内容が示す分岐条件を条件文にすることを指定している。具体的には、分岐条件の記述がｉｆ文またはｗｈｉｌｅ文に設定される条件文になる。
【００７５】
図１１に、振る舞い変換ルール２２３の具体例を示す。
振る舞い変換ルール２２３は、名称とヘッダと戻り値と引数とのそれぞれの欄を有する。それぞれの欄は互いに対応付けられている。
名称の欄は、振る舞いの名称を示している。
ヘッダの欄は、振る舞いに対応する関数が定義されているヘッダを指定している。
戻り値の欄は、振る舞いに対応する関数の戻り値を指定している。
引数の欄は、振る舞いに対応する関数の引数を指定している。
【００７６】
一般変換ルール２２１、ブロック変換ルール２２２および振る舞い変換ルール２２３の内容は、自然言語とプログラミング言語とのいずれで記述してもよい。
【００７７】
図７に戻り、ステップＳ１５２を説明する。
ステップＳ１５２において、コード生成部１４０は、モデル図２００とコード変換ルール２２０と分岐情報とに基づいて、プログラムコードを生成する。プログラムコードは、プログラミング言語を用いて記述される。記憶部１９１は、プログラムコードを記憶する。
具体的には、コード生成部１４０は以下のように動作する。
まず、コード生成部１４０は、一般変換ルール２２１（図９参照）に従って、ヘッダファイルとソースファイルとを生成する。ヘッダファイル名は、モデル図２００のファイル名（拡張子を除く）に拡張子「．ｈ」を付加して得られる名称である。ソースファイル名は、モデル図２００のファイル名（拡張子を除く）に拡張子「．ｃ」を付加して得られる名称である。モデル図２００のファイル名が「ＥｘｅｃＢａｃｋｕｐ．ｍｄｌ」である場合、ヘッダファイル名は「ＥｘｅｃＢａｃｋｕｐ．ｈ」であり、ソースファイル名は「ＥｘｅｃＢａｃｋｕｐ．ｃ」である。また、ソースファイルの中に記述される関数の名称は「ＥｘｅｃＢａｃｋｕｐ」である。
次に、コード生成部１４０は、ヘッダファイルの中にプロトタイプ宣言などを記述する。
そして、コード生成部１４０は、モデル図２００に基づいて、ソースファイルの中にプログラムコードを記述する。また、コード生成部１４０は、必要に応じて、ブロック変換ルール２２２、振る舞い変換ルール２２３および分岐情報を参照する。
【００７８】
図１２に、ヘッダファイル２３０の具体例を示す。
ヘッダファイル２３０には、プログラムコード２３１が記述されている。
プログラムコード２３１は、モデル図２００に対応する関数に関してプロトタイプ宣言などを定義するためのコードである。プログラムコード２３１は、Ｃ言語で記述されている。
【００７９】
図１３に、ソースファイル２４０の具体例を示す。
ソースファイル２４０には、プログラムコード２４１が記述されている。
プログラムコード２４１は、モデル図２００に対応する関数のコードである。プログラムコード２４１は、Ｃ言語で記述されている。
破線で囲われた部分は、分岐要素および各分岐先グループに対応するコードである。モデル図２００（図３参照）における分岐条件「ｒｅｓｕｌｔ＝＝１」は、条件文「ｒｅｓｕｌｔ！＝１」に変更されている。そして、第２分岐先グループ（Ｂ４およびＢ７）に対応するコードの後ろに、第１分岐先グループ（Ｂ５、Ｂ６およびＢ８）に対するコードが記述されている。
【００８０】
＊＊＊実施の形態１の効果＊＊＊
プログラムコード生成装置１００は、モデル図２００から分岐先グループを特定し、特定した分岐先グループの中でより重要な分岐先グループが後方に位置するようにプログラムコードを生成する。そのため、制御構造に関する命令をスキップさせる故障注入攻撃による悪影響を受け難いプログラムコードが生成される。
したがって、プログラムコードが故障注入攻撃による悪影響を受けやすいかを調査するための労力及び時間を削減することができる。また、故障注入攻撃による悪影響を受けやすい箇所を修正するための労力及び時間を削減することができる。
【００８１】
実施の形態２．
各分岐先グループの並び順を重要レベルの低い順ではなく所定の順序ルールに従って決定する形態について、主に実施の形態１と異なる点を説明する。
【００８２】
＊＊＊構成の説明＊＊＊
プログラムコード生成装置１００の構成は、実施の形態１における構成（図１参照）と同じである。
【００８３】
＊＊＊動作の説明＊＊＊
プログラムコード生成方法における処理の流れは、実施の形態１における処理の流れ（図２参照）と同じである。
但し、ステップＳ１４０において各分岐先グループの並び順を決定する方法は、実施の形態１における方法と異なる。
【００８４】
図６に基づいて、順序決定処理（Ｓ１４０）を説明する。
順序決定処理（Ｓ１４０）の流れは、実施の形態１で説明した通りである。
但し、ステップＳ１４６において各分岐先グループの並び順を決定する方法は、実施の形態１における方法と異なる。
【００８５】
ステップＳ１４６において、順序決定部１３０は、各分岐先グループの並び順を順序ルールに従って決定する。順序ルールは、重要レベルと順序との関係を示す。
プログラムの開発環境またはプログラムの実行環境に応じて複数の順序ルールが存在し、複数の順序ルールが記憶部１９１に予め記憶されている。
例えば、コンパイラの種類毎に順序ルールが存在する。この場合、順序決定部１３０は、利用者から指定されたコンパイラに対応する順序ルールを選択し、選択した順序ルールに従って各分岐先グループの並び順を決定する。
例えば、アーキテクチャの種類毎に順序ルールが存在する。この場合、順序決定部１３０は、利用者から指定されたアーキテクチャに対応する順序ルールを選択し、選択した順序ルールに従って各分岐先グループの並び順を決定する。
【００８６】
＊＊＊実施の形態２の効果＊＊＊
プログラムコード生成装置１００は、各分岐先グループの並び順をプログラムの開発環境またはプログラムの実行環境に応じて適切に決定する。
そのため、制御構造に関する命令をスキップさせる故障注入攻撃による悪影響を受け難いプログラムコードが生成される。
したがって、プログラムコードが故障注入攻撃による悪影響を受けやすいかを調査するための労力及び時間を削減することができる。また、故障注入攻撃による悪影響を受けやすい箇所を修正するための労力及び時間を削減することができる。
【００８７】
実施の形態３．
各分岐先グループの重要レベルを重要要素の有無に基づいて判定するのではなく、各分岐先グループの重要レベルを各分岐先グループの中のプログラム要素の構成に基づいて判定する形態について、主に実施の形態１と異なる点を説明する。
【００８８】
＊＊＊構成の説明＊＊＊
プログラムコード生成装置１００の構成は、実施の形態１における構成（図１参照）と同じである。
【００８９】
＊＊＊動作の説明＊＊＊
プログラムコード生成方法における処理の流れは、実施の形態１における処理の流れ（図２参照）と同じである。
但し、ステップＳ１４０において各分岐先グループの並び順を決定する方法は、実施の形態１における方法と異なる。
【００９０】
図６に基づいて、順序決定処理（Ｓ１４０）を説明する。
順序決定処理（Ｓ１４０）の流れは、実施の形態１で説明した通りである。
但し、ステップＳ１４３において各分岐先グループの重要レベルを判定する方法は、実施の形態１における方法と異なる。
【００９１】
ステップＳ１４３において、順序決定部１３０は、分岐先グループの中のプログラム要素の構成に基づいて、分岐先グループの重要レベルを判定する。
例えば、順序決定部１３０は、分岐先グループの重要レベルを、分岐先グループに含まれるプログラム要素の数に基づいて判定する。プログラム要素の数が多いほど重要レベルは高い。
例えば、順序決定部１３０は、分岐先グループに含まれる各プログラム要素に基づいて構成の複雑度を判定し、構成の複雑度に基づいて分岐先グループの重要レベルを判定する。複雑度が高いほど重要レベルは高い。
【００９２】
＊＊＊実施の形態３の効果＊＊＊
モデル図２００の作成者は、モデル図２００に含まれるプログラム要素の中から重要要素を選んで重要要素に重要属性を設定する必要がない。
したがって、モデル図２００を作成するための労力および時間を削減することができる。
【００９３】
実施の形態４．
各分岐先グループの中の各プログラム要素の内容に基づいて各分岐先グループの重要レベルを判定する形態について、主に実施の形態１と異なる点を説明する。
【００９４】
＊＊＊構成の説明＊＊＊
プログラムコード生成装置１００の構成は、実施の形態１における構成（図１参照）と同じである。
【００９５】
＊＊＊動作の説明＊＊＊
プログラムコード生成方法における処理の流れは、実施の形態１における処理の流れ（図２参照）と同じである。
但し、ステップＳ１４０において各分岐先グループの並び順を決定する方法は、実施の形態１における方法と異なる。
【００９６】
図６に基づいて、順序決定処理（Ｓ１４０）を説明する。
順序決定処理（Ｓ１４０）の流れは、実施の形態１で説明した通りである。
但し、ステップＳ１４３において各分岐先グループの重要レベルを判定する方法は、実施の形態１における方法と異なる。
【００９７】
ステップＳ１４３において、順序決定部１３０は、分岐先グループの中の各プログラム要素の内容に基づいて、分岐先グループの重要レベルを判定する。
具体的には、重要要素を特定する重要情報が予め記憶部１９１に記憶される。そして、順序決定部１３０は、重要情報によって特定される重要要素が分岐先グループに含まれるか否かに基づいて、分岐先グループの重要レベルを判定する。重要要素を含む分岐先グループの重要レベルおよび重要要素を含まない分岐先グループの重要レベルを判定する方法は、実施の形態１における方法と同じである。
重要情報が「ＥｘｅｃＰｒｏｇｒａｍ」である場合、図３のモデル図２００において重要要素は処理ブロックＢ６である。したがって、第１分岐先グループ（Ｂ５、Ｂ６およびＢ８）は重要要素を含む。一方、第２分岐先グループ（Ｂ４およびＢ７）は重要要素を含まない。
【００９８】
＊＊＊実施の形態４の効果＊＊＊
モデル図２００の作成者は、モデル図２００に含まれるプログラム要素の中から重要要素を選んで重要要素に重要属性を設定する必要がない。
したがって、モデル図２００を作成するための労力および時間を削減することができる。
【００９９】
実施の形態５．
モデル図２００の中で並び順が変更される箇所を利用者に知らせる形態について、主に実施の形態１と異なる点を説明する。
【０１００】
＊＊＊構成の説明＊＊＊
プログラムコード生成装置１００の構成は、実施の形態１における構成（図１参照）と同じである。
【０１０１】
＊＊＊動作の説明＊＊＊
プログラムコード生成方法における処理の流れは、実施の形態１における処理の流れ（図２参照）と同じである。
但し、ステップＳ１４０において、モデル図２００の中で並び順が変更される箇所が利用者に知らされる。
【０１０２】
図６に基づいて、順序決定処理（Ｓ１４０）を説明する。
順序決定処理（Ｓ１４０）の流れは、実施の形態１で説明した通りである。
但し、ステップＳ１４７において、モデル図２００の中で並び順が変更される箇所が利用者に知らされる。
【０１０３】
ステップＳ１４７において、順序決定部１３０は、決定された並び順が分岐要素によって特定される並び順と異なる場合、決定された並び順に合致するように分岐要素を変更する。分岐要素を変更する方法は、実施の形態１で説明した通りである。
さらに、決定された並び順が分岐要素によって特定される並び順と異なる場合、順序決定部１３０は、モデル図２００を分岐要素が強調された状態に変更する。そして、出力部１９３は、分岐要素が強調された状態でモデル図２００をディスプレイに表示する。
【０１０４】
＊＊＊実施の形態５の効果＊＊＊
利用者は、プログラムコードを調査することなく、並び順が変更された箇所を知ることができる。
【０１０５】
＊＊＊実施の形態の補足＊＊＊
図１４に基づいて、プログラムコード生成装置１００のハードウェア構成を説明する。
プログラムコード生成装置１００は処理回路９９０を備える。
処理回路９９０は、分岐要素特定部１１０とグループ特定部１２０と順序決定部１３０とコード生成部１４０とを実現するハードウェアである。
処理回路９９０は、専用のハードウェアであってもよいし、メモリ９０２に格納されるプログラムを実行するプロセッサ９０１であってもよい。
【０１０６】
処理回路９９０が専用のハードウェアである場合、処理回路９９０は、例えば、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ＡＳＩＣ、ＦＰＧＡまたはこれらの組み合わせである。
ＡＳＩＣはＡｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略称であり、ＦＰＧＡはＦｉｅｌｄ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略称である。
プログラムコード生成装置１００は、処理回路９９０を代替する複数の処理回路を備えてもよい。複数の処理回路は、処理回路９９０の役割を分担する。
【０１０７】
プログラムコード生成装置１００の機能について、一部が専用のハードウェアで実現されて、残りがソフトウェアまたはファームウェアで実現されてもよい。
【０１０８】
このように、処理回路９９０はハードウェア、ソフトウェア、ファームウェアまたはこれらの組み合わせで実現することができる。
【０１０９】
実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
【符号の説明】
【０１１０】
１００  プログラムコード生成装置、１１０  分岐要素特定部、１２０  グループ特定部、１３０  順序決定部、１４０  コード生成部、１９１  記憶部、１９２  受付部、１９３  出力部、２００  モデル図、２１０  分岐要素ルール、２２０  コード変換ルール、２２１  一般変換ルール、２２２  ブロック変換ルール、２２３  振る舞い変換ルール、２３０  ヘッダファイル、２３１  プログラムコード、２４０  ソースファイル、９０１  プロセッサ、９０２  メモリ、９０３  補助記憶装置、９０４  入出力インタフェース、９９０  処理回路。
【図１】
0006602511.tif 000002
【図２】
0006602511.tif 000003
【図３】
0006602511.tif 000004
【図４】
0006602511.tif 000005
【図５】
0006602511.tif 000006
【図６】
0006602511.tif 000007
【図７】
0006602511.tif 000008
【図８】
0006602511.tif 000009
【図９】
0006602511.tif 000010
【図１０】
0006602511.tif 000011
【図１１】
0006602511.tif 000012
【図１２】
0006602511.tif 000013
【図１３】
0006602511.tif 000014
【図１４】
0006602511.tif 000015