JP2021192201A - 修正支援プログラム、修正支援方法、および修正支援装置 - Google Patents

修正支援プログラム、修正支援方法、および修正支援装置 Download PDF

Info

Publication number
JP2021192201A
JP2021192201A JP2020098860A JP2020098860A JP2021192201A JP 2021192201 A JP2021192201 A JP 2021192201A JP 2020098860 A JP2020098860 A JP 2020098860A JP 2020098860 A JP2020098860 A JP 2020098860A JP 2021192201 A JP2021192201 A JP 2021192201A
Authority
JP
Japan
Prior art keywords
variable
source code
size
function
correction support
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2020098860A
Other languages
English (en)
Inventor
孝次 佐々木
Koji Sasaki
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Priority to JP2020098860A priority Critical patent/JP2021192201A/ja
Publication of JP2021192201A publication Critical patent/JP2021192201A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】ソースコードを修正し易くすること。【解決手段】修正支援装置100は、ソースコード110を取得する。修正支援装置100は、ソースコード110内の、規約違反の箇所111を検出する。修正支援装置100は、ソースコード110の文脈を考慮して、検出した規約違反の箇所111を削除するのではなく、開発者120の意図に合うよう、ソースコード110をどのように修正すればよいのかを示す対処案を特定し、開発者120が参照可能に出力する。【選択図】図1

Description

