IP Force 特許公報掲載プロジェクト 2022.1.31 β版

知財求人 - 知財ポータルサイト「IP Force」

▶ 富士電機株式会社の特許一覧

特開2024-31735ソースコード修正支援装置およびソースコード修正支援方法
(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024031735
(43)【公開日】2024-03-07
(54)【発明の名称】ソースコード修正支援装置およびソースコード修正支援方法
(51)【国際特許分類】
   G06F 8/77 20180101AFI20240229BHJP
   G06F 21/57 20130101ALI20240229BHJP
   G06F 8/30 20180101ALI20240229BHJP
【FI】
G06F8/77
G06F21/57 370
G06F8/30
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2022193242
(22)【出願日】2022-12-02
(31)【優先権主張番号】P 2022132394
(32)【優先日】2022-08-23
(33)【優先権主張国・地域又は機関】JP
(71)【出願人】
【識別番号】000005234
【氏名又は名称】富士電機株式会社
(74)【代理人】
【識別番号】100121083
【弁理士】
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【弁理士】
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100132067
【弁理士】
【氏名又は名称】岡田 喜雅
(74)【代理人】
【識別番号】100131521
【弁理士】
【氏名又は名称】堀口 忍
(72)【発明者】
【氏名】澤田 孝雄
(72)【発明者】
【氏名】菊田 祐司
【テーマコード(参考)】
5B376
【Fターム(参考)】
5B376BC08
5B376BC14
5B376BC24
5B376BC38
5B376BC69
(57)【要約】
【課題】ソースコードの一部を他の言語の記述に置き替える作業の労力を軽減する。
【解決手段】ソースコード修正支援装置は、取得部、構造解析部、及び判定部を備える。取得部は、ソースコードの構造の分析に係わる複数のメトリクス項目それぞれに対してプログラムの複雑さを判断するための基準値およびプログラムの複雑さに対応する評価値を付与することで作成されるメトリクスルールリストを取得する。構造解析部は、第1の言語で記述されたソースコード中の各プログラムモジュールについて、各メトリクス項目に対応する基準値に違反しているか否かをそれぞれ判定し、基準値に違反しているメトリクス項目に対応する評価値の和を表す評価点数を計算する。判定部は、構造解析部により計算された評価点数に基づいて、各プログラムモジュールに対して、第2の言語への置換えの要否を判定する。
【選択図】図1

【特許請求の範囲】
【請求項1】
ソースコードの構造の分析に係わる複数のメトリクス項目それぞれに対してプログラムの複雑さを判断するための基準値およびプログラムの複雑さに対応する評価値を付与することで作成されるメトリクスルールリストを取得するメトリクスルールリスト取得部と、
第1の言語で記述されたソースコード中の各プログラムモジュールについて、前記メトリクスルールリストに登録されている各メトリクス項目に対応する基準値に違反しているか否かをそれぞれ判定し、基準値に違反しているメトリクス項目に対応する評価値の和を表す評価点数を計算する構造解析部と、
前記構造解析部により計算された評価点数に基づいて、各プログラムモジュールに対する対処方針を判定する判定部と、
を備えるソースコード修正支援装置。
【請求項2】
前記判定部は、前記構造解析部により計算された評価点数が所定の閾値を超えているプログラムモジュールを、前記第1の言語よりも信頼性の高い第2の言語に置き換える、ことを指示する情報を出力する
ことを特徴とする請求項1に記載のソースコード修正支援装置。
【請求項3】
前記メトリクスルールリストにおいて、プログラムモジュールの記述が基準値に違反するときにセキュリティ上のリスクが大きくなるメトリクス項目ほど高い評価点が付与されている
ことを特徴とする請求項2に記載のソースコード修正支援装置。
【請求項4】
前記第1の言語で記述された前記ソースコードにおいて、ソースコードを記述する際に守らなければならない予め決められたコーディングルールに違反する違反記述を抽出する静的解析部をさらに備え、
前記判定部は、前記静的解析部により抽出された違反記述を含む各プログラムモジュールについて、前記構造解析部により計算された評価点数に基づいて対処方針を判定する
ことを特徴とする請求項1に記載のソースコード修正支援装置。
【請求項5】
前記第1の言語で記述されたソースコードにおいて脆弱性が発生し得るコードスタイルまたは前記第1の言語において脆弱性に係わる対策が行われているコードスタイルの少なくとも一方が登録されたテンプレートを取得し、前記ソースコードから、前記テンプレートに登録されているコードスタイルを含むプログラムモジュールを抽出するテンプレート検索部と、
前記テンプレート検索部により抽出されたプログラムモジュールを前記第2の言語に置き換えるか否かを判定する第2の判定部と、をさらに備える
ことを特徴とする請求項1に記載のソースコード修正支援装置。
【請求項6】
ソースコードの構造の分析に係わる複数のメトリクス項目それぞれに対してプログラムの複雑さを判断するための基準値およびプログラムの複雑さに対応する評価値を付与することで作成されるメトリクスルールリストを取得するメトリクスルールリスト取得部と、
第1の言語で記述されたソースコード中の各プログラムモジュールについて、前記メトリクスルールリストに登録されている各メトリクス項目に対応する基準値に違反しているか否かをそれぞれ判定し、基準値に違反しているメトリクス項目に対応する評価値の和を表す評価点数を計算する構造解析部と、
各プログラムモジュールについて、前記構造解析部により計算された評価点数に基づいて、前記第1の言語よりも信頼性の高い第2の言語に置き換えるべきか否かを判定する判定部と、
前記判定部により前記第2の言語に置き換えるべきと判定されたプログラムモジュールを、前記第2の言語の記述に変換する変換部と、
を備えるソースコード修正システム。
【請求項7】
ソースコードの構造の分析に係わる複数のメトリクス項目それぞれに対してプログラムの複雑さを判断するための基準値およびプログラムの複雑さに対応する評価値を付与することで作成されるメトリクスルールリストを取得し、
第1の言語で記述されたソースコード中の各プログラムモジュールについて、前記メトリクスルールリストに登録されている各メトリクス項目に対応する基準値に違反しているか否かをそれぞれ判定し、基準値に違反しているメトリクス項目に対応する評価値の和を表す評価点数を計算し、
前記評価点数に基づいて、各プログラムモジュールに対する対処方針を判定する
ことを特徴とするソースコード修正支援方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソースコード内の記述を他の言語の記述に置き替える作業を支援する装置および方法に係わる。
【背景技術】
【0002】
ネットワークに接続する機会が増加したことに伴い、悪意ある第三者によりソフトウェアの脆弱性が狙われて不具合が発生するケースも増加してきている。このため、開発段階で、所定のセキュアコーディングルールに基づいてソースコードを解析することで、ソフトウェアの脆弱性を発見する作業が行われている。これにより、ソフトウェアの安全性が担保される。例えば、車載機器、産業機器、医療機器などの分野では、CERT(Computer Emergency Response Team)、MISRA(The Motor Industry Software Reliability Association)、AUTOSAR(Automotive Open System Architecture)などのセキュアコーディングルールが使用されている。
【0003】
加えて、ソフトウェアの脆弱性を小さくするプログラミング言語が普及してきている。例えば、Rustは、メモリの安全性を保証する言語であり、C言語またはC++に代わる言語の1つとして注目されている。
【0004】
なお、ソースプログラムの実行処理順序の誤りを指摘するソースプログラム解析装置が提案されている(例えば、特許文献1)。また、あるプログラミング言語で記述されたソースコードを別のプログラミング言語によるソースコードに変換するソースコード変換装置が提案されている(例えば、特許文献2)。さらに、プログラムの修正またはデバッグを支援する装置が提案されている(例えば、特許文献3~4)。
【先行技術文献】
【特許文献】
【0005】
【特許文献1】特開2006-236042号公報
【特許文献2】特開2010-140408号公報
【特許文献3】特開2021-192201号公報
【特許文献4】特開2009-104252号公報
【発明の概要】
【発明が解決しようとする課題】
【0006】
上述したように、Rust等の信頼性の高いプログラミング言語が普及してきている。他方、プログラム開発に要するコストおよび時間を抑制するために、可能な限り既存のソフトウェア製品を使い続けたいという要求がある。このため、既存のソフトウェアの脆弱性に対処するために、静的解析装置を利用して脆弱性を含む箇所を特定し、特定した箇所のみを信頼性の高い言語の記述で書き換えることがある。
【0007】
ただし、大規模なプログラムにおいては、脆弱性を含む箇所の個数も多くなる。このため、脆弱性を含む箇所すべてを信頼性の高い言語の記述で書き換える場合、作業時間が長くなってしまう。
【0008】
本発明の1つの側面に係わる目的は、ある言語で記述されたソースコードの一部を他の言語の記述に置き替える作業の労力を軽減することである。
【課題を解決するための手段】
【0009】
本発明の1つの態様のソースコード修正支援装置は、ソースコードの構造の分析に係わる複数のメトリクス項目それぞれに対してプログラムの複雑さを判断するための基準値およびプログラムの複雑さに対応する評価値を付与することで作成されるメトリクスルールリストを取得するメトリクスルールリスト取得部と、第1の言語で記述されたソースコード中の各プログラムモジュールについて、前記メトリクスルールリストに登録されている各メトリクス項目に対応する基準値に違反しているか否かをそれぞれ判定し、基準値に違反しているメトリクス項目に対応する評価値の和を表す評価点数を計算する構造解析部と、前記構造解析部により計算された評価点数に基づいて、各プログラムモジュールに対する対処方針を判定する判定部と、を備える。
【発明の効果】
【0010】
上述の態様によれば、ある言語で記述されたソースコードの一部を他の言語の記述に置き替える作業の労力を軽減できる。
【図面の簡単な説明】
【0011】
図1】本発明の実施形態に係わるソースコード修正支援装置の一例を示す図である。
図2】メトリクスリストの一例を示す図である。
図3】メトリクスルール作成部の処理の一例を示すフローチャートである。
図4】評価値リストおよびメトリクスルールリストの一例を示す図である。
図5】構造解析部の処理の一例を示すフローチャートである。
図6】構造解析部による分析結果を表す分析結果リストの一例を示す図である。
図7】判定部の処理の一例を示すフローチャートである。
図8】他言語置換えリストおよび他処理リストの一例を示す図である。
図9】ソースコード修正装置および試験装置による処理の一例を示すフローチャートである。
図10】本発明の第2の実施形態に係わるソースコード修正支援装置の一例を示す図である。
図11】セキュアコーディングルールの一例を示す図である。
図12】優先度リストおよびセキュリティルールリストの一例を示す図である。
図13】静的解析部の処理の一例を示すフローチャートである。
図14】静的解析部の検索結果を表す検索結果リストの一例を示す図である。
図15】本発明の第2の実施形態における判定部の処理の一例を示すフローチャートである。
図16】本発明の第2の実施形態における他言語置換えリストおよび他処理リストの一例を示す図である。
図17】本発明の第3の実施形態に係わるソースコード修正支援装置の一例を示す図である。
図18】テンプレートの一例を示す図である。
図19】テンプレート検索部の処理の一例を示すフローチャートである。
図20】テンプレート検索部による検索結果を表す検索結果リストの一例を示す図(その1)である。
図21】テンプレート検索部による検索結果を表す検索結果リストの一例を示す図(その2)である。
図22】本発明の第3の実施形態における判定部の処理の一例を示すフローチャートである。
図23図20に示す検索結果リストに登録されている各プログラムモジュールに対して優先度を付与した状態を示す図である。
図24図21に示す検索結果リストに登録されている各プログラムモジュールに対して優先度を付与した状態を示す図である。
図25】本発明の実施形態のバリエーションを示す図である。
図26】ソースコード修正支援装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【0012】
図1は、本発明の実施形態に係わるソースコード修正支援装置の一例を示す。本発明の実施形態に係わるソースコード修正支援装置1は、メトリクス分析に基づいてソースコード2の中からリスクの高いプログラムモジュールを抽出し、抽出した各プログラムモジュールに対して対処方針を表す情報を出力する。なお、プログラムモジュールは、特に限定されるものではないが、例えば、1個の関数に対応する1まとまりの記述または処理を意味する。この場合、関数は、メソッドを含むものとする。
【0013】
ソースコード2は、所定のプログラミング言語で記述された、コンパイル前のプログラムコードである。特に限定されるものではないが、この実施例では、ソースコード2は、C言語またはC++で記述されているものとする。また、ソースコード2は、既存のソフトウェア製品として使用されているプログラムコードであってもよい。さらに、ソースコード2は、複数のプログラムモジュールを含む。
【0014】
メトリクスリスト3には、図2に示すように、ソースコードの複雑さ(規模、保守性などを含む)を定量的に示すための指標(すなわち、メトリクス)が登録されている。例えば、サイクロマティック複雑度(Cyclomatic)は、ソースコード中で使用される分岐条件の経路の数に1を加えた値を検出する。分岐条件としては、「if~then」「For~Next」「Case」「Catch」「While」などが想定される。また、最大ネスト数(MaxNesting)は、ソースコード中で使用される関数のネストの深さ(または、入れ子構造の段数)を表す。
【0015】
ソースコード修正支援装置1は、図1に示すように、メトリクスルールリスト作成部11、メトリクスルールリスト取得部12、構造解析部13、および判定部14を備える。なお、ソースコード修正支援装置1は、図1に示していない他の機能またはデバイスを備えてもよい。
【0016】
メトリクスルールリスト作成部11には、メトリクスリスト3が与えられる。ここで、メトリクスリスト3には、上述したように、1以上のメトリクス項目が登録されている。そして、メトリクスルールリスト作成部11は、各メトリクス項目に対して基準値および評価値を付与することでメトリクスルールリストを作成する。なお、メトリクスルールリスト作成部11は、例えば、ソースコード2を修正する作業者がコンピュータを操作することで実現される。
【0017】
図3は、メトリクスルールリスト作成部11の処理の一例を示すフローチャートである。このフローチャートの処理は、例えば、ソースコード修正支援装置1にソースコード2が与えられたときに実行される。ただし、メトリクスルールリスト作成部11は、ソースコード修正支援装置1にソースコード2が与えられる前に図3に示すフローチャートの処理を実行してもよい。
【0018】
S1において、メトリクスルールリスト作成部11は、ソースコード2を修正する際の対処方針に係わる評価値リストを作成する。評価値リスト21は、図4(a)に示すように、メトリクスリスト3に登録されている各メトリクス項目に付与すべき評価値の定義を表す。評価値は、例えば、当該メトリクス項目の基準値を超えたときのセキュリティ上のリスクの深刻度に基づいて決定される。この実施例では、3段階の評価値が設定されているが、2段階または4段階以上の評価値を設定してもよい。
【0019】
対処方針は、当該メトリクス項目の基準値を超えるプログラムモジュールに対してどのように対処するのかを表す。この実施例では、評価値に応じて図4(a)に示す方針が設定されている。すなわち、最もリスクが高い評価値「3」が付与されるメトリクス項目の基準を超えるプログラムモジュールに対しては「他の言語の記述に置き替える」が設定されている。2番目にリスクが高い評価値「2」が付与されるメトリクス項目の基準を超えるプログラムモジュールに対しては「他の言語の記述に置き替えることを推奨する」が設定されている。最もリスクが低い評価値「1」が付与されるメトリクス項目の基準を超えるプログラムモジュールに対しては「所定のポリシに基づいて修正する」が設定されている。
【0020】
S2において、メトリクスルールリスト作成部11は、ソースコード修正支援装置1に与えられたメトリクスリスト3を取得する。S3において、メトリクスルールリスト作成部11は、各メトリクス項目に対応する基準値を取得する。この基準値は、例えば、プログラムモジュールが複雑であるか否かを判定する閾値に相当する。また、この基準値は、予め決められているものとする。S4において、メトリクスルールリスト作成部11は、メトリクスリスト3において各メトリクス項目に対応する基準値および評価値を付与することでメトリクスルールリストを作成する。この実施例では、図2に示す各メトリクス項目に対して所定の基準値および図4(a)に示す評価値を付与することで、図4(b)に示すメトリクスルールリスト22が得られる。
【0021】
例えば、ソースコードが、インパクトスケール(ImpactScale)の基準値を超えるプログラムモジュールを含むときは、重大な障害が発生する可能性があると考えられる。したがって、このメトリクス項目に対して大きな評価値「3」が付与される。また、ソースコードが、凝縮度の欠如(PercentLackOfCohesion)の基準値を超えるプログラムモジュールを含むときは、何らかの障害が発生する可能性があるものの、重大な障害が発生する可能性は高くないと考えられる。したがって、このメトリクス項目に対しては、中間レベルの評価値「2」が付与される。なお、サイクロマティック複雑度(Cyclomatic)、最大ネスト数(MaxNesting)、入力数(CountInput)の基準値を超えるプログラムモジュールを含む場合であっても、重大な障害が発生する可能性は低いと考えられる。したがって、これらのメトリック項目に対しては、小さい評価値「1」が付与される。
【0022】
各メトリクス項目に対して付与する基準値および/または評価値は、例えば、ソースコード2を修正する作業者が決定してもよい。この場合、この作業者がコンピュータを操作することで、図4(b)に示すメトリクスルールリスト22が作成される。作成されたメトリクスルールリスト22は、ソースコード修正支援装置1が備える不図示のメモリに保存される。
【0023】
メトリクスルールリスト取得部12は、図3に示す手順で作成されたメトリクスルールリスト22を取得する。この実施例では、メトリクスルールリスト取得部12は、ソースコード修正支援装置1が備えるメモリから図4(b)に示すメトリクスルールリスト22を読み出す。
【0024】
構造解析部13は、メトリクスルールリスト取得部12が取得したメトリクスルールリスト22に基づいて、ソースコード2において、リスクの高い複雑なプログラムモジュールを検索する。すなわち、構造解析部13は、ソースコード2において、各メトリクス項目の基準値に違反するプログラムモジュールを検索する。「基準値に違反」は、この実施例では、基準値を超えることを意味する。
【0025】
図5は、構造解析部13の処理の一例を示すフローチャートである。このフローチャートの処理は、ソースコード修正支援装置1にソースコード2が与えられたときに実行される。ただし、このフローチャートの処理が実行される前に、図4(b)に示すメトリクスルールリスト22が作成されているものとする。
【0026】
S11において、構造解析部13は、ソースコード2を取得する。S12において、構造解析部13は、図3に示す手順で作成されたメトリクスルールリスト22に従って、ソースコード2内の違反モジュールを検索する。このとき、構造解析部13は、ソースコード2内の各プログラムモジュールについて、記述内容がメトリクス項目の基準値を超えているか否かを判定する。そして、S13において、構造解析部13は、分析結果を表す分析結果リストを出力する。
【0027】
図6は、構造解析部13による分析結果を表す分析結果リストの一例を示す。この実施例では、ソースコード2は、ファイル名が「main.c」であるメインプログラムおよびファイル名が「sub.c」であるサブプログラムを含む。
【0028】
分析結果リスト23は、図6(a)に示すように、各プログラムモジュールの記述内容が、メトリクスルールリスト22に登録されている各メトリクス項目に対して違反しているか否かを表す。すなわち、「〇」印は、当該プログラムモジュールがメトリック項目の基準値に違反していないことを表し、「×」印は、当該プログラムモジュールがメトリック項目の基準値に違反していることを表す。なお、この実施例では、ソースコード2内の各プログラムモジュールは、「ファイル名」および「関数名」に組合せで識別されるものとする。また、「位置」は、各プログラムモジュールの関数が記述されている位置(行番号)を表す。
【0029】
例えば、「ファイル名:main.c」および「関数名:main()」で識別されるプログラムモジュールに対する分析結果は以下の通りである。
(1)Cyclomatic=10、基準値=10 → 基準値以下(違反なし)
(2)MaxNesting=5、基準値=7 → 基準値以下(違反なし)
(3)PercentLackOfCohesion=15、基準値=20 → 基準値以下(違反なし)
(4)ImpactScale=10、基準値=8 → 基準値超え(違反あり)
(5)CountInput=8、基準値=15 → 基準値以下(違反なし)
構造解析部13は、違反が発生しているメトリクス項目に対応する評価点を足し合わせることで評価点数を計算する。この例では、「ImpactScale」のみに対して違反が発生している。そして、「ImpactScale」に対応する評価値は「3」である。よって、このプログラムモジュールの評価点数は「3」である。
【0030】
また、「ファイル名:main.c」および「関数名:func()」で識別されるプログラムモジュールに対する分析結果は以下の通りである。
(1)Cyclomatic=15、基準値=10 → 基準値超え(違反あり)
(2)MaxNesting=6、基準値=7 → 基準値以下(違反なし)
(3)PercentLackOfCohesion=25、基準値=20 → 基準値超え(違反あり)
(4)ImpactScale=3、基準値=8 → 基準値以下(違反なし)
(5)CountInput=10、基準値=15 → 基準値以下(違反なし)
この例では、「Cyclomatic」および「PercentLackOfCohesion」に対して違反が発生している。そして、「Cyclomatic」および「PercentLackOfCohesion」に対応する評価値はそれぞれ「1」および「2」である。よって、このプログラムモジュールの評価点数は「3」である。
【0031】
このように、構造解析部13は、各プログラムモジュールの評価点数を計算する。これにより、分析結果リスト23が作成される。
【0032】
構造解析部13は、図6(b)に示すように、分析結果の概要を表す分析結果リスト24を作成してもよい。分析結果リスト24は、ファイル毎に、分析を実行したソースコードの行数、違反が検出されたプログラムモジュールの総数、および評価値ごとに違反が検出されたプログラムモジュールの個数、およびファイル毎の評価点数の合計値を表す。例えば、メインプログラムに対する検索結果として、評価値が「3」「2」「1」であるメトリクス項目に対する違反がそれぞれ3個、2個、8個検出されたことを表している。
【0033】
判定部14は、構造解析部13による分析結果に基づいて、各プログラムモジュールについての対処方針を判定する。具体的には、判定部14は、各プログラムモジュールについて、構造解析部13により計算された評価点数に基づいて対処方針を判定する。
【0034】
図7は、判定部14の処理の一例を示すフローチャートである。なお、このフローチャートの処理を実行する前に、構造解析部13により分析結果リスト23が作成されているものとする。
【0035】
S21において、判定部14は、構造解析部13により作成された分析結果リストを取得する。このとき、判定部14は、プログラムモジュールごとに評価点数が計算された分析果リスト(例えば、図6(a)に示す分析結果リスト23)を取得する。S22において、判定部14は、分析結果リストからプログラムモジュールを選択する。図6(a)に示す実施例では、各プログラムモジュールは、ファイル名および関数名の組合せで識別される。S23~S24において、判定部14は、選択したプログラムモジュールの評価点数を確認する。
【0036】
選択したプログラムモジュールの評価点数がゼロであるときは、判定部14は、そのプログラムモジュールには問題が無いと判定する。この場合、判定部14は、S25において、選択したプログラムモジュールを無処理リストに追加する。無処理リストは、記述内容を変更する必要がないプログラムモジュールを登録するためのリストである。ただし、判定部14は、必ずしもS25の処理を実行する必要はない。
【0037】
選択したプログラムモジュールの評価点数が所定の閾値より大きいときは、判定部14は、そのプログラムモジュールに係わるリスクが高いと判定する。この場合、判定部14は、S26において、選択したプログラムモジュールを図8(a)に示す他言語置換えリスト25に追加する。他言語置換えリスト25は、信頼性の高い他の言語に置き換えることが必要なプログラムモジュールを登録するためのリストである。なお、この例では、S24の閾値は「2」である。すなわち、評価点数が3以上であるプログラムモジュールが他言語置換えリスト25に登録される。
【0038】
選択したプログラムモジュールの評価点数がゼロではないが上述の閾値以下であるときには、判定部14は、そのプログラムモジュールがリスクを有するが、さほど重大なリスクではないと判定する。この場合、判定部14は、S27において、選択したプログラムモジュールを図8(b)に示す他処理リスト26に追加する。他処理リスト26は、他の言語に置き換える処理以外の処理を実行すべきプログラムモジュールを登録するためのリストである。
【0039】
S28において、判定部14は、S23~S27の処理を実行していないプログラムモジュールが分析結果リストに残っているかチェックする。S23~S27の処理を実行していないプログラムモジュールが分析結果リストに残っているときには、判定部14の処理はS22に戻る。すなわち、分析結果リストから次のプログラムモジュールが選択される。この後、新たに選択されたプログラムモジュールに対してS23~S27の処理が実行される。そして、分析結果リストに登録されているすべてのプログラムモジュールに対してS23~27の処理が実行されると、判定部14の処理は終了する。この結果、他言語置換えリスト25および他処理リスト26が作成される。
【0040】
例えば、図6(a)に示す分析結果リスト23が判定部14に与えられるものとする。そして、判定部14は、分析結果リスト23に登録されている各プログラムモジュールに対してS23~S27の処理を実行する。ここで、S24で使用される閾値は「2」であるものとする。この場合、「ファイル名:main.c」および「関数名:main()」で識別されるプログラムモジュールの評価点数は「3」である。そうすると、判定部14は、このモジュールを他言語置換えリスト25に追加する。また、「ファイル名:main.c」および「関数名:func()」で識別されるプログラムモジュールも、他言語置換えリスト25に追加される。「ファイル名:main.c」および「関数名:aaa()」で識別されるプログラムモジュールの評価点数は「1」である。そうすると、判定部14は、このモジュールを他処理リスト26に追加する。また、「ファイル名:sub.c」および「関数名:sub_com2()」で識別されるプログラムモジュールも他処理リスト26に追加される。これにより、図8(a)に示す他言語置換えリスト25および図8(b)に示す他処理リスト26が得られる。
【0041】
なお、他言語置換えリスト25は、評価点数が閾値を超えるプログラムモジュールへの対処方針として、第1の言語(C/C++)よりも信頼性の高い第2の言語(Rust)に置き換えることを指示する情報の一例である。また、図7に示す手順は1つの実施例であり、本発明の実施形態はこの手順に限定されるものではない。
【0042】
このように、ソースコード修正支援装置1は、メトリクスリスト3に基づいてソースコード2中の各プログラムモジュールを分析する。このとき、各プログラムモジュールに対して、セキュリティ上のリスクの深刻度(または、信頼性の高いプログラミング言語に置き換える必要性の程度)を表す評価点数が付与される。そして、ソースコード修正支援装置1は、この評価点数を用いて各プログラムモジュールをグループ化することにより、他言語置換えリスト25および他処理リスト26を作成する。この後、他言語置換えリスト25および他処理リスト26は、図1に示すソースコード修正装置4に与えられる。
【0043】
ソースコード修正装置4は、ソースコード修正支援装置1により作成された他言語置換えリスト25および他処理リスト26に基づいてソースコード2を修正する。そして、試験装置5は、ソースコード修正装置4により修正されたソースコード2を実行することで動作確認を行う。なお、ソースコード修正装置4および試験装置5は、例えば、ソースコード2を修正する作業者がコンピュータを操作することで実現される。
【0044】
図9は、ソースコード修正装置4および試験装置5による処理の一例を示すフローチャートである。この実施例では、S41において、ソースコード修正装置4は、ソースコード2を取得する。また、ソースコード修正装置4は、S42およびS45において、ソースコード修正支援装置1により作成された他言語置換えリスト25および他処理リスト26をそれぞれ取得する。
【0045】
S43~S44の処理は、他言語置換えリスト25に登録されている各違反モジュールに対して実行される。すなわち、S43において、ソースコード修正装置4は、違反モジュールを他の言語の記述に置き換える。例えば、ソースコード2がC言語で記述されているときに、違反モジュールはRust言語の記述に置き換えられる。このとき、ソースコード2を修正する作業者が、ソースコード修正装置4を実現するコンピュータを用いて手作業でコードを書き換えてもよい。あるいは、ソースコード修正装置4がC言語からRust言語への変換機能を有するときは、ソースコード修正装置4により違反モジュールがRust言語の記述に置き換えられる。この場合、ソースコード修正装置4は、判定部14により他の言語の記述に置き換えるべきと判定された違反モジュールを、Rustの記述に変換する変換部として動作する。なお、プログラムコード全体をソフトウェア処理で他の言語に変換することは容易ではないが、一部の記述を他の言語に変換することは既存の技術で可能である。
【0046】
S44において、試験装置5は、他の言語に置き換えられた記述をコンパイルして実行する。すなわち、違反モジュールが正しく他の言語に置き換えられたか否かについての試験が行われる。そして、試験結果は、ソースコード修正装置4にフィードバックされる。このとき、違反モジュールが正しく他の言語に置き換えられていなければ、ソースコード修正装置4においてその記述がさらに修正される。これにより、他言語置換えリスト25に登録されている各違反モジュールが正しく他の言語に置き換えられる。
【0047】
S46~S47の処理は、他処理リスト26に登録されている各違反モジュールに対して実行される。すなわち、S46において、ソースコード修正装置4は、ソースコードの言語のまま違反モジュールを修正する。例えば、ソースコード2がC言語で記述されているときは、違反モジュールは、C言語のままその内容が修正される。このとき、ソースコード2を修正する作業者が、ソースコード修正装置4を実現するコンピュータを用いて手作業でコードを修正してもよい。或いは、ソースコード修正装置4は、違反モジュールを修正することなく、違反モジュールが修正されてないことを表すレポートを出力してもよい。
【0048】
S47において、試験装置5は、修正後の記述をコンパイルして実行する。すなわち、違反モジュールが正しく修正されたか否かについて試験が行われる。そして、この試験結果は、ソースコード修正装置4にフィードバックされる。このとき、違反モジュールが正しく修正されていなければ、ソースコード修正装置4においてその記述がさらに修正される。これにより、他処理リスト26に登録されている各違反モジュールが正しく修正される。なお、S46において違反モジュールを修正しないときは、S47の処理を実行しなくてもよい。
【0049】
S48において、試験装置5は、他の言語に置き換えられた記述および修正された記述をソースコード2に結合する。そして、試験装置5は、他の言語に置き換えられた記述および修正された記述を含むプログラムを試験する。
【0050】
このように、ソースコード修正支援装置1は、ソースコードの構造を解析するためのメトリクスに基づいて、ソースコード中の各プログラムモジュールに対して、セキュリティ上のリスクの深刻度(または、信頼性の高いプログラミング言語に置き換える必要性の程度)を表す評価点数を付与する。したがって、ソースコード2を修正する作業者は、ソースコードのサイズが大きい場合であっても、セキュリティ上のリスクの深刻度が高いプログラムモジュールを容易に認識できる。すなわち、コストまたは作業量の観点でソースコード全体を他の言語で書き換えることが困難なケースであっても、セキュリティ上のリスクの深刻度が高いプログラムモジュールを確実に信頼性の高いプログラミング言語の記述に置き換えることができる。これにより、コストまたは作業量の制限がある場合であっても、信頼性が低い既存のプログラムのリスクを小さくできる。
【0051】
<第2の実施形態>
図1図8に示す実施形態では、ソースコードの構造を解析するメトリクスを利用してリスクが高いプログラムモジュールが抽出される。これに対して、本発明の第2の実施形態においては、メトリクスに加えて、セキュアコーディングルールも利用してリスクが高いプログラムモジュールが抽出される。セキュアコーディングルールは、ソースコードを記述する際に守らなければならないルールの一例である。
【0052】
図10は、本発明の第2の実施形態に係わるソースコード修正支援装置の一例を示す。本発明の第2の実施形態においては、ソースコード修正支援装置1Bは、セキュアコーディングルール30に基づいてソースコード2の中から違反記述を検索する機能を備える。なお、ソースコード2は、図1および図10において実質的に同じであり、所定のプログラミング言語で記述された、コンパイル前のプログラムコードである。
【0053】
セキュアコーディングルール30は、ソースコードを記述する際に守らなければならないルールがリスト化された情報であり、ソースコード修正支援装置1Bがソースコード2を解析する際に使用される。この実施例では、ソースコード修正支援装置1Bは、セキュアコーディングルール30として既存のコーディングルールを使用する。例えば、セキュアコーディングルール30として、CERT、MISRA、またはAUTOSARが使用される。一例として、C/C++で記述されたコードの解析において使用されるCERT-C/C++コーディングスタンダード規約の一部を図11に示す。
【0054】
ソースコード修正支援装置1Bは、図10に示すように、メトリクスルールリスト作成部11、メトリクスルールリスト取得部12、構造解析部13、セキュリティルールリスト作成部31、セキュリティルールリスト取得部32、静的解析部33、および判定部14Bを備える。尚、メトリクスルールリスト作成部11、メトリクスルールリスト取得部12、および構造解析部13は、図1および図10において実質的に同じである。また、ソースコード修正支援装置1Bは、図10に示していない他の機能またはデバイスを備えてもよい。
【0055】
セキュリティルールリスト作成部31には、セキュアコーディングルール30が与えられる。セキュアコーディングルール30は、上述したように、ソースコードを記述する際に守らなければならない1または複数のルールを表す。そして、セキュリティルールリスト作成部31は、セキュアコーディングルール30としてリスト化されている各ルールに優先度を付与することでセキュリティルールリストを作成する。なお、セキュリティルールリスト作成部31は、例えば、ソースコード2を修正する作業者がコンピュータを操作することで実現される。
【0056】
セキュリティルールリスト作成部31は、ソースコード2を修正する際の対処方針に係わる優先度リストを作成する。優先度リスト41は、図12(a)に示すように、セキュアコーディングルール30として用意されている各ルールに付与する優先度を定義する。優先度は、例えば、当該ルールに対する違反が発生したときのセキュリティ上のリスクの深刻度に基づいて決定される。この実施例では、3段階の優先度が設定されるが、2段階または4段階以上の優先度を設定してもよい。
【0057】
対処方針は、当該ルールに違反する記述に対してどのように対処するのかを表す。この実施例では、優先度に応じて図12(a)に示す方針が設定されている。即ち、最も優先度が高いレベル3が付与されるルールに違反する記述に対しては「他の言語の記述に置き替える」が設定されている。2番目に優先度が高いレベル2が付与されるルールに違反する記述に対しては「他の言語の記述に置き替えることを推奨する」が設定されている。最も優先度が低いレベル1が付与されるルールに違反する記述に対しては「所定のポリシに基づいて修正する」が設定されている。
【0058】
セキュリティルールリスト作成部31は、ソースコード修正支援装置1Bに与えられたセキュアコーディングルール30を取得する。そして、セキュリティルールリスト作成部31は、ソースコードを記述する際に守らなければならない各ルールに優先度を付与することでセキュリティルールリストを作成する。この実施例では、図11に示す各ルールに対して図12(a)に示す優先度を付与することで、図12(b)に示すセキュリティルールリスト42が得られる。
【0059】
例えば、ソースコードが、「INT32-C」で識別されるルール「符号付き整数演算がオーバフローを引き起こさないことを保証する」に違反する記述を含むときは、重大な障害が発生する可能性があると考えられる。したがって、このルールに対して高い優先度「3」が付与される。「INT33-C」および「EXP33-C」で識別されるルールについても同様である。また、ソースコードが、「ARR32-C」で識別されるルール「可変長配列のサイズ引数が適切な範囲内にあることを保証する」に違反する記述を含むときは、何らかの障害が発生する可能性があるものの、重大な障害が発生する可能性は高くないと考えられる。したがって、このルールに対しては、中間レベルの優先度「2」が付与される。他方、ソースコードが、「MSC05-C」で識別されるルール「time_t型の値を直接操作しない」に違反する記述を含む場合であっても、重大な障害が発生する可能性は低いと考えられる。したがって、このルールに対しては、低い優先度「1」が付与される。
【0060】
各ルールに対して付与する優先度は、例えば、ソースコード2を修正する作業者が決定してもよい。この場合、この作業者がコンピュータを操作することで、図12(b)に示すセキュリティルールリスト42が作成される。作成されたセキュリティルールリスト42は、ソースコード修正支援装置1Bが備える不図示のメモリに保存される。
【0061】
セキュリティルールリスト取得部32は、上述の手順で作成されたセキュリティルールリスト42を取得する。この例では、セキュリティルールリスト取得部32は、ソースコード修正支援装置1Bが備えるメモリから図12(b)に示すセキュリティルールリスト42を読み出す。
【0062】
静的解析部33は、セキュリティルールリスト取得部32が取得したセキュリティルールリスト42に基づいて、ソースコード2において違反記述を検索する。すなわち、静的解析部33は、ソースコード2において、セキュリティルールリスト42に記載されているルールに違反する違反記述を検索する。
【0063】
図13は、静的解析部33の処理の一例を示すフローチャートである。このフローチャートの処理は、ソースコード修正支援装置1Bにソースコード2が与えられたときに実行される。ただし、このフローチャートの処理が実行される前に、図12(b)に示すセキュリティルールリスト42が作成されているものとする。
【0064】
S51において、静的解析部33は、ソースコード2を取得する。S52において、静的解析部33は、セキュリティルールリスト42に従って、ソースコード2内の違反記述を検索する。なお、予め決められたルールに違反する記述を検索する方法は、公知に技術により実現される。そして、S53において、静的解析部33は、検索結果を表す検索結果リストを出力する。
【0065】
図14は、静的解析部33の検索結果を表す検索結果リストの一例を示す。この実施例では、ソースコード2は、ファイル名が「main.c」であるメインプログラムおよびファイル名が「sub.c」であるサブプログラムを含む。
【0066】
検索結果リスト43は、図14(a)に示すように、検出された違反記述ごとに、違反が検出されたファイル名、違反が検出された位置、違反に係わる記述、違反が検出されたルールを識別するルール番号、検出された違反の内容、および違反が検出されたルールの優先度を表す。優先度は、図12(b)に示すセキュリティルールリスト42を参照して設定される。たとえば、メインプログラムの12行目において、除算の分母がゼロとなる違反が検出されている。この違反は、図12(b)に示すように、最も優先度が高い違反(即ち、レベル3の違反)に該当する。よって、静的解析部33は、この違反記述に対して「レベル3」を対応づける。このように、静的解析部33は、ソースコード2から違反記述を検出すると共に、検出した各違反記述に対して、セキュリティ上のリスクの深刻度を表す優先度を対応づける。これにより、検索結果リスト43が得られる。
【0067】
静的解析部33は、図14(b)に示すように、検索結果の概要を表す検索結果リスト44を作成してもよい。検索結果リスト44は、ファイル毎に、検索を実行したソースコードの行数、違反が検出された記述の総個数、および優先度ごとに違反が検出された記述の個数を表す。例えば、ファイル名が「main.c」であるメインプログラムに対する検索結果として、レベル3、レベル2、レベル1の違反がそれぞれ3個、2個、15個検出されたことを表している。
【0068】
判定部14Bは、構造解析部13による分析結果および静的解析部33による検索結果に基づいて、ソースコード内のリスクの高い記述についての対処方針を決定する。すなわち、判定部14Bは、構造解析部13により計算される評価点数および静的解析部33により使用される優先度の組合せに基づいて対処方針を判定する。
【0069】
図15は、判定部14Bの処理の一例を示すフローチャートである。なお、このフローチャートの処理を実行する前に、構造解析部13により分析結果リスト23が作成され、静的解析部33により検索結果リスト43が作成されているものとする。
【0070】
S61において、判定部14Bは、構造解析部13により作成された分析結果リストを取得する。このとき、判定部14Bは、各プログラムモジュールに対して評価点数が付与された分析結果リスト(例えば、図6(a)に示す分析結果リスト23)を取得する。S62において、判定部14Bは、静的解析部33により作成された検索結果リストを取得する。このとき、判定部14Bは、違反記述ごとに優先度が設定されている検索結果リスト(例えば、図14(a)に示す検索結果リスト43)を取得する。S63において、判定部14Bは、検索結果リストから違反記述を選択する。
【0071】
S64において、判定部14Bは、S63で選択した違反記述を含むプログラムモジュールを特定し、そのプログラムモジュールに付与されている評価点数を確認する。違反記述とプログラムモジュールとの対応関係は、ソースコード内の位置に基づいて検出してもよい。例えば、図14(a)に示す1番目の違反記述は、ソースコードの12行目に位置している。他方、図6(a)に示す1番目の関数「main()」は、ソースコードの10行目に位置している。したがって、この関数は、図14(a)に示す1番目の違反記述に対応していると判定される。
【0072】
S65において、判定部14Bは、S63で選択した違反記述の優先度が「レベル3:高優先」であり、且つ、その違反記述を含むプログラムモジュールの評価点数が「2」を超えているか否かを判定する。そして、優先度が「レベル3:高優先」であり、評価点数が「2」を超えているときは、判定部14Bは、S66において、その違反記述/プログラムモジュールを図16(a)に示す他言語置換えリスト45に追加する。他言語置換えリスト45は、他の言語に置き換えることが必要な違反記述/プログラムモジュールを登録するためのリストである。これに対して、選択した違反記述の優先度が「レベル2:中優先」または「レベル1:低優先」であるとき、或いは、その違反記述を含むプログラムモジュールの評価点数が「2」以下であるときは、判定部14Bは、S67において、その違反記述/プログラムモジュールを図16(b)に示す他処理リスト46に追加する。他処理リスト46は、他の言語に置き換える処理以外の処理を実行すべき違反記述/プログラムモジュールを登録するためのリストである。
【0073】
S68において、判定部14Bは、S64~S67の処理を実行していない違反記述が検索結果リストに残っているかチェックする。S64~S67の処理を実行していない違反記述が検索結果リストに残っているときには、判定部14Bの処理はS63に戻る。すなわち、検索結果リストから次の違反記述が選択される。この後、新たに選択された違反記述に対してS64~S67の処理が実行される。そして、検索結果リストに登録されているすべての違反記述に対してS64~S67の処理が実行されると、判定部14Bの処理は終了する。このようにして、他言語置換えリスト45および他処理リスト46が作成される。
【0074】
例えば、図6(a)に示す分析結果リスト23および図14(a)に示す検索結果リスト43が判定部14Bに与えられるものとする。そして、判定部14Bは、検索結果リスト43に登録されている各違反記述に対してS64~S67の処理を実行する。
【0075】
この場合、例えば、12行目の違反記述の優先度はレベル3であり、その違反記述を含むプログラムモジュール(関数:main())の評価点数は「3」である。したがって、この違反記述/プログラムモジュールは、図16(a)に示すように、他言語置換えリスト45に追加される。また、203行目の違反記述の優先度はレベル2であり、その違反記述を含むプログラムモジュール(関数:aaa())の評価点数は「1」である。したがって、この違反記述/プログラムモジュールは、図16(b)に示すように、他処理リスト46に追加される。なお、他言語置換えリスト45は、プログラムの構造が複雑であり、且つ、セキュリティ上のリスクの観点で最も高い優先度(レベル3)が対応づけられている違反記述/プログラムモジュールへの対処方針として、第1の言語(C/C++)よりも信頼性の高い第2の言語(Rust)に置き換えることを指示する情報の一例である。
【0076】
ソースコード修正装置4および試験装置5の動作は、図1に示す実施形態および図10に示す第2の実施形態において実質的に同じである。即ち、ソースコード修正装置4は、ソースコード修正支援装置1Bから出力される情報に基づいてソースコードを修正し、試験装置5は、修正後のソースコードの試験を実行する。
【0077】
このように、本発明の第2の実施形態においては、コーディングルールに違反し、且つ、メトリクスの観点でリスクが高いと判定された記述(或いは、プログラムモジュール)が抽出される。したがって、図1に示す実施形態と比較して、より重要度の高い記述またはプログラムモジュールを効率よく修正できる。
【0078】
<第3の実施形態>
図1図8に示す実施形態では、ソースコードの構造を解析するメトリクスを利用してリスクが高いプログラムモジュールが抽出される。また、図10図16に示す第2の実施形態では、メトリクスに加えて、セキュアコーディングルールも利用してリスクが高いプログラムモジュールが抽出される。そして、抽出したプログラムモジュールは、信頼性の高い言語(例えば、Rust)に置き換えられる。
【0079】
ただし、セキュアコーディングルールに違反していない記述、或いは、メトリクスの観点で問題がない記述であっても、信頼性の高い言語に置き換えることが好ましい記述もある。そこで、第3の実施形態では、脆弱性が発生し得るコードスタイルおよび脆弱性の対策が行われているコードスタイルに係わるテンプレートが作成される。そして、ソースコード修正支援装置は、このテンプレートを利用して、信頼性の高い言語に置き換えることが好ましい記述をソースコードから抽出する。
【0080】
図17は、本発明の第3の実施形態に係わるソースコード修正支援装置の一例を示す。第3の実施形態に係わるソースコード修正支援装置1Cは、テンプレート作成部51、テンプレート52、テンプレート検索部53、および判定部54を備える。そして、ソースコード修正支援装置1Cには、ソースコード2が与えられる。ソースコード2は、所定のプログラミング言語で記述された、コンパイル前のプログラムコードである。この実施例では、ソースコード2は、C言語(またはC++)で記述されているものとする。
【0081】
テンプレート52には、C/C++で記述されたソースコードにおいて脆弱性が発生し得るコードスタイルおよびC/C++でセキュリティ対策が行われているコードスタイルが登録されている。この実施例では、図18に示すように、外部関数、特定関数、ループ+配列操作、ループ+ポインタ操作などがテンプレート52に登録されている。外部関数は、ユーザが作成した関数を表す。ユーザが作成した関数は、脆弱性が発生し得るので、テンプレート52に登録されることが好ましい。特定関数は、セキュアコーディングルール(CERT-Cなど)に規定される、C/C++言語を安全に利用できるように設計された関数を表す。一例としては、特定関数は、バッファオーバフロー対策が施されたC/C++の標準関数に相当する。ループ+配列操作は、例えば、配列に文字データを1バイトずつコピーする処理などが相当する。ループ+ポインタ操作は、例えば、アドレスが示す領域に文字データを1バイトずつコピーする処理などが相当する。なお、「C/C++で記述されたソースコードにおいて脆弱性が発生し得るコードスタイル」は、例えば、過去の経験または実績等に基づいて、ソースコード2を修正する作業者により列挙れてもよい。
【0082】
テンプレート作成部51は、上述したテンプレート52を作成する。なお、テンプレート作成部51は、例えば、ソースコード2を修正する作業者がコンピュータを操作することで実現される。
【0083】
テンプレート検索部53は、テンプレート52を用いてソースコード2を検索する。具体的には、テンプレート検索部53は、テンプレート52に登録されているコードスタイルを含むプログラムモジュールをソースコード2から抽出する。
【0084】
図19は、テンプレート検索部53の処理の一例を示すフローチャートである。このフローチャートの処理は、ソースコード修正支援装置1Cにソースコード2が与えられたときに実行される。ただし、このフローチャートの処理が実行される前に、図18に示すテンプレート52が作成されているものとする。
【0085】
S71において、テンプレート検索部53は、ソースコード2を取得する。S72において、テンプレート検索部53は、ソースコード2から、テンプレート52と一致するコードスタイルを含むプログラムモジュールを抽出する。このとき、テンプレート検索部53は、好ましくは、抽出したプログラムモジュールが記述されている位置(行番号)を検出する。そして、S73において、テンプレート検索部53は、検索結果を表す検索結果リストを出力する。
【0086】
図20図21は、テンプレート検索部53による検索結果を表す検索結果リストの一例を示す。なお、図20図21では省略しているが、検索結果リストは、図6または図14に示すように、抽出したプログラムモジュールの位置を表す情報を含んでもよい。
【0087】
図20(a)に示す実施例では、テンプレートに基づいて、ソースコード2から外部関数(ex_strcpy)が検出され、その外部関数を含むプログラムモジュールが検索結果リスト81に登録されている。なお、テンプレート検索部53は、ユーザが作成した関数のうちで、違反がない下記の書式に沿った関数を含むプログラムモジュールを抽出する。
書式:関数名(格納先アドレス、格納先サイズ、読出し元アドレス)
なお、この実施例で抽出された関数は、格納先アドレスにデータを書き込むときに、指定された格納先サイズを超えないようにすることで、バッファオーバランを防いでいる。
【0088】
図20(b)に示す例では、ソースコード2から特定関数(strcpy_s)が検出され、その特定関数を含むプログラムモジュールが検索結果リスト81に登録されている。このコピー関数も、バッファオーバランを回避するように、パラメータ(dest、size、src)が指定されている。
【0089】
図21(a)に示す例では、ソースコード2から「ループ+配列操作」に係わる記述が検出され、検出した記述を含むプログラムモジュールが検索結果リスト81に登録されている。例えば、ループ処理として、while文またはfor文が検出される。配列処理として、「dest[n]=データ」を表す記述が検出される。この実施例では、配列に文字データを1バイトずつコピーするための記述が検出されている。
【0090】
図21(b)に示す例では、ソースコード2から「ループ+ポインタ操作」に係わる記述が検出され、検出した記述を含むプログラムモジュールが検索結果リスト81に登録されている。例えば、ループ処理として、while文またはfor文が検出される。配列処理として、「*dest=データ」を表す記述が検出される。この実施例では、指定されたアドレスが示す領域に文字データを1バイトずつコピーするための記述が検出されている。
【0091】
判定部54は、テンプレート検索部53によりソースコード2から抽出された各プログラムモジュールについて、他の言語に置き換えるか否かを判定する。すなわち、検索結果リスト81に登録されている各プログラムモジュールについて、他の言語に置き換えるか否か判定される。
【0092】
図22は、判定部54の処理の一例を示すフローチャートである。このフローチャートの処理は、テンプレート検索部53によりソースコード2から1または複数のプログラムモジュールが抽出された後に実行される。すなわち、このフローチャートの処理が実行される前に検索結果リスト81が作成されているものとする。
【0093】
S81において、判定部54は、テンプレート検索部53により作成された検索結果リストを取得する。S82において、判定部54は、検索結果リストからプログラムモジュールを選択する。S83において、判定部54は、選択したプログラムモジュールを他の言語に置き換えることの容易さに基づいて優先度を決定する。他の言語に置き換えることの容易さは、例えば、プログラムモジュールの複雑さまたは記述内容の結合度により判定される。
【0094】
図23図24は、図20図21に示す検索結果リストに登録されている各プログラムモジュールに対して優先度を付与した状態を示す。この実施例では、プログラムモジュールの結合度(または、他の言語に置き換えることの容易さ)は、3つのレベルで表される。また、プログラムモジュールの優先度は、結合度に対して設定される。例えば、図23に示す例では、外部関数ex_strcpyは、その結合度が中レベル(レベル2)であり、中レベル(レベル2)の優先度が付与されている。また、特定関数strcpy_sは、その結合度が低レベル(レベル1)であり、高レベル(レベル3)の優先度が付与されている。
【0095】
S84において、判定部54は、選択したプログラムモジュールの優先度に応じて、そのプログラムモジュールに対する処理を決定する。優先度が「レベル3(高)」であるときは、判定部54は、選択したプログラムモジュールを他の言語に置き換えることが容易であると判定する。この場合、判定部54は、S85において、そのプログラムモジュールを他言語置換えリストに追加する。優先度が「レベル2(中)」であるときは、判定部54は、選択したプログラムモジュールを他の言語に置き換えることが、やや困難であると判定する。この場合、判定部54は、S86において、そのプログラムモジュールを他処理リストに追加する。優先度が「レベル1(低)」であるときは、判定部54は、選択したプログラムモジュールを他の言語に置き換えることが困難であると判定する。この場合、S85およびS86の処理はスキップされる。
【0096】
S87において、判定部54は、S83~S86の処理を実行していないプログラムモジュールが検索結果リストに残っているかチェックする。S83~S86の処理を実行していないプログラムモジュールが検索結果リストに残っているときには、判定部54の処理はS82に戻る。すなわち、検索結果リストから次のプログラムモジュールが選択される。この後、新たに選択されたプログラムモジュールに対してS83~S86の処理が実行される。そして、検索結果リストに登録されているすべてのプログラムモジュールに対してS83~86の処理が実行されると、判定部54の処理は終了する。この結果、他言語置換えリストおよび他処理リストが作成される。
【0097】
このように、ソースコード修正支援装置1Cは、テンプレート52を利用して、ソースコード2から、信頼性の高い言語に置き換えることが好ましいプログラムモジュールを抽出する。そして、ソースコード修正支援装置1Cにより得られた結果は、ソースコード修正装置55に与えられる。
【0098】
ソースコード修正装置55の動作は、図1に示すソースコード修正装置4と実質的に同じである。すなわち、ソースコード修正装置55は、ソースコード修正支援装置1Cから出力される情報に基づいてソースコードを修正する。例えば、ソースコード修正装置55は、ソースコード修正支援装置1Cにより生成される他言語置換えリストに登録されているプログラムモジュールをRUSTに置き換える。この後、図9に示す手順と同様に、試験装置5を用いて修正後のソースコードの試験を行ってもよい。
【0099】
<バリエーション>
図25は、本発明の実施形態のバリエーションを示す。本発明の実施形態のバリエーションにおいては、図1に示すソースコード修正支援装置1または図10に示すソースコード修正支援装置1Bの入力側に、図17に示すソースコード修正支援装置1Cが設けられる。以下の記載では、図1に示すソースコード修正支援装置1または図10に示すソースコード修正支援装置1Bを「ソースコード修正支援装置1/1B」と呼ぶことがある。
【0100】
ソースコード修正支援装置1Cとソースコード修正支援装置1/1Bとの間に図17に示すソースコード修正装置55が設けられる。また、ソースコード修正支援装置1/1Bの出力側に図1または図10に示すソースコード修正装置4および試験装置5が設けられる。この構成によれば、メトリクス及び/又はセキュアコーディングルールに基づいて、リスクが高いプログラムモジュールが信頼性の高い言語に置き換えられることに加えて、脆弱性が発生し得るコードスタイルおよび脆弱性の対策が行われているコードスタイルに係わるプログラムモジュールも信頼性の高い言語に置き換えられる。
【0101】
なお、図25に示す構成において、ソースコード修正装置4が、ソースコード修正支援装置1/1Bにより生成される他言語置換えリストだけでなく、ソースコード修正支援装置1Cにより生成される他言語置換えリストにも基づいてソースコードを修正する場合には、ソースコード修正装置55を備える必要はない。また、ソースコード修正支援装置1Cは、図25ではソースコード修正支援装置1/1Bの入力側に設けられているが、ソースコード修正支援装置1/1Bの出力側に設けられてもよい。さらに、ソースコード修正支援装置1/1Bおよびソースコード修正支援装置1Cが1つのソースコード修正支援装置を構成してもよい。
【0102】
<ハードウェア構成>
図26は、ソースコード修正支援装置1、1B、または1Cのハードウェア構成の一例を示す。ソースコード修正支援装置1、1B、または1Cは、プロセッサ201、メモリ202、記憶装置203、入出力デバイス204、記録媒体読取り装置205、および通信インタフェース206を備えるコンピュータ200により実現される。
【0103】
プロセッサ201は、記憶装置203に保存されている修正支援プログラムを実行することにより、ソースコード修正支援装置1、1B、または1Cの動作を制御する。ソースコード修正支援装置1においては、修正支援プログラムは、図3図5、および図7に示すフローチャートの手順を記述したプログラムコードを含む。よって、プロセッサ201がこのプログラムを実行することで、図1に示すメトリクスルールリスト作成部11、メトリクスルールリスト取得部12、構造解析部13、および判定部14の機能が提供される。また、ソースコード修正支援装置1Bにおいては、修正支援プログラムは、図3図5図13、および図15に示すフローチャートの手順を記述したプログラムコードを含む。よって、プロセッサ201がこのプログラムを実行することで、図10に示すメトリクスルールリスト作成部11、メトリクスルールリスト取得部12、構造解析部13、セキュリティルールリスト作成部31、セキュリティルールリスト取得部32、静的解析部33、および判定部14Bの機能が提供される。さらに、ソースコード修正支援装置1Cにおいては、修正支援プログラムは、図19および図22に示すフローチャートの手順を記述したプログラムコードを含む。よって、プロセッサ201がこのプログラムを実行することで、図17に示すテンプレート検索部53および判定部54の機能が提供される。メモリ202は、プロセッサ201の作業領域として使用される。記憶装置203は、上述した修正支援プログラムおよび他のプログラムを保存する。
【0104】
入出力デバイス204は、キーボード、マウス、タッチパネル、マイクなどの入力デバイスを含む。また、入出力デバイス204は、表示装置、スピーカーなどの出力デバイスを含む。記録媒体読取り装置205は、記録媒体210に記録されているデータおよび情報を取得できる。記録媒体210は、コンピュータ200に着脱可能なリムーバブル記録媒体である。また、記録媒体210は、例えば、半導体メモリ、光学的作用で信号を記録する媒体、または磁気的作用で信号を記録する媒体により実現される。なお、修正支援プログラムは、記録媒体210からコンピュータ200に与えられてもよい。通信インタフェース206は、ネットワークに接続する機能を提供する。なお、修正支援プログラムがプログラムサーバ220に保存されているときは、コンピュータ200は、プログラムサーバ220から修正支援プログラムを取得してもよい。
【0105】
図26に示すコンピュータ200は、ソースコード修正支援装置1、1B、1Cの機能に加えて、ソースコード修正装置4、ソースコード修正装置55、および試験装置5の機能を提供してもよい。また、ソースコード修正支援装置1、1B、1C、ソースコード修正装置4、55、および試験装置5は、別々のコンピュータで実現してもよい。
【符号の説明】
【0106】
1、1B、1C ソースコード修正支援装置
2 ソースコード
3 メトリクスリスト
4 ソースコード修正装置
5 試験装置
11 メトリクスルールリスト作成部
12 メトリクスルールリスト取得部
13 構造解析部
14、14B 判定部
21 評価値リスト
22 メトリクスルールリスト
23 分析結果リスト
24 分析結果の概要を表す分析結果リスト
25 他言語置換えリスト
26 他処理リスト
30 セキュアコーディングルール
31 セキュリティルールリスト作成部
32 セキュリティルールリスト取得部
33 静的解析部
41 優先度リスト
42 セキュリティルールリスト
43 検索結果リスト
44 検索結果の概要を表す検索結果リスト
45 他言語置換えリスト
46 他処理リスト
51 テンプレート作成部
52 テンプレート
53 テンプレート検索部
54 判定部
200 コンピュータ
201 プロセッサ
202 メモリ
203 記憶装置
204 入出力デバイス
205 記録媒体読取り装置
206 通信インタフェース
210 記録媒体
220 プログラムサーバ
図1
図2
図3
図4
図5
図6
図7
図8
図9
図10
図11
図12
図13
図14
図15
図16
図17
図18
図19
図20
図21
図22
図23
図24
図25
図26