(57)【要約】【課題】検査精度の向上と検査結果の検証時間短縮とを図ることを課題とする。【解決手段】このプログラミングコード検査装置は、入力されたプログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出し、演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する。そして、プログラミングコード検査装置は、算出された演算結果を受け渡す側の最大値または最小値が、算出された演算結果を受け入れる側の型の最大値と最小値との範囲内に収まるか否かを判定し、範囲内に収まらない場合に、エラーを警告する。【選択図】        図２
2010244475.tif 000002
【特許請求の範囲】
【請求項１】
プログラミングコードのエラーを検査するプログラミングコード検査装置であって、
前記プログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出する第一の算出手段と、
前記演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する第二の算出手段と、
前記第一の算出手段により算出された最大値または最小値が、前記第二の算出手段により算出された最大値と最小値との範囲内に収まるか否かを判定するエラー判定手段と、
を備えたことを特徴とするプログラミングコード検査装置。
【請求項２】
型の最大値と最小値とを記憶する演算子記憶手段をさらに備え、
前記第一の算出手段は、前記演算子記憶手段に記憶される前記演算に用いる型に対応する最大値と最小値とを用いて、前記演算結果の最大値および最小値を算出し、
前記第二の算出手段は、前記演算子記憶手段に記憶される前記演算結果を受け入れる側の型に対応する最大値と最小値とを用いて、受け入れられる最大値および最小値を算出することを特徴とする請求項１に記載のプログラミングコード検査装置。
【請求項３】
前記エラー判定手段は、前記第一の算出手段により算出された最大値または最小値が、前記第二の算出手段により算出された最大値と最小値との範囲内に収まらない場合に、エラーを警告することを特徴とする請求項１または２に記載のプログラミングコード検査装置。
【請求項４】
前記エラー判定手段は、前記第一の算出手段または前記第二の算出手段による演算途中でエラーが発生した場合には、前記エラー判定手段による判定を行うことなく、前記エラーを警告することを特徴とする請求項３に記載のプログラミングコード検査装置。
【請求項５】
前記プログラミングコードの演算命令文を表示し、前記演算命令文における演算の各項の型および／または値の変更を受け付けて、当該受け付けた型および／または値に変更した場合の演算結果を通知する演算変更手段をさらに備えたことを特徴とする請求項１〜４のいずれか一つに記載のプログラミングコード検査装置。
【請求項６】
プログラミングコードのエラーを検査することをコンピュータに実行させるプログラミングコード検査プログラムであって、
前記プログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出する第一の算出手順と、
前記演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する第二の算出手順と、
前記第一の算出手順により算出された最大値または最小値が、前記第二の算出手順により算出された最大値と最小値との範囲内に収まるか否かを判定するエラー判定手順と、
をコンピュータに実行させることを特徴とするプログラミングコード検査プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラミングコードのエラーを検査するプログラミングコード検査装置およびプログラミングコード検査プログラムに関する。
【背景技術】
【０００２】
従来より、財務会計、人事、各種サーバ機能（例えば、WebサーバやDNSサーバなど）などの各種処理を実行する情報処理システムには、様々なプログラムが実行されており、大規模システムほど実行されているプログラムも多い。このようなプログラムは、システムとして稼動する前に検査を行って、ソースコードのエラー（バグ）を修正する必要があり、近年では、高精度にバグなどを検出できる様々な検査ツールも開発されている。
【０００３】
一般的な検査ツールでは、Ｃ言語のソースコードについて、「暗黙の型変換検査」と「型拡張検査」の２種類の検査を行う。「暗黙の型変換検査」とは、代入される型（左辺）より代入する型（右辺）が大きい場合に警告をする検査であり、例えば、「signed  long」＝「４バイト」、「signed  short」＝「２バイト」とし、演算式が『「signed  long」＝「signed  short」＋「signed  long」＋「signed  short」』である場合、右辺では一番大きい型が採用されるため、「左辺の型（signed  long）＝右辺の型（signed  long）」となり、警告されない。
【０００４】
また、演算式が『「signed  short」＝「signed  short」＋「signed  long」＋「signed  short」』である場合、右辺では一番大きい型が採用されるため、「左辺の型（signed  short）」よりも「右辺の型（signed  long）」が大きく、代入される型よりも代入する型が大きいこととなり、警告される。なお、上記した式は、説明上、型だけを示しており、実際は整数などの値である。
【０００５】
また、「型拡張検査」とは、例えば、演算式『「signed  long」＝「signed  short」＋「signed  long」＋「signed  short」』において、代入先（左辺）「signed  long」がint型以外の場合に、警告する検査であり、代入元（右辺）の型や式は考慮されない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０００−２０７２４２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記した従来技術に係る検査手法では、検査精度が悪く、検査結果を検証するために膨大な時間が必要であるという課題があった。
【０００８】
具体的には、データ型の制約のために値が破壊されないかという観点で検査できない、言い換えれば、左辺の演算や右辺の演算が考慮されないので、値が破壊される可能性がある箇所がエラーとして警告（抽出）されなかったり、実際は値が破壊されない安全なコードが間違ってエラーとして警告されたりする。
【０００９】
つまり、従来の検査手法では、表面的なエラー検査しか実施されていないので、エラーであるのにエラーとして警告されなかったり、エラーでないのにエラーとして警告されたりと、エラー警告が正しい情報であるのか否か判断がつかず、さらには、無駄なエラー警告も多い。その結果、検査結果と検査対象のプログラミングコードとを目視で確認してエラーか否かを判断する必要があり、結果の検証に時間がかかる。また、目視による検証を行うため、人為的ミスが発生する恐れもある。
【００１０】
そこで、この発明は、上述した従来技術の課題を解決するためになされたものであり、検査精度の向上と検査結果の検証時間短縮とを図ることが可能であるプログラミングコード検査装置およびプログラミングコード検査プログラムを提供することを目的とする。
【課題を解決するための手段】
【００１１】
上述した課題を解決し、目的を達成するため、本発明は、プログラミングコードのエラーを検査するプログラミングコード検査装置であって、前記プログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出する第一の算出手段と、前記演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する第二の算出手段と、前記第一の算出手段により算出された最大値または最小値が、前記第二の算出手段により算出された最大値と最小値との範囲内に収まるか否かを判定するエラー判定手段と、を備えたことを特徴とする。
【発明の効果】
【００１２】
本発明によれば、検査精度の向上と検査結果の検証時間短縮とを図ることが可能である。
【図面の簡単な説明】
【００１３】
【図１】図１は、実施例１に係るプログラミングコード検査装置の概要を説明するための図である。
【図２】図２は、実施例１に係るプログラミングコード検査装置の構成を示すブロック図である。
【図３】図３は、型ＤＢに記憶される情報の例を示す図である。
【図４】図４は、第１算出部の詳細な構成を例示した図である。
【図５−１】図５−１は、逆ポーランド記法変換結果を示す図である。
【図５−２】図５−２は、逆ポーランド記法変換結果をテーブルに格納した例を示す図である。
【図５−３】図５−３は、シンボルをスタックに格納する例を示した図である。
【図５−４】図５−４は、スタックに格納したシンボルの演算を実施する例を示した図である。
【図６】図６は、算出演算における最大値と最小値との算出手法を示す図である。
【図７】図７は、論理演算における最大値と最小値との算出手法を示す図である。
【図８】図８は、関係演算における最大値と最小値との算出手法を示す図である。
【図９】図９は、インクリメント／デクリメント演算における最大値と最小値との算出手法を示す図である。
【図１０】図１０は、ビット単位論理演算における最大値と最小値との算出手法を示す図である。
【図１１】図１１は、sizeof演算における最大値と最小値との算出手法を示す図である。
【図１２】図１２は、キャスト演算における最大値と最小値との算出手法を示す図である。
【図１３】図１３は、代入演算における最大値と最小値との算出手法を示す図である。
【図１４】図１４は、三項演算における最大値と最小値との算出手法を示す図である。
【図１５】図１５は、判定部の詳細な構成を例示した図である。
【図１６】図１６は、実施例１に係るプログラミングコード検査装置における処理の全体的な流れを示すフローチャートである。
【図１７】図１７は、実施例１に係るプログラミングコード検査装置における字句および構文解析処理の流れを示すフローチャートである。
【図１８】図１８は、実施例１に係るプログラミングコード検査装置における検査処理の流れを示すフローチャートである。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、この発明に係るプログラミングコード検査装置およびプログラミングコード検査プログラムの実施例を詳細に説明する。なお、以下では、本実施例に係るプログラミングコード検査装置の概要、プログラミングコード検査装置の構成および処理の流れを順に説明し、最後に本実施例に対する種々の変形例を説明する。
【実施例１】
【００１５】
［プログラミングコード検査装置の概要］
最初に、図１を用いて、実施例１に係るプログラミングコード検査装置の概要を説明する。図１は、実施例１に係るプログラミングコード検査装置の概要を説明するための図である。
【００１６】
実施例１に係るプログラミングコード検査装置は、Ｃ言語などの各種プログラミング言語で作成されたプログラミングコードのエラーを検査することを概要とするものであり、特に、検査精度の向上と検査結果の検証時間短縮とを図ることが可能である。なお、このプログラミングコード検査装置は、コンピュータなど情報処理装置に組み込まれていてもよく、プログラミングコード検査装置と情報処理装置とを別の筐体で実施していてもよく、コンパイラなどに組み込まれていてもよい。
【００１７】
具体的には、実施例１に係るプログラミングコード検査装置は、入力されたプログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出し、演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する。そして、プログラミングコード検査装置は、算出された受け渡す側の最大値または最小値が、算出された受け入れる側の最大値と最小値との範囲内に収まらない場合に、エラーを警告する。
【００１８】
例えば、図１に示す代入演算命令文「s1＝（s1t_a＋s1t_b）」（ただし、各型はsigned（最大値：127バイト、最小値：-128バイト）とする）がプログラミングコード検査装置に入力された場合を例にして説明する。この場合、プログラミングコード検査装置は、入力された演算命令文における演算結果を受け渡す側（右辺：s1t_a＋s1t_b）において、演算に用いる型（signed）から当該演算結果の最大値および最小値を算出する。具体的には、プログラミングコード検査装置は、「s1t_aの最大値＋s1t_bの最大値＝254バイト」、「s1t_aの最大値＋s1t_bの最小値＝-2バイト」、「s1t_aの最小値＋s1t_bの最大値＝-2バイト」、「s1t_aの最小値＋s1t_bの最小値＝-256バイト」と算出する。
【００１９】
同様に、プログラミングコード検査装置は、演算命令文における演算結果を受け入れる側（左辺＝s1）の型から、受け入れられる最大値および最小値を算出する。具体的には、プログラミングコード検査装置は、左辺は演算式で無く「s1」の型のみなので、「s1の最大値＝127バイト、s1の最小値＝-128バイト」となる。
【００２０】
そして、プログラミングコード検査装置は、算出された受け渡す側（右辺）の最大値が「254バイト」・最小値が「-256バイト」であり、算出された受け入れる側（左辺）の最大値が「127バイト」と最小値が「-128バイト」となり、受け渡す側の最大値と最小値が受け入れる側の最大値と最小値との範囲内に収まらないので、当該演算命令文に対してエラーを警告する。
【００２１】
このように、実施例１に係るプログラミングコード検査装置は、演算命令文（演算式）をデータ型の取り得る値で演算を行い、受け渡す側の演算結果の範囲が受け入れる側の型の範囲に収まるか否かを自動的に判定することができる結果、検査精度の向上と検査結果の検証時間短縮とを図ることが可能である。
【００２２】
［プログラミングコード検査装置の構成］
次に、図２を用いて、実施例１に係るプログラミングコード検査装置の構成を説明する。図２は、実施例１に係るプログラミングコード検査装置の構成を示すブロック図である。図２に示すように、このプログラミングコード検査装置１０は、型ＤＢ１１と、入力Ｉ／Ｆ部１２と、型判定部１３と、自動コード変換部１７とを有する。
【００２３】
型ＤＢ１１は、後述する型判定部１３と接続され、型ごとに定義された最大値と最小値とを記憶する。具体的には、型ＤＢ１１は、「型」に対応付けて、定義された「最大値」と「最小値」とを記憶する。例えば、型ＤＢ１１は、図３に示すように、「型、最大値、最小値」として「signed  char、-128、+127」、「signed  short（int）、-32769、+32767」、「signed  long（int）、-2147483648、+2147483647」、「unsigned  char、0、+255」、「unsigned  short（int）、0、+65535」、「unsigned  long（int）、0、+4294967295」などと記憶する。なお、図３は、C言語を例にして説明したが、これに限定されるものでなく、また、各言語ごとに別のテーブルで記憶することで複数の言語に対応付けて記憶することもできる。図３は、型ＤＢに記憶される情報の例を示す図である。
【００２４】
入力Ｉ／Ｆ部１２は、後述する第１算出部１４と第２算出部１５と接続され、プログラミングコードを受け付けて、受け付けたプログラミングコードを文（１行）単位にして型判定部１３に出力する。具体的には、入力Ｉ／Ｆ部１２は、開発途中のプログラミングコード、予めピックアップされた検査行、完成したプログラミングコード、完成したプログラミングコードをプリプロセッサで処理した後の展開結果など様々な状態のプログラミングコードを受け付けて、受け付けたプログラミングコードを文（１行）単位にして型判定部１３に出力する。
【００２５】
また、入力Ｉ／Ｆ部１２は、ネットワークを介してプログラミングコードを受け付けることもでき、メモリーカードやＣＤなどの記憶媒体から受け付けることもでき、さらには、キーボードやマウスなどを介して手入力により受け付けることもできる。
【００２６】
型判定部１３は、ＯＳ（Operating  System）などの制御プログラム、各種の処理手順などを規定したプログラムおよび所要データを格納するための内部メモリを有するとともに、第１算出部１４と、第２算出部１５と、判定部１６とを有し、これらによって種々の処理を実行する。
【００２７】
第１算出部１４は、図４に示すように、算術演算部１４ａと、論理演算部１４ｂと、関係演算部１４ｃと、インクリメント／デクリメント部１４ｄと、ビット単位論理演算部１４ｅと、sizeof演算部１４ｆと、キャスト演算部１４ｇと、代入演算部１４ｈとを有し、入力Ｉ／Ｆ部１２により受け付けられたプログラミングコードの演算命令文における演算結果を受け渡す側（右辺）において、演算に用いる型から当該演算結果の最大値および最小値を算出する。なお、図４は、第１算出部の詳細な構成を例示した図である。
【００２８】
具体的には、第１算出部１４は、型ＤＢ１１を参照しつつ、入力Ｉ／Ｆ部１２からプログラミングコードを文（１行）単位の演算命令文で受け付けて、受け付けた演算命令文の右辺に対して逆ポーランド記法を実行して、シンボルをスタックに格納する。そして、第１算出部１４は、オペランドに対応する演算処理を図４に示した演算処理部で実行し、入力された演算命令文の右辺の演算結果の最大値および最小値を算出して、その結果を判定部１６に出力する。
【００２９】
例えば、第１算出部１４は、図５−１に示すように、入力された演算命令文を逆ポーランド記法で変換する。続いて、第１算出部１４は、図５−２に示すように、変換した結果をテーブルとして格納し、先頭からチェックしていく。そして、第１算出部１４は、図５−３に示すように、チェックした先がシンボル（変数Ａ、変数Ｂ、２、変数Ｃ）の場合には、当該シンボルをスタックに順に格納する。その後、第１算出部１４は、図５−４に示すように、チェックした先がオペランド（演算子）の場合には、当該演算子に対応する演算部を用いて、スタックに格納したシンボルの演算を実施する。例えば、第１算出部１４は、チェックした演算子が「×」の場合は、算出演算部１４ａを用いて、スタックに最も後に格納された２つのシンボルを乗算する。
【００３０】
なお、図５−１は、逆ポーランド記法変換結果を示す図であり、図５−２は、逆ポーランド記法変換結果をテーブルに格納した例を示す図であり、図５−３は、シンボルをスタックに格納する例を示した図であり、図５−４は、スタックに格納したシンボルの演算を実施する例を示した図である。また、ここでは、逆ポーランド記法を用いた例を説明したが、本発明はこれに限定されるものではなく、例えば、ポーランド記法など様々な手法を用いることができる。
【００３１】
ここで、図６〜図１４を用いて、図４に示した各演算部が算出する演算結果を受け渡す側（右辺）の最大値および最小値の演算内容について、具体的に説明する。ここで説明する処理は、図５−４において実行される処理であり、処理結果（算出結果）は、各演算処理部から判定部１６に出力される。また、図４の各演算部は、型ＤＢ１１に定義される型の最大値と最小値とを用いて以下の処理を実行する。
【００３２】
図４に示す算術演算部１４ａは、オペランドが加算（＋）、減算（−）、乗算（×）、除算（／）などの算術演算子の場合に、演算結果（演算命令文の右辺）の最大値および最小値を算出する処理部である。具体的には、算術演算部１４ａは、図６に示すように、オペランドが加算（＋）、減算（−）、乗算（×）の場合には、「左項の最大値」と「右項の最大値」、「左項の最大値」と「右項の最小値」、「左項の最小値」と「右項の最大値」、「左項の最小値」と「右項の最小値」の４つの演算結果から新たに最大値と最小値を求める。
【００３３】
また、算術演算部１４ａは、オペランドが（／）の場合、予め定義された内容に従って最大値と最小値とを求める。具体的には、算術演算部１４ａは、図６に示すように、演算文の型が「unsigned／unsigned」の場合、「演算結果の最大値＝左項の最大値（left  unsigned_MAX）、演算結果の最小値＝0」として求め、「signed／unsigned」の場合には、「演算結果の最大値＝左項の最大値（left  signed_MAX）、演算結果の最小値＝左項の最小値（left  signed_MIN）」として求め、「unsigned／signed」の場合、「演算結果の最大値＝左項の最大値（left  unsigned_MAX）、演算結果の最小値＝左項の−最大値（−（left  unsigned_MAX））」として求め、「signed／signed」の場合、「演算結果の最大値＝左項の−最小値（−（left  unsigned_MIN））、演算結果の最小値＝左項の−最小値（−（left  unsigned_MIN））」として求める。例えば、算術演算部１４ａは、演算文が「s1t_a／s1t_b」、型が「signed／signed」の場合、演算結果の最大値を「128」、最小値を「-128」として算出する。なお、図６は、算出演算における最大値と最小値との算出手法を示す図である。
【００３４】
論理演算部１４ｂは、オペランドが「＆＆」や「｜｜」などの論理演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、論理演算部１４ｂは、図７に示すように、オペランドが「＆＆」または「｜｜」の場合には、「演算結果の最大値＝1」、演算結果の最小値＝0」、オペランドが「！」かつ型の最大値と最小値との間に「0」がある場合には、「演算結果の最大値＝1、演算結果の最小値＝0」、オペランドが「！」かつ型の最大値と最小値との間に「0」がない場合には、「演算結果の最大値＝0、演算結果の最小値＝0」として求める。
【００３５】
例えば、論理演算部１４ｂは、演算文が「s1t_a＆＆s1t_b」、型が「signed＆＆signed」の場合、演算結果の最大値を「1」、最小値を「0」として算出する。また、論理演算部１４ｂは、演算文が「！（s1t_a）」、型が「signed  char」の場合、「signed  char」の最大値が「128」・最小値が「-127」であり、型の最大値と最小値との間に「0」があるので、演算結果の最大値を「1」、最小値を「0」として算出する。また、論理演算部１４ｂは、演算文が「！（uns1t_a）」、型が「unsigned  char」の場合、「unsigned  char」の最大値が「255」・最小値が「0」であり、型の最大値と最小値との間に「0」がないので演算結果の最大値を「0」、最小値を「0」として算出する。なお、図７は、論理演算における最大値と最小値との算出手法を示す図である。
【００３６】
関係演算部１４ｃは、オペランドが等号（＝＝）、不等号（＞）、（＜）、（＞＝）、（＜＝）などの関係演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、関係演算部１４ｃは、図８に示すように、オペランドが「関係演算子」の場合には、「演算結果の最大値＝1、演算結果の最小値＝0」と求める。例えば、関係演算部１４ｃは、演算文が「s1t_a＞s1t_b＋1」、型が「signed＞signed＋1」の場合、「演算結果の最大値＝1、演算結果の最小値＝0」と求める。なお、図８は、関係演算における最大値と最小値との算出手法を示す図である。
【００３７】
インクリメント／デクリメント部１４ｄは、オペランドがインクリメント（＋＋）、デクリメント（−−）などの演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、インクリメント／デクリメント部１４ｄは、図９に示すように、オペランドが「＋＋」の場合には、「演算結果の最大値＝型の最大値＋1、演算結果の最小値＝型の最小値＋1」と求め、オペランドが「−−」の場合には、「演算結果の最大値＝型の最大値−1、演算結果の最小値＝型の最小値−1」と求める。
【００３８】
例えば、インクリメント／デクリメント部１４ｄは、演算文が「＋＋s1t_a」、型が「＋＋（signed  char）」の場合、「演算結果の最大値＝型の最大値（127）＋1＝128、演算結果の最小値＝型の最小値（-128）＋1＝-127」と求め、演算文が「−−s1t_a」、型が「−−（signed  char）」の場合、「演算結果の最大値＝型の最大値（127）−1＝126、演算結果の最小値＝型の最小値（-128）−1＝-128」と求める。なお、図９は、インクリメント／デクリメント演算における最大値と最小値との算出手法を示す図である。
【００３９】
ビット単位論理演算部１４ｅは、オペランドがAND演算子（＆）、OR演算子（｜）、NOT演算子（〜）、算術左シフト（＜＜）、算術右シフト（＞＞）、XOR演算子などのビット演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、ビット単位論理演算部１４ｅは、図１０に示すように、オペランドが「＆」の場合には、「バイト数が小さいほうを優先し、同じバイトの場合はunsignedを優先」し、オペランドが「｜」の場合には、「バイト数が大きいほうを優先し、同じバイトの場合はsignedを優先」し、オペランドが「〜」やXOR演算子の場合には、「演算を行わず、元のMAX、MINを引き継ぐ」ようにし、オペランドが「＜＜」や「＞＞」の場合には、「１．右項が定数で負の数、２．右項が左項のビット幅を超える、３．右項が変数の場合には、演算を行わずにオーバーフロー。アンダフローチェック時に警告を出力し、１〜３以外の場合には、演算を行ってMAXとMINを算出」する。なお、図１０は、ビット単位論理演算における最大値と最小値との算出手法を示す図である。
【００４０】
sizeof演算部１４ｆは、オペランドがデータ型の大きさを求めるsizeof演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、sizeof演算部１４ｆは、図１１に示すように、オペランドがデータ型の大きさを求めるsizeof演算子の場合に、コンパイラと同様の動作を行い、演算結果の最大値＝最小値＝sizeofとする。例えば、sizeof演算部１４ｆは、図１１に示すような「typedef  struct  AAA」と「sizeof（structAAA）」が定義されていた場合、演算結果の最大値＝最小値＝sizeofであることから、演算結果の最大値＝8、演算結果の最小値＝8として算出する。なお、図１１は、sizeof演算における最大値と最小値との算出手法を示す図である。
【００４１】
キャスト演算部１４ｇは、オペランドがオブジェクトまたは値の型を別の型に変換するキャスト演算子「（type）（式）」の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、キャスト演算部１４ｇは、定数がキャストされている場合には、実際に演算を行い、例えば、拡大方向へのキャストについては「キャスト後に値が壊れないのであれば、MAX・MINの更新を行わない」、縮小方向へのキャストについては「キャストの型をMAX・MINとする」。なお、図１２は、キャスト演算における最大値と最小値との算出手法を示す図である。
【００４２】
代入演算部１４ｈは、オペランドが「＋＝」、「−＝」、「＆＝」などの代入演算子の場合に、演算結果の最大値および最小値を算出する処理部である。具体的には、代入演算部１４ｈは、オペランドが「＋＝」、「−＝」、「＆＝」などの代入演算子の場合には、図１３に示すように、左辺と右辺のシンボル同士の演算を行い、その後、代入時のオーバーフローやアンダフローをチェックする。なお、図１３は、代入演算における最大値と最小値との算出手法を示す図である。
【００４３】
なお、図４に示した演算処理部は、あくまで例示であり、これに限定されるものではない。例えば、図１４に示すような三項演算子を用いて算出する演算部や、ポインタなどを処理する（最大値と最小値は、参照先の型の最大値と最小値とする）演算部など様々な演算などを定義することにより使用することができる。なお、図１４は、三項演算における最大値と最小値との算出手法を示す図である。
【００４４】
図２に戻り、第２算出部１５は、型ＤＢ１１を参照しつつ、演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出する。具体的には、第２算出部１５は、第１算出部１４と同様の構成を有し入力Ｉ／Ｆ部１２により受け付けられたプログラミングコードの演算命令文における演算結果を受け入れる側（左辺）の型から受け入れられる最大値および最小値を算出する。なお、算出方法などについては、第１算出部１４と同様であるので、ここでは詳細な説明は省略する。
【００４５】
判定部１６は、第１算出部１４、第２算出部１５や自動コード変換部１７に接続され、第１算出部１４により算出された最大値または最小値が、第２算出部１５により算出された最大値と最小値との範囲内に収まらない場合に、エラーを警告する。具体的には、判定部１６は、図１５に示すように、キャスト演算部１６ａと、代入演算部１６ｂと、引数演算部１６ｃと、戻り値演算部１６ｄを有し、これらによって、第１算出部１４により算出された最大値または最小値が、第２算出部１５により算出された最大値と最小値との範囲内に収まるか否かを判定する。そして、判定部１６は、第１算出部１４により算出された最大値または最小値が、第２算出部１５により算出された最大値と最小値との範囲内に収まらない場合に、図示しない表示部（ディスプレイ）にエラーを表示するエラー警告指示を自動コード変換部１７に出力する。
【００４６】
例えば、キャスト演算部１６ａは、演算命令文が「（s1）（s2＋s2）」などのキャスト演算の場合に、上記した第１算出部１４（この例では、算術演算部１４ａ）により算出された（s2＋s2）の最大値と最小値が、型をあわせる（s1）の型の最大値と最小値の範囲内にあるか否かを判定する。また、代入演算部１６ｂは、演算命令文が「s1＝s2＋s2」などの代入演算の場合に、上記した第１算出部１４により算出された（s2＋s2）の最大値と最小値が、代入先の（s1）の型の最大値と最小値の範囲内にあるか否かを判定する。
【００４７】
また、引数演算部１６ｃは、演算命令文が「関数fanc（s1）;  ・・・・・・  fanc（s1+s2）;」などの引数の場合に、上記した第１算出部１４により算出された（s1＋s2）の最大値と最小値が、定義された引数（s1）の型の最大値と最小値の範囲内にあるか否かを判定する。また、戻り値演算部１６ｄは、演算命令文が「s1  fanc（）  ・・・・・・  return（s2+s2）;」などの戻り値の場合に、上記した第１算出部１４により算出された（s2＋s2）の最大値と最小値が、定義された戻り値（s1）の型の最大値と最小値の範囲内にあるか否かを判定する。なお、図１５は、判定部の詳細な構成を例示した図である。
【００４８】
図２に戻り、自動コード変換部１７は、判定部１６から入力された判定結果を図示しない表示部（例えば、ディスプレイなど）に出力する。具体的には、自動コード変換部１７は、判定部１６から入力された判定結果がNG（エラー警告指示）である場合、入力Ｉ／Ｆ部１２に入力されたプログラミングコードにエラーがある旨を図示しない表示部（例えば、ディスプレイなど）に出力する。そして、自動コード変換部１７は、エラー箇所を自動修正して表示部に出力する。
【００４９】
［プログラミングコード検査装置による処理］
次に、図１６〜図１８を用いて、プログラミングコード検査装置による処理を説明する。図１６は、実施例１に係るプログラミングコード検査装置における処理の全体的な流れを示すフローチャートであり、図１７は、実施例１に係るプログラミングコード検査装置における字句および構文解析処理の流れを示すフローチャートであり、図１８は、実施例１に係るプログラミングコード検査装置における検査処理の流れを示すフローチャートである。
【００５０】
（処理の全体的な流れ）
図１６に示すように、プログラミングコード検査装置１０は、入力されたプログラミングコード（ソースコード、演算命令文）を１行単位で読み取り（ステップＳ１０１）、読み取ったプログラミングコードに対して字句解析処理および構文解析処理を実行する（ステップＳ１０２）。
【００５１】
そして、プログラミングコード検査装置１０は、字句解析処理および構文解析処理した結果を用いて、演算を行いながらエラーをチェックし（ステップＳ１０３）、チェック結果をディスプレイなどに出力する（ステップＳ１０４）。
【００５２】
（字句および構文解析処理の流れ）
図１７に示すように、プログラミングコード検査装置１０は、読み取ったプログラミングコード（一行）を単語単位に分割して（ステップＳ２０１）、分割した単語の意味を解析する（ステップＳ２０２）。
【００５３】
具体的には、プログラミングコード検査装置１０は、読み取ったプログラミングコードに対して逆ポーランド記法を用いて単語単位に分割する。また、例えば、プログラミングコード検査装置１０は、読み取ったプログラミングコードが「for文（for（i=0;i<10;i++））であった場合、この条件式を「i=0」、「i<10」、「i++」の３つに分割する。そして、プログラミングコード検査装置１０は、分割した「i=0」に対しては「変数iに0を代入する」、「i<10」に対しては「変数iの値が10より小さいか比較する」、「i++」に対しては「変数iの値をプラス１する」と意味の解析を実行する。
【００５４】
そして、プログラミングコード検査装置１０は、分割した単語に解析した意味を結びつけて、スタックに格納する（ステップＳ２０３）。その後、プログラミングコード検査装置１０は、入力されたプログラミングコード（一行）の全単語についてステップＳ２０２とステップＳ２０３の処理を実行すると（ステップＳ２０４肯定）、処理を終了する。
【００５５】
（検査処理の流れ）
図１８に示すように、プログラミングコード検査装置１０は、図１７においてスタックに格納された内容（オペランドやシンボル）を取出し（ステップＳ３０１）、取出した内容が「代入演算子、キャスト演算子、関数の引数、関数の戻り値」のいずれかに該当するかを判定する（ステップＳ３０２）。
【００５６】
そして、プログラミングコード検査装置１０は、取出した内容が「代入演算子、キャスト演算子、関数の引数、関数の戻り値」の演算に該当する場合（ステップＳ３０２肯定）、中間スタックの内容を演算する（ステップＳ３０３）。
【００５７】
例えば、プログラミングコード検査装置１０は、演算命令文が代入演算「s1t_b＝s1t_a＋5」であった場合、右辺の「s1t_a＋5」について、型ＤＢ１１を参照しつつ最大値と最小値を算出する。
【００５８】
その後、プログラミングコード検査装置１０は、演算命令文の右辺の最大値または最小値が、演算命令文の左辺の最大値と最小値との範囲内に収まらないか否かを判定する型判定を実施して（ステップＳ３０４）、その結果を一時領域やメモリなどに記憶するとともに表示出力する（ステップＳ３０５）。
【００５９】
例えば、プログラミングコード検査装置１０は、演算命令文が代入演算「s1t_b＝s1t_a＋5」であった場合、算出された代入元となる右辺の演算結果として取り得る最大値と最小値が、代入先となる左辺の最大値と最小値との範囲内に収まる場合には、エラーなしの正常であると判定し、代入先となる左辺の最大値と最小値との範囲内に収まらない場合には、エラーありとして警告を出力する。
【００６０】
一方、プログラミングコード検査装置１０は、スタックから取出した内容が「代入演算子、キャスト演算子、関数の引数、関数の戻り値」の演算に該当しない場合、つまり、スタックから取出した内容が数字や他の演算子などのシンボルやオペランドであった場合（ステップＳ３０２否定）、取出し内容を中間スタックに格納する（ステップＳ３０７）。
【００６１】
そして、プログラミングコード検査装置１０は、スタックが空になるまでステップＳ３０１〜ステップＳ３０５の処理を繰り返し（ステップＳ３０６）、スタックが空になると（ステップＳ３０６肯定）、検査処理を終了する。
【００６２】
［実施例１による効果］
このように、実施例１によれば、プログラミングコードの演算命令文における演算結果を受け渡す側において、演算に用いる型から当該演算結果の最大値および最小値を算出し、演算命令文における演算結果を受け入れる側の型から、受け入れられる最大値および最小値を算出し、算出された演算結果を受け渡す側の最大値または最小値が、算出された演算結果を受け入れる側の型の最大値と最小値との範囲内に収まるか否かを判定することができる。その結果、検査精度の向上と検査結果の検証時間短縮とを図ることが可能である。また、エラーを自動判定するので、目視判断がなくなりプログラミングコードの検査精度が向上する。
【００６３】
また、実施例１によれば、命令文の演算が考慮されるので、実際は破壊されない安全なコードに対する無駄な警告を防止することができる。開発途中でも検査可能であることから、プログラミングミスの早期発見に繋がる。安全なコードをエラーとして警告することを防止することができる結果、検査結果の検証時間を短縮できる。
【００６４】
また、実施例１によれば、演算に用いる型に対応づけて記憶される最大値と最小値とを用いて、演算結果の最大値および最小値を算出し、演算結果を受け入れる側の型に対応づけて記憶される最大値と最小値とを用いて、受け入れられる最大値および最小値を算出することができる。その結果、一般的な型でなく、限られたユーザしか使用しない型であっても、エラー判定を行うことができ、ユーザの利便性が向上する。
【００６５】
また、実施例１によれば、出された演算結果を受け渡す側の最大値または最小値が、算出された演算結果を受け入れる側の型の最大値と最小値との範囲内に収まらない場合に、エラーを警告することができる。その結果、問題箇所を早期発見することができ、手戻り工数を削減することができる。また、エラーコードを自動修正することもより、修正ミスを防止することもできる。
【実施例２】
【００６６】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に示すように、（１）エラー警告手法、（２）プログラミング言語と型ＤＢ、（３）項や値の変更による数値変化の表示、（４）システム構成等、（５）プログラムにそれぞれ区分けして異なる実施例を説明する。
【００６７】
（１）エラー警告手法
例えば、実施例１では、入力されたプログラミングコードの演算命令文全てを演算した上で、エラーがあれば警告する例について説明したが、本発明はこれに限定されるものではなく、演算命令文の左辺または右辺が長い命令（演算）の場合には、エラーが起きた時点でエラー警告を出力するようにしてもよい。
【００６８】
また、エラー警告の出力手法とてしては、ディスプレイなどに「エラー有り」などのメッセージを出力してもよく、演算命令文の途中でエラーが発生した場合にはエラー箇所を「赤字」にして出力してもよい。
【００６９】
また、入力されたプログラミングコードの演算命令文における演算の組み合わせと演算結果とをグラフにして表示することで、演算結果のダイナミックレンジを視覚的に認識するようにすることもできる。また、入力されたプログラミングコードの演算命令文における演算の組み合わせと演算結果と代入先、キャストの型からグラフを作成し、リミッタと丸めによる誤差が視覚的に認識するようにすることもできる。
【００７０】
（２）プログラミング言語と型ＤＢ
また、実施例１では、プログラミング言語としてＣ言語を例にして説明したが、本発明はこれに限定されるものではなく、Ｃ＋＋、Java（登録商標）など様々なプログラミング言語で記述されたプログラミングコードについてエラー検査を実施することができる。その場合、型ＤＢ１１に検査するプログラミング言語に対応した型の最大値と最小値を記憶するようにすればよい。
【００７１】
また、型の最大値や最小値は、プログラミング言語によって一意的に決まるため、型ＤＢ１１は、必ずしも必要な構成ではない。ところが、社内専用に用いる型などを型ＤＢ１１に記憶させることにより、実施例１で説明した手法でエラー判定を行うことができる。したがって、型ＤＢ１１を備えることにより、一般的な型でなく、限られたユーザしか使用しない型であっても、エラー判定を行うことができ、ユーザの利便性が向上する。
【００７２】
（３）項や値の変更による数値変化の表示
本願が開示するプログラミングコード検査装置は、入力されたプログラミングコードの演算命令文を表示し、演算命令文における演算の各項の型および／または値の変更を受け付けて、受け付けて変更した場合の演算結果の数値変化を通知することもできる。
【００７３】
具体的には、プログラミングコード検査装置は、入力されたプログラミングコードの演算命令文が「s1＝s2＋s3」であった場合、「s1＝s2×s3」や「s1＝s2／s3」などの演算子の変更、「s1＝s2＋s1」や「s1＝s1＋s3」などの値の変更を、マウスやキーボードを介してユーザより受け付けて、変更した場合のエラー判定結果をディプレイに表示することもできる。このようにすることで、ユーザは、エラーの修正を確認しながら行うことができ、問題を早期発見・早期解決が実現できるので、手戻り工数が少なくなる。
【００７４】
（４）システム構成等
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともでき、あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、各種のデータやパラメータを含む情報（例えば、図６〜図１４など）については、特記する場合を除いて任意に変更することができる。
【００７５】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合（例えば、第１算出部と第２算出部とを統合するなど）して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００７６】
（５）プログラム
なお、本実施例で説明したプログラミングコード検査方法は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータで実行することによって実現することができる。このプログラムは、インターネットなどのネットワークを介して配布することができる。また、このプログラムは、ハードディスク、フレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＭＯ、ＤＶＤなどのコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行することもできる。
【産業上の利用可能性】
【００７７】
以上のように、本発明に係るプログラミングコード検査装置およびプログラミングコード検査プログラムは、プログラミングコードのエラーを検査することに有用であり、特に、検査精度の向上と検査結果の検証時間短縮とを図ることに適する。
【符号の説明】
【００７８】
１０  プログラミングコード検査装置
１１  型ＤＢ
１２  入力Ｉ／Ｆ部
１３  型判定部
１４  第１算出部
１５  第２算出部
１６  判定部
１７  自動コード変換部
【図１】
2010244475.tif 000003
【図２】
2010244475.tif 000004
【図３】
2010244475.tif 000005
【図４】
2010244475.tif 000006
【図５−１】
2010244475.tif 000007
【図５−２】
2010244475.tif 000008
【図５−３】
2010244475.tif 000009
【図５−４】
2010244475.tif 000010
【図６】
2010244475.tif 000011
【図７】
2010244475.tif 000012
【図８】
2010244475.tif 000013
【図９】
2010244475.tif 000014
【図１０】
2010244475.tif 000015
【図１１】
2010244475.tif 000016
【図１２】
2010244475.tif 000017
【図１３】
2010244475.tif 000018
【図１４】
2010244475.tif 000019
【図１５】
2010244475.tif 000020
【図１６】
2010244475.tif 000021
【図１７】
2010244475.tif 000022
【図１８】
2010244475.tif 000023