(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2022154258
(43)【公開日】2022-10-13
(54)【発明の名称】不正箇所特定プログラム、不正箇所特定装置、及び不正箇所特定方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20221005BHJP
【FI】
G06F11/36 136
【審査請求】未請求
【請求項の数】7
【出願形態】OL
(21)【出願番号】P 2021057186
(22)【出願日】2021-03-30
(71)【出願人】
【識別番号】000005223
【氏名又は名称】富士通株式会社
(74)【代理人】
【識別番号】100087480
【弁理士】
【氏名又は名称】片山 修平
(72)【発明者】
【氏名】清水 香代子
(72)【発明者】
【氏名】浦本 貴正
(72)【発明者】
【氏名】大畑 貴史
【テーマコード(参考)】
5B042
【Fターム(参考)】
5B042HH32
5B042LA02
5B042MA08
5B042MC03
5B042MC07
5B042MC12
(57)【要約】
【課題】プログラムの動作検証を支援すること。
【解決手段】データ6に基づいてメモリの記憶領域5の内容を変更する第1の命令7を含むプログラム4における第1の命令7の前と後に、記憶領域5の内容を取得する第2の命令4xを挿入し、第2の命令4xが挿入されたプログラム4を実行することにより、第2の命令4xが取得した内容の各々の履歴を示す履歴情報10を生成し、履歴情報10に基づいて、プログラム4の実行時のエラーの原因となるデータ6が設定されている箇所を特定する処理をコンピュータに実行させるための不正箇所特定プログラムによる。
【選択図】
図5
【特許請求の範囲】
【請求項1】
データに基づいてメモリの記憶領域の内容を変更する第1の命令を含むプログラムにおける前記第1の命令の前と後に、前記記憶領域の内容を取得する第2の命令を挿入し、
前記第2の命令が挿入された前記プログラムを実行することにより、前記第2の命令が取得した前記内容の各々の履歴を示す履歴情報を生成し、
前記履歴情報に基づいて、前記プログラムの実行時のエラーの原因となる前記データが設定されている箇所を特定する、
処理をコンピュータに実行させるための不正箇所特定プログラム。
【請求項2】
前記プログラムに前記第2の命令を挿入する指示の入力を受け付ける処理を前記コンピュータに実行させ、
前記第2の命令を挿入する処理は、前記指示の入力を受け付けたときにコンパイラを利用して行われることを特徴とする請求項1に記載の不正箇所特定プログラム。
【請求項3】
前記第1の命令を実行する前と後で前記記憶領域の内容が変わらない場合に前記内容を前記履歴情報に加えない、
処理を前記コンピュータに実行させるための請求項1に記載の不正箇所特定プログラム。
【請求項4】
前記第2の命令は、前記記憶領域の先頭アドレスと、前記プログラムのソースプログラムにおいて前記第1の命令に対応する文の位置とを更に取得し、
前記履歴情報は、互いに対応付けられた前記内容、前記先頭アドレス、及び前記位置を有し、
前記箇所を特定する処理は、
前記メモリにおいて前記データが格納されている領域の範囲を特定し、
前記履歴情報における前記先頭アドレスのうち、前記範囲に含まれる先頭アドレスを特定し、
特定した前記先頭アドレスに対応した前記内容に不正な前記データが格納されている場合に、特定した前記先頭アドレスに対応した前記位置を前記箇所として特定する、
処理を有することを特徴とする請求項1に記載の不正箇所特定プログラム。
【請求項5】
前記メモリの一部領域が前記プログラムにとって利用可能となった情報を前記履歴情報に追加する第3の命令を挿入し、
前記一部領域が前記プログラムにとって利用不可能となった情報を前記履歴情報に追加する第4の命令を挿入し、
前記データが前記一部領域に存在する場合に、前記第3の命令の実行から前記第4の命令の実行の終了までの期間に前記エラーが発生しなかったときには、前記メモリ内に存在する前記期間内における前記履歴情報を削除する、
処理を前記コンピュータに実行させるための請求項1に記載の不正箇所特定プログラム。
【請求項6】
データに基づいてメモリの記憶領域の内容を変更する第1の命令を含むプログラムにおける前記第1の命令の前と後に、前記記憶領域の内容を取得する第2の命令を挿入する挿入部と、
前記第2の命令が挿入された前記プログラムを実行することにより、前記第2の命令が取得した前記内容の各々の履歴を示す履歴情報を生成する生成部と、
前記履歴情報に基づいて、前記プログラムの実行時のエラーの原因となる前記データが設定されている箇所を特定する特定部と、
を有することを特徴とする不正箇所特定装置。
【請求項7】
コンピュータが、
データに基づいてメモリの記憶領域の内容を変更する第1の命令を含むプログラムにおける前記第1の命令の前と後に、前記記憶領域の内容を取得する第2の命令を挿入し、
前記第2の命令が挿入された前記プログラムを実行することにより、前記第2の命令が取得した前記内容の各々の履歴を示す履歴情報を生成し、
前記履歴情報に基づいて、前記プログラムの実行時のエラーの原因となる前記データが設定されている箇所を特定する、
処理を実行することを特徴とする不正箇所特定方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、不正箇所特定プログラム、不正箇所特定装置、及び不正箇所特定方法に関する。
【背景技術】
【0002】
プログラミング言語が想定していない形式のデータがプログラムに記述されている場合にそのプログラムを実行すると、異常な処理が行われてしまい、開発者が意図したのとは異なる実行結果が得られてしまう。以下では、このような異常な処理が行われることをデータエラーと呼び、その原因となったデータを不正データと呼ぶ。
【0003】
プログラミング言語の中には、データエラーを検出する機構が備わっている言語もある。例えば、NetCOBOLでは、特定の設定下でプログラムを実行すると、データ処理を行う前に対象データの形式を検査し、それが不正ならばエラーを報告する機能を提供している。これにより、不正データが処理されて意図しない実行結果が得られるのを防いでいる。
【0004】
しかし、データエラーでは、プログラム中で不正データが処理された箇所と、その不正データが設定された箇所とが大きく離れていることがある。このため、検査によってデータエラーを捕捉できても、その原因となった不正データがプログラムのどこにあるのかを突き止めることが簡単ではなく、プログラムの動作検証をするのが難しい場合がある。
【先行技術文献】
【特許文献】
【0005】
【発明の概要】
【発明が解決しようとする課題】
【0006】
一側面によれば、プログラムの動作検証を支援することを目的とする。
【課題を解決するための手段】
【0007】
一側面によれば、データに基づいてメモリの記憶領域の内容を変更する第1の命令を含むプログラムにおける第1の命令の前と後に、記憶領域の内容を取得する第2の命令を挿入し、前記第2の命令が挿入された前記プログラムを実行することにより、前記第2の命令が取得した前記内容の各々の履歴を示す履歴情報を生成し、前記履歴情報に基づいて、前記プログラムの実行時のエラーの原因となる前記データが設定されている箇所を特定する処理をコンピュータに実行させるための不正箇所特定プログラムが提供される。
【発明の効果】
【0008】
一側面によれば、プログラムの動作検証を支援することができる。
【図面の簡単な説明】
【0009】
【
図1】
図1は、第1実施形態に係る不正箇所特定装置が行う処理の例を示す模式図である。
【
図2】
図2は、実行可能プログラムを実行するときの第1実施形態に係る不正箇所特定装置の模式図である。
【
図3】
図3は、ソースプログラムの具体例を示す模式図である。
【
図4】
図4は、第1実施形態に係る不正箇所特定装置が行う処理の模式図である。
【
図5】
図5は、第1実施形態に係る履歴情報の模式図である。
【
図6】
図6は、第1実施形態におけるメッセージの模式図である。
【
図7】
図7は、第1実施形態に係る不正箇所特定装置の機能構成図である。
【
図8】
図8(a)は、第1実施形態に係る不正箇所特定方法のフローチャートであり、
図8(b)は第1実施形態に係る特定処理のフローチャートである。
【
図9】
図9(a)は、第1実施形態に従って不正箇所特定装置が生成した履歴情報の模式図であり、
図9(b)は、第2実施形態に係る生成部が生成した履歴情報の模式図である。
【
図10】
図10(a)は、第3実施形態に係る不正箇所特定装置がコンパイルの対象とする第3のソースプログラムの模式図であり、
図10(b)は、第2実施形態に係る不正箇所特定装置が第3のソースプログラムをコンパイルして得られた実行可能プログラムの第3のセクション模式図であり、
図10(c)は、第3実施形態に係る不正箇所特定装置が実行可能プログラムを実行することにより生成した履歴情報の模式図である。
【
図11】
図11は、第3実施形態に係る不正箇所特定装置がコンパイルするソースプログラムの模式図である。
【
図12】
図12は、第3実施形態に係る不正箇所特定装置が第4のソースプログラムをコンパイルして得られた実行可能プログラムの第4のセクションの模式図である。
【
図13】
図13は、第3実施形態に係る不正箇所特定装置が備えるメモリと記憶装置の中身を示す模式図でる。
【
図14】
図14は、第3実施形態において、第5のソースプログラムが2回目に第4のソースプログラムを呼び出した場合にデータエラーが発生する直前の履歴情報の模式図である。
【
図15】
図15は、第3実施形態において、第5のソースプログラムが2回目に第4のソースプログラムを呼び出した場合にデータエラーが発生した直後の履歴情報の模式図である。
【
図16】
図16は、第1及び第2実施形態に係る不正箇所特定装置のハードウェア構成図である。
【発明を実施するための形態】
【0010】
(第1実施形態)
図1は、第1実施形態に係る不正箇所特定装置が行う処理の例を示す模式図である。
【0011】
不正箇所特定装置1は、サーバやPC(Personal Computer)等のコンピュータであって、コンパイラ2を用いてソースプログラム3から実行可能プログラム4を生成する。実行可能プログラム4は、不正箇所特定装置1で実行可能なバイナリファイルである。
【0012】
ソースプログラム3を記述するためのプログラミング言語は特に限定されないが、以下ではプログラミング言語としてCOBOLを例にして説明する。
【0013】
また、ソースプログラム3は複数個に分割されていてもよい。ここでは、ソースプログラム3が、IDが「PROG-A」の第1のソースプログラム3aと、IDが「PROG-B」の第2のソースプログラム3bとに分割されている場合を想定する。なお、IDは、ソースプログラム3の内部で各ソースプログラム3a、3bを一意に識別する識別子である。
【0014】
この場合、実行可能プログラム4は、第1のソースプログラム3aに対応した処理を行う第1のセクション4aと、第2のソースプログラム3bに対応した処理を行う第2のセクション4bとを有することになる。
【0015】
ここで、プログラミング言語が想定していない不正データがソースプログラム3に記述されていると、実行可能プログラム4の実行時にデータエラーが発生する。このデータエラーの発生原因となる不正データがソースプログラム3において記述されている箇所を特定するために、本実施形態では不正箇所特定装置1がコンパイル時に実行可能プログラムに命令4xを挿入する。
【0016】
例えば、不正箇所特定装置1は、MOVE命令のようにメモリの記憶領域5の内容をデータ6に基づいて変更する命令7が実行可能プログラム4に含まれている場合に、命令7の前後に命令4xを挿入する。命令7の前に挿入された命令4xは、命令7を実行する前における記憶領域5の内容と、ソースプログラム3における命令7に対応した文の位置とを取得する命令である。また、命令7の後に挿入された命令4xは、命令7を実行した後における記憶領域5の内容と、ソースプログラム3における命令7に対応した文の位置とを取得する。
【0017】
図2は、実行可能プログラム4を実行するときの不正箇所特定装置1の模式図である。
【0018】
図2に示すように、実行可能プログラム4を実行するときは、不正箇所特定装置1はランタイム8を呼び出す。ランタイム8は、データ6(
図1参照)の形式を検査することにより、当該データ6が不正データかどうかを判定するプログラムである。その検査によって不正データであると判定された場合、ランタイム8はエラー9を出力する。
【0019】
また、不正箇所特定装置1が実行可能プログラム4を実行すると、命令4x(
図1参照)が、記憶領域5の内容と、ソースプログラム3において命令7に対応した文の位置とを取得することになる。不正箇所特定装置1は、このように取得した記憶領域5の内容と位置の履歴を示す履歴情報10を生成する。そして、不正箇所特定装置1は、履歴情報10を参照することにより、ソースプログラム3において不正なデータ6が設定された箇所を特定する。
【0020】
次に、ソースプログラム3の具体例を参照して、不正箇所特定装置1の処理について更に説明する。
【0021】
図3は、ソースプログラム3の具体例を示す模式図である。
図3では、第1のソースプログラム3aのファイル名を「a.cob」とし、第2のソースプログラム3bのファイル名を「b.cob」としている。これらのソースプログラム3a、3bは以下の処理を行う。
【0022】
まず、第1のソースプログラム3aの000011行目の文「01 WK-RECORD.」は、構造体「WK-RECORD」を定義する文である。000012行目の文「02 WK-ITEM-1 PIC S9(4).」と、000013行目の文「02 WK-ITEM-2 PIC S9(4).」は、それぞれ構造体「WK-RECORD」のメンバを定義する文である。なお、これらの文の最後の「(4)」は、メンバのサイズが4バイトであることを示す。よって、「WK-RECORD」の全体のサイズは8バイトとなる。
【0023】
また、000100行目の文「MOVE INPUT-RECORD TO WK-RECORD.」は、データ「INPUT-RECORD」を、メモリ内の記憶領域である「WK-RECORD」に格納する文である。この「WK-RECORD」は、000011行目で定義されている構造体と同一である。
【0024】
そして、000200行目の文「CALL "PROG-B" USING WK-ITEM-2.」は、構造体「WK-RECORD」のメンバの「WK-ITEM-2」を引数にして第2のソースプログラム3bを呼び出す文である。この場合、「WK-ITEM-2」のアドレスが第2のソースプログラム3bに渡される。
【0025】
一方、第2のソースプログラム3bの000011行目の文「01 PARAM-NUM PIC S9(4).」は、引数を受け取る「PARAM-NUM」を定義する文である。この場合、引数として渡された「WK-ITEM-2」のアドレスが、「PARAM-NUM」のアドレスとなる。
【0026】
そして、000300行目の「ADD 1 TO PARAM-NUM.」は、「PARAM-NUM」に格納されているデータに「1」を加算する文である。実行可能プログラム4においてこの「ADD 1 TO PARAM-NUM.」に対応した命令は、データ「1」に基づいてメモリ内の「PARAM-NUM」に対応した領域の内容を変更するADD命令となる。
【0027】
以下では、COBOLの仕様が、ADD文の対象として「-0」を指定してはいけない仕様であるとする。この場合、「-0」は不正データとなる。そして、000300行目の「ADD 1 TO PARAM-NUM.」において、「PARAM-NUM」に格納されているデータが「-0」であるとする。
【0028】
この場合に不正箇所特定装置1が行う処理について
図4を参照して説明する。
図4は、不正箇所特定装置1が行う処理の模式図である。
【0029】
まず、不正箇所特定装置1は、ソースプログラム3を取得する(ステップP1)。なお、ソースプログラム3は第1のソースプログラム3aと第2のソースプログラム3bとに分割されているが、
図4では簡単のため第1のソースプログラム3aのみを示している。
【0030】
次いで、不正箇所特定装置1は、コマンドラインを介してコマンド13の入力を受け付ける(ステップP2)。そのコマンド13における「cobol」は、COBOLのコンパイラ2でソースプログラム3をコンパイルする命令である。オプションの「-D1」は、コンパイル時に前述の命令4xを挿入する指示を示す。「a.cob」は、コンパイル対象のソースプログラムのファイル名である。
【0031】
次に、不正箇所特定装置1が、ファイル名が「a.cob」の第1のソースプログラム3aをコンパイルすることにより、実行可能プログラム4の第1のセクションを生成する(ステップP3)。
【0032】
その第1のセクション4aにおいて文「MOVE INPUT-RECORD TO WK-RECORD.」に相当する命令7の前後には前述の命令4xが挿入される。なお、命令7は第1の命令の一例であり、命令4xは第2の命令の一例である。
【0033】
命令7の前に挿入された命令4xは、命令7によって「WK-RECORD」の内容が変更される前における当該「WK-RECORD」の内容を取得する命令である。また、当該命令4xは、命令7に対応した文「MOVE INPUT-RECORD TO WK-RECORD.」の第1のソースプログラム3a内での位置として、当該文の行番号(000100)を取得する。
【0034】
また、命令7の後に挿入された命令4xは、命令7によって「WK-RECORD」の内容が変更された後における当該「WK-RECORD」の内容を取得する命令である。その命令4xは、命令7に対応した文「MOVE INPUT-RECORD TO WK-RECORD.」の第1のソースプログラム3a内での位置として、当該文の行番号(000100)を取得する。
【0035】
そして、これと同様にして、不正箇所特定装置1は、ファイル名が「b.cob」の第2のソースプログラム3bをコンパイルすることにより実行可能プログラム4の第2のセクション4bを生成する。
【0036】
次に、不正箇所特定装置1が実行可能プログラム4を実行することにより履歴情報10を生成する(ステップP4)。
【0037】
図5は、履歴情報10の模式図である。履歴情報10は、命令4xが取得した情報を命令4xの実行順に並べた情報である。この例では、履歴情報10は、「#通し番号」、「ソースファイル」、「行」、「イベント種類」、「アドレス」、「サイズ」、及び「内容」の各々が対応付けられて時系列順に並べられる。
【0038】
「#通し番号」は、複数の命令4xの各々を実行した順序を示す値である。以下では、「#通し番号」で一意に識別される履歴情報10の各行をログと呼ぶ。
【0039】
「ソースファイル」は、命令4xが記述されているソースプログラム3のファイル名である。「行」は、ソースプログラム3において命令7に対応した文が記述されている位置を示す行番号である。
【0040】
「イベント種類」は、命令7の実行前と実行後のどちらにおいて命令4xが実行されたかを示す情報である。ここでは、「実行前」は命令7の実行前に命令4xが実行されたことを示し、「実行後」は命令7の実行後に命令4xが実行されたことを示す。
【0041】
「アドレス」は、記憶領域5(
図1参照)の先頭アドレスである。
図4の例では、「WK-RECORD」の先頭アドレスが「アドレス」となる。
【0042】
「サイズ」は、記憶領域5のサイズである。この例では「WK-RECORD」のサイズが8バイトであるため、「サイズ」は8バイトとなる。「内容」は、記憶領域5に格納されているデータの内容である。
【0043】
図5の例では、ファイル名が「a.cob」の第1のソースプログラム3aが、2回呼び出された場合を想定している。例えば、1回目の呼び出しでは「#通し番号」が「11」と「12」のログが記録され、2回目の呼び出しでは「#通し番号」が「53」と「54」のログが記録される。
【0044】
そして、2回目の呼び出しにおいて「WK-RECORD」の下位4バイトに「-0」が格納されたことを想定しており、「#通し番号」が「54」のログにおける「内容」の下位4バイト「30303050」はゾーン十進形式で「-0」を表す。
【0045】
再び
図4を参照する。次に、ランタイム8は、実行可能プログラム4におけるデータの形式を検査する(ステップP5)。この例では、ランタイム8は、第2のソースプログラム3b(
図3(b)参照)の000300行目の「PARAM-NUM」の形式が、COBOLで許されている形式かを検査する。
【0046】
一例として、ランタイム8は、「PARAM-NUM」の先頭アドレス11とサイズ12とを引数として受け取り、当該先頭アドレス11に格納されている「PARAM-NUM」の形式を検査する。なお、「PARAM-NUM」の先頭アドレス11とサイズ12は、コンパイル時にコンパイラ2が第2のソースプログラム3bの000300行目のADD文の直前に挿入した命令がランタイム8に引数として渡す。
【0047】
この例では、
図3を参照して説明したように、「PARAM-NUM」にはCOBOLでは許されていない「-0」が格納されている。そのため、ランタイム8は、実行可能プログラム4において「PARAM-NUM」に対応したデータが不正であると判定し、エラー9を出力する。
【0048】
次に、不正箇所特定装置1は、履歴情報10を用いて、実行可能プログラム4の実行時のエラーの原因となる不正データ「-0」が設定されている箇所を特定する(ステップP6)。
【0049】
例えば、ステップP4でランタイム8に渡された先頭アドレス11が「12345674」であり、サイズ12が4バイトであるとする。この場合、不正箇所特定装置1は、不正なデータ「-0」が格納されている不正領域の範囲として、「12345674」から始まる4バイトの領域を特定する。
【0050】
更に、不正箇所特定装置1は、履歴情報10の最新のログから遡ることにより、不正領域に含まれている「アドレス」を特定する。
【0051】
この例では、「#通し番号」が「54」のログの「アドレス」が「12345670」であり、かつ「サイズ」が8バイトであるため、当該ログの「アドレス」が不正領域に含まれる。更に、このログの「内容」は「-0」であり、不正なデータ形式となっている。
【0052】
なお、更に遡った「#通し番号」が「53」のログも不正領域が含まれているが、当該ログの「内容」である「0000000036373849」は不正なデータ「-0」ではない。
【0053】
よって、不正箇所特定装置1は、「#通し番号」が「54」のログの内容に基づいて、不正なデータ「-0」が、ファイル名が「a.cob」の第1のソースプログラム3aの000100行目で設定されていることを特定する。
【0054】
次いで、不正箇所特定装置1は、不正なデータ「-0」を設定した命令7の箇所を示すメッセージ15を表示する(ステップP7)。
【0055】
図6は、そのメッセージ15の模式図である。メッセージ15の末尾15aには、不正なデータ「-0」を含む第1のソースプログラム3aのファイル名「a.cob」と、第1のソースプログラム3aにおいて当該データが設定されている行番号「00100」が表示される。
【0056】
以上により、不正箇所特定装置1が実行する基本的な処理を終える。
【0057】
これによれば、開発者がメッセージ15に基づいてソースプログラム3において不正なデータが設定されている箇所を特定できるため、ソースプログラム3を修正するのが容易となる。
【0058】
次に、本実施形態に係る不正箇所特定装置1の機能構成について説明する。
【0059】
図7は、不正箇所特定装置1の機能構成図である。
図7に示すように、不正箇所特定装置1は、通信部21、入力部22、表示部23、記憶部24、及び制御部25を有する。
【0060】
このうち、通信部21は、不正箇所特定装置1をLAN (Local Area Network)やインターネット等のネットワークに接続する処理部である。入力部22は、開発者がコマンドライン等に種々のコマンドを入力するための処理部である。また、表示部23は、
図4のエラー9やメッセージ15を表示するための処理部である。
【0061】
一方、記憶部24は、前述のコンパイラ2、ソースプログラム3、実行可能プログラム4、ランタイム8、及び履歴情報10を記憶する。
【0062】
制御部25は、不正箇所特定装置1の各部を制御する処理部である。一例として、制御部25は、取得部31、受付部32、挿入部33、検査部34、生成部35、及び特定部36を備える。
【0063】
このうち、取得部31は、通信部21を介してソースプログラム3を取得し、ソースプログラム3を記憶部24に格納する処理部である。受付部32は、コマンド13の入力を受け付ける処理部である。
【0064】
挿入部33は、受付部32がコマンド13の入力を受け付けたときに、コンパイラ2を利用してソースプログラム3をコンパイルして実行可能プログラム4を生成する。更に、挿入部33は、実行可能プログラム4における命令7の前後に命令4xを挿入し、その実行可能プログラム4を記憶部24に格納する。
【0065】
検査部34は、ランタイム8を呼び出すことにより、実行可能プログラム4におけるデータの形式を検査する処理部である。例えば、検査部34は、検査対象のデータの先頭アドレス11とサイズ12とを引数として受け取り、当該先頭アドレス11に格納されているデータの形式を検査する。なお、検査対象のデータの先頭アドレス11とサイズ12は、コンパイル時に挿入部33が生成しており、それらを検査部34が引数として受け取る。
【0066】
生成部35は、実行可能プログラム4を実行することにより履歴情報10を生成し、履歴情報10を記憶部24に格納する処理部である。
【0067】
特定部36は、履歴情報10に基づいて、実行可能プログラム4の実行時のエラーの原因となる不正なデータが設定されている箇所を特定する処理部である。例えば、特定部36は、
図8のステップS16の処理を実行することにより、「-0」という不正なデータが設定されている箇所として、第1のソースプログラム3aの000100行目を特定する。
【0068】
更に、特定部36は、特定した箇所を示すメッセージ15を表示する指示を表示部23に通知する。
【0069】
次に、本実施形態に係る不正箇所特定方法について説明する。
図8(a)は、本実施形態に係る不正箇所特定方法のフローチャートである。まず、取得部31が、通信部21を介してソースプログラム3を取得し、ソースプログラム3を記憶部24に格納する(ステップS11)。
【0070】
次に、受付部32がコマンド13の入力を受け付る(ステップS12)。
【0071】
次いで、挿入部33が、ソースプログラム3をコンパイルすることにより命令7の前後に命令4xが挿入された実行可能プログラム4を生成し、それを記憶部24に格納する(ステップS13)。
【0072】
次いで、生成部35が、実行可能プログラム4を実行することにより履歴情報10を生成し、履歴情報10を記憶部24に格納する(ステップS14)。
【0073】
続いて、検査部34が、ランタイム8を呼び出すことにより実行可能プログラム4におけるデータの形式を検査する(ステップS15)。
【0074】
その後、特定部36が、履歴情報10に基づいて、実行可能プログラム4の実行時のエラーの原因となる不正なデータが設定されている箇所を特定する特定処理を行う(ステップS16)。
【0075】
次に、特定部36が、特定した箇所を示すメッセージ15を表示する指示を表示部23に通知し、これを受けた表示部23がメッセージ15を表示する(ステップS17)。
【0076】
以上により、本実施形態に係る不正個所特定方法の基本的な処理を終える。
【0077】
次に、ステップS16の特定処理について説明する。
図8(b)は、ステップS16の特定処理のフローチャートである。
【0078】
まず、特定部36は、不正なデータが格納されている不正領域の範囲を特定する(ステップS21)。前述のように先頭アドレス11(
図4参照)が「12345674」でありサイズ12が4バイトの場合は、特定部36は、不正なデータ「-0」が格納されている不正領域の範囲として「12345674」から始まる4バイトの領域を特定する。
【0079】
次に、特定部36は、履歴情報10の複数の「アドレス」のうちで、ステップS21で特定した不正領域の範囲に含まれるものを特定する(ステップS22)。
【0080】
前述のように先頭アドレス11(
図4参照)が「12345674」でありサイズ12が4バイトの場合は、特定部36は、
図5の履歴情報10において「#通し番号」が「54」の「アドレス」が特定する。
【0081】
次いで、特定部36は、特定した「アドレス」に対応した「内容」に不正なデータ「-0」が格納されている場合に、当該「アドレス」に対応した「行」を、不正なデータ「-0」が設定されている箇所として特定する(ステップS23)。上記の例では、特定部36は、「#通し番号」が「54」の「行」における「000100」を、不正なデータが設定されている箇所として特定する。その後、呼び出し元に戻る。
【0082】
以上により、本実施形態に係る不正箇所特定方法の基本的な処理を終える。
【0083】
上記した本実施形態によれば、不正個所特定装置1が、履歴情報10に基づいて、ソースプログラム3において不正なデータが設定している箇所を自動で特定できる。そのため、ソースプログラム3において不正なデータを設定した箇所と当該データを処理した箇所が離れていても、不正なデータを設定した箇所を開発者がすぐに特定でき、開発者が行うプログラムの動作検証を支援できる。
【0084】
(第2実施形態)
本実施形態では、履歴情報10を簡略化する方法について説明する。
【0085】
図9(a)は、第1実施形態に従って不正箇所特定装置1が生成した履歴情報10の模式図である。
【0086】
この例では、「#通し番号」が「53」と「54」の各々のログの「内容」は同一である。これは、
図1の命令7を実行する前と後で記憶領域5の内容が変わらなかったためである。このように「内容」が同一の複数のログは、「内容」の変遷を表すものではないため、不正箇所特定装置1が不正なデータの箇所を特定するのに役に立たない。
【0087】
そこで、本実施形態では、生成部35が、「#通し番号」が「53」と「54」の各々のログを履歴情報10に加えない。
【0088】
また、「#通し番号」が「11」と「12」の各ログについては「内容」が相互に異なるものの、不正箇所特定装置1が不正なデータの箇所を特定する場合には「内容」が変更された後の「実行後」の「12」のログのみで足りる。よって、本実施形態では、生成部35が、「実行後」の「12」のログのみを履歴情報10に加える。
【0089】
図9(b)は、このように本実施形態において生成部35が生成した履歴情報10の模式図である。
【0090】
図9(b)に示すように、「#通し番号」が「53」と「54」の各々のログを履歴情報10に加えないことで、履歴情報10のサイズを低減できる。
【0091】
また、「#通し番号」が「11」と「12」の各ログについては、生成部35は、「#通し番号」を「6」に振り直したうえで、「実行後」のログのみを履歴情報10に加える。
【0092】
なお、生成部35は、「#通し番号」が「11」と「12」の各ログの「内容」のうち、命令7によって変化した下位4バイトの「36373849」のみを履歴情報10に加え、上位4バイトの「00000000」を履歴情報10に加えない。これにより、履歴情報10の更なる簡略化が可能となる。また、このように下位4バイトのみを履歴情報10に加えるのに呼応して、生成部35は、「サイズ」に「4」を格納する。そして、生成部35は、下位4バイトの先頭アドレスである「12345674」を「アドレス」に格納する。
【0093】
以上のように、本実施形態では履歴情報10を簡略化できるため、履歴情報10のデータサイズを低減できる。
【0094】
(第3実施形態)
実行可能プログラム4を実行すると、メモリの一部領域が確保されてから短時間のうちに当該一部領域が解放されることがある。例えば、実行可能プログラム4に含まれるある関数を実行すると、その関数の内部でのみ定義された局所変数のスタック領域が関数の実行時に確保され、関数の実行が終了すると当該スタック領域は解放される。
【0095】
このように短時間で解放される一部領域にMOVE文等でデータが設定された場合、当該一部領域を確保してから解放されるまでの期間にデータエラーが発生しないときは、当該データに関するログを履歴情報10に加えても無駄である。本実施形態ではこのような無駄を以下のようにして省く。
【0096】
図10(a)は、本実施形態において不正箇所特定装置1がコンパイルの対象とする第3のソースプログラム3cの模式図である。
【0097】
第3のソースプログラム3cの000011行目の「01 WK-1 PIC S9(4) VALUE 0.」は、局所変数「WK-1」を定義する文である。また、000012行目の「01 WK-2 PIC S9(4).」は、局所変数「WK-2」を定義する文である。
【0098】
そして、000100行目の文「PROCEDURE DIVISION.」は、第3のソースプログラム3cの手続き部分が開始することを示す文である。更に、000200行目の文「END-PROGRAM. PROG-C.」は、第3のソースプログラム3cの手続き部分が終了することを示す文である。
【0099】
この場合、000100行目において、局所変数「WK-1」、「WK-2」を格納するための一部領域がメモリに確保され、000200行目において当該一部領域が解放されることになる。
【0100】
図10(b)は、本実施形態において不正箇所特定装置1の挿入部33が第3のソースプログラム3cをコンパイルして得られた実行可能プログラム4の第3のセクション4cの模式図である。
【0101】
図10(b)に示すように、挿入部33は、第3のソースプログラム3cの手続き部分の命令列4yの前に命令4p、4qを挿入し、命令列4yの後に命令4r、4sを挿入する。
【0102】
命令列4yは、第3のソースプログラム3cの000101行目~000199行目の手続き部分の命令を並べた命令列である。
【0103】
また、命令4p、4qは、いずれも第3の命令の一例であって、それぞれ局所変数「WK-1」、「WK-2」が格納されるメモリの一部領域が実行可能プログラム4cにとって利用可能であることを示す情報を履歴情報10に追加する命令である。
【0104】
一方、命令4r、4sは、いずれも第4の命令の一例である。これらの命令4r、4sは、それぞれ局所変数「WK-1」、「WK-2」が格納されるメモリの一部領域が実行可能プログラム4cにとって利用不可能となったことを示す情報を履歴情報10に追加する命令である。
【0105】
図10(c)は、本実施形態における不正箇所特定装置1の生成部35が実行可能プログラム4を実行することにより生成した履歴情報10の模式図である。
【0106】
図10(c)に示すように、前述の命令4p、4qを実行することで、メモリの一部領域が利用可能になったことを示す「利用可能」という情報が履歴情報10の「イベント種類」に追加される。
【0107】
また、命令4r、4sを実行することで、メモリの一部領域が利用不可能になったことを示す「利用不可」という情報が履歴情報10の「イベント種類」に追加される。
【0108】
本実施形態では、これらの「利用可能」や「利用不可」等の情報を利用して、不正箇所特定装置1が履歴情報10を簡略化する。
【0109】
図11は、本実施形態において不正箇所特定装置1がコンパイルするソースプログラム3の模式図である。
【0110】
ここでは、ソースプログラム3は、ファイル名が「d.cob」の第4のソースプログラム3dと、ファイル名が「e.cob」の第5のソースプログラム3eとを有するものする。そして、第5のソースプログラム3eが、000100行目と000200行目において第4のソースプログラム3dを呼び出す場合を想定する。また、000200行目の2回目の呼び出しにおいて、第4のソースプログラム3dの変数「LOC-1」に不正なデータ「-0」が設定されたものとする。
【0111】
図12は、不正箇所特定装置1の挿入部33が第4のソースプログラム3dをコンパイルして得られた実行可能プログラム4の第4のセクション4dの模式図である。
【0112】
図12に示すように、第4のセクション4dには、各命令4t~4w、4z、7a~7cが含まれる。
【0113】
このうち、命令7a~7cは、それぞれ第4のソースプログラム3dの行番号000200~000202の各文に対応した命令である。
【0114】
また、命令7aの前に挿入された命令4tは、命令7aが「LOC-RECORD」にデータ「PARAM」を格納する前において、「LOC-RECORD」に対応したメモリの記憶領域の内容と、命令7aに対応した文の位置とを取得する命令である。
【0115】
そして、命令7aの後に挿入された命令4tは、命令7aが「LOC-RECORD」にデータ「PARAM」を格納した後における、「LOC-RECORD」に対応したメモリの記憶領域の内容と、命令7aに対応した文の位置とを取得する命令である。
【0116】
同様に、命令4u、4vも、それぞれ命令7b、7cの実行前におけるメモリの記憶領域の内容と、各命令7b、7cに対応した文の位置とを取得する命令である。
【0117】
一方、命令4wは、第3の命令の一例であって、局所変数「LOC-RECORD」が格納されるメモリの一部領域が第4の実行可能プログラム4dにとって利用可能であることを示す情報を履歴情報10に追加する命令である。
【0118】
そして、命令4zは、第4の命令の一例であって、局所変数「LOC-RECORD」が格納されるメモリの一部領域が第4の実行可能プログラム4dにとって利用不可能となったことを示す情報を履歴情報10に追加する命令である。
【0119】
図13は、不正箇所特定装置1が備えるメモリ1aと記憶装置1bの中身を示す模式図である。このうち、メモリ1aはDRAM(Dynamic Random Access Memory)等の揮発性メモリである。また、記憶装置1bは、HDD(Hard Disc Drive)やSDD(Solid State Drive)等のストレージである。
【0120】
本実施形態では、不正箇所特定装置1の生成部35が、記憶装置1bに履歴情報10を格納し、メモリ1aには履歴情報10のテンプレート10aを格納する。
【0121】
なお、
図13の履歴情報10は、第5のソースプログラム3eが、1回目(000100行目)に第4のソースプログラム3dを呼び出したときの履歴情報である。1回目の呼び出しでは第4のソースプログラム3dには不正なデータ「-0」は設定されていない。
【0122】
また、本実施形態における生成部35の機能は、例えば、以下のようなCOBOLのランタイムを不正箇所特定装置1が実行することにより実現できる。
【0123】
COB_DTLOG(EV_AVAILABLE, &LOC-RECORD, 8, PERSISTENCE_LOCAL);
なお、第1引数の「EV_AVAILABLE」は、イベント種類が「利用可能」であることを示す変数である。第2引数の「&LOC-RECORD」は、変数「LOC-RECORD」が格納される領域の先頭アドレスである。第3引数の「8」は変数「LOC-RECORD」のサイズである。第4変数の「PERSISTENCE_LOCAL」は、変数「LOC-RECORD」が局所変数であることを示す。
【0124】
本実施形態では、まず、不正箇所特定装置1の生成部35が、メモリ1aに履歴情報10のテンプレート10aを生成する。
【0125】
そのテンプレート10aには、「#通し番号」が「35」、「40」、「42」、及び「67」のログが生成される。これらのログは、それぞれ命令4w、4t、4v、4zが取得した情報に対応する。なお、「#通し番号」が「40」、「42」のログについては、不正箇所特定装置1が第2実施形態に従って簡略化している。
【0126】
ここでは前述のように第5のソースプログラム3eが第4のソースプログラム3dを1回目に呼び出しており、かつ第4のソースプログラム3dには不正なデータ「-0」は設定されていない場合を想定している。
【0127】
この場合、局所変数「LOC-RECORD」が格納される一部領域がメモリ1aに確保されてから当該一部領域が解放されるまでの間の期間にデータエラーは発生しない。そのため、局所変数「LOC-RECORD」とそのメンバ変数の「LOC-1」の各々の記憶領域の内容を含む「#通し番号」が「40」、「42」の各ログは、不正なデータが設定された箇所を特定するのに役立たない。
【0128】
そこで、生成部35は、「#通し番号」が「40」、「42」の各ログを、記憶装置1bの履歴情報10に加えず、かつメモリ1aから削除する。同様に、生成部35は、「LOC-RECORD」が格納される一部領域がそれぞれ利用可能及び利用不可能となったことを示す「#通し番号」が「35」、「67」の各ログについても、記憶装置1bの履歴情報10に加えず、かつメモリ1aから削除する。
【0129】
これにより、記憶装置1bの履歴情報10の容量が小さくなり、記憶装置1bの容量を節約することができる。
【0130】
一方、「#通し番号」が「41」のログは、局所変数「LOC-RECORD」とは別の変数「WK-1」の内容を示すログである。その変数「WK-1」が格納される記憶領域が確保されてから解放されるまでの期間は、局所変数「LOC-RECORD」のそれとは異なる。よって、生成部35は、「#通し番号」が「41」のログを記憶装置1bの履歴情報10に追加する。
【0131】
図14は、第5のソースプログラム3eが、2回目(000200行目)に第4のソースプログラム3dを呼び出した場合に、データエラーが発生する直前の履歴情報10の模式図である。
【0132】
この時点では、メモリ1aにおけるテンプレート10aに、「#通し番号」が「88」、「93」、及び「95」のログが生成される。これらのログは、それぞれ
図12の命令4w、4t、4vが取得した情報に対応する。なお、「#通し番号」が「93」のログについては、不正箇所特定装置1が第2実施形態に従って簡略化している。
【0133】
また、「#通し番号」が「88」、「93」、及び「95」のログは、局所変数「LOC-RECORD」とそのメンバ変数の「LOC-1」の各々の記憶領域の内容を含むログであり、この時点では局所変数「LOC-RECORD」の記憶領域は解放されていない。そのため、生成部35は、これらのログを記憶装置1bの履歴情報10に追加するかの判断を留保し、この時点ではこれらのログを履歴情報10には追加しない。
【0134】
一方、「#通し番号」が「94」のログは、局所変数「LOC-RECORD」とは別の変数「WK-1」の内容を示すログである。その変数「WK-1」が格納される記憶領域が確保されてから解放されるまでの期間は、局所変数「LOC-RECORD」のそれとは異なる。よって、生成部35は、この時点で「#通し番号」が「94」のログを記憶装置1bの履歴情報10に追加する。
【0135】
図15は、第5のソースプログラム3eが、2回目(000200行目)に第4のソースプログラム3dを呼び出した場合に、データエラーが発生した直後の履歴情報10の模式図である。
【0136】
このようにデータエラーが発生すると、生成部35は、メモリ1aにある「#通し番号」が「88」、「93」、及び「95」のログを、記憶装置1bの履歴情報10に追加する。その後、これらのログをメモリ1aから削除する。
【0137】
以上により、本実施形態に係る不正箇所特定方法の基本的な処理を終える。
【0138】
上記した本実施形態によれば、
図13に示したように、局所変数が格納されるメモリ1aの一部領域を確保してからそれを解放するまでの期間にデータエラーが発生しなかった場合、当該期間におけるログをメモリ1aから削除する。これにより、記憶装置1bに格納される履歴情報10の容量が小さくなり、記憶装置1bの容量を節約することができる。
【0139】
(ハードウェア構成)
次に、第1及び第2実施形態に係る不正箇所特定装置1のハードウェア構成について説明する。
【0140】
図16は、第1及び第2実施形態に係る不正箇所特定装置1のハードウェア構成図である。
【0141】
図16に示すように、不正箇所特定装置1は、メモリ1a、記憶装置1b、プロセッサ1c、通信インターフェース1d、表示装置1e、入力装置1f、及び媒体読取装置1gを有する。これらの各部は、バス1hにより相互に接続される。
【0142】
このうち、記憶装置1bは、HDDやSSD等の不揮発性のストレージであって、本実施形態に係る不正箇所特定プログラム100を記憶する。
【0143】
なお、不正箇所特定プログラム100をコンピュータが読み取り可能な記録媒体1kに記録し、媒体読取装置1gを介してプロセッサ1cにその不正箇所特定プログラム100を読み取らせるようにしてもよい。
【0144】
そのような記録媒体1kとしては、例えばCD-ROM、DVD、及びUSBメモリ等の物理的な可搬型記録媒体がある。また、フラッシュメモリ等の半導体メモリやハードディスクドライブを記録媒体1kとして使用してもよい。これらの記録媒体1kは、物理的な形態を持たない搬送波のような一時的な媒体ではない。
【0145】
更に、公衆回線、インターネット、及びLAN等に接続された装置に不正箇所特定プログラム100を記憶させてもよい。その場合は、プロセッサ1cがその不正箇所特定プログラム100を読み出して実行すればよい。
【0146】
一方、メモリ1aは、DRAM等のようにデータを一時的に記憶するハードウェアであって、その上に不正箇所特定プログラム100が展開される。
【0147】
プロセッサ1cは、不正箇所特定装置1の各部を制御するCPUやGPU等のハードウェアである。また、プロセッサ1cは、メモリ1aと協働して不正箇所特定プログラム100を実行する。
【0148】
このようにメモリ1aとプロセッサ1cとが協働して不正箇所特定プログラム100を実行することにより、不正箇所特定装置1の制御部25(
図7参照)が実現される。その制御部25には、取得部31、受付部32、挿入部33、検査部34、生成部35、及び特定部36が含まれる。
【0149】
また、記憶部24(
図7参照)は、メモリ1aと記憶装置1bとによって実現される。
【0150】
更に、通信インターフェース1dは、不正箇所特定装置1をLANやインターネット等のネットワークに接続するためのNetwork Interface Card (NIC)等のハードウェアである。その通信インターフェース1dにより通信部21(
図7参照)が実現される。
【0151】
そして、表示装置1eは、
図4のエラー9やメッセージ15を表示するための液晶ディスプレイやタッチパネル等のハードウェアである。その表示装置1eにより表示部23(
図7参照)が実現される。
【0152】
また、入力装置1fは、開発者が不正箇所特定装置1にコマンド13を入力するためのキーボードやマウス等のハードウェアである。
【0153】
媒体読取装置1gは、記録媒体1kを読み取るためのCDドライブ、DVDドライブ、及びUSBインターフェース等のハードウェアである。
【符号の説明】
【0154】
1…不正箇所特定装置、2…コンパイラ、3…ソースプログラム、3a~3e…第1~第5のソースプログラム、4…実行可能プログラム、4a~4d…第1~第4のセクション、5…記憶領域、6…データ、8…ランタイム、10…履歴情報、10a…テンプレート、11…先頭アドレス、12…サイズ、13…コマンド、15…メッセージ。