本発明は、修正支援プログラム、修正支援方法、および修正支援装置に関する。
従来、ソフトウェアを実行せずに、ソフトウェアのソースコードを文言的に解析することにより、ソフトウェアのソースコードの中から、規約違反の箇所またはバグの原因箇所などを発見する静的解析ツールが存在する。規約は、例えば、コーディング規約である。
コーディング規約は、例えば、CERT(Computer Emergency Response Team)の標準セキュアコーディング規約などである。そして、ソフトウェアの開発者は、発見された規約違反の箇所またはバグの原因箇所などを参照して、規約違反またはバグなどが解消されるよう、ソースコードを修正することになる。
先行技術としては、例えば、ソースコードから解析に用いる情報を抽出し、ソースコードから欠陥情報を検出し、欠陥情報および解析に用いる情報に基づいて、修正例示情報を生成するものがある。また、例えば、ソースプログラムにおいて翻訳エラーとなった未定義語の属性候補を構文規則に基づいて抽出し、未定義語に類似する定義語のうち抽出した属性候補が示す属性を有する定義語を、修正候補として抽出する技術がある。
特表2017−527034号公報 特開2016−038718号公報
しかしながら、従来技術では、ソースコードを修正することが難しい。例えば、ソフトウェアの開発者は、ソースコードを修正するにあたり、プログラミングに関する能力が比較的低い場合、ソースコードを本来意図した内容とは異なる内容に変更してしまい、規約違反またはバグなどが解消されないことがある。
1つの側面では、本発明は、ソースコードを修正し易くすることを目的とする。
1つの実施態様によれば、ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する修正支援プログラム、修正支援方法、および修正支援装置が提案される。
1つの実施態様によれば、ソースコードにおける、多重の領域解放命令を検出し、ソースコードにおける、未解放の変数を検出し、前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する修正支援プログラム、修正支援方法、および修正支援装置が提案される。
一態様によれば、ソースコードを修正し易くすることが可能になる。
図1は、実施の形態にかかる修正支援方法の一実施例を示す説明図である。 図2は、修正支援システム200の一例を示す説明図である。 図3は、修正支援装置100のハードウェア構成例を示すブロック図である。 図4は、修正支援装置100の機能的構成例を示すブロック図である。 図5は、修正支援装置100の動作例1を示す説明図(その1)である。 図6は、修正支援装置100の動作例1を示す説明図(その2)である。 図7は、修正支援装置100の動作例1を示す説明図(その3)である。 図8は、修正支援装置100の動作例1を示す説明図(その4)である。 図9は、修正支援装置100の動作例1を示す説明図(その5)である。 図10は、修正支援装置100の動作例1を示す説明図(その6)である。 図11は、動作例1における全体処理手順の一例を示すフローチャートである。 図12は、修正支援装置100の動作例2を示す説明図(その1)である。 図13は、修正支援装置100の動作例2を示す説明図(その2)である。 図14は、修正支援装置100の動作例2を示す説明図(その3)である。 図15は、修正支援装置100の動作例2を示す説明図(その4)である。 図16は、動作例2における全体処理手順の一例を示すフローチャートである。 図17は、修正支援装置100による効果を示す説明図である。
以下に、図面を参照して、本発明にかかる修正支援プログラム、修正支援方法、および修正支援装置の実施の形態を詳細に説明する。
(実施の形態にかかる修正支援方法の一実施例)
図1は、実施の形態にかかる修正支援方法の一実施例を示す説明図である。修正支援装置100は、ソースコードを修正し易くするためのコンピュータである。修正支援装置100は、例えば、サーバ、または、PC(Personal Computer)などである。
従来、ソフトウェアの開発者は、静的解析ツールを利用して、ソフトウェアを実行しないまま、発見されたソフトウェアのソースコードに含まれる、規約違反の箇所またはバグの原因箇所などが解消されるよう、ソフトウェアのソースコードを修正する。
しかしながら、開発者が、ソースコードを修正することは難しい場合がある。例えば、開発者が、ソースコードを本来意図した内容通りに変更して修正することができるか否かは、開発者が有する、プログラミングに関する能力の高さに依存すると考えられる。
このため、開発者は、プログラミングに関する能力の高さが比較的低いと、ソースコードを本来意図した内容とは異なる内容に変更してしまい、ソースコードを修正することができないことがある。また、開発者は、プログラミングに関する能力の高さが比較的低いと、ソースコードを修正する際にかかる作業負担の増大化を招くことがある。
これに対し、ソースコード内で、削除しても構わないと判断され、不要と判断される規約違反の箇所を発見し、発見した箇所を削除するよう、ソースコードを修正する対処案を、開発者が参照可能に出力する手法が考えられる。
この手法では、ソースコードの文脈を考慮することができず、規約違反の箇所を、開発者が、どのような意図で記述したのかを考慮することができず、規約違反の箇所が、誤って不要と判断されてしまうことがある。例えば、プログラミング言語の文法上は適切であり、コンパイルエラーとはならないものの、開発者が意図した内容を実現していない規約違反の箇所が、誤って不要と判断されてしまうことがある。そして、開発者は、対処案を参照して、誤って不要と判断された規約違反の箇所を削除してしまうことになり、ソースコードを本来意図した内容通りに修正することができないことがある。
特に、近年、既存のソースコードを流用して新たなソースコードを開発するといった流用開発と呼ばれる手法で、新たなソースコードが開発される傾向がある。ここで、既存のソースコードを流用するにあたり、開発者が、既存のソースコードを、意図通りに修正しきれなかった結果、新たなソースコードに、規約違反となる箇所が含まれる場合がある。
具体的には、既存のソースコードを流用するにあたり、開発者が、サイズ演算子の出力結果を参照する箇所を、正しく変更することができなかった場合が考えられる。この場合、新たなソースコードに、出力結果が未参照であるサイズ演算子が含まれてしまう。この場合、サイズ演算子は、文法上は適切であり、コンパイルエラーとはならないものの、サイズ演算子の出力結果を参照したいといった開発者が意図した内容を実現せず、機能的に意味を有さない、不要な箇所であると判断されてしまうことが考えられる。
また、具体的には、既存のソースコードを流用するにあたり、開発者が、領域解放命令の対象となる変数を表す変数名を、正しく変更することができなかった場合が考えられる。この場合、新たなソースコードに、それぞれ異なる変数ではなく、同一の変数を対象とする多重の領域解放命令が含まれてしまう。この場合、多重の領域解放命令は、文法上は適切であり、コンパイルエラーとはならないものの、それぞれ異なる変数を解放したいといった開発者が意図した内容を実現せず、不要な箇所であると判断されてしまうことが考えられる。
これに対し、上記手法では、開発者が、どのような意図で、既存のソースコードを修正しようとしたのかを考慮することができないため、新たなソースコードに含まれる、規約違反となる箇所を、誤って不要な箇所と判断してしまうことがある。そして、開発者は、対処案を参照して、誤って不要と判断された規約違反の箇所を削除してしまうことになり、ソースコードを本来意図した内容通りに修正することができないことがある。
そこで、本実施の形態では、ソースコードを修正し易くすることができる修正支援方法について説明する。
図1において、修正支援装置100は、ソースコード110を取得する。ソースコード110は、例えば、開発者120によって作成される。修正支援装置100は、ソースコード110内の、規約違反の箇所111を検出する。修正支援装置100は、ソースコード110の文脈を考慮して、検出した規約違反の箇所111を削除するのではなく、開発者120の意図に合うようソースコード110をどのように修正すればよいのかを示す対処案を特定し、開発者120が参照可能に出力する。
(1−1)修正支援装置100は、例えば、関数ごとに、当該関数の引数となる変数を特定可能にする情報を記憶する。修正支援装置100は、具体的には、関数ごとに、当該関数の引数となる、データの格納先を表す変数と、当該変数のサイズを表す変数とを特定可能にする情報を記憶する。関数は、例えば、memset命令、または、memcpy命令などである。
(1−2)修正支援装置100は、例えば、ソースコード110を取得する。修正支援装置100は、例えば、ソースコード110に記述されたサイズ演算子の出力結果が、ソースコード110において未参照であることを検出する。サイズ演算子は、例えば、ソースコード110に記述された変数のうち、指定された変数のサイズを出力する演算子である。サイズ演算子は、例えば、sizeof命令である。修正支援装置100は、具体的には、ソースコード110に記述されたサイズ演算子の出力結果が、ソースコード110において未参照であることを検出し、規約違反となるサイズ演算子を検出する。
(1−3)修正支援装置100は、例えば、サイズ演算子の出力結果が未参照であることを検出した場合、記憶した情報に基づいて、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。修正支援装置100は、具体的には、記憶した情報に基づいて、サイズ演算子を含む、ソースコード110に記述された関数の中で、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。
(1−4)修正支援装置100は、例えば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコード110を修正する内容を出力する。出力される内容は、例えば、ソースコード110に対する修正の候補案に対応する。修正支援装置100は、具体的には、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコード110を修正する内容を、対処案として開発者120が参照可能に表示する。
これにより、修正支援装置100は、ソースコード110の文脈を考慮して、規約違反となるサイズ演算子を削除するのではなく、開発者120の意図に合うよう、ソースコード110をどのように修正すればよいのかを示す対処案を特定することができる。修正支援装置100は、例えば、特定の関数の引数となるサイズを表す変数が、規約違反となるサイズ演算子の出力結果を参照するよう、ソースコード110を修正すればよいことを示す対処案を特定して出力することができる。このため、修正支援装置100は、開発者120が、対処案に基づき、ソースコード110を修正し易くすることができ、開発者120にかかる作業負担の低減化を図ることができる。
(2−1)修正支援装置100は、例えば、関数ごとに、当該関数の引数となる変数を特定可能にする情報を記憶する。修正支援装置100は、具体的には、関数ごとに、当該関数の引数となる、解放する領域を表す変数を特定可能にする情報を記憶する。関数は、例えば、領域解放命令である。領域解放命令は、例えば、free命令、または、fclose命令などである。
(2−2)修正支援装置100は、例えば、ソースコード110を取得する。修正支援装置100は、例えば、ソースコード110における、多重の領域解放命令を検出する。修正支援装置100は、具体的には、記憶した情報に基づいて、ソースコード110における、解放する領域を表す、同一の変数を引数とする、規約違反となる多重の領域解放命令を検出する。
(2−3)修正支援装置100は、例えば、ソースコード110における、未解放の変数を検出する。修正支援装置100は、具体的には、記憶した情報に基づいて、多重の領域解放命令を含む、ソースコード110に記述された関数の中で、領域解放命令により解放されていない未解放の変数を検出する。
(2−4)修正支援装置100は、例えば、多重の領域解放命令を検出し、かつ、未解放の変数を検出した場合、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコード110を修正する内容を出力する。出力される内容は、例えば、ソースコード110に対する修正の候補案に対応する。修正支援装置100は、具体的には、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコード110を修正する内容を、対処案として開発者120が参照可能に表示する。
これにより、修正支援装置100は、ソースコード110の文脈を考慮して、規約違反となる領域解放命令を削除するのではなく、開発者120の意図に合うよう、ソースコード110をどのように修正すればよいのかを示す対処案を特定することができる。修正支援装置100は、規約違反となる多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコード110を修正すればよいことを示す対処案を特定して出力することができる。このため、修正支援装置100は、開発者120が、対処案に基づき、ソースコード110を修正し易くすることができ、開発者120にかかる作業負担の低減化を図ることができる。
ここでは、修正支援装置100が、対処案を出力する場合について説明したが、これに限らない。例えば、修正支援装置100が、対処案に基づいて、ソースコード110を修正する場合があってもよい。これによれば、修正支援装置100は、開発者120にかかる作業負担の低減化を図ることができる。
ここでは、修正支援装置100が、ソースコード110を修正する内容を、対処案として開発者120が参照可能に表示する場合について説明したが、これに限らない。例えば、修正支援装置100が、ソースコード110を修正する内容を、対処案として、ソースコード110を作成した開発者120以外が参照可能に表示する場合があってもよい。
ここでは、修正支援装置100が、ソースコード110を取得したことに応じて、規約違反の箇所111を検出し、ソースコード110をどのように修正すればよいのかを示す対処案を特定して出力する場合について説明したが、これに限らない。例えば、開発者120が、対処案に基づき、ソースコード110を修正したことに応じて、修正支援装置100が、再び、規約違反の箇所111を検出し、ソースコード110をどのように修正すればよいのかを示す対処案を特定して出力する場合があってもよい。
ここでは、修正支援装置100が、ソースコード110を修正する内容を、対処案として、開発者120が参照可能に表示する場合について説明したが、これに限らない。例えば、修正支援装置100が、他のコンピュータに、ソースコード110を修正する内容を送信し、対処案として開発者120が参照可能に表示させる場合があってもよい。この場合に対応する具体例については、例えば、図2を用いて後述する。
(修正支援システム200の一例)
次に、図2を用いて、図1に示した修正支援装置100を適用した、修正支援システム200の一例について説明する。
図2は、修正支援システム200の一例を示す説明図である。図2において、修正支援システム200は、修正支援装置100と、クライアント装置201とを含む。
修正支援システム200において、修正支援装置100とクライアント装置201とは、有線または無線のネットワーク210を介して接続される。ネットワーク210は、例えば、LAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどである。
修正支援装置100は、ソースコードを、クライアント装置201から受信することにより取得する。修正支援装置100は、ソースコード内の規約違反の箇所を検出する。修正支援装置100は、ソースコードの文脈を考慮して、検出した規約違反の箇所を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを特定する。修正支援装置100は、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案を、クライアント装置201に送信する。
クライアント装置201は、ソースコードを作成または修正する開発者によって用いられるコンピュータである。ソースコードを修正する開発者は、例えば、ソースコードを作成する開発者と同一の者である。ソースコードを修正する開発者は、例えば、ソースコードを作成する開発者とは異なる者であってもよい。クライアント装置201は、ソースコードを、修正支援装置100に送信する。クライアント装置201は、ソースコードを作成した開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案を、修正支援装置100から受信し、ソースコードを修正する開発者が参照可能に表示する。クライアント装置201は、例えば、PC、タブレット端末、または、スマートフォンなどである。開発者は、対処案を参照して、ソースコードを修正する。
ここでは、修正支援装置100が、ソースコード内の規約違反の箇所を検出し、かつ、ソースコードの文脈を考慮して、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを特定する場合について説明したが、これに限らない。例えば、修正支援装置100が、ソースコード内の規約違反の箇所を検出せず、ソースコード内の規約違反の箇所を検出可能な他のコンピュータと通信可能である場合があってもよい。この場合、修正支援装置100は、ソースコード内の規約違反の箇所を検出した結果を他のコンピュータから受信し、ソースコードをどのように修正すればよいのかを特定する。
(修正支援装置100のハードウェア構成例)
次に、図3を用いて、修正支援装置100のハードウェア構成例について説明する。
図3は、修正支援装置100のハードウェア構成例を示すブロック図である。図3において、修正支援装置100は、CPU(Central Processing Unit)301と、メモリ302と、ネットワークI/F(Interface)303と、記録媒体I/F304と、記録媒体305とを有する。また、各構成部は、バス300によってそれぞれ接続される。
ここで、CPU301は、修正支援装置100の全体の制御を司る。メモリ302は、例えば、ROM(Read Only Memory)、RAM(Random Access Memory)およびフラッシュROMなどを有する。具体的には、例えば、フラッシュROMやROMが各種プログラムを記憶し、RAMがCPU301のワークエリアとして使用される。メモリ302に記憶されるプログラムは、CPU301にロードされることにより、コーディングされている処理をCPU301に実行させる。
ネットワークI/F303は、通信回線を通じてネットワーク210に接続され、ネットワーク210を介して他のコンピュータに接続される。そして、ネットワークI/F303は、ネットワーク210と内部のインターフェースを司り、他のコンピュータからのデータの入出力を制御する。ネットワークI/F303は、例えば、モデムやLANアダプタなどである。
記録媒体I/F304は、CPU301の制御に従って記録媒体305に対するデータのリード/ライトを制御する。記録媒体I/F304は、例えば、ディスクドライブ、SSD(Solid State Drive)、USB(Universal Serial Bus)ポートなどである。記録媒体305は、記録媒体I/F304の制御で書き込まれたデータを記憶する不揮発メモリである。記録媒体305は、例えば、ディスク、半導体メモリ、USBメモリなどである。記録媒体305は、修正支援装置100から着脱可能であってもよい。
修正支援装置100は、上述した構成部のほか、例えば、キーボード、マウス、ディスプレイ、プリンタ、スキャナ、マイク、スピーカーなどを有してもよい。また、修正支援装置100は、記録媒体I/F304や記録媒体305を複数有していてもよい。また、修正支援装置100は、記録媒体I/F304や記録媒体305を有していなくてもよい。
(クライアント装置201のハードウェア構成例)
クライアント装置201のハードウェア構成例は、図3に示した修正支援装置100のハードウェア構成例と同様であるため、説明を省略する。
(修正支援装置100の機能的構成例)
次に、図4を用いて、修正支援装置100の機能的構成例について説明する。
図4は、修正支援装置100の機能的構成例を示すブロック図である。修正支援装置100は、記憶部400と、取得部401と、検出部402と、特定部403と、修正部404と、出力部405とを含む。
記憶部400は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域によって実現される。以下では、記憶部400が、修正支援装置100に含まれる場合について説明するが、これに限らない。例えば、記憶部400が、修正支援装置100とは異なる装置に含まれ、記憶部400の記憶内容が修正支援装置100から参照可能である場合があってもよい。
取得部401〜出力部405は、制御部の一例として機能する。取得部401〜出力部405は、具体的には、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶されたプログラムをCPU301に実行させることにより、または、ネットワークI/F303により、その機能を実現する。各機能部の処理結果は、例えば、図3に示したメモリ302や記録媒体305などの記憶領域に記憶される。
記憶部400は、各機能部の処理において参照され、または更新される各種情報を記憶する。記憶部400は、例えば、ソースコードを記憶する。ソースコードは、例えば、開発者によって作成される。
記憶部400は、例えば、関数ごとに、当該関数の引数となる変数を特定可能にする情報を記憶する。記憶部400は、具体的には、関数ごとに、当該関数の引数となる、データの格納先を表す変数と、当該変数のサイズを表す変数とを特定可能にする情報を記憶する。関数は、例えば、memset命令、または、memspy命令などである。記憶部400は、より具体的には、関数ごとに、当該関数の引数となる、データの格納先を表す変数の変数名と、当該変数のサイズを表す変数の変数名とを対応付けた情報を記憶する。
記憶部400は、具体的には、関数ごとに、当該関数の引数となる、解放する領域を表す変数を特定可能にする情報を記憶する。関数は、例えば、領域解放命令である。領域解放命令は、例えば、free命令、または、fclose命令などである。記憶部400は、より具体的には、関数ごとに、当該関数の引数となる、解放する領域を表す変数の変数名を対応付けた情報を記憶する。
取得部401は、各機能部の処理に用いられる各種情報を取得する。取得部401は、取得した各種情報を、記憶部400に記憶し、または、各機能部に出力する。また、取得部401は、記憶部400に記憶しておいた各種情報を、各機能部に出力してもよい。取得部401は、例えば、利用者の操作入力に基づき、各種情報を取得する。利用者は、例えば、開発者である。取得部401は、例えば、修正支援装置100とは異なる装置から、各種情報を受信してもよい。
取得部401は、ソースコードを取得する。取得部401は、例えば、利用者の操作入力に基づき、ソースコードの入力を受け付けることにより、ソースコードを取得する。取得部401は、例えば、利用者の操作入力に基づき、ソースコードを、記憶部400から読み出すことにより取得する。取得部401は、例えば、ソースコードを、クライアント装置201から受信することにより取得してもよい。
取得部401は、いずれかの機能部の処理を開始する開始トリガーを受け付けてもよい。開始トリガーは、例えば、利用者による所定の操作入力があったことである。開始トリガーは、例えば、他のコンピュータから、所定の情報を受信したことであってもよい。開始トリガーは、例えば、いずれかの機能部が所定の情報を出力したことであってもよい。
取得部401は、例えば、ソースコードを取得したことを、検出部402と、特定部403と、出力部405との処理を開始する開始トリガーとして受け付ける。取得部401は、例えば、出力部405が対処案を出力した結果、開発者がソースコードを修正したことを検出し、検出部402と、特定部403と、出力部405との処理を開始する開始トリガーとして受け付けてもよい。
検出部402は、ソースコードにおいて規約違反となる箇所を検出する。規約違反は、例えば、プログラミング言語の文法上は適切であり、コンパイルエラーとはならないものの、所定の規約に違反した箇所である。所定の規約は、例えば、コーディング規約である。コーディング規約は、例えば、CERTの標準セキュアコーディング規約などである。
検出部402は、ソースコードに記述されたサイズ演算子の出力結果が、ソースコードにおいて未参照であることを検出する。サイズ演算子は、例えば、ソースコードに記述された変数のサイズを出力する演算子である。検出部402は、例えば、ソースコードに記述されたサイズ演算子の出力結果が、ソースコードにおいて未参照であることを検出することにより、規約違反となるサイズ演算子を検出する。これにより、検出部402は、規約違反となる箇所を検出し、ソースコードを修正することが望まれると判断することができる。
検出部402は、ソースコードにおける、多重の領域解放命令を検出する。検出部402は、例えば、記憶した情報に基づいて、ソースコードにおける、領域解放命令の引数として、領域解放命令が解放する領域を表す変数を特定する。そして、検出部402は、例えば、解放する領域を表す同一の変数を引数とする、規約違反となる多重の領域解放命令を検出する。これにより、検出部402は、規約違反となる箇所を検出し、ソースコードを修正することが望まれると判断することができる。
検出部402は、ソースコードにおける、未解放の変数を検出する。検出部402は、例えば、記憶した情報に基づいて、記憶した情報に基づいて、ソースコードにおける、領域解放命令の引数として、領域解放命令が解放する領域を表す変数を特定する。そして、検出部402は、領域解放命令により解放されていない未解放の変数を検出する。検出部402は、具体的には、多重の領域解放命令を含む、ソースコードに記述された関数の中で、領域解放命令により解放されていない未解放の変数を検出する。これにより、検出部402は、規約違反を解消するようソースコードを修正するにあたり参考となる情報を取得することができる。
特定部403は、ソースコードの文脈を考慮して、規約違反となる箇所を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを特定し、対処案を特定する。
特定部403は、サイズ演算子の出力結果が未参照であることを検出した場合、記憶した情報に基づいて、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。特定部403は、例えば、記憶した情報に基づいて、サイズ演算子を含む、ソースコードに記述された関数の中で、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。
特定部403は、具体的には、記憶した情報に基づいて、サイズ演算子を含む、ソースコードに記述された関数の中に存在する、それぞれの関数の引数となる、格納先を表す変数と当該変数のサイズを表す変数とを特定する。そして、特定部403は、具体的には、サイズ演算子の引数となる変数と同一の、格納先を表す変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。これにより、特定部403は、規約違反を解消するようソースコードを修正するにあたり参考となる情報を取得することができる。
特定部403は、例えば、サイズ演算子を含む、ソースコードに記述された関数の中で、サイズ演算子が記述された箇所以降に存在し、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。
特定部403は、具体的には、記憶した情報に基づいて、サイズ演算子を含む、ソースコードに記述された関数の中で、サイズ演算子が記述された箇所以降に存在する、それぞれの関数の引数となる、格納先を表す変数と当該変数のサイズを表す変数とを特定する。そして、特定部403は、具体的には、サイズ演算子の引数となる変数と同一の、格納先を表す変数と、当該変数のサイズを表す変数とを引数とする関数を特定する。これにより、特定部403は、規約違反を解消するようソースコードを修正するにあたり参考となる情報を取得することができる。また、特定部403は、関数を検索する範囲を狭め、処理量の低減化を図ることができる。
特定部403は、例えば、サイズ演算子を含む、ソースコードに記述された関数の中で、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す、参照先が存在しない変数とを引数とする関数を特定する。
特定部403は、具体的には、記憶した情報に基づいて、サイズ演算子を含む、ソースコードに記述された関数の中で、それぞれの関数の引数となる、格納先を表す変数と当該変数のサイズを表す変数とを特定する。そして、特定部403は、具体的には、サイズ演算子の引数となる変数と同一の、格納先を表す変数と、当該変数のサイズを表す、参照先が存在しない変数とを引数とする関数を特定する。これにより、特定部403は、規約違反を解消するようソースコードを修正するにあたり参考となる情報を取得することができる。
特定部403は、例えば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正する内容を、対処案として特定する。これにより、特定部403は、開発者の意図に合わせて、ソースコードをどのように修正することが好ましいのかを、特定することができる。
特定部403は、例えば、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定しなかった場合、サイズ演算子を削除するよう、ソースコードを修正する内容を、対処案として特定する。これにより、特定部403は、開発者の意図に合わせて、ソースコードをどのように修正することが好ましいのかを、特定することができる。
特定部403は、例えば、多重の領域解放命令を検出し、かつ、多重の領域解放命令を含む、ソースコードに記述された関数の中で、未解放の変数を検出したか否かを判定する。そして、特定部403は、例えば、多重の領域解放命令を検出し、かつ、未解放の変数を検出した場合、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコードを修正する内容を、対処案として特定する。これにより、特定部403は、開発者の意図に合わせて、ソースコードをどのように修正することが好ましいのかを、特定することができる。
特定部403は、例えば、多重の領域解放命令を検出し、かつ、多重の領域解放命令を含む、ソースコードに記述された関数の中で、未解放の変数を検出したか否かを判定する。そして、特定部403は、例えば、多重の領域解放命令を検出し、かつ、未解放の変数を検出しなかった場合、多重の領域解放命令のいずれかの領域解放命令を削除するよう、ソースコードを修正する内容を、対処案として特定する。これにより、特定部403は、開発者の意図に合わせて、ソースコードをどのように修正することが好ましいのかを、特定することができる。
修正部404は、特定した対処案に基づいて、ソースコードを修正する。修正部404は、例えば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正する。これにより、修正部404は、開発者が、ソースコードを手作業で修正せずに済ませることができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
修正部404は、例えば、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコードを修正する。これにより、修正部404は、開発者が、ソースコードを手作業で修正せずに済ませることができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
出力部405は、いずれかの機能部の処理結果を出力する。出力形式は、例えば、ディスプレイへの表示、プリンタへの印刷出力、ネットワークI/F303による外部装置への送信、または、メモリ302や記録媒体305などの記憶領域への記憶である。これにより、出力部405は、いずれかの機能部の処理結果を利用者に通知可能にし、修正支援装置100の利便性の向上を図ることができる。利用者は、例えば、ソースコードを修正する開発者である。
出力部405は、特定した対処案を出力する。出力部405は、例えば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正する内容を、対処案として出力する。出力部405は、例えば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正する内容を、対処案として表示する。これにより、出力部405は、対処案を、開発者が参照可能に出力することができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
出力部405は、例えば、サイズ演算子を削除するよう、ソースコードを修正する内容を、対処案として出力する。これにより、出力部405は、対処案を、開発者が参照可能に出力することができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
出力部405は、例えば、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコードを修正する内容を、対処案として出力する。これにより、出力部405は、対処案を、開発者が参照可能に出力することができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
出力部405は、多重の領域解放命令のいずれかの領域解放命令を削除するよう、ソースコードを修正する内容を、対処案として出力する。これにより、出力部405は、対処案を、開発者が参照可能に出力することができ、ソースコードを修正する際に開発者にかかる作業負担の低減化を図ることができる。
(修正支援装置100の動作例1)
次に、図5〜図10を用いて、修正支援装置100の動作例1について説明する。
図5〜図10は、修正支援装置100の動作例1を示す説明図である。図5において、(1)修正支援装置100は、開発者の操作入力に基づき、関数一覧テンプレート500を取得する。
関数一覧テンプレート500は、例えば、図3に示した修正支援装置100のメモリ302や記録媒体305などの記憶領域により実現される。関数一覧テンプレート500は、関数名と、格納先変数の引数順番と、サイズ変数の引数順番とのフィールドを有する。関数一覧テンプレート500は、関数ごとに各フィールドに情報を設定することにより、関数情報が記憶される。
関数名のフィールドには、関数を識別する関数名が設定される。格納先変数の引数順番のフィールドには、関数の引数のうち、格納先を表す格納先変数に対応する引数が、先頭から何番目に規定された引数であるのかを示す番号が設定される。サイズ変数の引数順番のフィールドには、関数の引数のうち、サイズを表すサイズ変数に対応する引数が、先頭から何番目に規定された引数であるのかを示す番号が設定される。次に、図6の説明に移行する。
図6において、(2)修正支援装置100は、開発者の操作入力に基づき、ソースコードを取得する。修正支援装置100は、取得したソースコードのうち、代入先が存在せず、出力結果が未参照であるsizeof演算子を検出する。代入先が存在しないとは、例えば、ソースコードにおいて、変数名x=sizeof(・);のような記述が存在せず、何らかの変数にsizeof演算子の出力結果を代入する代入式が記述されていないことである。=は、代入演算子である。
図6の例では、修正支援装置100は、代入先が存在せず、出力結果が未参照であるsizeof(str);を検出する。修正支援装置100は、検出したsizeof(str);の引数となる変数の変数名strを特定する。これにより、修正支援装置100は、規約違反となる箇所を検出することができる。次に、図7の説明に移行する。
図7において、(3)修正支援装置100は、関数一覧テンプレート500に基づいて、ソースコードに記述された、それぞれの関数呼び出し文において引数として指定された、格納先変数の変数名を特定する。そして、修正支援装置100は、引数として指定された格納先変数の変数名が、検出したsizeof(str);の引数となる変数の変数名strと一致する関数呼び出し文を検索する。
図7の例では、修正支援装置100は、関数呼び出し文memset(str,0,sz);を検索する。これにより、修正支援装置100は、開発者の意図を考慮し、ソースコードをどのように修正すればよいかを特定する手がかりとなる情報を得ることができる。
ここで、修正支援装置100は、例えば、引数として指定された格納先変数の変数名が、sizeof(str);の引数となる変数の変数名strと一致しない関数呼び出し文memset(str2,0,sz);などを検索しなくてもよい。
また、修正支援装置100は、例えば、関数一覧テンプレート500に登録されていない関数名の関数を呼び出す関数呼び出し文xxfunc(str,sz);などを検索しなくてもよい。修正支援装置100は、例えば、引数として指定された変数の変数名が、sizeof(str);の引数となる変数の変数名strと一致しても、関数呼び出し文xxfunc(str,sz);などを検索しなくてもよい。次に、図8の説明に移行する。
図8において、(4)修正支援装置100は、関数一覧テンプレート500に基づいて、検索した関数呼び出し文memset(str,0,sz);において、引数として指定されたサイズ変数の変数名szを特定する。これにより、修正支援装置100は、検出したsizeof(str);の出力結果を参照する変数の候補となる、変数の変数名を特定することができる。そして、修正支援装置100は、開発者の意図を考慮し、ソースコードをどのように修正すればよいかを特定する手がかりとなる情報を得ることができる。次に、図9の説明に移行する。
図9において、(5)修正支援装置100は、ソースコードにおいて、特定したサイズ変数szに対する格納処理があるか否かを判定する。ここで、格納処理がなく、サイズ変数szの参照先がない場合、ソースコードにおいて、未参照のsizeof(str);と、参照先がないサイズ変数szとが共に存在することになる。この場合、サイズ変数szに、検出したsizeof(str);の出力結果を参照させるという開発者の意図があったと考えられる。このため、サイズ変数szが、検出したsizeof(str);の出力結果を参照するよう、ソースコードを修正することが好ましいと考えられる。
一方で、格納処理があり、サイズ変数szの参照先がある場合、サイズ変数szは、検出したsizeof(str);の出力結果を参照しなくてよいと考えられる。この場合、サイズ変数szに、検出したsizeof(str);の出力結果を参照させるという開発者の意図がないと考えられる。また、検出したsizeof(str);は、削除してもよい確率が高いと考えられる。
(5.1)修正支援装置100は、ソースコードの内容が、文面901のようであれば、特定したサイズ変数szに対する格納処理がないと判定する。このため、修正支援装置100は、検出したsizeof(str);を削除しない方がよいと判定する。
(5.2)修正支援装置100は、ソースコードの内容が、文面902のようであり、sz=strlen(str);が記述されていれば、特定したサイズ変数szに対する格納処理があると判定する。このため、修正支援装置100は、検出したsizeof(str);を削除してもよいと判定する。
(5.3)修正支援装置100は、ソースコードの内容が、文面903のようであり、サイズ変数sz以外に、サイズ変数sz2を特定した場合、同様に、特定したサイズ変数sz2に対する格納処理があるか否かを判定する。ここでは、修正支援装置100は、特定したサイズ変数sz2に対する格納処理があると判定する。このため、修正支援装置100は、検出したsizeof(str);を削除してもよいと判定する。
(5.4)修正支援装置100は、ソースコードの内容が、文面904のようであり、検出したsizeof(str);以前に、sz=strlen(str);が記述されていれば、特定したサイズ変数szに対する格納処理があると判定する。このため、修正支援装置100は、検出したsizeof(str);を削除してもよいと判定する。次に、図10の説明に移行する。
図10において、(6)修正支援装置100は、特定したサイズ変数szに対する格納処理があるか否かを判定した結果に基づいて、対処案を生成する。(6.1)修正支援装置100は、特定したサイズ変数szに対する格納処理がないと判定した場合、特定したサイズ変数szに、sizeof(str);の出力結果を代入する代入式を、ソースコードに書き込む対処案1001を生成して出力する。
これにより、修正支援装置100は、ソースコードの文脈を考慮して、規約違反となるsizeof(str);を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案1001を生成することができる。修正支援装置100は、生成した対処案1001を出力することができる。このため、修正支援装置100は、開発者が、対処案1001に基づき、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
(6.2)修正支援装置100は、特定したサイズ変数szに対する格納処理があると判定した場合、sizeof(str);を削除する対処案1002を生成して出力する。これにより、修正支援装置100は、ソースコードの文脈を考慮して、対処案1001より、規約違反となるsizeof(str);を削除する対処案1002の方が好ましい場合、対処案1002を生成して出力することができる。このため、修正支援装置100は、開発者が、誤って、サイズ変数szに、sizeof(str);の出力結果を代入する代入式を、ソースコードに書き込んでしまうことを回避することができる。また、修正支援装置100は、開発者が、対処案1002に基づき、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
(動作例1における全体処理手順)
次に、図11を用いて、修正支援装置100が実行する、動作例1における全体処理手順の一例について説明する。全体処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
図11は、動作例1における全体処理手順の一例を示すフローチャートである。図11において、修正支援装置100は、関数一覧テンプレートを取得する(ステップS1101)。
次に、修正支援装置100は、ソースコードのうち、代入先が存在しないsizeof演算子を検出する(ステップS1102)。そして、修正支援装置100は、関数一覧テンプレートに基づいて、検出したsizeof演算子に記述された変数名を、格納先変数の変数名として記述している関数呼び出し文を検索する(ステップS1103)。
次に、修正支援装置100は、検索した関数に記述されたサイズ変数を特定する(ステップS1104)。そして、修正支援装置100は、特定したサイズ変数の参照先が存在するか否かを判定する(ステップS1105)。
ここで、参照先が存在する場合(ステップS1105:Yes)、修正支援装置100は、ステップS1106の処理に移行する。一方で、参照先が存在しない場合(ステップS1105:No)、修正支援装置100は、ステップS1107の処理に移行する。
ステップS1106では、修正支援装置100は、ソースコードにおいて、特定したサイズ変数の参照先を、sizeof演算子の出力結果とする対処案を、利用者が参照可能に出力する(ステップS1106)。利用者は、例えば、ソースコードを修正する開発者である。そして、修正支援装置100は、全体処理を終了する。
ステップS1107では、修正支援装置100は、ソースコードにおいて、sizeof演算子を削除する対処案を、利用者が参照可能に出力する(ステップS1107)。そして、修正支援装置100は、全体処理を終了する。これにより、修正支援装置100は、ソースコードをどのように修正すればよいかを示す対処案を、利用者に参照させ、ソースコードを修正し易くすることができる。
(修正支援装置100の動作例2)
次に、図12〜図15を用いて、修正支援装置100の動作例2について説明する。
図12〜図15は、修正支援装置100の動作例2を示す説明図である。図12において、(1)修正支援装置100は、開発者の操作入力に基づき、関数一覧テンプレート1200を取得する。
関数一覧テンプレート1200は、例えば、図3に示した修正支援装置100のメモリ302や記録媒体305などの記憶領域により実現される。関数一覧テンプレート1200は、関数名と、解放先変数の引数順番とのフィールドを有する。関数一覧テンプレート1200は、関数ごとに各フィールドに情報を設定することにより、関数情報が記憶される。
関数名のフィールドには、関数を識別する関数名が設定される。解放先変数の引数順番のフィールドには、関数の引数のうち、解放する記憶領域を表す解放先変数に対応する引数が、先頭から何番目に規定された引数であるのかを示す番号が設定される。次に、図13の説明に移行する。
図13において、(2)修正支援装置100は、開発者の操作入力に基づき、ソースコードを取得する。修正支援装置100は、関数一覧テンプレート1200に基づいて、取得したソースコードにおいて、それぞれの領域解放命令の引数となり、解放する領域を表す解放先変数の変数名を特定する。修正支援装置100は、特定した変数名に基づいて、取得したソースコードにおいて、多重解放される変数の変数名を検出する。
(2.1)修正支援装置100は、ソースコードの内容が、文面1301のようであれば、複数のfree命令の引数となる解放先変数の変数名p1を検出する。(2.2)修正支援装置100は、ソースコードの内容が、文面1302のようであれば、複数のfree命令の引数となる解放先変数の変数名p1を検出する。
(3)修正支援装置100は、特定した変数名に基づいて、取得したソースコードにおいて、未解放の変数の変数名を検出する。(3.1)修正支援装置100は、ソースコードの内容が、文面1301のようであれば、一旦確保された後、いずれのfree命令の引数ともならず、解放されなかった未解放の変数の変数名p2を検出する。
(3.2)修正支援装置100は、ソースコードの内容が、文面1302のようであれば、未解放の変数の変数名を検出せず、未解放の変数がないと判定する。これにより、修正支援装置100は、規約違反となる箇所を検出することができる。
また、修正支援装置100は、開発者の意図を考慮し、ソースコードをどのように修正すればよいかを特定する手がかりとなる情報を得ることができる。修正支援装置100は、例えば、多重のfree命令のいずれかのfree命令で解放する領域の候補として、未解放の変数の変数名を検出することができ、ソースコードをどのように修正すればよいかを特定する手がかりとなる情報を得ることができる。次に、図14の説明に移行する。
図14において、(4)修正支援装置100は、同一の関数において、多重解放される変数と、未解放の変数とが共に存在するか否かを判定する。ここで、同一の関数において、多重解放される変数と、未解放の変数とが共に存在する場合、多重のfree命令のいずれかのfree命令を、本来、未解放の変数を解放させるfree命令として規定したかったという開発者の意図があると考えられる。
一方で、同一の関数において、多重解放される変数が存在するものの、未解放の変数が存在しない場合、多重のfree命令のそれぞれのfree命令を、本来、他の変数を解放させるfree命令として規定したいという開発者の意図はないと考えられる。
(4.1)修正支援装置100は、ソースコードの内容が、文面1301のようである場合、同一の関数において、多重解放される変数名p1の変数と、未解放の変数名p2の変数とが共に存在すると判定する。(4.2)修正支援装置100は、ソースコードの内容が、文面1302のようである場合、未解放の変数の変数名を検出していないため、同一の関数において、多重解放される変数と、未解放の変数とが共に存在しないと判定する。次に、図15の説明に移行する。
図15において、(5)修正支援装置100は、同一の関数において、多重解放される変数と、未解放の変数とが共に存在するか否かを判定した結果に基づいて、対処案を生成する。(5.1)修正支援装置100が、多重解放される変数名p1の変数と、未解放の変数名p2の変数とが共に存在すると判定したとする。この場合、修正支援装置100は、変数p1を多重解放する複数のfree命令のいずれかのfree命令が、未解放の変数p2を解放するよう、ソースコードを修正する対処案1501を生成して出力する。
これにより、修正支援装置100は、ソースコードの文脈を考慮して、規約違反となるfree命令を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案1501を生成して出力することができる。このため、修正支援装置100は、開発者が、対処案1501に基づき、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
(5.2)修正支援装置100が、同一の関数において、多重解放される変数と、未解放の変数とが共に存在しないと判定したとする。この場合、修正支援装置100は、変数p1を多重解放する複数のfree命令のいずれかのfree命令を削除するよう、ソースコードを修正する対処案1502を生成して出力する。
これにより、修正支援装置100は、ソースコードの文脈を考慮して、対処案1501より、規約違反となるfree命令を削除する対処案1502の方が好ましい場合、規約違反となるfree命令を削除する対処案1502を生成して出力することができる。このため、修正支援装置100は、開発者が、誤って、多重のfree命令のいずれかのfree命令で、他の変数を解放するよう、ソースコードを変更してしまうことを回避することができる。また、修正支援装置100は、開発者が、対処案1502に基づき、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
(動作例2における全体処理手順)
次に、図16を用いて、修正支援装置100が実行する、動作例2における全体処理手順の一例について説明する。全体処理は、例えば、図3に示したCPU301と、メモリ302や記録媒体305などの記憶領域と、ネットワークI/F303とによって実現される。
図16は、動作例2における全体処理手順の一例を示すフローチャートである。図16において、修正支援装置100は、関数一覧テンプレートを取得する(ステップS1601)。
次に、修正支援装置100は、関数一覧テンプレートに基づいて、ソースコードのうち、多重解放された変数を検出する(ステップS1602)。そして、修正支援装置100は、関数一覧テンプレートに基づいて、ソースコードのうち、未解放の変数を検出する(ステップS1603)。
次に、修正支援装置100は、ソースコードのうち、同一の関数において、多重解放される変数と、未解放の変数とが共に存在するか否かを判定する(ステップS1604)。
ここで、同一の関数において、多重解放される変数と、未解放の変数とが共に存在する場合(ステップS1604:Yes)、修正支援装置100は、ステップS1605の処理に移行する。一方で、同一の関数において、多重解放される変数と、未解放の変数とが共に存在しない場合(ステップS1604:No)、修正支援装置100は、ステップS1606の処理に移行する。
ステップS1605では、修正支援装置100は、ソースコードにおいて、多重解放された変数を解放するいずれかの解放命令を、未解放の変数を解放する新たな解放命令に変更する対処案を、利用者が参照可能に出力する(ステップS1605)。利用者は、例えば、ソースコードを修正する開発者である。そして、修正支援装置100は、全体処理を終了する。
ステップS1606では、修正支援装置100は、ソースコードにおいて、多重解放された変数を解放するいずれかの解放命令を削除する対処案を、利用者が参照可能に出力する(ステップS1606)。そして、修正支援装置100は、全体処理を終了する。これにより、修正支援装置100は、ソースコードをどのように修正すればよいかを示す対処案を、利用者に参照させ、ソースコードを修正し易くすることができる。
(修正支援装置100による効果)
次に、図17を用いて、動作例1および動作例2における修正支援装置100による効果について説明する。
図17は、修正支援装置100による効果を示す説明図である。図17において、表1700は、規約違反の例と、ソースコードの一例と、従来の対処案と、ソースコードを作成した開発者の意図とを表す。
表1700に示すように、未参照であり、機能的に意味を有さない記述が、規約違反として規定されている。ここで、開発者が、ソースコード1701を作成したとする。ソースコード1701は、規約違反となる行を含む。従来の対処案は、規約違反となる行を削除することを提案してしまう。これに対し、開発者は、本来、規約違反の行を、次に実行する関数に渡す値を求める意図で記述している。
修正支援装置100は、動作例1に示すように、規約違反となるsizeof(str);を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案を生成して出力することができる。このため、修正支援装置100は、開発者が、対処案に基づき、本来の意図通りに、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
また、表1700に示すように、変数を多重解放する記述が、規約違反として規定されている。ここで、開発者が、ソースコード1702を作成したとする。ソースコード1702は、規約違反となる行を含む。従来の対処案は、規約違反となる行を削除することを提案してしまう。これに対し、開発者は、本来、規約違反の行を、別の変数を解放する意図で記述している。
修正支援装置100は、動作例2に示すように、規約違反となるfree命令を削除するのではなく、開発者の意図に合うよう、ソースコードをどのように修正すればよいのかを示す対処案を生成して出力することができる。このため、修正支援装置100は、開発者が、対処案に基づき、本来の意図通りに、ソースコードを修正し易くすることができ、開発者にかかる作業負担の低減化を図ることができる。
以上説明したように、修正支援装置100によれば、ソースコードに記述された変数のサイズを出力する、ソースコードに記述されたサイズ演算子の出力結果が、ソースコードにおいて未参照であることを検出することができる。修正支援装置100によれば、関数ごとに、当該関数の引数となる変数を特定可能にする情報を記憶することができる。修正支援装置100によれば、サイズ演算子の出力結果が未参照であることを検出した場合、記憶した情報に基づいて、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定することができる。修正支援装置100によれば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正する内容を出力することができる。これにより、修正支援装置100は、開発者の意図に合わせて、ソースコードを修正し易くすることができる。
修正支援装置100によれば、サイズ演算子が記述された箇所以降に存在し、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定することができる。これにより、修正支援装置100は、処理量の低減化を図ることができる。
修正支援装置100によれば、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す、参照先が存在しない変数とを引数とする関数を特定することができる。これにより、修正支援装置100は、開発者の意図をより考慮し易くすることができ、開発者の意図に合わせて、ソースコードを修正し易くすることができる。
修正支援装置100によれば、関数ごとに、当該関数の引数となる、データの格納先を表す変数と、当該変数のサイズを表す変数とを特定可能にする情報を記憶することができる。これにより、修正支援装置100は、関数を特定し易くすることができる。
修正支援装置100によれば、特定した関数の引数となるサイズを表す変数が、サイズ演算子の出力結果を参照するよう、ソースコードを修正することができる。これにより、修正支援装置100は、開発者にかかる作業負担の低減化を図ることができる。
修正支援装置100によれば、サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定しなかった場合、サイズ演算子を削除するよう、ソースコードを修正する内容を出力することができる。これにより、修正支援装置100は、開発者の意図に合わせて、ソースコードを修正し易くすることができる。
修正支援装置100によれば、ソースコードにおける、多重の領域解放命令を検出することができる。修正支援装置100によれば、ソースコードにおける、未解放の変数を検出することができる。修正支援装置100によれば、多重の領域解放命令を検出し、かつ、未解放の変数を検出した場合、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコードを修正する内容を出力することができる。これにより、修正支援装置100は、開発者の意図に合わせて、ソースコードを修正し易くすることができる。
修正支援装置100によれば、多重の領域解放命令を検出し、かつ、未解放の変数を検出した場合、多重の領域解放命令のいずれかの領域解放命令が、未解放の変数を解放するよう、ソースコードを修正することができる。これにより、修正支援装置100は、開発者にかかる作業負担の低減化を図ることができる。
修正支援装置100によれば、多重の領域解放命令を検出し、かつ、未解放の変数を検出しなかった場合、多重の領域解放命令のいずれかの領域解放命令を削除するよう、ソースコードを修正する内容を出力することができる。これにより、修正支援装置100は、開発者の意図に合わせて、ソースコードを修正し易くすることができる。
なお、本実施の形態で説明した修正支援方法は、予め用意されたプログラムをPCやワークステーションなどのコンピュータで実行することにより実現することができる。本実施の形態で説明した修正支援プログラムは、コンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。記録媒体は、ハードディスク、フレキシブルディスク、CD(Compact Disc)−ROM、MO(Magneto Optical disc)、DVD(Digital Versatile Disc)などである。また、本実施の形態で説明した修正支援プログラムは、インターネットなどのネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
処理をコンピュータに実行させることを特徴とする修正支援プログラム。
(付記2)前記特定する処理は、
前記サイズ演算子の出力結果が未参照であることを検出した場合、前記情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子が記述された箇所以降に存在し、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する、ことを特徴とする付記1に記載の修正支援プログラム。
(付記3)前記特定する処理は、
前記サイズ演算子の出力結果が未参照であることを検出した場合、前記情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す、参照先が存在しない変数とを引数とする関数を特定する、ことを特徴とする付記1または2に記載の修正支援プログラム。
(付記4)前記情報は、関数ごとに、当該関数の引数となる、データの格納先を表す変数と、当該変数のサイズを表す変数とを特定可能にする情報である、ことを特徴とする付記1〜3のいずれか一つに記載の修正支援プログラム。
(付記5)特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する、
処理を前記コンピュータに実行させることを特徴とする付記1〜4のいずれか一つに記載の修正支援プログラム。
(付記6)前記出力する処理は、
前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定しなかった場合、前記サイズ演算子を削除するよう、前記ソースコードを修正する内容を出力する、ことを特徴とする付記1〜5のいずれか一つに記載の修正支援プログラム。
(付記7)ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
処理をコンピュータが実行することを特徴とする修正支援方法。
(付記8)ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
制御部を有することを特徴とする修正支援装置。
(付記9)ソースコードにおける、多重の領域解放命令を検出し、
ソースコードにおける、未解放の変数を検出し、
前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
処理をコンピュータに実行させることを特徴とする修正支援プログラム。
(付記10)前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する、
処理を前記コンピュータに実行させることを特徴とする付記9に記載の修正支援プログラム。
(付記11)前記出力する処理は、
前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出しなかった場合、前記多重の領域解放命令のいずれかの領域解放命令を削除するよう、前記ソースコードを修正する内容を出力する、ことを特徴とする付記9または10に記載の修正支援プログラム。
(付記12)ソースコードにおける、多重の領域解放命令を検出し、
ソースコードにおける、未解放の変数を検出し、
前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
処理をコンピュータが実行することを特徴とする修正支援方法。
(付記13)ソースコードにおける、多重の領域解放命令を検出し、
ソースコードにおける、未解放の変数を検出し、
前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
制御部を有することを特徴とする修正支援装置。
100 修正支援装置
110,1701,1702 ソースコード
111 箇所
120 開発者
200 修正支援システム
201 クライアント装置
210 ネットワーク
300 バス
301 CPU
302 メモリ
303 ネットワークI/F
304 記録媒体I/F
305 記録媒体
400 記憶部
401 取得部
402 検出部
403 特定部
404 修正部
405 出力部
500,1200 関数一覧テンプレート
901,902,903,904,1301,1302 文面
1001,1002,1501,1502 対処案
1700 表

