(57)【特許請求の範囲】
【請求項１】
プログラムの出力を特定するためのソースコードに関する基準を記憶する記憶部と、
読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照して、前記基準に合致するソースコードを探索する入出力探索手段と、
前記探索されたソースコード以外であって、且つ、前記探索されたソースコードで表現されたプログラムの出力に影響を与えないソースコードを特定し、これをプログラムの出力に影響を与えないソースコードである冗長コードとして特定する冗長コード特定手段と、を具備し、
前記記憶部は、プログラムの出力を特定するためのソースコードに関する基準に加えて、プログラムの入力を特定するためのソースコードに関する基準を記憶しており、
前記入出力探索手段は、前記読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照して、前記基準に合致するソースコードを探索し、
前記冗長コード特定手段は、プログラムの出力を特定するための前記基準を用いて探索されたソースコードで表現されたプログラムの出力に影響を与えないソースコードであって、且つ、プログラムの入力を特定するための前記基準を用いて探索されたソースコードを冗長コードとして特定することを特徴とする冗長コード検査装置。
【請求項２】
前記記憶部は前記読み込まれたコンピュータプログラムのソースコードの言語に対応した前記プログラムの出力と入力とを特定するための基準を記憶するものであり、
前記入出力探索手段は、前記読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照し、前記記憶部に記憶された前記基準のうちの何れかと合致するソースコードを探索することを特徴とする請求項１記載の冗長コード検査装置。
【請求項３】
請求項１又は２に記載の冗長コード検査装置としてコンピュータを動作させるためのプログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、コンピュータのソースプログラム中の冗長コードを検出する冗長コード検査装置に関する。
【０００２】
【従来の技術】
実際のプログラム開発においては、プログラマが、後に使用することを意図して変数を定義したが、実際には、その変数を使用せずにプログラムができてしまった場合や、一旦、その変数を使ってプログラムを作成したが、後の修正でそれが不要となり、その定義したコードを削除せずにそのまま残した場合などに冗長コードが発生する。このような冗長コードは、プログラム中に存在しても、プログラムの動作上は問題はない。しかし、冗長コードがプログラム中に残っていると、後にそのプログラムを保守したり、プログラム内容を解析しようとする場合に、これらの作業を難しくし、作業効率を低下させる。したがって、冗長コードはできる限り削除しておくことが望ましい。
【０００３】
【発明が解決しようとする課題】
ところで、簡単なソースプログラムの場合は、それを人間が見て、どれが冗長コードであるかを見つけだすことができる。しかし、多くの大規模で複雑なプログラムの場合には、たとえプログラムの専門家であってもすべての冗長コードを確実に見つけ出すことは容易でない。
【０００４】
本発明は、上記事情に基づいてなされたものであり、コンピュータのソースプログラム内にある冗長コードを自動的に検出し、必要に応じて自動的に当該冗長コードを削除する冗長コード検査装置を提供することを目的とする。
【０００５】
【課題を解決するための手段】
上記の目的を達成するための請求項１記載の発明に係る冗長コード検査装置は、プログラムの出力を特定するためのソースコードに関する基準を記憶する記憶部と、読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照して、前記基準に合致するソースコードを探索する入出力探索手段と、前記探索されたソースコード以外であって、且つ、前記探索されたソースコードで表現されたプログラムの出力に影響を与えないソースコードを特定し、これをプログラムの出力に影響を与えないソースコードである冗長コードとして特定する冗長コード特定手段と、を具備し、前記記憶部は、プログラムの出力を特定するためのソースコードに関する基準に加えて、プログラムの入力を特定するためのソースコードに関する基準を記憶しており、前記入出力探索手段は、前記読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照して、前記基準に合致するソースコードを探索し、前記冗長コード特定手段は、プログラムの出力を特定するための前記基準を用いて探索されたソースコードで表現されたプログラムの出力に影響を与えないソースコードであって、且つ、プログラムの入力を特定するための前記基準を用いて探索されたソースコードを冗長コードとして特定することを特徴とする。
【０００８】
請求項２記載の発明は、請求項１記載の冗長コード検査装置において、前記記憶部は前記読み込まれたコンピュータプログラムのソースコードの言語に対応した前記プログラムの出力と入力とを特定するための基準を記憶するものであり、前記入出力探索手段は、前記読み込まれたコンピュータプログラムのソースコードの中から、前記記憶部を参照し、前記記憶部に記憶された前記基準のうちの何れかと合致するソースコードを探索することを特徴とする。
【０００９】
上記の目的を達成するための請求項３記載の発明に係るコンピュータ読み取り可能な記録媒体は、請求項１又は２に記載の冗長コード検査装置としてコンピュータを動作させるためのプログラムを記録したものである。
【００１０】
請求項１記載の発明は、前記より、入出力探索手段は、予め定められた基準に基づいて読み込まれたコンピュータプログラムのソースコードについて入力と出力を探索する。入力と出力とが分かれば、それに基づいて冗長コードを特定することができる。かかる冗長コードをソースプログラムから削除することによって、プログラムの保守効率が向上する。
【００１１】
【発明の実施の形態】
以下に本発明の実施の形態について説明する。図１は、冗長コードについて説明するためのＣ言語によるコンピュータプログラムの一例を示す図、図２は、図１に示すプログラムに基づいて作成されたフローグラフを示す図、図３は、Ｃ言語で記述されたプログラムにおける入出力をまとめた表、図４は、ＦＯＲＴＲＡＮ言語で記述されたプログラムにおける入出力をまとめた表、図５は本発明の一実施形態の冗長コード検査装置の機能ブロック図、図６は、ＦＯＲＴＲＡＮ言語によるソースプログラムの一例を示した図である。
【００１２】
まず、具体的な例を用いて、ソースプログラムの冗長コードについて説明する。冗長コードとは、ソースプログラムの命令を記載したコードのうち、出力に影響を与えないコードをいう。図２において、ノード１０９は、図１のプログラムの１８行目に対応するノードであり、「ｒｅｔｕｒｎ  ｊ；」という実行文によって、変数ｊが返される。すなわち、このノードに対応する「ｒｅｔｕｒｎ  ｊ；」という実行文は、このプログラムの実行結果を表すものである。したがって、ｊはこのプログラムの出力に該当する。
【００１３】
そこで、このフローグラフを逆に下から上へ辿って、出力変数ｊに影響を与えるのはどこかを調べる。まず、ノード１０４（プログラムの１０行目）においてｊが定義されている（ｊ＝０）。また、ノード１０４とは異なる経路のノード１０７（プログラムの１５行目）においてもｊが定義されている。したがって、これらのノードは、ノード１０９の出力に影響を与える。また、ノード１０３（プログラムの９行目）の分岐も、ノード１０９の出力に影響を与える。更に、プログラムの２行目に対応するノード１００の「ｅｎｔｒｙ」ノードでは、引数としてｎ，ｍが定義されている。このｎは分岐ノード１０３に影響を与えている。その結果、ノード１００はノード１０９の出力ｊにも影響を与える。
【００１４】
つまり、ノード１０９に影響を与えるのは、ノード１００、ノード１０３、ノード１０４、ノード１０７であり、これ以外のノード１０１、ノード１０２、ノード１０５、ノード１０６、ノード１０８は、ノード１０９に影響を与えない。したがって、図１のプログラムにおいては、６行目、７行目、１１行目、１２行目、１６行目が冗長なコードであることが分かる。
【００１５】
次に、図１のプログラムの入力について考える。図１のプログラムにおいて、入力変数ｎ及びｍは、２行目にあるように、関数ｓａｍｐｌｅ１の引数である。この場合は、図１のプログラムの上から下に向かう方向で解析し、ｎとｍがどこに影響するかを調べる。この場合、ノード１０９が出力であることを認識しておく。
【００１６】
まず、ｎについて考えると、ノード１００において定義され、ノード１０３の分岐において使用されている。ある入力変数が分岐において使用されている場合には、その分岐した直後のノードでもその入力変数は使用された、すなわちｎが影響を与えていると考える。この場合、分岐した直後のノードはノード１０４とノード１０７であり、これらのノードではｊが定義されているので、それ以降ｊが使用されている部分には、ｎが影響を与えることになる。すなわち、出力ノード１０９においてｊが使用されているが、このｊは出力なので、入力変数ｎは出力に影響を与えている。
【００１７】
次に、ｍについて影響を調べる。まず、ｍは、ノード１０１、ノード１０２において使用されている。ノード１０１では「ｉ＝ｍ」というｉの定義にｍが使用されており、このｉは、ノード１０６（プログラムの１２行目）及びノード１０８（プログラムの１６行目）において使用されている。しかしながら、出力ノード１０９において使用されているのは、ｊだけであって、ｉは使用されていない。ということは、ｉに関係するｍは出力に影響を与えない。次に、ノード１０２では「ｊ＝ｍ」というｊの定義にｍが使用されている。しかしながら、分岐ノード１０３（プログラムの９行目）で使用されているのはｎのみであって、ｍは使用されていない。さらに、ノード１０４においては「ｊ＝０」と、ノード１０７においては「ｊ＝１」と、それぞれの分岐経路において再度ｊが定義されている。したがって、出力ノード１０９においてｊが使用されているが、このｊには、ｍは無関係である。結局、入力変数ｍは、出力変数ｊには影響を与えない。したがって、入力変数ｍは、冗長であることが分かる。
【００１８】
上の結果をまとめると、図１のプログラムにおいて、６行目、７行目、１１行目、１２行目、１６行目の文は冗長コードであり、入力変数ｍは冗長である。このような冗長コードがプログラム中に存在しても、そのコード自体は実行されるがそのプログラムの実行結果には影響を与えないので、冗長コードの存在はプログラムの実行上は問題とならない。しかしながら、冗長コードの存在は、プログラムを保守するという観点から考えると望ましくない。特に、後にそのプログラムを作成した者以外のものが、そのプログラムの内容を解析しなければならない場合には、冗長コードはプログラムの理解の妨げとなり、保守効率を低下させる原因となる。また、冗長コードが存在することによって、予想しえない何らかの誤動作の原因になるかもしれない。したがって、冗長コードが見つかった場合には、それを削除しておくのが望ましい。
【００１９】
以上が、冗長コードについての説明である。尚、この冗長コードについては、Ｂ．Ｋｏｒｅｌ著「Ｔｈｅ  Ｐｒｏｇｒａｍ  Ｄｅｐｅｎｃａｎｃｅ  Ｇｒａｈｐ  Ｉｎ  Ｓｔａｔｉｃ  Ｐｒｏｇｒａｍ  Ｔｅｓｔｉｎｇ」（Ｉｎｆｏｒｍａｔｉｏｎ  Ｐｒｏｃｅｓｓｉｇ  Ｌｅｔｔｅｒｓ  ３０，Ｊａｎ．１９８７）を参照することができる。
【００２０】
次に、どういうものを入力とし、どういうものを出力とするかについて説明する。図３は、Ｃ言語の場合の入力及び出力に該当する判断基準をまとめた表である。本実施形態では、図３の表に示すように、
「引数」
「非局所変数の参照」
「ｓｃａｎｆ関数などの入力関数で定義される変数」
を入力とする。ここで、「非局所変数」のうち代表的なものは大域変数である。大域変数は、一つの関数だけでなく、色々な関数が使うことができる変数である。したがって、大域変数を使う関数は、その関数以外の部分を見ることになるので、大域変数の参照は入力とする。また、入口ノードとは、ソースプログラムをフローグラフに直した場合のｅｎｔｒｙノードのことを指す。「ｓｃａｎｆ関数」とは、ある情報をオペレータがキーボードから打ち込んだ場合、その情報がプログラムに読み込まれるという関数である。このため、ｓｃａｎｆ関数のように、関数の外からの情報で定義される変数も入力とする。
【００２１】
次に、出力については、
「出口ノードで有効な非局所変数の定義」
「出口ノードで有効であり、外部に影響する引数の定義」
「ｒｅｔｕｒｎ文で返される変数」
「ｐｒｉｎｔｆ関数などの出力関数で使用される変数」
を出力とする。ここで、「出口ノードで有効な非局所変数の定義」は、例えばその関数において大域変数をある値に定義し、それがその関数の最後の部分、すなわちフローグラフに直したときのｅｘｉｔノードにおいて有効な場合である。ここでは、関数の中では、大域変数を複数回定義する場合もあるが、最後に有効なものを指している。この場合、他の関数がその大域変数を使おうとすると、その定義された値として使うことになるので、これはその関数についての出力となる。また、「外部に影響する引数の定義」は、Ｃ言語の場合、ある関数の中で引数を定義したときに、その定義された値を他の関数で使える場合（ポインタなど）と使えない場合があるので、外部に影響するものだけを出力としている。「ｒｅｔｕｒｎ文で返される変数」は、その関数を外部から呼び出したときに、その値を決定することになるので、これも出力とする。「ｐｒｉｎｔｆ関数」とは、コンピュータの画面に指定した情報が表示されるという関数である。このため、このような関数から書き出される変数も出力とする。
【００２２】
図４は、ＦＯＲＴＲＡＮ言語の場合の入力及び出力に該当する判断基準をまとめた表である。本実施形態では、図４の表に示すように、
「引数」
「非局所変数の参照」
「ＲＥＡＤ文で定義される変数」
を入力とする。これを見ると、図３に示すＣ言語の場合と同じものもあるので、それらについては、説明を省略する。「ＲＥＡＤ」文は、Ｃ言語におけるｓｃａｎｆ関数に相当するもので、キーボードから打ち込んだ情報あるいは指定したファイルの情報がコンピュータに伝えられ、これが入力として捉えられる命令であり、したがって、「ＲＥＡＤ文で定義される変数」も入力とする。
【００２３】
次に、出力については、
「出口ノードで有効な非局所変数の定義」
「出口ノードで有効な引数の定義」
「ＲＥＴＵＲＮ文で使用される変数」
「ＷＲＩＴＥ文およびＰＲＩＮＴ文で使用される変数」
を出力とする。ここで、２つめの「出口ノードで有効な引数の定義」は、Ｃ言語の場合と異なる。これは、ＦＯＲＴＲＡＮ言語の場合には、ある関数の中で引数を定義したときに、その定義された値を他の手続きで使うことができるという点でＣ言語と異なるので、上のように規定することができる。「ＲＥＴＵＲＮ」文は、制御をどの文へ戻すかを指定する文であり、通常の出力と異なるが、手続きの外部に影響するという意味で、ここでは出力とみなす。また、「ＷＲＩＴＥ文」および「ＰＲＩＮＴ文」は、コンピュータの画面あるいは指定したファイルに情報が伝達されるという命令文である。したがって、これも出力とする。
【００２４】
以上のように、何を入力とし、何を出力とすべきかは、プログラム言語の種類によって異なる。Ｃ言語の場合には、図３の表によって、また、ＦＯＲＴＲＡＮ言語の場合には、図４の表によって入力と出力は特定されるが、これ以外のプログラム言語を用いる場合には、予め、何を入力とし、何を出力とするかを明確に特定しておく必要がある。
【００２５】
図５は、本実施形態の冗長コード検査装置の機能ブロック図である。ソースプログラム読み込み部１０は、冗長コード検査を行おうとするソースプログラムのファイルを読み込む。入出力探索部１１は、そのソースプログラムがＣ言語による場合には図３に示した基準に基づいて、また、そのソースプログラムがＦＯＲＴＲＡＮ言語による場合には図４に示した基準に基づいて、そのソースプログラムの中から入力と出力を探索する。冗長コード特定部１２は、見いだされた入力と出力に応じて、上で説明した考え方のアルゴリズムによって冗長コードを特定する。
【００２６】
尚、上記のソースプログラム読み込み部１０、入出力探索部１１、冗長コード特定部１２は、コンピュータ上で動作するソフトウェアとして実現される。
図１に示したＣ言語のプログラムには、関数の呼び出しが含まれていないが、Ｃ言語の標準ライブラリのように、ソースコードの内容が分かっていない関数が呼び出される場合がある。また、ＦＯＲＴＲＡＮ言語の場合にも、ソースコードの内容が分かっていないサブルーチンが呼び出される場合がある。このような場合に、上の考え方をそのまま用いて冗長コード検査を行うと、冗長コードが発見できなかったり、誤った結論が導かれる場合がある。
【００２７】
図６は、ＦＯＲＴＲＡＮ言語で記述されたプログラム例である。このプログラムを見ると、ＣＨＡＮＧＥというサブルーチンの中で、ＩＮＩＴというサブルーチンが呼び出されている。このサブルーチンは、コンパイルされてライブラリとして用意されているものであって、そのソースコードは、図６のプログラムの中には含まれていないものとする。プログラマに分かるのは、コンパイルされたプログラムの仕様だけである。
【００２８】
そこで、本実施形態では、プログラムが呼び出す手続き（ＦＯＲＴＲＡＮの場合はサブルーチンなど、Ｃ言語の場合は関数）が、標準ライブラリのようなソースコードを持たないものである場合には、予め入力と出力に関するテーブルを用意しておく。図６のソースプログラムの場合、サブルーチンＩＮＩＴについては、具体的には、
「ＩＮＩＴ（Ｎ）・・・ 参照：なし 定義：Ｎ」
という情報を記載しておく。ここで、「参照：なし」とは、サブルーチンＩＮＩＴの中では、ＩＮＩＴの外部の変数が参照されないことを意味し、「定義：Ｎ」とは、サブルーチンＩＮＩＴがＩＮＩＴ（Ｎ）という形で現れたときには引数Ｎが定義されるということを意味する。このように、ソースコードを持たない手続きについては、予め、テーブルを用意しておき、これをデータベースとして格納しておく。そして、冗長コード解析を行うときに、必要に応じて、図５の入出力探索部１１がこのデータベースにアクセスし、必要なテーブルを読み出すことによって、当該手続きについての入力と出力を特定できるようにする。
【００２９】
図６のプログラムにおいて、仮に、予め用意したデータベースにアクセスせずに通常どおりに冗長コード検査を行うと、入力は１行目のＩとＪ、出力は７行目のＩとなり、出力に影響を与える部分を解析したときに、３行目で「Ｋ＝０」と定義された部分が７行目のＫに影響を与えると判断される。しかしながら、サブルーチンＩＮＩＴについて予め上記のようなテーブルを用意しておき、サブルーチンや関数などの手続きの呼び出しがあったときには図５の入出力探索部１１がこれを参照する、というようにしておけば、Ｋについての影響解析を行うときに、サブルーチンの中でＫがある値に定義されているということが分かる。これにより、３行目の「Ｋ＝０」という実行文は、冗長コードであり、このプログラムでは不要であることが分かる。
【００３０】
このように、ソースコードが存在しない手続きの呼び出しがあった場合に、これについての所定のテーブルを予め用意しておくことによって、冗長コード検査を確実に、かつ迅速に行うことができる。
尚、本発明は、上記実施形態に限定されるものではなく、その要旨の範囲内で種々の変更が可能である。
【００３１】
【発明の効果】
以上説明したように、本発明によれば、ソースプログラムに冗長コードが存在しているときに、これを自動的に見いだすことができるので、プログラマが冗長コードを見つけ出す場合の労力が軽減され、また、冗長コードを確実に削除することができるので、その後のプログラムの保守効率が向上する。また、ソースコードが存在しない手続きの呼び出しがあったときに、予め当該手続きについて所定の情報を記載したテーブルを用意しておき、呼び出しがあったときにそのテーブルを参照することによって、ソースコードが存在しない手続きの呼び出しがあった場合でも正確に冗長コード検査を行うことができる。
【図面の簡単な説明】
【図１】冗長コードについて説明するためのＣ言語によるコンピュータプログラムの一例を示す図である。
【図２】図１に示すプログラムに基づいて作成されたフローグラフを示す図である。
【図３】Ｃ言語で記述されたプログラムにおける入出力をまとめた表を示す図である。
【図４】ＦＯＲＴＲＡＮ言語で記述されたプログラムにおける入出力をまとめた表を示す図である。
【図５】本発明の一実施形態の冗長コード検査装置の機能ブロック図である。
【図６】ＦＯＲＴＲＡＮ言語によるソースプログラムの一例を示した図である。
【符号の説明】
１０    ソースプログラム読み込み部
１１    入出力探索部
１２    冗長コード特定部
【図１】
0004092750.tif 000002
【図２】
0004092750.tif 000003
【図３】
0004092750.tif 000004
【図４】
0004092750.tif 000005
【図５】
0004092750.tif 000006
【図６】
0004092750.tif 000007