(57)【要約】【課題】プログラムを解析する際のメモリ消費を抑える技術を提供する。【解決手段】解析対象であるプログラムのコードを取得し、取得した前記コードが配列要素の値を設定する命令であった場合に、当該値を設定する配列要素の配列を示す数列である設定数列を前記命令に基づいて生成し、取得した前記コードが配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定する。【選択図】図１
2011113126.tif 000002
【特許請求の範囲】
【請求項１】
解析対象であるプログラムのコードを取得する取得部と、
取得した前記コードが配列要素の値を設定する命令であった場合に、当該値を設定する配列要素の配列を示す数列である設定数列を前記命令に基づいて生成する数列生成部と、
取得した前記コードが配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定する判定部と、
を備える解析装置。
【請求項２】
取得した前記コードが配列要素を連続して参照する命令であった場合に、前記数列生成部が、当該連続して参照する配列要素を示す数列である参照数列を前記命令に基づいて生成し、
前記判定部が、前記設定数列と前記参照数列を比較してバグの存在を判定する請求項１に記載の解析装置。
【請求項３】
解析対象であるプログラムのコードを取得するステップと、
取得した前記コードが配列要素の値を設定する命令であった場合に、当該値を設定する配列要素の配列を示す数列である設定数列を前記命令に基づいて生成するステップと、
取得した前記コードが配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定するステップと、
をコンピュータが実行する解析方法。
【請求項４】
取得した前記コードが配列要素を連続して参照する命令であった場合に、当該連続して参照する配列要素を示す数列である参照数列を前記命令に基づいて生成するステップを更に実行し、
前記バグを判定するステップが、前記設定数列と前記参照数列を比較することにより、前記バグの存在を判定する請求項３に記載の解析方法。
【請求項５】
解析対象であるプログラムのコードを取得するステップと、
取得した前記コードが配列要素の値を設定する命令であった場合に、当該値を設定する配列要素の配列を示す数列である設定数列を前記命令に基づいて生成するステップと、
取得した前記コードが配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定するステップと、
をコンピュータに実行するための解析プログラム。
【請求項６】
取得した前記コードが配列要素を連続して参照する命令であった場合に、当該連続して参照する配列要素を示す数列である参照数列を前記命令に基づいて生成するステップを更に実行し、
前記バグを判定するステップが、前記設定数列と前記参照数列を比較することにより、前記バグの存在を判定する請求項５に記載の解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本件は、プログラムを解析する技術に関する。
【背景技術】
【０００２】
コンピュータプログラムのバグの一つとして、変数を初期化しないまま参照することがあげられる。
【０００３】
0001:   int a,b;
0002:   a=10;
0003:   printf("%d,%d\n",a,b);
上記プログラムの場合、3行目で1度も値を設定していない、すなわち初期化していない変数"b"がプリントされている。このように初期化していない変数を参照した場合、3行目の出力は、不定となり、プログラムのバグの原因となる。
【０００４】
このバグを検出するために従来の解析装置は、初期化したかどうかのフラグを変数ごとに設け、変数を初期化した場合に当該フラグを初期化済みとし、変数を参照する時点で該当の変数が初期化済であるかどうかをフラグに基づいて判定していた。
【０００５】
0001:   int a,b;               ←  a:未、b:未
0002:   a=10;                  ←  a:済、b:未
0003:   printf("%d,%d\n",a,b); ←  この時点で b:未 のまま参照しているためバグ
上記プログラムの静的解析の場合、従来の解析装置は、コードを取得し、１行目のコードが" int a,b "であるので、変数ａ，ｂについて初期化済みでないことを示すフラグをメモリに保持する。次に解析装置は、２行目のコードが" a=10"であり、変数ａに値を代入しているので、変数ａのフラグを初期化済とする。そして解析装置は、３行目のコードが" printf("%d,%d\n",a,b)"であり、変数ａ，ｂが参照されているので、変数ａ，ｂのフラグを確認し、初期化済みか否かによってバグの有無を判定する。即ち、変数ｂのフラグが初期化済みでなく、解析装置は、未設定の変数を参照するバグが存在すると判断する。
【０００６】
また、先行技術としては、以下の特許文献が存在する。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０００−３０５８０６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
変数が配列である場合にも、初期化されずに参照される変数は、バグの原因となる。
【０００９】
0001:   int x[100],i;
0002:   for(i=1;i<100;i++) { x[i]=1; }
0003:   for(i=0;i<100;i++) { printf("%d\n",x[i]); }
上記プログラムの場合、２行目でループの制御変数"i"の初期値が1であるため、x[0]が初期化されないまま３行目で参照されている。
【００１０】
このバグを従来の解析装置で検出しようとすると、配列変数xの個々の要素について初期済みフラグが必要となる。このため、配列の要素数が膨大であった場合、従来の解析装
置では、過大なメモリ領域が必要となり、メモリ領域不足および操作上のパフォーマンスの低下といった問題が発生する。
【００１１】
また、初期化したかどうかのフラグに代えて、初期化済みである要素の要素番号を保存しておく方法もあるが、メモリ領域および操作上のパフォーマンスに影響があることに変わりはない。
【００１２】
そこで、開示の一実施形態は、プログラムを解析する際のメモリ消費を抑える技術を提供する。
【課題を解決するための手段】
【００１３】
開示の一実施形態としての解析装置は、
解析対象であるプログラムのコードを取得する取得部と、
取得した前記コードが配列要素の値を設定する命令であった場合に、当該値を設定する配列要素の配列を示す数列である設定数列を前記命令に基づいて生成する数列生成部と、
取得した前記コードが配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定する判定部と、
を備える。
【発明の効果】
【００１４】
開示の一実施形態は、プログラムを解析する際のメモリ消費を抑える技術を提供できる。
【図面の簡単な説明】
【００１５】
【図１】本発明のシステム構成図
【図２】サンプルプログラム１を示す図
【図３】サンプルプログラム１に対するプログラムミス指摘メッセージ表示画面例
【図４】サンプルプログラム１に対する配列使用状況レポート表示画面例
【図５】サンプルプログラム１に対する配列設定参照情報のデータ構成図（その１）
【図６】サンプルプログラム１に対する配列設定参照情報のデータ構成図（その２）
【図７】サンプルプログラム１に対する配列設定参照情報のデータ構成図（その３）
【図８】サンプルプログラム２を示す図
【図９】サンプルプログラム２に対する配列設定参照情報のデータ構成図（その１）
【図１０】サンプルプログラム２に対する配列設定参照情報のデータ構成図（その２）
【図１１】サンプルプログラム２に対する配列設定参照情報のデータ構成図（その３）
【図１２】サンプルプログラム３を示す図
【図１３】サンプルプログラム３に対するプログラムミス指摘メッセージ表示画面のイメージ
【図１４】サンプルプログラム３に対する配列使用状況レポート表示画面例
【図１５】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その１）
【図１６】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その２）
【図１７】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その３）
【図１８】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その４）
【図１９】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その５）
【図２０】サンプルプログラム３に対する配列設定参照情報のデータ構成図（その６）
【図２１】配列要素静的解析手順説明フロー図
【図２２】プログラムミス指摘メッセージ表示および配列使用状況レポート表示フロー図
【図２３】配列要素参照コードから有限等差数列を作成する手順の説明フロー図
【図２４】配列要素参照コードから有限等差数列を作成する手順の説明サンプル図
【図２５】設定数列をマージする手順を説明したフロー図
【図２６】数列を連結する手順を説明したフロー図
【図２７】数列を連結する手順を示したサンプル図
【図２８】数列を融合する手順を説明したフロー図
【図２９】数列を融合する手順を示したサンプル図
【図３０】参照数列のマッチング判定をする手順を説明したフロー図
【図３１】参照数列のマッチング判定をする手順を示したサンプル図
【発明を実施するための形態】
【００１６】
以下、図面を参照して本発明を実施するための形態について説明する。以下の実施の形態の構成は例示であり、本発明は実施の形態の構成に限定されない。
【００１７】
＜装置構成の説明＞
本実施形態の解析装置は、コンピュータプログラムを静的解析して、配列要素を初期化せずに参照している箇所を検出する。図１は本発明のシステム構成図である。
【００１８】
解析装置１は、図１に示すように、データの演算処理を行うデータ処理部１１と、他の装置との通信を行う通信処理部１２、演算処理の為のデータやソフトウェアを記憶する記憶部（ハードディスク）１３、入力部１４、出力部１５を備えたコンピュータである。
【００１９】
通信処理部１２は、ネットワークやケーブル等の回線を介して他のコンピュータとの通信を行う。
【００２０】
記憶部１３は、オペレーティングシステム（ＯＳ）やアプリケーションプログラム（解析プログラム）を記憶している。
【００２１】
入力部１４は、データ処理部１１へ情報を入力する手段であり、キーボードやポインティングデバイスといったユーザインタフェースや、メモリカードやＣＤ−ＲＯＭ等の記憶媒体から情報を読み取るデバイスを有する。
【００２２】
出力部１５は、データ処理部１１の処理結果を出力する手段であり、処理結果等を表示する表示装置や、データを印刷するプリンターを有する。
【００２３】
データ処理部１１は、ＣＰＵやメインメモリを有し、前記ＯＳやアプリケーションプログラムを記憶部１３からメインメモリに読み出し、読み出したＯＳやアプリケーションプログラムに従ってＣＰＵが演算処理を行う。この演算処理により、ＣＰＵは、取得部２１や、数列生成部２２、判定部２３、出力制御部２４としても機能する。
【００２４】
データ処理部１１のＣＰＵ、即ち取得部２１は、解析対象であるプログラムのコードを取得する。例えば、解析対象であるプログラムが記憶部１３に記憶されている場合、取得部２１は記憶部１３から当該プログラムのコードを順次読み出し、メインメモリに展開する。また、解析対象であるプログラムがＣＤやＤＶＤ等の記憶媒体に記憶されている場合
、取得部２１は入力部１４に挿入された記憶媒体から当該プログラムのコードを読み出しても良い。更に取得部２１は、通信処理部１２を介して他のコンピュータから解析対象であるプログラムのコードを取得（受信）しても良い。
【００２５】
取得部２１は、解析対象であるプログラムのコードを実行する順にコードを取得しても良い。例えば取得部２１は、下記プログラムコードを行番号(0001行〜0003行)の順にメインメモリ上に読み出す。
【００２６】
0001:   int x[100],i;
0002:   for(i=1;i<100;i++) { x[i]=1; }
0003:   for(i=0;i<100;i++) { printf("%d\n",x[i]); }
また、コード中にfor, if, while, gotoなどの分岐命令がある場合、取得部２１はこの分岐命令に従ってコードを取得する。ここで複数の分岐先が存在する場合、取得部２１は、あらゆる分岐先へ分岐した場合の順序でコードを取得する。このように取得部２１が、解析対象であるプログラムのコードを実行する順にコードを取得することで、配列要素を参照する時点で、当該配列要素が初期化済みか否かを容易に判定できる。なお、これに限らず、配列要素を参照する時点で、当該配列要素が初期化済みか否かを判定部２３が判定できれば、どのような順序でコードを取得しても良い。
【００２７】
また、データ処理部１１のＣＰＵ、即ち数列生成部２２は、取得した前記コードが配列要素の値を設定する命令であった場合に、値が設定された当該配列要素の配列を示す数列である設定数列を前記命令に基づいて生成する。上記のプログラムでは、２行目のコードが、配列要素x[i]に値1を設定する命令x[i]=1であり、値を設定する要素番号をfor文で決定しているので、数列生成部２２は、for(i=1;i<100;i++)に基づき設定数列を生成する。ここで、配列要素の配列番号を用いて”(初項,末項,公差)”のように等差数列で配列要素の配列を表現した場合、for文のi=1が初項、i<100が末項、i++が公差に相当するので、数列生成部２２は、設定数列(1,99,1)を生成する。即ち、数列生成部２２は、命令（上記例ではfor文）のパラメータに基づいて設定数列（等差数列）の各項を決定する。
【００２８】
数列生成部２２は、取得した前記コードが配列要素の値を連続して参照する命令であった場合に、当該連続して参照する配列要素を示す数列である参照数列を前記命令に基づいて生成する。上記のプログラムでは、３行目のコードが、配列要素x[i]の値を標準出力 (stdout)、例えば出力部１５の表示装置に出力する命令printf("%d\n",x[i])である。この配列要素を出力する、即ち参照するコードにおいて、参照する配列要素の要素番号をfor文で決定しているので、数列生成部２２は、for(i=0;i<100;i++)に基づき参照数列を生成する。ここで、配列要素の配列、例えば配列番号を”(初項,末項,公差)”のように等差数列で表現すると、for文のi=0が初項、i<100が末項、i++が公差に相当するので、数列生成部２２は、参照数列(0,99,1)を生成する。即ち、数列生成部２２は、命令（上記例ではfor文）のパラメータに基づいて参照数列（等差数列）の各項を決定する。
【００２９】
データ処理部１１のＣＰＵ、即ち判定部２３は、取得部２１で取得したコードが、配列要素を参照する命令であった場合に、参照する配列要素が前記設定数列を超えているか否かによってバグの存在を判定する。また、判定部２３は、取得した前記コードが配列要素の値を連続して参照する命令であった場合、数列生成部２２で生成した参照数列と、数列生成部２２で生成した設定数列とを比較してバグの存在を判定する。即ち、判定部２３は、参照数列が設定数列を超えている場合にバグが存在すると判定する。上記のプログラムでは、設定数列(1,99,1)と参照数列(0,99,1)を比較し、参照数列が設定数列を超えて配列要素x[0]を参照しているので、バグが存在すると判定する。
【００３０】
データ処理部１１のＣＰＵ、即ち出力制御部２４は、判定部２３の判定結果（マッチ情
報）を取得し、このマッチ情報に基づいてメッセージや配列使用状況を表示部やプリンター等の出力部１５から出力させる。
【００３１】
なお、本例の解析装置１の構成要素のうち、情報を処理する要素は、汎用のプロセッサがソフトウェアとしての解析プログラムを実行することによって、上記各機能を実現するものである。これら情報を処理する要素の一部或いは全部は、基本的な回路を組み合わせて各々の機能を実現したハードウェアであっても良い。
【００３２】
本例の解析装置１において、取得部２１や、数列生成部２２、判定部２３、出力制御部２４が、前記情報を処理する要素である。
【００３３】
これら情報を処理する要素であるハードウェアは、例えば、ＦＰＧＡ［Field Programmable Gate Array］、ＡＳＩＣ［Application Specific Integrated Circuit］、ＬＳＩ［Large Scale Integration］といった基本的な回路を備えても良い。また、当該ハードウェアは、ＩＣ［Integrated Circuit］、ゲートアレイ、論理回路、信号処理回路、アナログ回路といった基本的な回路を備えても良い。
【００３４】
論理回路としては、例えば、ＡＮＤ、ＯＲ、ＮＯＴ、ＮＡＮＤ、ＮＯＲ、フリップフロップ、カウンタ回路がある。信号処理回路には、信号値に対し、例えば、加算、乗算、除算、反転、積和演算、微分、積分を実行する回路が、含まれていてもよい。アナログ回路には、例えば、信号値に対して、増幅、加算、乗算、微分、積分を実行する回路が、含まれていてもよい。
【００３５】
＜解析方法の説明＞
上記構成の解析装置１は、解析プログラムを実行することにより、図２〜図３１に示すように解析方法を実現する。
図２１は、配列要素を静的に解析する解析方法の手順（ステップＳ１〜Ｓ８）を説明したフロー図である。
【００３６】
ユーザが解析対象のプログラム名を入力し、解析開始の操作を行い、解析プログラムを実行すると、解析装置１の取得部２１は、解析対象であるプログラムのコードを取得する（Ｓ１）。
【００３７】
取得部２１が、配列要素を設定する或いは設定要素を参照するコードを取得した場合、数列生成部２２は、設定或いは参照する配列要素の配列を示す数列を生成する（Ｓ２）。
【００３８】
数列生成部２２は、Ｓ２で数列を生成したコードが配列要素を設定する命令か否かを判定し（Ｓ３）、配列要素を設定する命令であれば（Ｓ３，Ｙｅｓ）、Ｓ２で生成した数列即ち設定数列をマージ処理する（Ｓ４）。ここで設定数列のマージ処理は、既に生成された設定数列が存在する場合に、この既存の設定数列とＳ２で新たに生成した設定数列とを一つの数列で示すことが可能であれば、一つの数列にまとめる処理である。なお、具体的な手順は、後述する。そして、数列生成部２２は、マージ処理後の設定数列をメモリ或いは記憶部１３に登録する（Ｓ５）。
【００３９】
一方、Ｓ３で配列要素を設定する命令でないと判定した場合（Ｓ３，Ｎｏ）、即ち配列要素を参照する命令の場合、判定部２３は、Ｓ２で生成した数列即ち参照数列とメモリに登録されている設定数列とを比較する（Ｓ６）。判定部２３は、この比較の結果、例えば参照数列が設定数列を超えているか否かや、設定数列を超えて参照している配列要素の要素番号をマッチ情報としてメモリ或いは記憶部１３に登録する（Ｓ７）。
【００４０】
Ｓ５，Ｓ７の後、取得部２１は、コードの取得が終了したか否かを判定し（Ｓ８）、終了していなければ（Ｓ８，Ｎｏ）、Ｓ１に戻って上記ステップを繰り返し、コードの取得が終了したならば（Ｓ８，Ｙｅｓ）、解析処理を終了する。
【００４１】
上記解析処理が終了した場合、或いはユーザが解析結果を出力する操作が入力された場合に、出力制御部２４は、図２２に示す解析結果の出力処理を行う。
【００４２】
この出力処理が開始されると、出力制御部２４は、メモリ或いは記憶部１３からマッチ情報を取得する（Ｓ２１）。
【００４３】
出力制御部２４は、取得したマッチ情報に基づき、参照数列が設定数列にマッチしていないか否か、即ち参照数列が設定数列を超えているか否かを判定する（Ｓ２２）。
【００４４】
参照数列が設定数列にマッチしていない場合（Ｓ２２，Ｙｅｓ）、出力制御部２４は、図３に示すように、マッチしていないことを指摘するメッセージを出力する（Ｓ２３）。例えば、プログラムのファイル名(sample.c)や、配列要素名(x)、添字(i)、行番号等を変数で置き換えたフォーマットを記憶しておき、出力制御部２４が当該フォーマットを読み出して各変数に解析対象のプログラム等から取得した値を挿入して出力する。
【００４５】
また、出力制御部２４は、設定数列やマッチ情報に基づいて配列要素の設定状況を示す情報（配列使用状況）を出力する（Ｓ２４）。例えば、出力制御部２４は、図４に示すように設定数列に基づいて設定済みの配列要素の範囲を並べて表示させることで、設定されていない配列要素を視覚的に理解できるようにしている。
【００４６】
配列使用状況の出力後、或いはＳ２２で参照数列がマッチしていると判定された後（Ｓ２２，Ｙｅｓ）、出力制御部２４は、Ｓ２１〜Ｓ２４の処理を行うマッチ情報がなくなったか否かを判定する。即ち、出力制御部２４は、処理すべきマッチ情報があれば（Ｓ２５，Ｎｏ）Ｓ２１に戻り、処理すべきマッチ情報がなければ（Ｓ２５，Ｙｅｓ）、処理を終了する。
【００４７】
上述のように、本実施形態によれば、初期化せずに配列要素を参照するバグを静的に解析する際、初期化済みの配列要素を等差数列で示すことにより、各配列要素を示すフラグをメモリ上に保持する必要がなくなり、メモリ領域を過大に消費することが防止できる。従って、フラグの確保によってメモリの作業領域が圧迫されることがなくなり、パフォーマンスの低下が、防止される。
【００４８】
また、配列要素を連続して参照する場合に、参照する配列要素を等差数列で表し、参照する配列要素と初期化済みの配列要素を等差数列で比較することにより、メモリ消費を更に抑えることができる。
【００４９】
＜図２１で示した解析方法における各ステップの詳細説明＞
図２３は、図２１のＳ２で行う数列の作成処理の具体例を示した図である。Ｓ１でコードを取得し、配列要素を設定する或いは設定要素を参照するコードを取得した場合、数列生成部２２は、先ず配列要素の配列要素番号が変数で指定されているか否かを判定する。
【００５０】
配列要素の配列要素番号を変数で指定し、ｆｏｒ文などでループして当該変数を変えながら連続して配列要素を設定或いは参照する命令であれば（Ｓ３１，Ｙｅｓ）、ループさせている命令のパラメータ（ループ情報）を取得する（Ｓ３２）。
【００５１】
次に数列生成部２２は、ループ情報に基づいて数列を作成する（Ｓ３３）。例えば、数
列生成部２２は、ループ情報の変数の初期値を初項、変数の上限を末項、一ループ当たりの変化量を公差とする。図２４の例では、サンプルプログラムの１行目for(i=0;i<100;i++)から、数列(0,99,1)を作成する。
【００５２】
そして、数列生成部２２は、カウンタの乗数と定数を取得する（Ｓ３４）。図２４の例では、２行目のカウンタy[i*2+1]=1から、乗数＝２、定数＝１を取得する。
【００５３】
また、数列生成部２２は、数列の各項に乗数を乗じ、初項と末項に定数を加えて補正し、数列を決定する（Ｓ３５）。図２４の例では、（０，９９，１）を（０×２＋１，９９×２＋１，１×２）と補正し、（１，１９９，２）となる。
【００５４】
一方、Ｓ３１で配列要素が変数でないと判定された場合（Ｓ３１，Ｙｅｓ）、即ち配列要素番号が定数の場合、この定数を等差数列の初項と末項とし、数列（定数，定数，１）を作成する（Ｓ３６）。
【００５５】
図２５は、図２１のＳ４で行う設定数列のマージ処理の具体例を示した図である。このマージ処理は、設定数列が複数生成された場合に、この複数の設定数列のうち、数列の範囲が連続しているものや、数列の範囲が重なっているものを一つの数列で表し、効率化を図るための処理である。
【００５６】
マージ処理が開始されると、数列生成部２２は、図２１のＳ２で作成された設定数列をマージの対象数列としてメモリや記憶部１３に登録し（Ｓ４１）、当該設定数列と登録済の対象数列との連結処理を行う（Ｓ４２）。この連結処理は、隣り合う数列を一続きの数列にする処理である。例えば、１,２，３、即ち（１，３，１）という数列と、３，４，５，６（３，６，１）という数列は、隣合って連続した数列であるので、連結し、一続きの数列１，２，３，４，５，６、即ち（１，６，１）とする。
【００５７】
連結処理後、数列生成部２２は、連結が成功したか否かを判定し（Ｓ４３）、連結が成功した場合（Ｓ４３，Ｙｅｓ）、連結した数列をマージの対象数列としてメモリや記憶部１３に登録し（Ｓ４４）、Ｓ４２に戻ってさらに連結処理を行う。なお、Ｓ４４で連結した数列を登録した場合には、連結の元となったＳ４１で登録した数列は削除しても良い。
【００５８】
一方、Ｓ４３で連結が不成功と判定した場合（Ｓ４３，Ｎｏ）、数列生成部２２は、図２１のＳ２で作成された設定数列と登録済の対象数列との融合処理を行う（Ｓ４５）。この融合処理は、公差が同じ複数の設定数列を合わせて一つの小さな公差の数列を作成する処理である。例えば０，２，４即ち（０，４，２）という数列と１，３，５、即ち（１，５，２）という数列は、公差が同じく２で、合わせると公差が１の一つの数列（０，５，１）に融合させることができる。
【００５９】
融合処理後、数列生成部２２は、融合が成功したか否かを判定し（Ｓ４６）、融合が不成功であれば（Ｓ４６，Ｎｏ）マージ処理を終了する。また、数列生成部２２は、融合が成功であれば（Ｓ４６，Ｙｅｓ）、融合した数列をマージの対象数列としてメモリや記憶部１３に登録し（Ｓ４７）、Ｓ４２に戻ってさらに連結処理を行う。
【００６０】
図２６は、図２５のＳ４２で行う数列の連結処理の詳細な説明図、図２７は、この連結処理によって連結される数列の具体例を示す図である。
【００６１】
連結処理が開始されると、数列生成部２２は、図２１のＳ２で作成された設定数列を連結の対象数列としてメモリに保持して連結処理の準備を行う（Ｓ５１）。当該設定数列は、以下で被連結数列とも称される。
【００６２】
次に数列生成部２２は、登録済のマージの対象数列を読み出す（Ｓ５２）。当該マージの対象数列は、以下で連結候補数列とも称される。
【００６３】
数列生成部２２は、被連結数列（ｆ２，ｌ２，ｄ２）と連結候補数列（ｆ１，ｌ１，ｆｄ１）とを比較し、公差が同じであるか（ｄ１＝ｄ２）否かを判定する（Ｓ５３）。
【００６４】
公差が同じ場合（Ｓ５３，Ｙｅｓ）、数列生成部２２は、被連結対象数列の初項ｆ２が連結候補数列の範囲内か（ｆ１＜＝ｆ２＜＝ｌ１）否かを判定する（Ｓ５４）。例えば、図２７の例２では、被連結数列の初項０が連結候補数列の範囲２−１２にないので、Ｓ５４の条件を満たさない。
【００６５】
Ｓ５４の条件に該当しなければ（Ｓ５４，Ｎｏ）、数列生成部２２は、被連結対象数列の末項ｌ２が連結候補数列の範囲内か（ｆ１＜＝ｌ２＜＝ｌ１）否かを判定する（Ｓ５５）。例えば、図２７の例２では、被連結数列の末項１０が連結候補数列の範囲２−１２に入っているのでＳ５４の条件を満たす。
【００６６】
なお、Ｓ５４，Ｓ５５の条件は、上記に限らず被連結対象数列と連結候補数列の範囲の少なくとも一部が重複していることを判定できれば良い。
【００６７】
例えば、数列生成部２２は、Ｓ５４で、連結候補数列の初項ｆ１が被連結数列の範囲内か（ｆ２＜＝ｆ１＜＝ｌ２）否かを判定し、Ｓ５５で、連結候補数列の末項ｌ１が被連結数列の範囲内か（ｆ２＜＝ｌ１＜＝ｌ２）否かを判定しても良い。また、数列生成部２２は、Ｓ５４で、被連結数列の初項ｆ２が連結候補数列の範囲内か（ｆ１＜＝ｆ２＜＝ｌ１）否かを判定し、Ｓ５５で、連結候補数列の初項ｆ１が被連結数列の範囲内か（ｆ２＜＝ｆ１＜＝ｌ２）否かを判定しても良い。
【００６８】
Ｓ５５の条件に該当しなければ（Ｓ５５，Ｎｏ）、数列生成部２２は、連結候補数列の末項ｌ１に公差ｄ１を加えて被連結数列の初項ｆ２と同じになるか（ｌ１＋ｄ１＝ｆ２）否か、即ち連結候補数列の後に被連結数列が続いているか否かを確認する。また、数列生成部２２は、被連結数列の末項ｌ２に公差ｄ２を加えて連結候補数列の初項ｆ１と同じになるか（ｌ２＋ｄ２＝ｆ１）否か、即ち被連結数列の後に連結候補数列が続いているか否かを確認する。そして、数列生成部２２は、このどちらかの条件を満たしているか否かを判定する（Ｓ５６）。例えば、図２７の例１では、被連結数列の末項１６に、公差２を加えると、連結候補数列の初項１８と一致するので、Ｓ５６の条件に一致する。
【００６９】
Ｓ５４，Ｓ５５，Ｓ５６の何れかの条件を満たした場合、数列生成部２２は、被連結数列と連結候補数列とを連結し、連結後の数列で被連結数列及び連結候補数列を置き換え、連結成功を示すフラグをメモリに記憶して連結処理を完了する（Ｓ５７）。なお、連結成功を示すフラグは、図２５のＳ４３で参照して連結成功か否かの判定に用い、参照後に削除する。また、連結後の数列（ｍｉｎ（ｆ１，ｆ２），ｍａｘ（ｌ１，ｌ２），ｄ１）は、初項ｆ１，ｆ２のうち、小さい方を初項とし、末項ｌ１，ｌ２のうち、大きい方を末項としている。
【００７０】
一方、Ｓ５６で、どちらの条件も満たしていない場合（Ｓ５６，Ｎｏ）、数列生成部２２は、被連結数列と全ての連結候補数列との連結を試したか否かを判定し（Ｓ５８）、全ての連結候補数列について連結を試した場合（Ｓ５８，Ｎｏ）、連結処理を終了する。ここで数列生成部２２は、連結の不成功を示すフラグをメモリに記憶する。なお、連結の不成功を示すフラグは、図２５のＳ４３で参照して連結成功か否かの判定に用い、参照後に削除する。また、Ｓ５６において、数列生成部２２は、全ての連結候補数列について連結
を試していない場合（Ｓ５８，Ｙｅｓ）、Ｓ５２に戻って次の連結候補数列と被連結数列との連結処理を行う。
【００７１】
図２８は、図２５のＳ４５で行う数列の融合処理の詳細な説明図、図２９は、この融合処理によって融合される数列の具体例を示す図である。
【００７２】
融合処理が開始されると、数列生成部２２は、図２５のＳ４１で登録した対象数列を含め公差ｄが等しい対象数列をメモリ或いは記憶部１３からｎ個抽出する（Ｓ６１）。但し、ｄは自然数であり、ｎと同一である。
【００７３】
次に、数列生成部２２は、各数列の初項を抽出してソートし、数列とする。また、数列生成部２２は、各数列の末項を抽出してソートし、数列とする（Ｓ６２）。
【００７４】
図２９の例では、対象数列１−３の初項０，１，２が初項数列（０，２，１）となり、末項１３，１４，１５が末項数列（１３，１４，１５）となる。
【００７５】
数列生成部２２は、初項数列が公差１の有限等差数列で、且つ末項数列が公差１の有限等差数列か否かを判定する（Ｓ６３）。
【００７６】
Ｓ６３の条件を満たしていれば（Ｓ６３，Ｙｅｓ）、数列生成部２２は、Ｓ６１で抽出した各数列を連結し、連結後の数列で各数列を置き換え、融合成功を示すフラグをメモリに記憶して融合処理を完了する（Ｓ６４）。なお、融合成功を示すフラグは、図２５のＳ４６で参照して融合成功か否かの判定に用い、参照後に削除する。連結後の数列（ｍｉｎ（ｆ１，ｆ２．．．，ｆｎ），ｍａｘ（ｌ１，ｌ２．．．，ｌｎ），１）は、初項ｆ１，ｆ２．．．，ｆｎのうち、最も小さいものを初項とし、末項ｌ１，ｌ２．．．，ｌｎのうち、最も大きいものを末項としている。例えば、図２９の例では、初項０，１，２のうち、最も小さい０を初項とし、末項１３，１４，１５のうち、最も大きい１５を末項として、融合後数列（０，１５，１）を決定している。
【００７７】
一方、Ｓ６３の条件を満たしていなければ（Ｓ６３，Ｎｏ）、数列生成部２２は、融合の不成功を示すフラグをメモリに記憶させ、融合処理を終了する。なお、融合の不成功を示すフラグは、図２５のＳ４６で参照して融合成功か否かの判定に用い、参照後に削除する。
【００７８】
図３０は、図２１のＳ６で行うマッチング判定の詳細な説明図、図３１は、マッチング判定の具体例を示す図である。
【００７９】
マッチング判定が開始されると、判定部２３は、図２１のＳ２で作成された参照数列をメインメモリ上に保持してマッチング判定の準備を行う（Ｓ７１）。
【００８０】
また、判定部２３は、図２１のＳ５でメモリ或いは記憶部１３に登録された設定数列をマッチング判定の対象としてメインメモリ上に順次読み出す（Ｓ７２）。
【００８１】
判定部２３は、参照数列（ｆ２，ｌ２，ｄ２）と設定数列（ｆ１，ｌ１，ｆｄ１）を比較し、所定条件を満たしているか否かによって参照数列が設定数列を超えていないか、否かを判定する。
具体的には、先ず、判定部２３は、以下の三条件を全て満たすか否かを判定する（Ｓ７３）。
１．参照数列の公差ｄ２が設定数列の公差ｄ１以上か？
２．参照数列の公差ｄ２を設定数列の公差ｄ１で割った剰余が０か？
３．設定数列の初項ｆ１と参照数列の初項ｆ２の差の絶対値を設定数列の公差ｄ１で除算した余りが０か、の条件全てを満たしているか否か？
Ｓ７３の条件を満たしている場合（Ｓ７３，Ｙｅｓ）、判定部２３は、参照数列の初項ｆ２が設定数列の初項ｆ１以上で設定数列の末項以下であり、且つ参照数列の末項ｌ２が設定数列の初項ｆ１以上で設定数列の末項ｌ１以下であるか否かを判定する（Ｓ７４）。
【００８２】
Ｓ７４の条件を満たしている場合（Ｓ７４，Ｙｅｓ）、判定部は真値を返す、即ち参照数列が設定数列を超えていないことを示す判定結果をメインメモリに登録する（Ｓ７５）。
【００８３】
一方、Ｓ７３或いはＳ７４の条件を満たしていない場合（Ｓ７３，Ｎｏ）（Ｓ７４，Ｎｏ）、判定部２３は、参照数列を全ての設定数列と比較したか否かを判定する（Ｓ７６）。
【００８４】
全ての設定数列の比較が終わっていなければ（Ｓ７６，Ｎｏ）、判定部２３はＳ７２に戻り、参照数列が次の設定数列を超えていないか否かを判定する。
【００８５】
また、Ｓ７６で、参照数列を全ての設定数列と比較したと判定した場合（Ｓ７６，Ｙｅｓ）、判定部２３は、偽値を返す、即ち参照数列が設定数列を超えていることを示す判定結果をメインメモリに登録する（Ｓ７７）。
【００８６】
図３１の例１では、設定数列の公差が１で参照数列の初項から末項が、設定数列の範囲内なのでＳ７３，Ｓ７４の条件を全て満たし、真値が返される。
【００８７】
なお、設定数列の公差が２以上の場合、参照数列の初項から末項が、設定数列の初項以上及び末項以下であっても、即ちＳ７４の条件を満たしていても初期済みでない場合がある。例えば設定数列８，１０，１２即ち（８，１２，２）の場合、９や１１のように公差の間の数を参照した場合は、初期化済みでない。このためＳ７３の条件が必要である。
【００８８】
例２では、参照数列の公差が４で設定数列の公差２以上であり、参照数列の公差４を設定数列の公差２で割った剰余が無く、設定数列の初項２と参照数列の初項８の差−６の絶対値を設定数列の公差２で除算した余りが無いので、Ｓ７３の条件全てを満たしている。また、参照数列の初項８が設定数列の初項２以上で設定数列の末項２０以下であり、且つ参照数列の末項１６が設定数列の初項２以上で設定数列の末項２０以下である。即ち図３１の例２では、真値が返される。
【００８９】
一方、図３１の例３では、参照数列の初項から末項が、設定数列の初項以上及び末項以下であり、Ｓ７４の条件を満たすが、設定数列の初項２と参照数列の初項９の差−７の絶対値を設定数列の公差２で除算すると余りが有り、Ｓ７３の条件を満たさない。即ち、図３１の例３では、偽値が返される。
【実施例１】
【００９０】
図２〜図７は、実施例１を説明するための図である。
【００９１】
ユーザが解析対象のプログラム名ｓａｍｐｌｅ１．ｃを入力し、解析開始の操作を行い、解析プログラムを実行すると、解析装置１の取得部２１は、解析対象であるプログラムのコードを取得する（Ｓ１）。
【００９２】
取得部２１が３行目のコードを取得すると、数列生成部２２は、ｉｎｔ ｘ［２００］に基づき、この変数名ｘとサイズ２００の情報を含む設定参照情報をメインメモリに登録
する。
【００９３】
また、取得部２１が４行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜１００；ｉ＋＋）に基づき数列（０，９９，１）を生成する（Ｓ２）。
【００９４】
数列生成部２２は、４行目のコードのＸ［ｉ］＝０に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。この４行目のコードを処理する時点では、まだマージの対象数列が登録されていないので、設定数列はマージ不成功となり、そのまま設定参照情報に登録される。図５は４行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【００９５】
そしてＳ８でコードの取得（Ｓ１）に戻り、取得部２１が５行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝１０１；ｉ＜２００；ｉ＋＋）に基づき数列（１０１，１９９，１）を生成する（Ｓ２）。
【００９６】
数列生成部２２は、５行目のコードのＸ［ｉ］＝１に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【００９７】
図２の例では、４行目のコードから作成した設定数列と５行目のコードから作成した設定数列とが連続していないので、マージ不成功となり、そのまま設定参照情報に登録される。図６は５行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【００９８】
そして、取得部２１が６行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜２００；ｉ＋＋）に基づき数列（０，１９９，１）を生成する（Ｓ２）。
【００９９】
数列生成部２２が、６行目のコードのｐｒｉｎｔｆ（”％ｄ￥ｎ”，ｘ［ｉ］）に基づきＳ２で数列を生成したコードが配列要素を参照する命令であると判定すると（Ｓ３，Ｎｏ）、判定部２３がマッチング判定を行う（Ｓ６）。
【０１００】
判定部２３は、図３０のようにマッチング判定を行うと、参照数列（０，１９９，１）が、何れの設定数列（０，９９，１），（１０１，１９９，１）をも超えているので、偽値を返し、参照数列とマッチ情報（偽値）を設定参照情報に登録する（Ｓ７）。図７はマッチ判定後の設定参照情報を示す。
【０１０１】
そして出力処理が開始されると、出力制御部２４は、メモリ或いは記憶部１３の設定参照情報を参照してマッチ情報を取得する（Ｓ２１）。
【０１０２】
図７の例では、マッチ情報が偽値なので、出力制御部２４は、図３に示すように、マッチしていないことを指摘するメッセージを出力し、表示装置に表示させる（Ｓ２３）。このとき出力制御部２４は、プログラムのファイル名（ｓａｍｐｌｅ．ｃ）や、配列要素名（ｘ）、添字（ｉ）、行番号等をメッセージに挿入して出力する。これにより、６行目で初期化済みでない数値を参照していることが示される。
【０１０３】
また、出力制御部２４は、設定数列やマッチ情報に基づいて配列要素の設定状況を示す情報（配列使用状況）を出力する（Ｓ２４）。例えば、出力制御部２４は、図４に示すように設定数列に基づいて設定済みの配列要素の範囲を並べて表示させることで、設定されていない配列要素を視覚的に理解できるようにしている。図４の例では、設定数列が二つに別れ、x[100]が初期化済みでないことがわかる。
【実施例２】
【０１０４】
図８〜図１１は、実施例２を説明するための図である。
【０１０５】
ユーザが解析対象のプログラム名ｓａｍｐｌｅ２．ｃを入力し、解析開始の操作を行い、解析プログラムを実行すると、解析装置１の取得部２１は、解析対象であるプログラムのコードを取得する（Ｓ１）。
【０１０６】
取得部２１が３行目のコードを取得すると、数列生成部２２は、ｉｎｔ ｙ［２００］に基づき、この変数名ｙとサイズ２００の情報を含む設定参照情報をメインメモリに登録する。
【０１０７】
また、取得部２１が４，５行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜１００；ｉ＋＋）｛ｙ［ｉ＊２］＝０に基づき数列（０，１９８，２）を生成する（Ｓ２）。
【０１０８】
数列生成部２２は、５行目のコードのｙ［ｉ＊２］＝０に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。この４，５行目のコードを処理する時点では、まだマージの対象数列が登録されていないので、設定数列はマージ不成功となり、そのまま設定参照情報に登録される。図９は５行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１０９】
そしてＳ８でコードの取得（Ｓ１）に戻り、取得部２１が６行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜１００；ｉ＋＋）｛ｙ［ｉ＊２＋１］＝１に基づき数列（１，１９９，２）を生成する（Ｓ２）。
【０１１０】
数列生成部２２は、６行目のコードのｙ［ｉ＊２＋１］＝１に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１１１】
図８の例では、４，５行目のコードから作成した設定数列と４，６行目のコードから作成した設定数列とは、公差が２で、この二つの設定数列を融合して公差１の一つの小さい数列にマージされ、マージ後の数列（０，１９９，１）が設定参照情報に登録される。図１０は４，６行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１１２】
そして、取得部２１が８行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜２００；ｉ＋＋）に基づき数列（０，１９９，１）を生成する（Ｓ２）。
【０１１３】
数列生成部２２が、８行目のコードのｐｒｉｎｔｆ（”％ｄ￥ｎ”，ｙ［ｉ］）に基づきＳ２で数列を生成したコードが配列要素を参照する命令であると判定すると（Ｓ３，Ｎｏ）、判定部２３がマッチング判定を行う（Ｓ６）。
【０１１４】
判定部２３は、図３０のようにマッチング判定を行うと、参照数列（０，１９９，１）が、設定数列（０，１９９，１）と同じであり、設定数列を超えていないので、真値を返し、参照数列とマッチ情報（真値）を設定参照情報に登録する（Ｓ７）。図１１はマッチ判定後の設定参照情報を示す。
【実施例３】
【０１１５】
図１２〜図２０は、実施例３を説明するための図である。
【０１１６】
ユーザが解析対象のプログラム名ｓａｍｐｌｅ３．ｃを入力し、解析開始の操作を行い
、解析プログラムを実行すると、解析装置１の取得部２１は、解析対象であるプログラムのコードを取得する（Ｓ１）。
【０１１７】
取得部２１が３行目のコードを取得すると、数列生成部２２は、ｉｎｔ ｚ［１０］に基づき、この変数名ｚとサイズ１０の情報を含む設定参照情報をメインメモリに登録する。
【０１１８】
また、取得部２１が４行目のコードを取得した場合、数列生成部２２は、ｚ［０］＝２のように配列番号が定数なので、初項及び末項をこの定数とした数列（０，０，１）を生成する（Ｓ２）。
【０１１９】
数列生成部２２は、４行目のコードのｚ［０］＝２に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。この４行目のコードを処理する時点では、まだマージの対象数列が登録されていないので、設定数列はマージ不成功となり、そのまま設定参照情報に登録される。図１５は４行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１２０】
そしてＳ８でコードの取得（Ｓ１）に戻り、取得部２１が５行目のコードを取得した場合、数列生成部２２は、ｚ［１］＝３に基づき数列（１，１，１）を生成する（Ｓ２）。
【０１２１】
数列生成部２２は、５行目のコードのｚ［１］＝３に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１２２】
図１２の例では、４行目のコードから作成した設定数列の末項０に、公差１を加えた値１が、５行目のコードから作成した設定数列の初項１と一致しており、二つの設定数列が連続しているのでマージ成功となる。これにより、マージ後の設定数列（０，１，１）が設定参照情報に登録される。図１６は５行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１２３】
同様に、取得部２１が６行目のコードを取得した場合、数列生成部２２は、ｚ［２］＝５に基づき数列（２，２，１）を生成する（Ｓ２）。
【０１２４】
数列生成部２２は、６行目のコードのｚ［２］＝５に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１２５】
図１２の例では、５行目でマージした設定数列（０，１，１）の末項１に、公差１を加えた値２が、６行目のコードから作成した設定数列の初項２と一致しており、二つの設定数列が連続しているのでマージ成功となる。これにより、マージ後の設定数列（０，２，１）が設定参照情報に登録される。
【０１２６】
取得部２１が７行目のコードを取得した場合、数列生成部２２は、ｚ［３］＝７に基づき数列（３，３，１）を生成する（Ｓ２）。
【０１２７】
数列生成部２２は、７行目のコードのｚ［３］＝７に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１２８】
図１２の例では、６行目でマージした設定数列（０，２，１）の末項２に、公差１を加
えた値３が、７行目のコードから作成した設定数列の初項３と一致しており、二つの設定数列が連続しているのでマージ成功となる。これにより、マージ後の設定数列（０，３，１）が設定参照情報に登録される。
【０１２９】
取得部２１が８行目のコードを取得した場合、数列生成部２２は、ｚ［３］＝１１に基づき数列（３，３，１）を生成する（Ｓ２）。
【０１３０】
数列生成部２２は、８行目のコードのｚ［３］＝１１に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１３１】
なお、図１２の例では、８行目のコードでｚ［４］＝１１とすべきところをｚ［３］＝１１と間違った例を示している。このため、７行目でマージした設定数列（０，３，１）に、８行目のコードから作成した設定数列（３，３，１）をマージしても７行目の結果と変わらない。図１７は８行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１３２】
そして、取得部２１が９行目のコードを取得した場合、数列生成部２２は、ｚ［５］＝１３に基づき数列（５，５，１）を生成する（Ｓ２）。
【０１３３】
数列生成部２２は、９行目のコードのｚ［５］＝１３に基づきＳ２で数列を生成したコードが配列要素を設定する命令であると判定し（Ｓ３，Ｙｅｓ）、マージ処理する（Ｓ４）。
【０１３４】
図１２の例では、８行目の要素番号が間違っているので、８行目でマージした設定数列（０，３，１）の末項３に、公差１を加えた値４が、９行目のコードから作成した設定数列の初項５と一致せず、二つの設定数列が連続していないのでマージ不成功となる。即ち、９行目のコードから作成した設定数列（５，５，１）は、マージせずに設定参照情報に登録される。図１８は９行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１３５】
同様に、１０行目から１３行目のコードを取得し、設定数列を生成してマージ処理すると、マージ後の設定数列（５，９，１）が得られる。図１９は１３行目のコードに基づく設定数列を加えた時点の設定参照情報を示す。
【０１３６】
そして、取得部２１が１４行目のコードを取得した場合、数列生成部２２は、ｆｏｒ（ｉ＝０；ｉ＜１０；ｉ＋＋）に基づき数列（０，９，１）を生成する（Ｓ２）。
【０１３７】
数列生成部２２が、１５行目のコードのｐｒｉｎｔｆ（”％ｄ￥ｎ”，ｚ［ｉ］）に基づきＳ２で数列を生成したコードが配列要素を参照する命令であると判定すると（Ｓ３，Ｎｏ）、判定部２３がマッチング判定を行う（Ｓ６）。
【０１３８】
判定部２３は、図３０のようにマッチング判定を行うと、参照数列（０，９，１）が、何れの設定数列（０，３，１），（５，９，１）をも超えているので、偽値を返し、参照数列とマッチ情報（偽値）を設定参照情報に登録する（Ｓ７）。図２０はマッチ判定後の設定参照情報を示す。
【０１３９】
そして出力処理が開始されると、出力制御部２４は、メモリ或いは記憶部１３の設定参照情報を参照してマッチ情報を取得する（Ｓ２１）。
【０１４０】
図２０の例では、マッチ情報が偽値なので、出力制御部２４は、図１３に示すように、マッチしていないことを指摘するメッセージを出力し、表示装置に表示させる（Ｓ２３）。このとき出力制御部２４は、プログラムのファイル名（ｓａｍｐｌｅ３．ｃ）や、配列要素名（ｘ）、添字（ｉ）、行番号等をメッセージに挿入して出力する。これにより、１５行目で初期化済みでない数値を参照していることが示される。
【０１４１】
また、出力制御部２４は、設定数列やマッチ情報に基づいて配列要素の設定状況を示す情報（配列使用状況）を出力する（Ｓ２４）。例えば、出力制御部２４は、図１４に示すように設定数列に基づいて設定済みの配列要素の範囲を並べて表示させることで、設定されていない配列要素を視覚的に理解できるようにしている。図１４の例では、設定数列が二つに別れ、x[４]が初期化済みでないことがわかる。
【０１４２】
〈その他〉
本発明は、上述の図示例にのみ限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変更を加え得ることは勿論である。
【０１４３】
また、前述のプログラムは、コンピュータが読み取り可能な記録媒体に記録されたものでも良い。
【０１４４】
ここで、コンピュータが読み取り可能な記録媒体とは、データやプログラム等の情報を電気的、磁気的、光学的、機械的、または化学的作用によって蓄積し、コンピュータから読み取ることができる記録媒体をいう。このような記録媒体の内コンピュータから取り外し可能なものとしては、例えばフレキシブルディスク、光磁気ディスク、CD-ROM、CD-R/W、DVD、DAT、８mmテープ、メモリカード等がある。
【０１４５】
また、コンピュータに固定された記録媒体としてハードディスクやＲＯＭ（リードオンリーメモリ）等がある。
【符号の説明】
【０１４６】
１  解析装置
１１  データ処理部
１２  通信処理部
１３  記憶部（ハードディスク）
１４  入力部
１５  出力部
２１  取得部
２２  数列生成部
２３  判定部
２４  出力制御部
【図１】
2011113126.tif 000003
【図２】
2011113126.tif 000004
【図３】
2011113126.tif 000005
【図４】
2011113126.tif 000006
【図５】
2011113126.tif 000007
【図６】
2011113126.tif 000008
【図７】
2011113126.tif 000009
【図８】
2011113126.tif 000010
【図９】
2011113126.tif 000011
【図１０】
2011113126.tif 000012
【図１１】
2011113126.tif 000013
【図１２】
2011113126.tif 000014
【図１３】
2011113126.tif 000015
【図１４】
2011113126.tif 000016
【図１５】
2011113126.tif 000017
【図１６】
2011113126.tif 000018
【図１７】
2011113126.tif 000019
【図１８】
2011113126.tif 000020
【図１９】
2011113126.tif 000021
【図２０】
2011113126.tif 000022
【図２１】
2011113126.tif 000023
【図２２】
2011113126.tif 000024
【図２３】
2011113126.tif 000025
【図２４】
2011113126.tif 000026
【図２５】
2011113126.tif 000027
【図２６】
2011113126.tif 000028
【図２７】
2011113126.tif 000029
【図２８】
2011113126.tif 000030
【図２９】
2011113126.tif 000031
【図３０】
2011113126.tif 000032
【図３１】
2011113126.tif 000033