Claims (11)

  1. ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
    前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
    特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
    処理をコンピュータに実行させることを特徴とする修正支援プログラム。
  2. 前記特定する処理は、
    前記サイズ演算子の出力結果が未参照であることを検出した場合、前記情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子が記述された箇所以降に存在し、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定する、ことを特徴とする請求項1に記載の修正支援プログラム。
  3. 前記特定する処理は、
    前記サイズ演算子の出力結果が未参照であることを検出した場合、前記情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す、参照先が存在しない変数とを引数とする関数を特定する、ことを特徴とする請求項1または2に記載の修正支援プログラム。
  4. 前記情報は、関数ごとに、当該関数の引数となる、データの格納先を表す変数と、当該変数のサイズを表す変数とを特定可能にする情報である、ことを特徴とする請求項1〜3のいずれか一つに記載の修正支援プログラム。
  5. 特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する、
    処理を前記コンピュータに実行させることを特徴とする請求項1〜4のいずれか一つに記載の修正支援プログラム。
  6. ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
    前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
    特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
    処理をコンピュータが実行することを特徴とする修正支援方法。
  7. ソースコードに記述された変数のサイズを出力する、前記ソースコードに記述されたサイズ演算子の出力結果が、前記ソースコードにおいて未参照であることを検出し、
    前記サイズ演算子の出力結果が未参照であることを検出した場合、関数ごとに、当該関数の引数となる変数を特定可能にする情報に基づいて、前記サイズ演算子を含む、前記ソースコードに記述された関数の中で、前記サイズ演算子の引数となる変数と同一の変数と、当該変数のサイズを表す変数とを引数とする関数を特定し、
    特定した前記関数の引数となるサイズを表す変数が、前記サイズ演算子の出力結果を参照するよう、前記ソースコードを修正する内容を出力する、
    制御部を有することを特徴とする修正支援装置。
  8. ソースコードにおける、多重の領域解放命令を検出し、
    ソースコードにおける、未解放の変数を検出し、
    前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
    処理をコンピュータに実行させることを特徴とする修正支援プログラム。
  9. 前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する、
    処理を前記コンピュータに実行させることを特徴とする請求項8に記載の修正支援プログラム。
  10. ソースコードにおける、多重の領域解放命令を検出し、
    ソースコードにおける、未解放の変数を検出し、
    前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
    処理をコンピュータが実行することを特徴とする修正支援方法。
  11. ソースコードにおける、多重の領域解放命令を検出し、
    ソースコードにおける、未解放の変数を検出し、
    前記多重の領域解放命令を検出し、かつ、前記多重の領域解放命令を含む、前記ソースコードに記述された関数の中で、前記未解放の変数を検出した場合、前記多重の領域解放命令のいずれかの領域解放命令が、前記未解放の変数を解放するよう、前記ソースコードを修正する内容を出力する、
    制御部を有することを特徴とする修正支援装置。
