(57)【特許請求の範囲】
【請求項１】
ソースコードを読み込むソースコード入力手段と、
静的検証ツールによって前記ソースコードの静的検証を実行する静的検証実行手段と、
前記静的検証によって警告が発せられた事項である指摘事項を記憶する指摘事項記憶手段と、
前記指摘事項から関数呼出に関する事項を関数呼出指摘事項として抜き出す関数呼出指摘事項抽出手段と、
前記関数呼出指摘事項の種類と、前記種類に対応するアノテーションとを対応づけるテーブルを記憶するアノテーションルール記憶手段と、
前記テーブルにおいて、前記関数呼出指摘事項抽出手段によって抜き出された前記関数呼出指摘事項に対応する前記アノテーションを導出するアノテーション導出手段と、
前記アノテーション導出手段が導出した前記アノテーションを前記ソースコードに挿入してアノテーション挿入ソースコードを生成するアノテーション挿入手段と、
前記アノテーション挿入ソースコードを出力する結果出力手段
としてコンピュータを機能させるアノテーション自動挿入プログラム。
【請求項２】
請求項１に記載されたアノテーション自動挿入プログラムであって、
前記アノテーションは、前記静的検証ツールによって警告が発せられた事項に対して、
前記静的検証ツールが警告を発することを止めるための記述である
アノテーション自動挿入プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータプログラムの静的検証に関する。
【背景技術】
【０００２】
プログラムの記述内容の適切さをチェックするために静的検証ツールが用いられている。静的検証ツールは、関数呼出においてなんらかの前提条件を置いた上でソースコードの検証を実施する。一般的に静的検証ツールは、アノテーションと呼ばれる特殊な記述を行う事で、この前提条件を変更する機能を備えている。
【０００３】
例えば、静的検証ツールＳＰｌｉｎｔ（非特許文献１参照）であれば、／＊＠ｎｕｌｌ＠＊／というアノテーションを指定する事で、「引数にはＮＵＬＬが渡されない」という前提を無効化する事ができる。また同様に、／＊＠ｏｕｔ＠＊／というアノテーションを指定する事で、「引数には未初期化の値が渡されない」という前提を無効化する事ができる。
【０００４】
アノテーションの効果を、図４を例として説明する。図４の４行目において、関数ｆ２の第１引数に対して、／＊＠ｎｕｌｌ＠＊／のアノテーションが挿入されている。この結果、１２行目においてｆ２にＮＵＬＬを渡しているという指摘は発生しない。関数ｆ２にＮＵＬＬを渡し得るが、それは４行目のアノテーション／＊＠ｎｕｌｌ＠＊／により許可されているためである。逆に、２１行目においてはＮＵＬＬポインタ参照の指摘が発生し、この箇所において実行時エラーが発生しうる事がわかる。４行目のアノテーション／＊＠ｎｕｌｌ＠＊／により、引数ｐ１にＮＵＬＬが渡される可能性が考慮されるからである。
【０００５】
同じ例の３行目において、関数ｆ１の第１引数に対して、／＊＠ｏｕｔ＠＊／のアノテーションが挿入されている。この結果、１１行目においてｆ１に未初期化値を渡しているという指摘は発生しない。１６行目から定義される関数ｆ１においても、未初期化値を渡されても問題ないように作られており、指摘は発生しない。
【０００６】
以上のように、アノテーションを利用する事で関数呼出時の前提条件を変更することにより、関数呼出に関する前提条件に反する箇所における欠陥ではなく、実行時エラーが発生しうる箇所を静的検証ツールに指摘させる事ができる。
【０００７】
ここで、前提条件に反する箇所における欠陥ではなく、実行時エラーが発生しうる箇所の指摘が欲しいという視点に立って考える。この場合、静的検証ツール自身によって「その前提が守られない」旨が指摘された関数呼出の前提条件については、その前提条件が無効化された状態での検証結果が得られる事が望ましい。
【０００８】
例で説明すると、図３に示すソースコードを前述のＳＰｌｉｎｔで検証した場合、１２行目においてｆ２の第１引数にＮＵＬＬを渡す可能性があると指摘される。そうであるなら、関数ｆ２の検証についてもＮＵＬＬを「受け取る」という前提の上での検証結果が得られる事が望ましい。すなわち、図３の４行目に示す／＊＠ｎｕｌｌ＠＊／が追加された上で、１２行目においてｆ２の第１引数にＮＵＬＬを渡す可能性があるという指摘が抑制され、２１行目においてＮＵＬＬポインタ参照という実行時エラーの指摘が発生する方が望ましい。
【０００９】
以下、出願人が知り得た文献公知発明について記載する。特許文献１には、ソフトウェア静的解析における問題箇所の検出精度を向上させることを目的とするソースコード問題予測技術が記載されている。
【００１０】
特許文献２には、プログラム言語の規則違反を、利用者が修正しなくても、自動的に修正可能なエラー検出装置、エラー検出方法およびエラー検出用プログラムを提供することを目的とする技術が記載されている。
【００１１】
特許文献３には、プログラムコードにおける１つ以上の動的なチェックに関する情報を静的に検証するステップであって、プログラムコードにおける１つ以上の動的なチェックの各々がプログラムコードにおけるオペレーションをチェックするようなステップを備えた、プログラムコードについてチェックを行う方法が記載されている。
【特許文献１】特開２００７−１７９４８８号公報
【特許文献２】特開平１１−２９６３６６号公報
【特許文献３】特表２００７−５１６５３８号公報
【非特許文献１】ＩＥＥＥ  ＳＯＦＴＷＡＲＥ  Ｊａｎｕａｒｙ／Ｆｅｂｒｕａｒｙ２００２  Ｉｍｐｒｏｖｉｎｇ  Ｓｅｃｕｒｉｔｙ  Ｕｓｉｎｇ  Ｅｘｔｅｎｓｉｂｌｅ  Ｌｉｇｈｔｗｅｉｇｈｔ  Ｓｔａｔｉｃ  Ａｎａｌｙｓｉｓ
【発明の開示】
【発明が解決しようとする課題】
【００１２】
従来の静的検証ツールでは、上記のように、静的検証ツール自身の指摘に基づいて関数呼出の前提条件を変更し、その上での検証結果を得るには、前提条件を変更するアノテーションをユーザが手動で追加していた。
【００１３】
静的検証ツールとアノテーションを用いた実行時エラー発生箇所の検出作業を省力化することが望まれる。
【課題を解決するための手段】
【００１４】
本発明の実施の一形態によるアノテーション自動挿入プログラムは、ソースコードを読み込むソースコード入力手段と、静的検証ツールによってソースコードの静的検証を実行する静的検証実行手段と、静的検証によって警告が発せられた事項である指摘事項を記憶する指摘事項記憶手段と、指摘事項から関数呼出に関する事項を関数呼出指摘事項として抜き出す関数呼出指摘事項抽出手段と、関数呼出指摘事項の種類と、種類に対応するアノテーションとを対応づけるテーブルを記憶するアノテーションルール記憶手段と、テーブルにおいて、関数呼出指摘事項抽出手段によって抜き出された関数呼出指摘事項に対応するアノテーションを導出するアノテーション導出手段と、アノテーション導出手段が導出したアノテーションをソースコードに挿入してアノテーション挿入ソースコードを生成するアノテーション挿入手段と、アノテーション挿入ソースコードを出力する結果出力手段とを備える。
【００１５】
本発明の実施の一形態によるアノテーション自動挿入プログラムは、読み込まれたソースコードに対して静的検証ツールによって静的検証を実行する静的検証実行手段と、静的検証ツールによって警告が発せられた事項に対して静的検証ツールが警告を発することを止めるためのアノテーションをソースコードに挿入するアノテーション挿入手段とを備える。
【発明の効果】
【００１６】
本発明により、静的検証ツールとアノテーションを用いた実行時エラー発生箇所の検出作業を省力化することが可能となる。
【発明を実施するための最良の形態】
【００１７】
次に、本発明の実施の一形態の構成について図面を参照して詳細に説明する。図１を参照すると、本実施の形態におけるシステムは、静的検証ツール１と、入力ソースコード２と、プログラム制御により動作する処理装置３と、情報を記憶する記憶装置４と、出力ソースコード５と、出力指摘事項６とを含む。静的検証ツール１はコンピュータによって実行されるソフトウェアプロダクトである。出力ソースコード５と出力指摘事項６とはコンピュータが出力するテキスト情報である。
【００１８】
静的検証ツール１としては、従来技術の静的検証ツールを適用することができる。本実施の形態ではｈｔｔｐ：／／ｗｗｗ．ｓｐｌｉｎｔ．ｏｒｇ／にて公開されているＳＰｌｉｎｔを想定する。
【００１９】
入力ソースコード２は、本システムを適用する対象であるソースコードである。図５にその一例を示す。
【００２０】
処理装置３は、ソースコード入力手段３１と、静的検証実行手段３２と、関数呼出指摘事項抽出手段３３と、アノテーション導出手段３４と、アノテーション挿入手段３５と、結果出力手段３６とを備えている。これらの手段は、記憶装置に格納され、演算制御装置によって読み出されて実行されるソフトウェアプロダクトである。
【００２１】
これらの手段は、それぞれ概略つぎのように動作する。ソースコード入力手段３１は、入力ソースコード２を読み込み、ソースコード記憶部４１に格納する。
【００２２】
静的検証実行手段３２は、静的検証ツール１を利用してソースコード記憶部４１に格納されたソースコードを検証する。静的検証ツール１が構文エラー等の箇所を発見して警告メッセージを発した場合、その警告の種類と警告の対象となったソースコードの場所とを含む指摘事項が指摘事項記憶部４２に格納される。
【００２３】
関数呼出指摘事項抽出手段３３は、指摘事項記憶部４２に格納された指摘事項から、関数呼出に関係する指摘事項のみを抜き出し、関数呼出指摘事項記憶部４３に格納する。
【００２４】
アノテーション導出手段３４は、関数呼出指摘事項記憶部４３に格納された指摘事項と、アノテーションルール記憶部４４に格納されているルールを利用し、追加すべきアノテーションを導出し、追加アノテーション記憶部４５に格納する。アノテーション挿入手段３５は、追加アノテーション記憶部４５に格納されたアノテーションを、ソースコード記憶部４１に格納されたソースコードに挿入する。結果出力手段３６は、ソースコード記憶部４１に格納されたソースコードと、指摘事項記憶部４２に格納された指摘事項を、出力ソースコード５及び出力指摘事項６として出力する。
【００２５】
記憶装置４は、ソースコード記憶部４１と、指摘事項記憶部４２と、関数呼出指摘事項記憶部４３と、アノテーションルール記憶部４４と、追加アノテーション記憶部４５とを備えている。
【００２６】
これらの各記憶部は、概略次のような情報を保持する。ソースコード記憶部４１は、ソースコード入力手段３１により読み込まれた静的検証対象となる入力ソースコード２を保持する。
【００２７】
指摘事項記憶部４２は、指摘箇所（静的検証ツール１が警告した問題箇所）の各々について、指摘事項を保持する。保持する内容は、ソースコード上の指摘位置、指摘内容、当該指摘事項が関数呼出に関するものか否か、呼び出された関数、引数である。例を図９に示す。
【００２８】
関数呼出指摘事項記憶部４３は、静的検証ツールからの指摘事項のうち、関数呼出に関するもののみを保持する。保持する内容は、指摘位置、指摘内容、呼び出された関数、引数である。例を図１０に示す。
【００２９】
アノテーションルール記憶部４４は、指摘内容と、その指摘内容に対応して挿入すべきアノテーションを対応付けるルールを保持する。その内容の一例が図８に示されている。本実施の形態の説明を通じて、図８に示された例が用いられる。アノテーションルール記憶部４４は、静的検証ツールが出力する可能性のある指摘内容のリストである。アノテーションルール記憶部４４は、各指摘内容ごとにアノテーションを保持し、アノテーション挿入手段３５が指摘内容に応じてソースコードに挿入すべきアノテーションを決定する際に利用される。この内容の一例が図８で、事前に人手により定義され、本実施の形態を通じて変更されない。
【００３０】
追加アノテーション記憶部４５は、本システムにより挿入すべきと判断したアノテーションを保持する。追加アノテーション記憶部４５は、アノテーションを追加する対象となる関数である追加対象関数と、各々の追加対象関数の引数のうちアノテーションが追加される対象となる引数と、追加アノテーションとの関係を格納する。例を図１１に示す。
【００３１】
次に、図１及び図２を参照して、本実施の形態の動作について詳細に説明する。ソースコード入力手段３１が、入力ソースコード２を読み込み、ソースコード記憶部４１に格納する（図２のステップＡ１）。ソースコード記憶部４１に格納されたソースコードの例を、図５に示す。
【００３２】
次に、静的検証実行手段３２が、従来技術である静的検証ツール１を用いて、ソースコード記憶部４１に格納されたソースコードを検証し、得られた指摘事項を指摘事項記憶部４２に格納する（図２のステップＡ２）。この際、指摘位置（指摘事項の発生箇所）及び指摘内容を格納する。関数呼出箇所での指摘事項については、呼び出された関数及び指摘の対象となった引数についても記録する。
【００３３】
例として、この時点でソースコード記憶部４１に格納されたソースコードの例が図５に示したものであるとするならば、指摘事項記憶部４２に格納される指摘事項は図９に示された内容である。一例について説明すると、図９の指摘１１は、図５のｍａｉｎ関数の１１行目における関数呼出ｆ１（＆ｊ）において、第１引数である＆ｊに「未初期化値を渡している」旨の指摘である。これは関数呼出に関する指摘であるから、「関数呼出箇所での指摘」列はＹｅｓとなる。
【００３４】
次に、関数呼出指摘事項抽出手段３３が、指摘事項記憶部４２に格納された指摘事項のうち、「関数呼出箇所での指摘」列がＹｅｓであるものが存在するかを確認し（図２のステップＡ３）、存在する場合には関数呼出箇所での指摘事項のみを取り出し、関数呼出指摘事項記憶部４３に格納する（図２のステップＡ４）。存在しない場合には、ステップＡ７へと進む。
【００３５】
例として、指摘事項記憶部４２に図９に示されたような内容が格納されている場合、すべての項目が関数呼出箇所での指摘であるので、指摘１１，１２，１３すべての項目が関数呼出指摘事項記憶部４３に格納される。従って、関数呼出指摘事項記憶部４３の内容は図１０に示すものとなる。
【００３６】
次に、アノテーション導出手段３４が、関数呼出指摘事項記憶部４３の各指摘項目に対して、アノテーションルール記憶部４４に格納されたルールから指摘内容の列が一致するものを取り出し、追加アノテーション記憶部４５に対して格納する（図２のステップＡ５）。この際、関数呼出指摘事項記憶部４３の「呼び出された関数」列及び「引数」列は、それぞれ追加アノテーション記憶部４５の「追加対象関数」列及び「引数」列に格納される。また、アノテーションルール記憶部４４のアノテーション列は、追加アノテーション記憶部４５の「追加アノテーション」列に格納される。
【００３７】
例として、関数呼出指摘事項記憶部４３に図１０に示す内容が格納されており、アノテーションルール記憶部４４に図８の内容が格納されていたとすれば、追加アノテーション記憶部４５の内容は図１１の内容となる。一例について説明すると、図１０に示す指摘１１は、「指摘内容」列が「未初期化値を渡している」となっている。図８において「指摘内容」列が「未初期化値を渡している」となっているのはルール１であるから、指摘１１は、ルール１と対応付けられる。両者から生成されるのが図１１の追加１１である。
【００３８】
なお、このステップの主旨は、静的検証ツールによる指摘事項をもとに、静的検証ツールに与えるアノテーションを決定する事にある。この主旨について、ここで用いた例を利用して説明する。
【００３９】
本実施の形態で利用している静的検証ツール１であるＳＰｌｉｎｔは、特段の指定がなければ関数は未初期化値を受け取らない、という前提条件の上で検証を実施している。しかしながら、図１０に示す指摘１１のように、静的検証ツール１は、関数ｆ１の第１引数に未初期化値を渡す、と結論付けている。従って、これ以降関数ｆ１の検証を実施する際には、第１引数に関しては「未初期化値を受け取らない」という前提条件を無効とすべきであり、すなわち／＊＠ｏｕｔ＠＊／というアノテーションを関数ｆ１の第１引数に対して挿入すべきである。
【００４０】
これを実現するために、得られた指摘と対応するアノテーションの情報を図８に保持しておき、このステップで挿入するアノテーションを決める。
【００４１】
次に、アノテーション挿入手段３５により、追加アノテーション記憶部４５に示されたアノテーションを、ソースコード記憶部４１に格納されたソースコードに挿入し、結果をソースコード記憶部４１に書き戻す（図２のステップＡ６）。より具体的には、追加アノテーション記憶部４５の「追加対象関数」列で指定された関数の、「引数」列で指定された引数に対し、「追加アノテーション」列で指定されたアノテーションが挿入される。
【００４２】
例として、追加アノテーション記憶部４５に図１１に示される内容が格納されており、ソースコード記憶部４１に図５に示される内容が格納されている場合、アノテーションが挿入された内容は図６に示されるものとなり、この内容がソースコード記憶部４１に書き戻される。一例について説明すると、追加アノテーション記憶部４５のＮｏ１１により、関数ｆ１の第１引数に対し、／＊＠ｏｕｔ＠＊／というアノテーションを挿入する。この結果が図６の０３行目における／＊＠ｏｕｔ＠＊／である。
【００４３】
以上のように図２のステップＡ６が終了すると、処理は図２のステップＡ２に戻る。次に、図２のステップＡ２が再度実行される。例のみを説明すると、ソースコード記憶部４１に図６の内容が格納されていた場合、指摘事項記憶部４２に格納される内容は図１２のようになる。一度目のステップＡ２実行とは違う内容が指摘事項記憶部４２に格納される事になるが、これはアノテーション挿入の効果である。一例として、図１２のＮｏ２１は、図６の２１行目にて、未初期化値を参照している旨の指摘をうけている。これは、０４行目において関数ｆ２の第２引数に／＊＠ｏｕｔ＠＊／というアノテーションが挿入された事により、静的検証ツールにより関数ｆ２の第２引数に未初期化値が渡される可能性を考慮した検証が実施された結果、指摘されたものである。
【００４４】
次に、図２のステップＡ３，Ａ４が再度実行される。例のみを説明すると、指摘事項記憶部４２に図１２に示されたような内容が格納されている場合、「関数呼出箇所での指摘」がＹｅｓであるのは指摘２２であるので、指摘２２のみが抽出され、関数呼出指摘事項記憶部４３に格納される。この結果、関数呼出指摘事項記憶部４３の内容は図１３に示すように、指摘２２のみを格納した内容となる。
【００４５】
次に、図２のステップＡ５が再度実行される。例のみを説明すると、関数呼出指摘事項記憶部４３に図１３に示す内容が格納されており、アノテーションルール記憶部４４に図８の内容が格納されていたとすれば、追加アノテーション記憶部４５の内容は図１４の内容となる。一例について説明すると、図１３に示す指摘２２は、「指摘内容」列が「ＮＵＬＬを渡している」となっている。図８において「指摘内容」列が「ＮＵＬＬを渡している」となっているのはルール１であるから、指摘２２は、ルール１と対応付けられる。両者から生成されるのが図１４の追加２２である。
【００４６】
次に、図２のステップＡ６が再度実行される。例のみを説明すると、追加アノテーション記憶部４５に図１４に示される内容が格納されており、ソースコード記憶部４１に図６に示される内容が格納されている場合、アノテーションが挿入された内容は図７に示されるものとなり、ソースコード記憶部４１に書き戻される。図１４の追加２２により、関数ｆ３の第１引数に対し、／＊＠ｎｕｌｌ＠＊／というアノテーションが挿入される。この結果が図７の０５行目における／＊＠ｎｕｌｌ＠＊／である。
【００４７】
図２のステップＡ６が終了したため、処理は再び図２のステップＡ２に戻る。次に、図２のステップＡ２が再度実行される。例のみを説明すると、ソースコード記憶部４１に図７の内容が格納されていた場合、指摘事項記憶部４２に格納される内容は図１５のとおりとなる。
【００４８】
次に、図２のステップＡ３が再度実行される。例のみを説明すると、指摘事項記憶部４２に図１５に示されたような内容が格納されている場合、「関数呼出箇所での指摘」がＹｅｓであるものは存在しない。従って、ステップＡ７へと進む。
【００４９】
次に、結果出力手段３６が、指摘事項記憶部４２に格納された指摘事項を出力指摘事項６として出力し、またソースコード記憶部４１に格納されたソースコードを出力ソースコード５として、特に加工せず、そのままの形で出力する（図２のステップＡ７）。
【００５０】
例として、指摘事項記憶部４２に図１５に示されたような内容が格納されており、ソースコード記憶部４１に図７に示されたような内容が格納されていたとすると、そのままの内容が出力される。すなわち、出力指摘事項６として図１５の内容を、出力ソースコード５として図７の内容が出力される。
【００５１】
図１５に示された指摘事項すなわち指摘３１，３２は、双方とも関数呼出箇所での指摘ではなく、未初期化値が参照される（指摘３１）、ＮＵＬＬが参照される（指摘３２）といった、実行時にエラーが出る事に対する指摘である。また、図７の内容により、どのようなアノテーションが追加された結果として、指摘事項が得られたかを確認する事ができる。以上により、本システムのユーザは、アノテーション挿入作業を実施する事なく、実行時エラー発生箇所の指摘を得る事ができる。本発明の一実施形態の動作の説明は以上である。
【図面の簡単な説明】
【００５２】
【図１】アノテーション自動挿入プログラムが適用されるシステムの構成を示す。
【図２】アノテーション自動挿入プログラムの動作を示す。
【図３】静的検証が適用されるソースコードの一例である。
【図４】アノテーションを説明するためのソースコードの一例である。
【図５】アノテーション自動挿入プログラムが適用されるソースコードの一例である。
【図６】アノテーションが挿入されたソースコードの一例である。
【図７】アノテーションが挿入されたソースコードの一例である。
【図８】アノテーションルール記憶部に格納されるデータを示す。
【図９】指摘事項記憶部に格納される指摘事項を示す。
【図１０】関数呼出指摘事項記憶部に格納されるデータを示す。
【図１１】追加アノテーション記憶部に格納されるデータを示す。
【図１２】指摘事項記憶部に格納されるデータを示す。
【図１３】関数呼出指摘事項記憶部に格納されるデータを示す。
【図１４】追加アノテーション記憶部に格納されるデータを示す。
【図１５】指摘事項記憶部に格納されるデータを示す。
【符号の説明】
【００５３】
１  静的検証ツール
２  入力ソースコード
３  処理装置
４  記憶装置
５  出力ソースコード
６  出力指摘事項
３１  ソースコード入力手段
３２  静的検証実行手段
３３  関数呼出指摘事項抽出手段
３４  アノテーション導出手段
３５  アノテーション挿入手段
３６  結果出力手段
【図１】
0004915362.tif 000002
【図２】
0004915362.tif 000003
【図３】
0004915362.tif 000004
【図４】
0004915362.tif 000005
【図５】
0004915362.tif 000006
【図６】
0004915362.tif 000007
【図７】
0004915362.tif 000008
【図８】
0004915362.tif 000009
【図９】
0004915362.tif 000010
【図１０】
0004915362.tif 000011
【図１１】
0004915362.tif 000012
【図１２】
0004915362.tif 000013
【図１３】
0004915362.tif 000014
【図１４】
0004915362.tif 000015
【図１５】
0004915362.tif 000016