(57)【要約】【課題】ソフトウェア開発における解析時間の抑制を目的とする。【解決手段】構造分析部１４０が、複数の関数を含むソースコード２０を分析し、引数のアドレス渡しを行っている特定関数を抽出するとともに、特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する。警告条件受付部１１０が、特定関数が引数のアドレス渡しを行っていることを警告する警告条件２４を受け付ける。監視部１５０が、連続回数が警告条件２４を満たすか否かを監視し、連続回数が警告条件２４を満たす場合に特定関数が引数のアドレス渡しを行っていることを警告する警告情報３０を出力する。【選択図】図１
2019109639.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析部と、
前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視部と
を備えたソフトウェア開発装置。
【請求項２】
前記ソフトウェア開発装置は、
前記ソースコードから前記複数の関数の関数同士の参照関係を構文解析結果として取得する構文解析部を備え、
前記構造分析部は、
前記構文解析結果に基づいて、前記特定関数と前記連続回数とを抽出する請求項１に記載のソフトウェア開発装置。
【請求項３】
前記構造分析部は、
前記構文解析結果に基づいて、前記複数の関数から参照関係にある関数同士を抽出し、前記参照関係にある関数同士を関数リストとして生成する関数リスト生成部と、
前記構文解析結果を用いて前記参照関係がある関数同士から引数のアドレス渡しを行っている前記特定関数を判定し、前記特定関数が引数のアドレス渡し行っていることを表す情報を前記関数リストに付与するアドレス渡し判定部と、
前記関数リストに基づいて、前記特定関数について連続して引数のアドレス渡しを行っている回数を前記連続回数としてカウントする階層カウント部と
を備えた請求項２に記載のソフトウェア開発装置。
【請求項４】
前記アドレス渡し判定部は、
前記構文解析結果に基づいて、前記複数の関数の各々の引数である変数が参照しているアドレスを設定したアドレス参照確認表を生成し、前記アドレス参照確認表に基づいて前記特定関数を判定する請求項３に記載のソフトウェア開発装置。
【請求項５】
前記階層カウント部は、
前記関数リストに基づいて、前記複数の関数の関数同士の参照関係をツリー構造で表現した関数ツリーを生成し、前記関数ツリーと前記構文解析結果とに基づいて、前記関数ツリーのノードとなる各関数の階層を前記連続回数としてカウントする請求項４に記載のソフトウェア開発装置。
【請求項６】
前記構造分析部は、無限に階層をカウントさせる前記複数の関数の構造を検出し、無限カウントを防止する請求項５に記載のソフトウェア開発装置。
【請求項７】
前記ソフトウェア開発装置は、前記ソースコードの編集を受け付けるエディタ部と、前記エディタ部により編集されている前記ソースコードを一時的に保管する一時保管部とを備え、
前記構文解析部は、前記一時保管部に保管されているソースコードから前記構文解析結果を取得する請求項２から６のいずれか１項に記載のソフトウェア開発装置。
【請求項８】
前記ソフトウェア開発装置は、表示機器を備え、
監視部は、前記警告情報を前記表示機器に表示する請求項１から７のいずれか１項に記載のソフトウェア開発装置。
【請求項９】
前記ソフトウェア開発装置は、前記監視部が前記警告情報を出力すると、前記警告情報が解消されるまで前記ソースコードのコンパイルを制限する制限部を備えた請求項１から８のいずれか１項に記載のソフトウェア開発装置。
【請求項１０】
構造分析部が、複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出し、
監視部が、前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力するソフトウェア開発方法。
【請求項１１】
複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析処理と、
前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視処理と
をコンピュータに実行させるソフトウェア開発プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラムに関する。特に、特定のプログラムを記述した際に利用者に警告を通知するソフトウェア開発装置、ソフトウェア開発方法およびソフトウェア開発プログラムに関する。
【背景技術】
【０００２】
昨今のソフトウェア開発では、テキストベースのソースコードを図あるいはリストで表現することにより可視性を上げている。可視性の向上により、レビュー段階での欠陥検出を容易にし、バグ混入を防止することができる。プログラムの構造を可視化するツールとして、静的解析ツールが知られている。
静的解析ツールは、プログラムを実行せずにソースコードを解析し、コールツリーあるいは品質メトリクスを提供する。コールツリーは、関数同士の参照関係を表す図である。品質メトリクスは、プログラム品質を数値化したものである。また、静的解析ツールは、ソースコードを対象として解析するので、プログラムの実行環境および開発環境に左右されずに解析することができる。
【０００３】
一方、プログラムにおけるアドレスは、プログラム実行時あるいはプログラム実行中に割り当てられる。そして、プログラム実行中には、変数あるいは関数が指し示すアドレスは動的に変化する。よって、静的解析ツールによりアドレス参照を網羅することは困難である。
特許文献１には、ソフトウェア開発においてバグを起こすことが比較的多い大域変数のアドレス参照を解析し、参照関係にある変数同士を図表で表示する技術が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０１１−２５７８７２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、特許文献１のようにアドレス参照を解析する技術があるにも関わらず、アドレス参照を正確に解析できない静的解析ツールは多い。その理由はアドレス参照を解析するためにはプログラムを擬似的に実行する必要があるからである。プログラムを擬似的に実行して全ての変数組み合わせを解析するには時間がかかる。また、高性能で高価格なコンピュータが要求される。コンピュータ性能あるいはソースコードの構造にも寄るが、１Ｍラインを超える大規模ソースコードを静的解析ツールで解析すると、コンピュータがフリーズし、正常に解析が完了しないケースも発生する。
【０００６】
本発明は、アドレス参照に関する特定の記述を監視し、特定の記述がされた場合、利用者に警告を通知する。これにより、利用者に対してソースコードの構成的課題を是正させ、静的解析ツールにおける解析時間の増加を抑制することを主な目的とする。
【課題を解決するための手段】
【０００７】
本発明に係るソフトウェア開発装置は、
複数の関数を含むソースコードを分析し、前記複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、前記特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する構造分析部と、
前記連続回数が、前記特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、前記連続回数が前記警告条件を満たす場合に、前記特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する監視部とを備えた。
【発明の効果】
【０００８】
本発明に係るソフトウェア開発装置では、構造分析部が、複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する。監視部が、連続回数が、特定関数により引数のアドレス渡しが行われていることを警告するための警告条件を満たすか否かを監視し、連続回数が警告条件を満たす場合に、特定関数により引数のアドレス渡しが行われていることを警告する警告情報を出力する。よって、本発明に係るソフトウェア開発装置によれば、警告条件を満たす記述がソースコードにある場合、ソフトウェア開発者に警告を通知することができる。したがって、解析時間を増加させるような記述の是正をソフトウェア開発者に促すことにより、ソースコードの構成的課題を是正させることができる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１に係るソフトウェア開発装置の構成図。
【図２】実施の形態１に係るソフトウェア開発処理のフローチャート。
【図３】実施の形態１に係る警告条件の例を表す図。
【図４】実施の形態１に係るソースコードの例を表す図。
【図５】実施の形態１に係る構文解析結果の例を表す図。
【図６】実施の形態１に係る構文解析結果の例を表す図。
【図７】実施の形態１に係る関数リストの例を表す図。
【図８】実施の形態１に係るソースコードの例を表す図。
【図９】実施の形態１に係る関数リスト生成処理のフローチャート。
【図１０】実施の形態１に係るアドレス渡し判定処理のフローチャート。
【図１１】実施の形態１に係るアドレス参照確認表の例を表す図。
【図１２】実施の形態１に係る階層カウント処理のフローチャート。
【図１３】実施の形態１に係る関数ツリーの例を表す図。
【図１４】実施の形態１の変形例に係るソフトウェア開発装置１００の構成図。
【図１５】実施の形態２に係るソフトウェア開発装置１００ａの構成図。
【図１６】実施の形態３に係るソフトウェア開発装置１００ｂの構成図。
【発明を実施するための形態】
【００１０】
以下、本発明の実施の形態について、図を用いて説明する。なお、各図中、同一または相当する部分には、同一符号を付している。実施の形態の説明において、同一または相当する部分については、説明を適宜省略または簡略化する。
【００１１】
実施の形態１．
＊＊＊構成の説明＊＊＊
図１を用いて、本実施の形態に係るソフトウェア開発装置１００の構成を説明する。
本実施の形態に係るソフトウェア開発装置１００は、ソフトウェア開発環境の機能を有する。
【００１２】
ソフトウェア開発装置１００は、コンピュータである。ソフトウェア開発装置１００は、プロセッサ９１０を備えるとともに、メモリ９２１、補助記憶装置９２２、入力インタフェース９３０、および出力インタフェース９４０といった他のハードウェアを備える。プロセッサ９１０は、信号線を介して他のハードウェアと接続され、これら他のハードウェアを制御する。
【００１３】
ソフトウェア開発装置１００は、機能要素として、警告条件受付部１１０と、エディタ部１２０と、構文解析部１３０と、構造分析部１４０と、監視部１５０と、コンパイル部１６０と、記憶部１７０を備える。構造分析部１４０は、関数リスト生成部１４１と、アドレス渡し判定部１４２と、階層カウント部１４３とを備える。
記憶部１７０には、ソースコード２０と、構文解析結果２１と、関数リスト２２と、関数ツリー２３と、警告条件２４と、アドレス参照確認表２５が記憶されている。
【００１４】
警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能は、ソフトウェアにより実現される。構造分析部１４０の機能とは、上述したように、関数リスト生成部１４１とアドレス渡し判定部１４２と階層カウント部１４３の機能である。
記憶部１７０は、メモリ９２１に備えられる。
【００１５】
プロセッサ９１０は、ソフトウェア開発プログラムを実行する装置である。ソフトウェア開発プログラムは、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能を実現するプログラムである。
プロセッサ９１０は、演算処理を行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）である。プロセッサ９１０の具体例は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、ＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
【００１６】
メモリ９２１は、データを一時的に記憶する記憶装置である。メモリ９２１の具体例は、ＳＲＡＭ（Ｓｔａｔｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）、あるいはＤＲＡＭ（Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。
【００１７】
補助記憶装置９２２は、データを保管する記憶装置である。補助記憶装置９２２の具体例は、ＨＤＤである。また、補助記憶装置９２２は、ＳＤ（登録商標）メモリカード、ＣＦ、ＮＡＮＤフラッシュ、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤといった可搬記憶媒体であってもよい。なお、ＨＤＤは、Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅの略語である。ＳＤ（登録商標）は、Ｓｅｃｕｒｅ  Ｄｉｇｉｔａｌの略語である。ＣＦは、ＣｏｍｐａｃｔＦｌａｓｈ（登録商標）の略語である。ＤＶＤは、Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｋの略語である。
【００１８】
入力インタフェース９３０は、マウス、キーボード、あるいはタッチパネルといった入力装置と接続されるポートである。入力インタフェース９３０は、具体的には、ＵＳＢ（Ｕｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓ）端子である。なお、入力インタフェース９３０は、ＬＡＮ（Ｌｏｃａｌ  Ａｒｅａ  Ｎｅｔｗｏｒｋ）と接続されるポートであってもよい。
【００１９】
出力インタフェース９４０は、ディスプレイといった出力機器のケーブルが接続されるポートである。出力インタフェース９４０は、具体的には、ＵＳＢ端子またはＨＤＭＩ（登録商標）（Ｈｉｇｈ  Ｄｅｆｉｎｉｔｉｏｎ  Ｍｕｌｔｉｍｅｄｉａ  Ｉｎｔｅｒｆａｃｅ）端子である。ディスプレイは、具体的には、ＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）である。
【００２０】
ソフトウェア開発プログラムは、プロセッサ９１０に読み込まれ、プロセッサ９１０によって実行される。メモリ９２１には、ソフトウェア開発プログラムだけでなく、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）も記憶されている。プロセッサ９１０は、ＯＳを実行しながら、ソフトウェア開発プログラムを実行する。ソフトウェア開発プログラムおよびＯＳは、補助記憶装置９２２に記憶されていてもよい。補助記憶装置９２２に記憶されているソフトウェア開発プログラムおよびＯＳは、メモリ９２１にロードされ、プロセッサ９１０によって実行される。なお、ソフトウェア開発プログラムの一部または全部がＯＳに組み込まれていてもよい。
【００２１】
ソフトウェア開発装置１００は、プロセッサ９１０を代替する複数のプロセッサを備えていてもよい。これら複数のプロセッサは、ソフトウェア開発プログラムの実行を分担する。それぞれのプロセッサは、プロセッサ９１０と同じように、ソフトウェア開発プログラムを実行する装置である。
【００２２】
ソフトウェア開発プログラムにより利用、処理または出力されるデータ、情報、信号値および変数値は、メモリ９２１、補助記憶装置９２２、または、プロセッサ９１０内のレジスタあるいはキャッシュメモリに記憶される。
【００２３】
警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えてもよい。なお、コンパイル部１６０はコンパイラである。
ソフトウェア開発プログラムは、上記の各部の「部」を「処理」、「手順」あるいは「工程」に読み替えた各処理、各手順あるいは各工程を、コンピュータに実行させる。また、ソフトウェア開発方法は、ソフトウェア開発装置１００がソフトウェア開発プログラムを実行することにより行われる方法である。
ソフトウェア開発プログラムは、コンピュータ読取可能な記録媒体に格納されて提供されてもよい。また、ソフトウェア開発プログラムは、プログラムプロダクトとして提供されてもよい。
【００２４】
＊＊＊動作の説明＊＊＊
図２を用いて、本実施の形態に係るソフトウェア開発処理Ｓ１００について説明する。
まず、図３を用いて、本実施の形態に係る警告条件２４の例について説明する。
警告条件受付部１１０は、入力インタフェース９３０を介して、ソフトウェア開発者といった利用者から、警告を通知する条件を受け付け、記憶部１７０に警告条件２４として記憶する。警告を通知する条件は、引数のアドレス渡しの回数である。すなわち、警告条件受付部１１０は、引数のアドレス渡し回数を表す値Ｎ（自然数）を設定値として、警告条件２４を受け付ける。図３の例では、警告条件受付部１１０は、引数のアドレス渡し回数を表す設定値「３」の入力を受け付け、警告条件２４として記憶部１７０に記憶する。
【００２５】
また、図４は、本実施の形態に係るソースコード２０の一例であるソースコード２００を表す。ソースコード２０は複数の関数を含む。なお、ソースコード２０に含まれる関数は単数であっても本実施の形態を適用することができる。
エディタ部１２０は、入力インタフェース９３０を介して、利用者からソースコード２００の編集を受け付ける。エディタ部１２０は、ソースコード２００の編集の他に、ソースコード２００の記憶部１７０への記憶、および、ソースコード２００の記憶部１７０からの読出しを行う。
【００２６】
＜構文解析処理：ステップＳ１０＞
ステップＳ１０において、構文解析部１３０は、ソースコード２０から複数の関数の関数同士の参照関係を構文解析結果２１として取得する。具体的には、構文解析部１３０は、記憶部１７０に記憶されているソースコード２０に対して、字句解析および構文解析を行い、構文解析結果２１を生成する。
構文解析結果２１は以下の情報を有する。
（１）関数名
（２）関数の仮引数名、仮引数の型
（３）関数の中で定義している変数名、変数の型
（４）変数同士の代入
（５）関数の中で使用している関数名、すなわち参照関数
（６）（５）の関数の実引数名
（７）大域変数の変数名、大域変数の型
【００２７】
構文解析部１３０は、構文解析結果２１を記憶部１７０に記憶する。なお、構文解析結果２１は上記（１）から（７）の情報を有していれば構造は問わない。
【００２８】
図５は、本実施の形態に係る構文解析結果２１の例を表す図である。
図６は、本実施の形態に係る構文解析結果２１の例を表す図である。
構文解析結果２１は、図５および図６に示すように、リスト形式でも良い。図５および図６の構文解析結果２１は図４のソースコード２０をリスト化したものである。図５の構文解析結果＿大域変数２１０は、大域変数をリスト化したものである。また、図６の構文解析結果＿関数２１１，２１２は、関数をリスト化したものである。構文解析結果＿大域変数２１０には上記（７）の情報が格納される。構文解析結果＿関数２１１，２１２には上記（１）から（６）の情報が格納される。
【００２９】
図５および図６における（８）から（１０）の情報は、構造分析部１４０による分析によって導出される項目である。よって、構文解析部１３０では導出されない。
（８）仮引数参照アドレスは（２−１）仮引数が示す変数のアドレスを表すものである。（９）実引数参照アドレスは、（６）実引数が示す変数のアドレスを表すものである。
（１０）参照アドレスはグローバル変数が示すアドレスを表すものである。（８）から（９）の情報により、同じ関数であっても示すアドレスが異なる場合があるので、呼び出す関数１つにつき、構文解析結果＿関数２１１，２１２のようなリストを１つずつ生成する。つまり、同じ関数が呼び出された場合においても、それぞれ構文解析結果＿関数、すなわち関数の構文解析結果２１を生成する。
【００３０】
＜構造分析処理：Ｓ２０＞
ステップＳ２０において、構造分析部１４０は、複数の関数を含むソースコード２０を分析し、複数の関数のうち引数のアドレス渡しを行っている特定関数を抽出するとともに、特定関数が連続して引数のアドレス渡しを行っている連続回数を抽出する。構造分析部１４０は、構文解析結果２１に基づいて、特定関数と連続回数とを抽出する。つまり、構造分析部１４０は、構文解析結果２１に基づいて、引数のアドレス渡しを行っている関数と、その関数が連続して引数のアドレス渡しを行っている回数とを抽出する構造分析処理を行う。
【００３１】
構造分析処理は、関数リスト生成処理、アドレス渡し判定処理、および階層カウント処理を有する。
【００３２】
関数リスト生成処理において、関数リスト生成部１４１は、構文解析結果２１に基づいて、複数の関数から参照関係にある関数同士を抽出し、参照関係にある関数同士を関数リスト２２として生成する。
アドレス渡し判定処理において、アドレス渡し判定部１４２は、構文解析結果２１を用いて参照関係がある関数同士から引数のアドレス渡しを行っている特定関数を判定する。そして、アドレス渡し判定部１４２は、特定関数が引数のアドレス渡し行っていることを表す情報を関数リスト２２に付与する。
階層カウント処理において、階層カウント部１４３は、関数リスト２２に基づいて、特定関数について連続して引数のアドレス渡しを行っている回数を連続回数としてカウントする。
【００３３】
図７は、本実施の形態に係る関数リスト２２の例を表す図である。
図８は、本実施の形態に係るソースコード２０の別例であるソースコード２０１，２０２，２０３，２０４，２０５，２０６を表す図である。
構造分析部１４０は、構文解析結果２１から、図７に示すような関数リスト２２を生成する。図７の関数リスト２２０は、関数同士の呼び出し関係をまとめたものである。図７の関数リスト２２１は関数同士の呼び出し関係に加え、引数のアドレス渡しを行っているかを表現したものである。関数リストの構成として、１行目に被参照関数、１列目に参照関数を記載し、２行２列目以降に参照関係を表す数値を記載する。ここでは参照していないことを「０」で表し、参照していることを「０以外の数値」で表している。関数リスト２２１の場合、参照していることを１、参照しており、かつ引数のアドレス渡しを行っていることを−１で表している。すなわち、−１が設定されている関数は、引数のアドレス渡し行っている特定関数である。また、−１を関数リストに設定することは、特定関数が引数のアドレス渡し行っていることを表す情報を関数リスト２２に付与することである。
【００３４】
以下において、構造分析部１４０が備える関数リスト生成部１４１、アドレス渡し判定部１４２、および階層カウント部１４３の各々の動作について詳しく説明する。
【００３５】
＜＜関数リスト生成処理：ステップＳ２１＞＞
図９は、本実施の形態に係る関数リスト生成処理のフローチャートである。
関数リスト生成部１４１は、関数リスト生成処理を行う。関数リスト生成部１４１は、構文解析結果２１から（１）関数名と（５）参照関数を抽出し、関数リスト２２を生成する。図７の関数リスト２２０は、図８のソースコードに基づいて生成されている。
【００３６】
ステップＳ１０１において、関数リスト生成部１４１は、構文解析結果２１から（１）関数名と（５）参照関数の情報を抽出する。
ステップＳ１０２において、関数リスト生成部１４１は、図７の関数リスト２２０に示すように、ステップＳ１０１で抽出した全ての関数を１行目と１列目に並べる。
ステップＳ１０３において、関数リスト生成部１４１は、関数リスト２２０の２行２列目以降の数値部分を構文解析結果＿関数の（５）参照関数に応じて入力する。関数リスト２２０の数値部分は、１列目の関数が２列目以降の関数を参照している場合１を格納し、参照していない場合は０を格納する。図８のソースコードを例にすると、ソースコード２０１ではｍａｉｎ関数はｆｕｎｃＡを参照しているので１、ｍａｉｎ関数はｆｕｎｃＡ以外の関数を参照していないので０を格納する。
以上の処理で関数リスト２２０を生成する。
【００３７】
なお、ここで、図４および図８のソースコードについて簡単に説明する。
図４および図８のソースコードでは、説明を分かり易くするために、ｉｎｔ型で宣言された変数については、「＿ｖａｌ」を付しており、ｉｎｔ＊型で宣言されたポインタ型の変数については、「＿ａｄｄｒ」を付している。
「ｉｎｔ＊  ｐａ＿ａｄｄｒ」と宣言された場合、ｐａ＿ａｄｄｒはｉｎｔのポインタ型であることを示す。また、ｉｎｔ型で宣言された変数ｇｌｏｂａｌ＿ｖａｌについて、「＆ｇｌｏｂａｌ＿ｖａｌ」はｇｌｏｂａｌ＿ｖａｌのアドレスを示す。
【００３８】
＜＜アドレス渡し判定処理：ステップＳ２２＞＞
図１０は、本実施の形態に係るアドレス渡し判定処理のフローチャートである。
アドレス渡し判定部１４２は、構文解析結果２１を用いて、関数の中で引数のアドレス渡しを行っているかを確認する。アドレス渡し判定部１４２は、構文解析結果２１に基づいて、複数の関数の各々の引数である変数が参照しているアドレスを設定したアドレス参照確認表２５を生成する。そして、アドレス渡し判定部１４２は、アドレス参照確認表２５に基づいて、引数のアドレス渡しを行っている特定関数を判定する。アドレス渡し判定部１４２は、判定結果に応じて関数リスト２２の内容を更新する。引数のアドレス渡しの判定対象は関数リスト２２内の全ての関数である。
【００３９】
引数のアドレス渡し判定処理の内容を図１０のフローチャートと図４のソースコード２００と図５の構文解析結果＿大域変数と図６の構文解析結果＿関数を例に説明する。
ステップＳ１１１において、アドレス渡し判定部１４２は、構文解析結果＿関数２１１の（２−１）仮引数名および（２−２）仮引数の型を確認し、仮引数にポインタ記述が存在するか確認する。存在しない場合、処理を終了する。存在する場合はステップＳ１１２の処理を行う。
【００４０】
図１１は、本実施の形態に係るアドレス参照確認表２５の例を表す図である。
ステップＳ１１２において、アドレス渡し判定部１４２は、引数のアドレス渡しの有無を確認するため、図１１に示すようなアドレス参照確認表２５を生成する。アドレス参照確認表２５は、変数がどの変数のアドレスを参照しているかを記憶するものである。まず、アドレス参照を確認する変数を列挙する。アドレス渡し判定部１４２は、構文解析結果＿関数２１１の（２−１）仮引数名と（３−１）変数名を抽出し、アドレス参照確認表２５の変数列に加える。アドレス渡し判定部１４２は、（２−１）仮引数名をアドレス参照確認表２５に挿入する際には、アドレス参照確認表２５の参照アドレス列に仮引数が示している変数のアドレスも入力する。
図４のソースコード２００では、ｆｕｎｃＴｅｓｔＡを使用している関数を記載していないので仮引数ｐａ＿ａｄｄｒが示している変数のアドレスが定まらない。ここではｆｕｎｃＴｅｓｔＡの仮引数ｐａ＿ａｄｄｒが示しているアドレスをｐｉｎｔ＿ｖａｌとして、後の処理を説明する。ここまでの処理を用いて構文解析結果＿関数２１１に対して変数抽出を実施した場合、アドレス参照確認表５１１が生成できる。
【００４１】
ステップＳ１１３において、アドレス渡し判定部１４２は、アドレス参照確認表２５に加えた変数のアドレス参照状態を確認する。アドレスの参照状態を確認するためには、構文解析結果＿関数の（４）変数同士の代入を上から確認していく。図６の構文解析結果＿関数２１１の場合、（４）変数同士の代入の一番上は「ｐｂ＿ａｄｄｒ＝ｐａ＿ａｄｄｒ」である。ｐｂ＿ａｄｄｒとｐａ＿ａｄｄｒの型を確認するため、構文解析結果＿関数２１１の（２−１）仮引数名（２−２）仮引数の型（３−１）変数名（３−２）変数の型を探索する。変数ｐｂ＿ａｄｄｒは構文解析結果＿関数２１１の（３−１）変数名と（３−２）仮引数の型により「ｉｎｔ＊」であることが確認できる。また、変数ｐａ＿ａｄｄｒは（２−１）仮引数名と（２−２）仮引数により「ｉｎｔ＊」であることが確認できる。また、アドレス参照確認表２５によって、ｐａ＿ａｄｄｒはｐａ＿ａｄｄｒのアドレスを示していることが確認できる。よってｐｂ＿ａｄｄｒ＝ｐａ＿ａｄｄｒはｐｂ＿ａｄｄｒにｐａ＿ａｄｄｒのアドレスを渡していることが確認できる。この場合、アドレス渡し判定部１４２は、アドレス参照確認表５１１の変数ｐｂ＿ａｄｄｒの右枠にｐｉｎｔ＿ｖａｌを格納する。格納した結果がアドレス参照確認表５１２である。
【００４２】
同様の処理を構文解析結果＿関数２１１の（４）変数同士の代入の「ｐｃ＿ａｄｄｒ＝ｐｂ＿ａｄｄｒ」にも実施する。実施した結果がアドレス参照確認表５１３である。
また、構文解析結果＿関数２１１の（４）変数同士の代入の「＊ｐｃ＿ａｄｄｒ＝ｇｌｏｂａｌ＿ｖａｌ」において、変数ｐｃ＿ａｄｄｒは構文解析結果＿関数２１１より「ｉｎｔ＊」であることが確認できる。変数ｇｌｏｂａｌ＿ｖａｌは構文解析結果＿関数２１１には存在しない。その場合、変数の探索域を構文解析結果＿大域変数２１０に変更する。構文解析結果＿大域変数２１０で変数ｇｌｏｂａｌ＿ｖａｌは「ｉｎｔ」であることが確認できる。よって＊ｐｃ＿ａｄｄｒ＝ｇｌｏｂａｌ＿ｖａｌはアドレス渡し、すなわちアドレスの代入ではなく、値渡し、すなわち値の代入であることが確認できる。値渡しの場合、アドレス参照確認表２５の更新は行わない。
＊ｐｃ＿ａｄｄｒ＝ｇｌｏｂａｌ＿ｖａｌについてさらに説明する。ｐｃはｉｎｔ型ポインタである。ｉｎｔ型ポインタであるｐｃを「＊ｐｃ」と記載した場合、参照されるのはｐｃのアドレスに格納された「値」である。ｇｌｏｂａｌ＿ｖａｌはｉｎｔ型なので、「ｇｌｏｂａｌ＿ｖａｌ」と記載した場合、参照されるのはｇｌｏｂａｌ＿ｖａｌに格納された「値」である。よって、これにより＊ｐｃ＿ａｄｄｒ＝ｇｌｏｂａｌ＿ｖａｌは、値同士の代入であることが確認できる。
【００４３】
ステップＳ１１４において、アドレス渡し判定部１４２は、アドレス参照確認表２５で引数のアドレス参照判定を行う。構文解析結果＿関数２１１の（６）実引数に記載されている変数が仮引数のアドレスを示している場合、引数のアドレス参照「有」と判定し、示していない場合は「無」と判定する。「有」と判定した場合、ステップＳ１１５の処理を行い、「無」の場合は処理を終了する。
図６の構文解析結果＿関数２１１の場合、（６）実引数に記載されているのは変数ｐｃ＿ａｄｄｒであり、アドレス参照確認表２５３によるとｐｃ＿ａｄｄｒが示しているアドレスはｐｉｎｔ＿ｖａｌである。構文解析結果＿関数２１１によると仮引数ｐａ＿ａｄｄｒが示しているアドレスもｐｉｎｔ＿ｖａｌなので、ｆｕｎｃＴｅｓｔＡはｆｕｎｃＴｅｓｔＢに引数のアドレス渡しを行っていることが確認できる。よって、アドレス渡し判定部１４２は、「有」と判定する。実引数ｐｃ＿ａｄｄｒが示しているアドレスがｐｉｎｔ＿ｖａｌであることが確認できたので、構文解析結果＿関数２１１の（９）実引数参照アドレスと構文解析結果＿関数２１２の（８）仮引数参照アドレスにｐｉｎｔ＿ｖａｌを入力する。
【００４４】
ステップＳ１１５において、アドレス渡し判定部１４２は、ステップＳ１１４で「有」と判定された関数の参照は関数リスト２２において−１を格納する。図８のソースコードを対象に引数のアドレス渡し参照確認を行った結果が図９の関数リスト２２１である。関数同士の参照がない場合は「０」、アドレス渡し以外の参照は「１」、アドレス渡しを行った参照は「−１」を格納している。
以上の処理により、参照関数について引数のアドレス渡しを判定する。
【００４５】
＜＜階層カウント処理：ステップＳ２３＞＞
図１２は、本実施の形態に係る階層カウント処理のフローチャートである。
図１３は、本実施の形態に係る関数ツリー２３の例を表す図である。
階層カウント部１４３は、関数リスト２２に基づいて、複数の関数の関数同士の参照関係をツリー構造で表現した関数ツリー２３を生成する。そして、階層カウント部１４３は、関数ツリー２３と構文解析結果２１とに基づいて、関数ツリー２３のノードとなる各関数の階層を連続回数としてカウントする。
階層カウント部１４３は、図１３に示すように、関数参照をツリー構造で表現した関数ツリー２３を生成し、関数ツリー２３のノードとなる各関数に階層を設定する。階層カウント部１４３は、関数リスト２２を基に関数ツリー２３を生成する。階層カウント処理について、図１２のフローチャートと図７の関数リスト２２１を用いて説明する。
【００４６】
ステップＳ１３１において、階層カウント部１４３は、関数リスト２２１の２行目の関数を参照関係確認関数に指定する。関数リスト２２１において２行目の関数はｍａｉｎであるので、ｍａｉｎが参照関係確認関数として指定される。
ステップＳ１３２において、階層カウント部１４３は、参照関係確認関数に指定された関数を関数ツリーの要素として配置する。ここでの「配置」とは関数ツリーの各要素を区別できるような位置情報を振ることを意味する。具体的には、２次元空間上の座標情報を位置情報とし、２次元における横情報をＸ、縦情報をＹとし、座標情報を（Ｘ、Ｙ）と表現とする場合、（０、４）あるいは（−１、０）といった情報を参照関係確認関数に振り、２次元空間上に存在する要素同士を区別できるようにする。上記の例は一例であり、関数ツリーという情報を表現できれば位置情報の振り方は問わない。
【００４７】
ステップＳ１３３において、階層カウント部１４３は、関数ツリー上において参照関係にある要素同士を線で結ぶ処理を行う。結ぶ対象は、参照関係確認関数と一つ前の再帰で関数ツリー２３に配置した要素である。「一つ前の再帰で関数ツリー２３に配置した要素」とは参照関係確認関数を参照している関数を表す。例えば、関数リスト２２１のｆｕｎｃＡを参照関係確認関数とした場合、ｆｕｎｃＡを参照しているのはｍａｉｎであるので、ｆｕｎｃＡとｍａｉｎを図１３の関数ツリー２３のように線で接続する。
【００４８】
ステップＳ１３４において、階層カウント部１４３は、参照関係確認関数がアドレス渡しを行っているかを確認する。アドレス渡しを行っているかを確認するには、関数リスト２２１における参照関係確認関数の行に「−１」が存在しないかを確認する。確認した結果、引数のアドレス渡しが存在する場合はステップＳ１３５の処理を行う。存在しない場合はステップＳ１３６の処理を行う。具体的には、参照関係確認関数がｆｕｎｃＡの場合、関数リスト２２１においてｆｕｎｃＡは３行目であり、３行目には「−１」が存在するので、ステップＳ１３５の処理を実行する。
【００４９】
ステップＳ１３５において、階層カウント部１４３は、関数ツリー上の参照関係確認関数に階層値を振る。階層値の値は「階層＝同じアドレスを渡した回数」とする。「同じアドレスを渡した回数」とは、構文解析結果＿関数において、（８）仮引数参照アドレスと（９）実引数参照アドレスが同じである回数を示す。具体的には、図６の構文解析結果＿関数２１１の場合、（８）仮引数参照アドレスと（９）実引数参照アドレスが同じなので１階層目とする。ｆｕｎｃＴｅｓｔＡが参照しているｆｕｎｃＴｅｓｔＢの（８）仮引数参照アドレスと（９）実引数参照アドレスがｆｕｎｃＴｅｓｔＡと同様であるならばｆｕｎｃＴｅｓｔＢを２階層目とする。以下同様に同じアドレスを渡した回数をカウントし、階層値とする。なお引数が複数あり、異なる引数でアドレスを連続して渡している場合は、連続してアドレス渡している回数が最も大きいものを階層値とする。具体的には、引数１で渡されているアドレスは３回連続で渡されており、引数２で渡されているアドレスは４回連続である場合には、４を階層値とする。
【００５０】
ステップＳ１３６において、階層カウント部１４３は、関数ツリー上の参照関係確認関数に階層値を振る。階層値の初期値は「階層＝０」とする。
ステップＳ１３７において、階層カウント部１４３は、参照関係確認関数が参照している関数がないか関数リスト２２で確認する。参照している関数がある場合、階層カウント部１４３は、参照している関数ごとにステップＳ１３８の処理を実行する。参照している関数がない場合、階層カウント処理を終了する。参照関係確認関数をｆｕｎｃＡとした場合、ｆｕｎｃＡは関数リスト２２１によるとｆｕｎｃＢ、ｆｕｎｃＣ、ｆｕｎｃＤを参照しているので、参照しているそれぞれの関数に対してステップＳ１３８の処理を行う。ステップＳ１３８の処理を行う順番は問わないものとする。なお、図１２のフローチャートには関数リストの左列から右列に向かって参照関数の有無を確認するアルゴリズムを記載しているが、すべての関数の参照関係を確認できるのであれば方法は問わない。
【００５１】
ステップＳ１３８において、階層カウント部１４３は、参照関係確認関数が参照している関数を参照関係確認関数としてステップＳ１３０からステップＳ１３９の処理を実施する。実施が完了したら、参照関係確認関数を元の関数に戻し、ステップＳ１３９の処理を実施する。具体的には、参照関係確認関数をｆｕｎｃＡとした場合、ｆｕｎｃＡはｆｕｎｃＢ、ｆｕｎｃＣ、ｆｕｎｃＤを参照しているので、ｆｕｎｃＢ、ｆｕｎｃＣ、ｆｕｎｃＤを参照関係確認関数としてステップＳ１３０からステップＳ１３９を実施する。ｆｕｎｃＢ、ｆｕｎｃＣ、ｆｕｎｃＤに対してステップＳ１３０からステップＳ１３９の処理をそれぞれ実施したら、参照関係確認関数をｆｕｎｃＡに戻し、階層カウント処理終了する。
以上の処理により、図１３のような関数ツリー２３を生成する。階層カウント部１４３は、生成した関数ツリー２３を記憶部１７０に記憶する。
【００５２】
ここで、構造分析部１４０が、無限に階層をカウントさせる複数の関数の構造を検出し、無限カウントを防止する処理について説明する。階層カウント処理において、構造的に無限に階層をカウントしてしまう関数呼び出しについて、無限カウントを防止する。無限に階層をカウントする関数呼び出しとは、具体的には、「ｆｕｎｃＡ→ｆｕｎｃＢ→ｆｕｎｃＣ→ｆｕｎｃＡ→ｆｕｎｃＢ→…」のようなものである。ｆｕｎｃＣがｆｕｎｃＡを呼び出しているので、無限に「ｆｕｎｃＡ→ｆｕｎｃＢ→ｆｕｎｃＣ」のループが行われる。これを防止するために、階層カウント処理対象である参照関係確認関数を記憶し、記憶した中に同じ関数が存在する場合、処理を終了するという処理を加える。下記に処理の例を説明する。
【００５３】
図１２のステップＳ１３１に処理を追加したものをステップＳ１３１Ａとし、ステップＳ１３９に処理を加えたものをステップＳ１３９Ａとする。なお、参照関係確認関数を記憶するデータ構造はスタックとする。
ステップＳ１３１Ａにおいて、階層カウント部１４３は、参照関係確認関数を指定する。階層カウント部１４３は、参照関係確認関数をデータ記憶領域にプッシュする。参照関係確認関数と同じ関数が存在する場合、ステップＳ１３９Ａの処理を行う。
ステップＳ１３９Ａにおいて、階層カウント部１４３は、ステップＳ１３１Ａで追加した参照関係確認関数をポップする。
上記のような処理を加えた上で、「ｆｕｎｃＡ→ｆｕｎｃＢ→ｆｕｎｃＣ→ｆｕｎｃＡ→ｆｕｎｃＢ→…」のような構造を処理すると２回目のｆｕｎｃＡで階層カウント処理を中断することができる。
以上のような処理で無限階層カウントを防止する。
【００５４】
＜監視処理：Ｓ３０＞
ステップＳ３０において、監視部１５０は、連続回数が、特定関数により引数のアドレス渡しが行われていることを警告するための警告条件２４を満たすか否かを監視する。そして、監視部１５０は、連続回数が警告条件２４を満たす場合に、特定関数により引数のアドレス渡しが行われていることを警告する警告情報３０を出力する。
具体的には、監視部１５０は、利用者が設定した警告条件と関数ツリーの中に条件が一致しているものがないか確認する。監視処理は条件一致確認処理ともいう。また、監視部１５０は、警告条件２４と一致している場合は警告情報３０を出力する。図３の警告条件２４と、図１３の関数ツリー２３を例に説明する。警告条件２４には、「引数のアドレス渡しを３回連続して行った関数を特定関数として検知する」ことが設定されている。図１３の関数ツリー２３では、引数のアドレス渡しを３回連続行っているのはｍａｉｎから辿って、ｆｕｎｃＡ、ｆｕｎｃＣ、を経由したｆｕｎｃＢである。よって、監視部１５０は、ｆｕｎｃＢを特定関数とする。監視部１５０は、警告条件２４に条件が一致するプログラムを検知すると、出力インタフェース９４０を介して、ディスプレイといった表示機器に警告情報３０を出力する。これにより、警告情報３０が利用者に通知される。
【００５５】
以上の説明により、本実施の形態では、引数のアドレス渡しを特定の記述として、Ｎ回数以上連続してアドレス渡しが行われたことを警告するソフトウェア開発装置１００を実現する。
【００５６】
＊＊＊他の構成＊＊＊
＜変形例１＞
本実施の形態では、表示機器に警告情報を出力している。しかし、利用者が容易に条件一致を確認できるように、表示機器に記憶部１７０に記憶された関数ツリー２３を表示してもよい。また、監視部がＮ回以上の引数のアドレス渡しを検知した場合、警告をポップアップ表示する、あるいは、関数ツリー要素、すなわち特定関数を強調表示してもよい。その他、利用者が容易に特定関数を確認できるような表示であれば、表示方法は問わない。
以上により、利用者が容易に警告条件一致を確認できるようになる。
【００５７】
＜変形例２＞
ソフトウェア開発装置１００がネットワークを介して他の装置と通信する通信装置を備えていてもよい。通信装置は、レシーバとトランスミッタを有する。通信装置は、有線または無線で、ＬＡＮ、インターネット、あるいは電話回線といった通信網に接続している。通信装置は、具体的には、通信チップまたはＮＩＣ（Ｎｅｔｗｏｒｋ  Ｉｎｔｅｒｆａｃｅ  Ｃａｒｄ）である。ソフトウェア開発装置１００は、通信装置を介して、外部の装置から警告条件あるいはソースコードを受信してもよい。あるいは、ソフトウェア開発装置１００は、通信装置を介して、警告情報を外部の装置に送信してもよい。
【００５８】
＜変形例３＞
本実施の形態では、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能がソフトウェアで実現される。変形例として、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能がハードウェアで実現されてもよい。
【００５９】
図１４は、本実施の形態の変形例に係るソフトウェア開発装置１００の構成を示す図である。
ソフトウェア開発装置１００は、電子回路９０９、メモリ９２１、補助記憶装置９２２、入力インタフェース９３０、および出力インタフェース９４０を備える。
【００６０】
電子回路９０９は、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能を実現する専用の電子回路である。
電子回路９０９は、具体的には、単一回路、複合回路、プログラム化したプロセッサ、並列プログラム化したプロセッサ、ロジックＩＣ、ＧＡ、ＡＳＩＣ、または、ＦＰＧＡである。ＧＡは、Ｇａｔｅ  Ａｒｒａｙの略語である。ＡＳＩＣは、Ａｐｐｌｉｃａｔｉｏｎ  Ｓｐｅｃｉｆｉｃ  Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔの略語である。ＦＰＧＡは、Ｆｉｅｌｄ−Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙの略語である。
警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能は、１つの電子回路で実現されてもよいし、複数の電子回路に分散して実現されてもよい。
別の変形例として、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の一部の機能が電子回路で実現され、残りの機能がソフトウェアで実現されてもよい。
【００６１】
プロセッサと電子回路の各々は、プロセッシングサーキットリとも呼ばれる。つまり、ソフトウェア開発装置１００において、警告条件受付部１１０とエディタ部１２０と構文解析部１３０と構造分析部１４０と監視部１５０とコンパイル部１６０の機能は、プロセッシングサーキットリにより実現される。
【００６２】
ソフトウェア開発装置１００において、警告条件受付部、構文解析部、構造分析部、および監視部の「部」を「工程」あるいは「処理」に読み替えてもよい。また、警告条件受付処理、構文解析処理、構造分析処理、および監視処理の「処理」を「プログラム」、「プログラムプロダクト」または「プログラムを記録したコンピュータ読取可能な記憶媒体」に読み替えてもよい。
【００６３】
＊＊＊本実施の形態の効果の説明＊＊＊
本実施の形態に係るソフトウェア開発装置１００は、静的解析時間を増加させる記述を引数のアドレス渡しとし、ソースコードに含まれる引数のアドレス渡しを行っている関数を抽出する。また、Ｎ階層以上連続してアドレス渡しを行っている関数を特定関数とし、利用者に特定関数の是正を通達することで、静的解析時間の増加を抑制する。よって、本実施の形態に係るソフトウェア開発装置１００によれば、静的解析ツールの解析時間増加を抑制することができる。
【００６４】
また、本実施の形態に係るソフトウェア開発装置１００によれば、アドレス渡しの階層カウントにおいて、無限に階層をカウントさせる構造を持つ単数および複数の関数の構造的特長を検出し、無限カウントを防止することができる。
【００６５】
実施の形態２．
本実施の形態では、主に、実施の形態１と異なる点について説明する。なお、実施の形態１で説明した構成と同様の構成について同一の符号を付し、その説明を省略する。
【００６６】
図１５を用いて、本実施の形態に係るソフトウェア開発装置１００ａの構成を説明する。
本実施の形態に係るソフトウェア開発装置１００ａは、実施の形態１の構成に加え、是正強制部１８０を備える。是正強制部１８０は、利用者にソースコードの是正を強制できる機能を有する。是正強制部１８０は、警告条件２４を満たしてしまうソースコード記述がある場合に利用者にソースコードの是正を強制させる。是正を強制させるために、具体的には、新たな関数の実装をさせなくすること、あるいは、コンパイルを実行できなくすることといった機能が挙げられる。
【００６７】
本実施の形態では、ソフトウェア開発装置１００は、監視部１５０が警告情報３０を出力すると、警告情報３０が解消されるまでソースコードのコンパイルを制限する制限部１８１を備えている。ソースコードの編集を停止させる機能の例として。是正強制部１８０は制限部１８１を備える。制限部１８１は監視部１５０の警告情報に基づいて、コンパイル部１６０を起動あるいは停止させる機能を有する。監視部１５０が警告条件２４の一致を検知した場合、制限部１８１は検知情報を受け取り、コンパイル部１６０を停止する。利用者がソースコードを修正し、監視部１５０からの検知情報が失われた場合、制限部１８１はコンパイル部１６０を起動する。
以上により、利用者にソースコードの是正を強制することができる。
【００６８】
実施の形態３．
本実施の形態では、主に、実施の形態１と異なる点について説明する。なお、実施の形態１で説明した構成と同様の構成について同一の符号を付し、その説明を省略する。
【００６９】
図１６を用いて、本実施の形態に係るソフトウェア開発装置１００ｂの構成を説明する。
本実施の形態に係るソフトウェア開発装置１００ｂは、実施の形態１の構成に加え、一時保管部１９０を備える。一時保管部１９０は、エディタ部により編集されているソースコードを一時的に保管し、利用者のソースコード編集と並行して警告出力を行えるようにする。上述した実施の形態１および２では、利用者がソースコードを記憶部１７０に保存しない限り、解析対象が記憶部１７０に存在しないので、解析を始めることができなかった。そこで、本実施の形態では、一時保管部１９０を追加し、エディタ部１２０が特定のタイミングでソースコードを保存することで、利用者が意図せずとも解析対象を確保することができ、ソースコード解析から警告出力を行えるようにする。
【００７０】
一時保管部１９０は利用者がエディタ部１２０で編集中のソースコードを一時的保存する記憶媒体である。図１６では、一時保管部１９０は、メモリ９２１において記憶部１７０とは異なるエリアに設けられている。一時保管部１９０で扱う記憶媒体はソースコードを一時保存できる記憶媒体であれば、種類は問わない。具体的には、ＲＡＭでも良いし、ＨＤＤでも良い。
また、エディタ部１２０が一時保管部１９０に保存するタイミングは問わない。具体的には、一定周期でも良いし、利用者によりキーボードの改行を打った時でも良い。
【００７１】
構文解析部１３０は、一時保管部１９０に保管されているソースコードから構文解析結果２１を取得する。構文解析部１３０は、一時保管部１９０に存在するソースコードを解析し、構造分析部１４０は構文解析の解析が終了し次第、即座に構文解析結果２１を分析する。また、監視部１５０は構造分析部１４０の分析が終了し次第、即座に分析結果と条件を比較し、条件一致を検出する。
以上により、利用者のソースコード編集と並行して警告出力を行えるようにする。
【００７２】
本実施の形態では、ソフトウェア開発装置の各部を独立した機能ブロックとして説明した。しかし、ソフトウェア開発装置の構成は、上述した実施の形態のような構成でなくてもよい。ソフトウェア開発装置の機能ブロックは、上述した実施の形態で説明した機能を実現することができれば、どのような構成でもよい。
【００７３】
実施の形態１から３のうち、複数の部分を組み合わせて実施しても構わない。あるいは、これらの実施の形態のうち、１つの部分を実施しても構わない。その他、これらの実施の形態を、全体としてあるいは部分的に、どのように組み合わせて実施しても構わない。
なお、上述した実施の形態は、本質的に好ましい例示であって、本発明の範囲、本発明の適用物の範囲、および本発明の用途の範囲を制限することを意図するものではない。上述した実施の形態は、必要に応じて種々の変更が可能である。
【符号の説明】
【００７４】
２０，１９１，２００，２０１，２０２，２０３，２０４，２０５，２０６  ソースコード、２１  構文解析結果、２１０  構文解析結果＿大域変数、２１１，２１２  構文解析結果＿関数、２２，２２０，２２１  関数リスト、２３  関数ツリー、２４  警告条件、２５，５１１，５１２，５１３  アドレス参照確認表、３０  警告情報、１００，１００ａ，１００ｂ  ソフトウェア開発装置、１１０  警告条件受付部、１２０  エディタ部、１３０  構文解析部、１４０  構造分析部、１４１  関数リスト生成部、１４２  アドレス渡し判定部、１４３  階層カウント部、１５０  監視部、１６０  コンパイル部、１７０  記憶部、１８０  是正強制部、１８１  制限部、１９０  一時保管部、９０９  電子回路、９１０  プロセッサ、９２１  メモリ、９２２  補助記憶装置、９３０  入力インタフェース、９４０  出力インタフェース、Ｓ１００  ソフトウェア開発処理。
【図１】
2019109639.tif 000003
【図２】
2019109639.tif 000004
【図３】
2019109639.tif 000005
【図４】
2019109639.tif 000006
【図５】
2019109639.tif 000007
【図６】
2019109639.tif 000008
【図７】
2019109639.tif 000009
【図８】
2019109639.tif 000010
【図９】
2019109639.tif 000011
【図１０】
2019109639.tif 000012
【図１１】
2019109639.tif 000013
【図１２】
2019109639.tif 000014
【図１３】
2019109639.tif 000015
【図１４】
2019109639.tif 000016
【図１５】
2019109639.tif 000017
【図１６】
2019109639.tif 000018