JP2020098860A 2020-06-05 2020-06-05 修正支援プログラム、修正支援方法、および修正支援装置 Pending JP2021192201A (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2020098860A JP2021192201A (ja) 2020-06-05 2020-06-05 修正支援プログラム、修正支援方法、および修正支援装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2020098860A JP2021192201A (ja) 2020-06-05 2020-06-05 修正支援プログラム、修正支援方法、および修正支援装置

Publications (1)

Publication Number Publication Date
JP2021192201A true JP2021192201A (ja) 2021-12-16

Family

ID=78945748

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2020098860A Pending JP2021192201A (ja) 2020-06-05 2020-06-05 修正支援プログラム、修正支援方法、および修正支援装置

Country Status (1)

Country Link
JP (1) JP2021192201A (ja)

Similar Documents

Publication Publication Date Title
JP4619698B2 (ja) コードセグメント作成方法及びそのシステム
JP4667386B2 (ja) 業務モデル図作成支援プログラム、業務モデル図作成支援方法、および業務モデル図作成支援装置
JP5460359B2 (ja) 文書中の文字列の処理を支援するための装置、方法及びプログラム
JP2012221380A (ja) 自動プログラム生成装置、方法及びコンピュータプログラム
CN110955409A (zh) 在云平台上创建资源的方法和装置
US9053450B2 (en) Automated business process modeling
KR20060030857A (ko) 정보 처리 방법 및 장치
JP3502543B2 (ja) テストケース生成システム及びテストケース生成方法
CN109947711A (zh) 一种对ios项目开发过程中的多语言文件自动化管理方法
JP6721548B2 (ja) 設計確認装置及び設計確認方法
JP2021192201A (ja) 修正支援プログラム、修正支援方法、および修正支援装置
US20230072988A1 (en) System and a method for automatic generation of smart contracts across blockchain platforms
US6854109B2 (en) Tool for converting .MAP file formats
KR101534493B1 (ko) 구조 변환에 기초한 소스코드 보안 약점 탐지 장치 및 방법
JP2023070408A (ja) 生成装置、生成方法及びプログラム
JP7247593B2 (ja) 生成装置、ソフトウェアロボットシステム、生成方法及び生成プログラム
JP2021096685A (ja) テスト実行プログラム、テスト実行方法、およびテスト実行装置
JP6907703B2 (ja) 解析装置、解析方法、および解析プログラム
KR102000543B1 (ko) 웹 전자 문서 편집 장치 및 이의 동작 방법
JP2011113298A (ja) 流用ソースコード解析システム及びプログラム並びに記録媒体
US20220035612A1 (en) Conversion assistance program, conversion assistance method, and conversion assistance device
KR102052338B1 (ko) 테스트케이스 설계 정보의 추적 분석을 위한 시각화 방법, 테스트케이스 생성 장치 및 컴퓨터 판독가능 기록매체
JP2006031331A (ja) プログラム変換実行計算機、及び、プログラム変換実行方法、プログラム
JP2021076951A (ja) 機能モデル生成装置、機能モデル生成プログラム、および、機能モデル生成方法
WO2018212142A1 (ja) 情報処理装置、情報処理方法及びコンピュータ読み取り可能な記録媒体