(57)【要約】      （修正有）【課題】ソースコードの中の注目すべき関数を絞り込むことができるソースコード解析装置を提供する。【解決手段】ソースコード解析装置１００は、受付部１１１と第１解析部１１２と第２解析部１１３と第３解析部１１４と絞り込み部１１５等を備える。受付部は、１つ以上の変数と１つ以上の関数とを含む、第１ソースコードと第２ソースコードとを受け付ける。第１解析部は、第１ソースコードに含まれる１つ以上の変数のうち第２ソースコードに含まれる関数からアクセスされる変数である注目変数にアクセスする１つ以上のアクセス関数を第１ソースコードから見つける。第２解析部は、脆弱条件を満たす１つ以上の脆弱関数を第１ソースコードから見つける。絞り込み部は、１つ以上の脆弱関数から１つ以上のアクセス関数に含まれる脆弱関数を注目関数として選択する。【選択図】図１
2019168753.tif 000002
【特許請求の範囲】
【請求項１】
第１ソースコードに含まれる１つ以上の変数のうち第２ソースコードに含まれる関数からアクセスされる変数である注目変数にアクセスする１つ以上のアクセス関数を前記第１ソースコードから見つける第１解析部と、
脆弱条件を満たす１つ以上の脆弱関数を前記第１ソースコードから見つける第２解析部と、
前記１つ以上の脆弱関数から前記１つ以上のアクセス関数に含まれる脆弱関数を注目関数として選択する絞り込み部と
を備えるソースコード解析装置。
【請求項２】
１つ以上の注目関数のそれぞれについて前記注目変数に対するアクセス頻度を算出する第３解析部と、
前記１つ以上の注目関数のそれぞれのアクセス頻度に基づいて前記１つ以上の注目関数に優先順位を付ける順位付け部と
を備える請求項１に記載のソースコード解析装置。
【請求項３】
前記１つ以上の注目関数が前記優先順位に従って並んだ状態で前記１つ以上の注目関数を表示する表示部
を備える請求項２に記載のソースコード解析装置。
【請求項４】
１つ以上の注目関数のそれぞれの呼び出しタイミングを特定する第３解析部と、
前記１つ以上の注目関数のそれぞれの呼び出しタイミングに基づいて前記１つ以上の注目関数に優先順位を付ける順位付け部と
を備える請求項１に記載のソースコード解析装置。
【請求項５】
前記１つ以上の注目関数が前記優先順位に従って並んだ状態で前記１つ以上の注目関数を表示する表示部
を備える請求項４に記載のソースコード解析装置。
【請求項６】
第１ソースコードに含まれる１つ以上の変数のうち第２ソースコードに含まれる関数からアクセスされる変数である注目変数にアクセスする１つ以上のアクセス関数を前記第１ソースコードから見つける第１解析部と、
脆弱条件を満たす１つ以上の脆弱関数を前記第１ソースコードから見つける第２解析部と、
前記１つ以上の脆弱関数から前記１つ以上のアクセス関数に含まれる脆弱関数を注目関数として選択する絞り込み部
としてコンピュータを機能させるためのソースコード解析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコードを解析する技術に関するものである。
【背景技術】
【０００２】
特許文献１は、次のような変更影響分析技術を開示している。
指定されたソースコードをもとに、プログラム要素間の依存関係が分析される。そして、依存強度が表の交点に示される。これにより、ソースコードの変更における影響範囲が特定される。
【０００３】
特許文献２は、次のようなソフトウェア分析技術を開示している。
ソフトウェアの静的解析結果としてソフトウェアの問題点が出力される。そして、問題点の発生箇所を知らせる警告が表示される。また、ソフトウェアの品質の尺度となるメトリックスが分析される。そして、メトリックスが表示される。これにより、的確な問題点の指摘および効率的な問題点の把握が可能となる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開２０１７／１４１８９３号公報
【特許文献２】特許第４９２０４４１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記の通り、特許文献１には、ソフトウェアに関して、修正すべき依存関係を特定する変更影響範囲を分析する技術が記載されている。また、特許文献２には、ソフトウェアに関して、静的解析により、修正を要する箇所の警告を出力する技術が記載されている。
しかし、ソフトウェアが巨大化または複雑化すると、修正を要する箇所の警告が多数出る可能性がある。例えば、実際には呼び出されないデッドコード等も含めて、数千の警告が出る可能性がある。この場合、限られた時間で、ソフトウェア設計者がすべての箇所を修正することは困難である。
【０００６】
本発明は、対象システムのソースコードから注目すべき関数を絞り込むことができるようにすることを目的とする。
【課題を解決するための手段】
【０００７】
本発明のソースコード解析装置は、
第１ソースコードに含まれる１つ以上の変数のうち第２ソースコードに含まれる関数からアクセスされる変数である注目変数にアクセスする１つ以上のアクセス関数を前記第１ソースコードから見つける第１解析部と、
脆弱条件を満たす１つ以上の脆弱関数を前記第１ソースコードから見つける第２解析部と、
前記１つ以上の脆弱関数から前記１つ以上のアクセス関数に含まれる脆弱関数を注目関数として選択する絞り込み部とを備える。
【発明の効果】
【０００８】
本発明によれば、対象システムのソースコード（第１ソースコード）から注目すべき関数を絞り込むことができる。
例えば、ソフトウェアの修正箇所を効率よく絞り込むことが可能となる。
【図面の簡単な説明】
【０００９】
【図１】実施の形態１におけるソースコード解析装置１００の構成図。
【図２】実施の形態１におけるソースコード解析方法のフローチャート。
【図３】実施の形態１における受付処理（Ｓ１１０）のフローチャート。
【図４】実施の形態１における第１解析処理（Ｓ１２０）のフローチャート。
【図５】実施の形態１における第２解析処理（Ｓ１３０）のフローチャート。
【図６】実施の形態１における第３解析処理（Ｓ１４０）のフローチャート。
【図７】実施の形態１における絞り込み処理（Ｓ１５０）のフローチャート。
【図８】実施の形態１における順位付け処理（Ｓ１６０）のフローチャート。
【図９】実施の形態１における表示処理（Ｓ１７０）のフローチャート。
【図１０】実施の形態１におけるソースコード解析方法の具体例を示す図。
【図１１】実施の形態２におけるソースコード解析方法のフローチャート。
【図１２】実施の形態２における第３解析処理（Ｓ２４０）のフローチャート。
【図１３】実施の形態２におけるソースコード解析方法の具体例を示す。
【発明を実施するための形態】
【００１０】
実施の形態および図面において、同じ要素および対応する要素には同じ符号を付している。同じ符号が付された要素の説明は適宜に省略または簡略化する。図中の矢印はデータの流れ又は処理の流れを主に示している。
【００１１】
実施の形態１．
ソースコードの中の注目すべき関数を絞り込む形態について、図１から図１０に基づいて説明する。
【００１２】
＊＊＊構成の説明＊＊＊
図１に基づいて、ソースコード解析装置１００の構成を説明する。
ソースコード解析装置１００は、プロセッサ１０１とメモリ１０２と補助記憶装置１０３と入出力インタフェース１０４といったハードウェアを備えるコンピュータである。これらのハードウェアは、信号線を介して互いに接続されている。
【００１３】
プロセッサ１０１は、演算処理を行うＩＣ（Ｉｎｔｅｇｒａｔｅｄ  Ｃｉｒｃｕｉｔ）であり、他のハードウェアを制御する。例えば、プロセッサ１０１は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）、ＤＳＰ（Ｄｉｇｉｔａｌ  Ｓｉｇｎａｌ  Ｐｒｏｃｅｓｓｏｒ）、またはＧＰＵ（Ｇｒａｐｈｉｃｓ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）である。
メモリ１０２は揮発性の記憶装置である。メモリ１０２は、主記憶装置またはメインメモリとも呼ばれる。例えば、メモリ１０２はＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）である。メモリ１０２に記憶されたデータは必要に応じて補助記憶装置１０３に保存される。
補助記憶装置１０３は不揮発性の記憶装置である。例えば、補助記憶装置１０３は、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）、またはフラッシュメモリである。補助記憶装置１０３に記憶されたデータは必要に応じてメモリ１０２にロードされる。
入出力インタフェース１０４は入力装置および出力装置が接続されるポートである。例えば、入出力インタフェース１０４はＵＳＢ端子であり、入力装置はキーボードおよびマウスであり、出力装置はディスプレイである。ＵＳＢはＵｎｉｖｅｒｓａｌ  Ｓｅｒｉａｌ  Ｂｕｓの略称である。
【００１４】
ソースコード解析装置１００は、受付部１１１と第１解析部１１２と第２解析部１１３と第３解析部１１４と絞り込み部１１５と順位付け部１１６と表示部１１７といった要素を備える。これらの要素はソフトウェアで実現される。
【００１５】
補助記憶装置１０３には、受付部１１１と第１解析部１１２と第２解析部１１３と第３解析部１１４と絞り込み部１１５と順位付け部１１６と表示部１１７としてコンピュータを機能させるためのソースコード解析プログラムが記憶されている。ソースコード解析プログラムは、メモリ１０２にロードされて、プロセッサ１０１によって実行される。
さらに、補助記憶装置１０３にはＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が記憶されている。ＯＳの少なくとも一部は、メモリ１０２にロードされて、プロセッサ１０１によって実行される。
つまり、プロセッサ１０１は、ＯＳを実行しながら、ソースコード解析プログラムを実行する。
ソースコード解析プログラムを実行して得られるデータは、メモリ１０２、補助記憶装置１０３、プロセッサ１０１内のレジスタまたはプロセッサ１０１内のキャッシュメモリといった記憶装置に記憶される。
【００１６】
補助記憶装置１０３は記憶部１２０として機能する。但し、他の記憶装置が、補助記憶装置１０３の代わりに、又は、補助記憶装置１０３と共に、記憶部１２０として機能してもよい。
【００１７】
ソースコード解析装置１００は、プロセッサ１０１を代替する複数のプロセッサを備えてもよい。複数のプロセッサは、プロセッサ１０１の役割を分担する。
【００１８】
ソースコード解析プログラムは、光ディスクまたはフラッシュメモリ等の不揮発性の記録媒体にコンピュータで読み取り可能に記録（格納）することができる。
【００１９】
＊＊＊動作の説明＊＊＊
ソースコード解析装置１００の動作はソースコード解析方法に相当する。また、ソースコード解析方法の手順はソースコード解析プログラムの手順に相当する。
【００２０】
図２に基づいて、ソースコード解析方法を説明する。
ステップＳ１１０において、受付部１１１は、第１ソースコードと第２ソースコードとを受け付ける。
第１ソースコードは、１つ以上の変数と１つ以上の関数とを含む。
第２ソースコードは、１つ以上の変数と１つ以上の関数とを含む。
【００２１】
具体的な第１ソースコードは、対象システムで実行されるプログラムのソースコードである。対象システムは、解析対象となるシステムである。
具体的な第２ソースコードは、外部システムで実行されるプログラムのソースコードである。外部システムは、対象システムにアクセスするシステムである。
【００２２】
図３に基づいて、受付処理（Ｓ１１０）の手順を説明する。
ステップＳ１１１において、利用者は、第１ソースコードをソースコード解析装置１００に入力する。
そして、受付部１１１は、入出力インタフェース１０４を介して、第１ソースコードを受け付ける。
【００２３】
ステップＳ１１２において、受付部１１１は、第１ソースコードを記憶部１２０に記憶する。
【００２４】
ステップＳ１１３において、利用者は、第２ソースコードをソースコード解析装置１００に入力する。
そして、受付部１１１は、入出力インタフェース１０４を介して、第２ソースコードを受け付ける。
【００２５】
ステップＳ１１４において、受付部１１１は、第２ソースコードを記憶部１２０に記憶する。
【００２６】
以降の説明において、第１ソースコードと第２ソースコードとを総称してシステムソースコードと呼ぶ。
【００２７】
図２に戻り、ステップＳ１２０を説明する。
ステップＳ１２０において、第１解析部１１２は、第１ソースコードから１つ以上のアクセス関数を見つける。
アクセス関数は、第１ソースコードに含まれる１つ以上の関数のうち、注目変数にアクセスする関数である。アクセス関数には、注目変数に直接にアクセスする関数の他に、１つ以上の関数を介して注目変数にアクセスする関数が含まれる。例えば、第１関数が注目関数にアクセスする関数であり、第２関数が第１関数を呼び出す関数である場合、第１関数と第２関数とのそれぞれがアクセス関数である。例えば、アクセス関数は注目関数を参照する関数である。
注目変数は、第１ソースコードに含まれる１つ以上の変数のうち、第２ソースコードに含まれる関数からアクセスされる変数である。例えば、注目変数は第２ソースコードに含まれる関数によって更新される変数である。
【００２８】
具体的には、第１解析部１１２は、システムソースコードに対する構造解析を行うことによって、ソフトウェア要素の階層構造を生成する。
ソフトウェア要素の階層構造は、ソフトウェア要素間の依存関係を示す。主なソフトウェア要素は、変数および関数である。主な依存関係は、変数へのアクセスおよび関数の呼び出しである。
ソフトウェア要素の階層構造には、注目変数と１つ以上のアクセス関数とが含まれる。
【００２９】
例えば、第１解析部１１２は、特許文献１に開示された変更影響分析を行うことによって、ソフトウェア要素の階層構造を生成する。
【００３０】
図４に基づいて、第１解析処理（Ｓ１２０）の手順を説明する。
ステップＳ１２１において、第１解析部１１２は、システムソースコードを記憶部１２０からメモリ１０２に読み出す。
つまり、第１解析部１１２は、第１ソースコードと第２ソースコードとを記憶部１２０からメモリ１０２に読み出す。
システムソースコードがメモリ１０２に記憶されている場合、ステップＳ１２１は不要である。
【００３１】
ステップＳ１２２において、第１解析部１１２は、システムコードに対する構造解析を行う。
これにより、ソフトウェア要素の階層構造が得られる。
【００３２】
ステップＳ１２３において、第１解析部１１２は、ソフトウェア要素の階層構造を記憶部１２０に記憶する。
【００３３】
図２に戻り、ステップＳ１３０を説明する。
ステップＳ１３０において、第２解析部１１３は、第１ソースコードから１つ以上の脆弱関数を見つける。
脆弱関数は、脆弱条件を満たす関数である。
脆弱条件は、ソフトウェアに関する脆弱性を有する関数が満たす条件である。脆弱条件は予め決められる。
注目変数がバッファ変数である場合、脆弱条件は、例えば、バッファオーバーフローが発生する関数が満たす条件である。脆弱関数は、バッファオーバーフローを発生する可能性がある。バッファ変数は、バッファとして使用される変数である。
【００３４】
具体的には、第２解析部１１３は、システムソースコードに対する静的解析を行うことによって、１つ以上の脆弱関数を見つける。例えば、第２解析部１１３は、Ｋｌｏｃｗｏｒｋと呼ばれるソフトウェアを実行する。このソフトウェアは、静的解析を行うためのソフトウェアである。
【００３５】
第２解析部１１３は、特許文献２に開示されたソースコード解析を行うことによって、脆弱関数を見つけてもよい。脆弱関数は、特許文献２における警告対象の関数の一種である。
【００３６】
図５に基づいて、第２解析処理（Ｓ１３０）の手順を説明する。
ステップＳ１３１において、第２解析部１１３は、第１ソースコードを記憶部１２０からメモリ１０２に読み出す。
第１ソースコードがメモリ１０２に記憶されている場合、ステップＳ１３１は不要である。
【００３７】
ステップＳ１３２において、第２解析部１１３は、第１ソースコードに対する静的解析を行う。
これにより、１つ以上の脆弱関数が見つかる。
【００３８】
ステップＳ１３３において、第２解析部１１３は、１つ以上の脆弱関数を示す脆弱関数一覧を生成し、脆弱関数一覧を記憶部１２０に記憶する。
【００３９】
図２に戻り、ステップＳ１４０を説明する。
ステップＳ１４０において、第３解析部１１４は、１つ以上の脆弱関数のそれぞれのアクセス頻度を算出する。
アクセス頻度は、注目変数に対するアクセスの頻度である。
【００４０】
具体的には、第３解析部１１４は、第１ソースコードに対する動的解析を行うことによって、１つ以上の脆弱関数のそれぞれのアクセス頻度を算出する。例えば、第３解析部１１４は、ＤＴ１０と呼ばれるソフトウェアを実行する。このソフトウェアは、動的解析を行うためのソフトウェアである。
【００４１】
図６に基づいて、第３解析処理（Ｓ１４０）の手順を説明する。
ステップＳ１４１において、第３解析部１１４は、システムソースコードを記憶部１２０からメモリ１０２に読み出す。
つまり、第３解析部１１４は、第１ソースコードと第２ソースコードとを記憶部１２０からメモリ１０２に読み出す。
システムソースコードがメモリ１０２に記憶されている場合、ステップＳ１４１は不要である。
【００４２】
ステップＳ１４２において、第３解析部１１４は、第１ソースコードに対する動的解析を行う。
これにより、第１ソースコードに含まれる１つ以上の関数のそれぞれのアクセス頻度が算出される。第１ソースコードに含まれる１つ以上の関数には、１つ以上の脆弱関数が含まれる。
【００４３】
ステップＳ１４３において、第３解析部１１４は、第１ソースコードに含まれる１つ以上の関数のそれぞれのアクセス頻度を示すアクセス頻度一覧を生成し、アクセス頻度一覧を記憶部１２０に記憶する。
【００４４】
図２に戻り、ステップＳ１５０を説明する。
ステップＳ１５０において、絞り込み部１１５は、１つ以上の脆弱関数から１つ以上の注目関数を選択する。
注目関数は、１つ以上のアクセス関数に含まれる脆弱関数である。つまり、注目関数は、アクセス関数と脆弱関数とのいずれにも該当する関数である。
【００４５】
図７に基づいて、絞り込み処理（Ｓ１５０）の手順を説明する。
ステップＳ１５１において、絞り込み部１１５は、ソフトウェア要素の階層構造と脆弱関数一覧とを記憶部１２０からメモリ１０２に読み出す。
ソフトウェア要素の階層構造と脆弱関数一覧とがメモリ１０２に記憶されている場合、ステップＳ１５１は不要である。
【００４６】
ステップＳ１５２において、絞り込み部１１５は、ソフトウェア要素の階層構造から、未選択のアクセス関数を１つ選択する。
【００４７】
ステップＳ１５３およびステップＳ１５４は、ステップＳ１５２で選択されたアクセス関数のために実行される。
【００４８】
ステップＳ１５３において、絞り込み部１１５は、アクセス関数が脆弱関数であるか判定する。
具体的には、絞り込み部１１５は、アクセス関数と同じ名称の関数が脆弱関数一覧に含まれるか判定する。アクセス関数と同じ名称の関数が脆弱関数一覧に含まれる場合、アクセス関数は脆弱関数である。
アクセス関数が脆弱関数である場合、処理はステップＳ１５４に進む。
アクセス関数が脆弱関数でない場合、処理はステップＳ１５５に進む。
【００４９】
ステップＳ１５４において、絞り込み部１１５は、アクセス関数を注目関数として注目関数一覧に登録する。
注目関数一覧は１つ以上の注目関数を示す。
【００５０】
ステップＳ１５５において、絞り込み部１１５は、未選択のアクセス関数が有るか判定する。ステップＳ１５５において、未選択のアクセス関数を未選択関数と呼ぶ。
未選択関数が有る場合、処理はステップＳ１５６に進む。
未選択関数が無い場合、処理はステップＳ１５２に進む。
【００５１】
ステップＳ１５６において、絞り込み部１１５は、注目関数一覧を記憶部１２０に記憶する。
【００５２】
図２に戻り、ステップＳ１６０を説明する。
ステップＳ１６０において、順位付け部１１６は、１つ以上の注目関数のそれぞれのアクセス頻度に基づいて、１つ以上の注目関数に優先順位を付ける。
具体的には、順位付け部１１６は、アクセス頻度が大きいほど高い優先順位を各注目関数に付ける。
【００５３】
図８に基づいて、順位付け処理（Ｓ１６０）の手順を説明する。
ステップＳ１６１において、順位付け部１１６は、注目関数一覧とアクセス頻度一覧とを記憶部１２０からメモリ１０２に読み出す。
注目関数一覧とアクセス頻度一覧とがメモリ１０２に記憶されている場合、ステップＳ１６１は不要である。
【００５４】
ステップＳ１６２において、順位付け部１１６は、注目関数一覧に示される注目関数毎に、注目関数のアクセス頻度をアクセス頻度一覧から取得する。
【００５５】
ステップＳ１６３において、順位付け部１１６は、各注目関数のアクセス頻度に基づいて、各注目関数の優先順位を決定する。
具体的には、順位付け部１１６は、アクセス頻度が大きいほど高い優先順位を各注目関数に付ける。
【００５６】
ステップＳ１６４において、順位付け部１１６は、注目関数一覧に示される各注目関数を優先順位に従って並べ替える。
これにより、優先順位に従って並んだ１つ以上の注目関数が注目関数一覧に示される。
【００５７】
ステップＳ１６５において、順位付け部１１６は、記憶部１２０に記憶されている注目関数一覧をステップＳ１６４で得られた注目関数一覧に更新する。
【００５８】
図２に戻り、ステップＳ１７０を説明する。
ステップＳ１７０において、表示部１１７は、１つ以上の注目関数が優先順位に従って並んだ状態で１つ以上の注目関数を表示する。
【００５９】
図９に基づいて、表示処理（Ｓ１７０）の手順を説明する。
表示処理（Ｓ１７０）における注目関数一覧は、順位付け処理（Ｓ１６０）の後の注目関数一覧を意味する。
【００６０】
ステップＳ１７１において、表示部１１７は、注目関数一覧を記憶部１２０からメモリ１０２に読み出す。
注目関数一覧がメモリ１０２に記憶されている場合、ステップＳ１７１は不要である。
【００６１】
ステップＳ１７２において、表示部１１７は、入出力インタフェース１０４を介して、注目関数一覧をディスプレイに表示する。
【００６２】
図１０に基づいて、ソースコード解析方法の具体例を説明する。
受付部１１１は、第１ソースコード１２１と第２ソースコード１２２とを受け付ける。
【００６３】
第１解析部１１２は、第１ソースコード１２１と第２ソースコード１２２とに対する構造解析を行うことによって、階層構造１２３を生成する。
第１ソースコード１２１は、バッファ変数ｂｕｆｆ［ｘ］を有する。
バッファ変数ｂｕｆｆ［ｘ］は、注目変数であり、第２ソースコード１２２に含まれる関数からアクセスされる。
階層構造１２３は、関数ｆ１（）と関数ｆ３（）とのそれぞれがバッファ変数ｂｕｆｆ［ｘ］にアクセスすることを示している。さらに、階層構造１２３は、関数ｆ３（）が関数ｆ５（）から呼び出されることを示している。関数ｆ１（）、関数ｆ３（）および関数ｆ５（）は、第１ソースコード１２１に含まれる。
アクセス関数は、関数ｆ１（）、関数ｆ３（）および関数ｆ５（）である。
【００６４】
第２解析部１１３は、第１ソースコード１２１に対する静的解析を行うことによって、脆弱関数一覧を生成する。
第３解析部１１４は、第１ソースコード１２１に対する動的解析を行うことによって、アクセス頻度一覧を生成する。
解析結果１２４は、脆弱関数一覧とアクセス頻度一覧とをマージすることによって得られる表である。脆弱性「なし」に対応する関数は、脆弱関数に該当しない。
脆弱関数は、関数ｆ１（）、関数ｆ３（）、関数ｆ５（）および関数ｆ７（）である。関数ｆ１（）、関数ｆ３（）、関数ｆ５（）および関数ｆ７（）は第１ソースコード１２１に含まれる。
【００６５】
絞り込み部１１５は、１つ以上の脆弱関数から１つ以上のアクセス関数に含まれる脆弱関数を選択する。選択される脆弱関数が注目関数である。
解析結果１２４において、脆弱関数は、関数ｆ１（）、関数ｆ３（）、関数ｆ５（）および関数ｆ７（）である。
階層構造１２３において、アクセス関数は、関数ｆ１（）、関数ｆ３（）および関数ｆ５（）である。
したがって、注目関数は、関数ｆ１（）、関数ｆ３（）および関数ｆ５（）である。
【００６６】
順位付け部１１６は、１つ以上の注目関数のそれぞれのアクセス頻度に基づいて、１つ以上の注目関数に優先順位を付ける。アクセス頻度が大きいほど優先順位が高い。
注目関数は、関数ｆ１（）、関数ｆ３（）および関数ｆ５（）である。
解析結果１２４において、関数ｆ１（）のアクセス頻度は１００であり、関数ｆ３（）のアクセス頻度は５０であり、関数ｆ５（）のアクセス頻度は３０である。
したがって、注目関数の優先順位は、関数ｆ１（）、関数ｆ３（）、関数ｆ５（）の順に高い。
【００６７】
注目関数一覧１２５は、優先順位に従って並んだ３つの注目関数を示している。
【００６８】
表示部１１７は、注目関数一覧１２５をディスプレイに表示する。
【００６９】
＊＊＊実施の形態１の効果＊＊＊
ソースコードの中の注目すべき関数を絞り込むことができる。さらに、注目すべき関数に優先順位を付けることができる。
例えば、ソフトウェアの修正箇所を効率よく絞り込むことが可能となる。さらに、優先順位に基づいたソフトウェアの修正が可能となる。
このことは、仕様が明確ではない外部システム（つまり、例えば他社の装置のように、対象システムの設計者が挙動を明らかにできないシステム）との間で種々の情報をやり取りする対象システムにおいて、特に外部システムからのアクセスに関わる部分の弱点（つまり、外部システムからのアクセスに対して脆弱な設計部分）を見つけ出すことに繋がる。
【００７０】
＊＊＊他の構成＊＊＊
ソースコード解析方法の手順は、図２における手順と異なってもよい。
例えば、ステップＳ１２０からステップＳ１４０の順番が入れ替わっても構わない。
【００７１】
実施の形態２．
ソフトウェアにおける脆弱性の種類と各注目関数に対する優先順位の付け方とが実施の形態１と異なる形態について、主に実施の形態１と異なる点を図１１から図１３に基づいて説明する。
【００７２】
＊＊＊構成の説明＊＊＊
ソースコード解析装置１００の構成は、実施の形態１における構成と同じである（図１参照）。
【００７３】
＊＊＊動作の説明＊＊＊
図１１に基づいて、ソースコード解析方法を説明する。
ステップＳ２１０において、受付部１１１は、第１ソースコードと第２ソースコードとを受け付ける。つまり、受付部１１１は、システムソースコードを受け付ける。
ステップＳ２１０は、実施の形態１におけるステップＳ１１０と同じである。
【００７４】
ステップＳ２２０において、第１解析部１１２は、第１ソースコードから１つ以上のアクセス関数を見つける。
ステップＳ２２０は、実施の形態１におけるステップＳ１２０と同じである。
【００７５】
ステップＳ２３０において、第２解析部１１３は、第１ソースコードから１つ以上の脆弱性関数を見つける。
脆弱関数は、脆弱条件を満たす関数である。
【００７６】
脆弱条件は、例えば、次のような事象が発生する関数が満たす条件である。脆弱関数は、次のような事象を発生する可能性がある。
・整数オーバーフロー
・配列インデックスの検証不備
・未初期化変数の利用
・ポインタ変数に対するｓｉｚｅｏｆ演算子の使用
【００７７】
具体的には、第２解析部１１３は、システムソースコードに対する静的解析を行うことによって、１つ以上の脆弱関数を見つける。例えば、第２解析部１１３は、Ｋｌｏｃｗｏｒｋと呼ばれるソフトウェアを実行する。このソフトウェアは、静的解析を行うためのソフトウェアである。
第２解析部１１３は、特許文献２に開示されたソースコード解析を行うことによって、脆弱関数を見つけてもよい。脆弱関数は、特許文献２における警告対象の関数の一種である。
【００７８】
第２解析処理（Ｓ２３０）の手順は、実施の形態１における第２解析処理（Ｓ１３０）の手順と同じである（図５参照）。
【００７９】
ステップＳ２４０において、第３解析部１１４は、１つ以上の脆弱関数のそれぞれの呼び出しタイミングを特定する。
【００８０】
具体的には、第３解析部１１４は、第１ソースコードに対する動的解析を行うことによって、１つ以上の脆弱関数のそれぞれの呼び出しタイミングを算出する。例えば、第３解析部１１４は、ＤＴ１０と呼ばれるソフトウェアを実行する。このソフトウェアは、動的解析を行うためのソフトウェアである。
【００８１】
図１２に基づいて、第３解析処理（Ｓ２４０）の手順を説明する。
ステップＳ２４１において、第３解析部１１４は、システムソースコードを記憶部１２０からメモリ１０２に読み出す。
ステップＳ２４１は、実施の形態１におけるステップＳ１４１と同じである（図６参照）。
【００８２】
ステップＳ２４２において、第３解析部１１４は、第１ソースコードに対する動的解析を行う。
これにより、第１ソースコードに含まれる１つ以上の関数のそれぞれの呼び出しタイミングが特定される。第１ソースコードに含まれる１つ以上の関数には、１つ以上の脆弱関数が含まれる。
【００８３】
ステップＳ２４３において、第３解析部１１４は、第１ソースコードに含まれる１つ以上の関数のそれぞれの呼び出しタイミングを示す呼び出しタイミング一覧を生成し、呼び出しタイミング一覧を記憶部１２０に記憶する。
【００８４】
図１１に戻り、ステップＳ２５０から説明を続ける。
ステップＳ２５０において、絞り込み部１１５は、１つ以上の脆弱関数から１つ以上の注目関数を選択する。
ステップＳ２５０は、実施の形態１におけるステップＳ１５０と同じである（図２参照）。
【００８５】
ステップＳ２６０において、順位付け部１１６は、１つ以上の注目関数のそれぞれの呼び出しタイミングに基づいて、１つ以上の注目関数に優先順位を付ける。
具体的には、順位付け部１１６は、優先順位規則にしたがって、１つ以上の注目関数に優先順位を付ける。優先順位規則は、予め決められる規則であり、呼び出しタイミングと優先順位との関係を指定する。
【００８６】
順位付け処理（Ｓ２６０）の手順は、実施の形態１におけるステップＳ１６０の手順と同じである（図８参照）。
【００８７】
ステップＳ２７０において、表示部１１７は、１つ以上の注目関数が優先順位に従って並んだ状態で１つ以上の注目関数を表示する。
ステップＳ２７０は、実施の形態１におけるステップＳ１７０と同じである（図２参照）。
【００８８】
図１３に、ソースコード解析方法の具体例を示す。
この具体例は、解析結果１２６を除いて、実施の形態１における具体例と同じである（図１０参照）。解析結果１２６は、実施の形態１における解析結果１２４に相当する。
【００８９】
受付部１１１は、第１ソースコード１２１と第２ソースコード１２２とを受け付ける。
第１解析部１１２は、第１ソースコード１２１と第２ソースコード１２２とに対する構造解析を行うことによって、階層構造１２３を生成する。
第２解析部１１３は、第１ソースコード１２１に対する静的解析を行うことによって、脆弱関数一覧を生成する。
第３解析部１１４は、第１ソースコード１２１に対する動的解析を行うことによって、呼び出しタイミング一覧を生成する。
解析結果１２６は、脆弱関数一覧と呼び出しタイミング一覧とをマージすることによって得られる表である。
絞り込み部１１５は、１つ以上の脆弱関数から１つ以上のアクセス関数に含まれる脆弱関数を選択する。選択される脆弱関数が注目関数である。
順位付け部１１６は、１つ以上の注目関数のそれぞれの呼び出しタイミングに基づいて、１つ以上の注目関数に優先順位を付ける。
注目関数一覧１２５は、優先順位に従って並んだ３つの注目関数を示している。
表示部１１７は、注目関数一覧１２５をディスプレイに表示する。
【００９０】
＊＊＊実施の形態２の効果＊＊＊
バッファオーバーフロー以外の脆弱性を有する１つ以上の脆弱関数から１つ以上の注目関数を絞り込むことができる。さらに、各注目関数の呼び出しタイミングに基づいて各注目関数に優先順位を付けることができる。
【００９１】
＊＊＊実施の形態の補足＊＊＊
実施の形態は、好ましい形態の例示であり、本発明の技術的範囲を制限することを意図するものではない。実施の形態は、部分的に実施してもよいし、他の形態と組み合わせて実施してもよい。フローチャート等を用いて説明した手順は、適宜に変更してもよい。
【符号の説明】
【００９２】
１００  ソースコード解析装置、１０１  プロセッサ、１０２  メモリ、１０３  補助記憶装置、１０４  入出力インタフェース、１１１  受付部、１１２  第１解析部、１１３  第２解析部、１１４  第３解析部、１１５  絞り込み部、１１６  順位付け部、１１７  表示部、１２０  記憶部、１２１  第１ソースコード、１２２  第２ソースコード、１２３  階層構造、１２４  解析結果、１２５  注目関数一覧、１２６  解析結果。
【図１】
2019168753.tif 000003
【図２】
2019168753.tif 000004
【図３】
2019168753.tif 000005
【図４】
2019168753.tif 000006
【図５】
2019168753.tif 000007
【図６】
2019168753.tif 000008
【図７】
2019168753.tif 000009
【図８】
2019168753.tif 000010
【図９】
2019168753.tif 000011
【図１０】
2019168753.tif 000012
【図１１】
2019168753.tif 000013
【図１２】
2019168753.tif 000014
【図１３】
2019168753.tif 000015