JP2011048581A - ソースコード解析システム - Google Patents

ソースコード解析システム Download PDF

Info

Publication number
JP2011048581A
JP2011048581A JP2009195859A JP2009195859A JP2011048581A JP 2011048581 A JP2011048581 A JP 2011048581A JP 2009195859 A JP2009195859 A JP 2009195859A JP 2009195859 A JP2009195859 A JP 2009195859A JP 2011048581 A JP2011048581 A JP 2011048581A
Authority
JP
Japan
Prior art keywords
source code
value
execution
endianness
library
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.)
Granted
Application number
JP2009195859A
Other languages
English (en)
Other versions
JP5050019B2 (ja
Inventor
Yuji Ishikawa
悠司 石川
Yu Nakanishi
悠 中西
Yutaka Ota
裕 太田
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.)
Toshiba Corp
Original Assignee
Toshiba Corp
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 Toshiba Corp filed Critical Toshiba Corp
Priority to JP2009195859A priority Critical patent/JP5050019B2/ja
Priority to US12/713,817 priority patent/US8266596B2/en
Publication of JP2011048581A publication Critical patent/JP2011048581A/ja
Application granted granted Critical
Publication of JP5050019B2 publication Critical patent/JP5050019B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/51Source to source

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定すること。
【解決手段】第2のエンディアン方式に従ったシミュレーションの実行中に代入文が実行される毎に、前記代入文に第1のエンディアン方式に従ったシミュレーションと第2のエンディアン方式に従ったシミュレーションとで、同一の意味に解釈される値が代入されるか否かを判定し、同一の意味に解釈される値が代入されない場合には、第2のエンディアン方式で代入された値を期待値で上書するとともに該代入文をエンディアンネス依存箇所としてレポート出力する。
【選択図】図8

Description

本発明は、ソースコード解析システムに関する。
プロセッサがバイト単位でアドレスを持つメモリにマルチバイトデータを書き込む場合、データの格納順序(変数記憶方式)に関して自由度が存在する。一般的に使われる格納順序として、重み付けの小さいバイトから順に記述する方式(リトルエンディアン)と重み付けの大きいバイトから順に記述する方式(ビッグエンディアン)とがある。16進数の整数を0x1234のように先頭に0xをつけて表記し、メモリ上で連続して配置されるバイト列を0x12、0x34のように小さいアドレスに位置するバイトから順にカンマで区切って表記することとすると、例えば4バイト長の整数0x12345678は、リトルエンディアン方式では、0x78、0x56、0x34、0x12のように記述され、ビッグエンディアン方式では、0x12、0x34、0x56、0x78のように記述される。なお、このようなマルチバイトデータの格納順序のことを簡単にエンディアンネスと呼ぶ。
ビッグエンディアン方式で書き込まれた4バイト整数値0x12345678をリトルエンディアン方式の4バイト整数値として読み出そうと試みると、値0x78563412が得られる。このため、ビッグエンディアン方式に従うプロセッサを想定して書かれたプログラムをリトルエンディアン方式に従うプロセッサでそのまま動作させると、メモリの読み書きで誤動作を起こす可能性がある。
バイトアクセスとシフト演算を組み合わせることで、特定の格納順序を意図してマルチバイトデータを読み書きすることは可能である。この場合、処理系のエンディアンネスに依存しないソフトウェアを記述できるが、メモリアクセスの回数が増加するので処理速度の低下は避けられない。このため、特定のエンディアンネスに従うプロセッサで実行することを前提としてそのエンディアンネスに依存したプログラムを書くことは多々見られる。
異なるエンディアンネスに従うプロセッサへのソフトウェアの移植を支援する技術は幾つか報告されている。例えば特許文献1には、バイトスワップ命令を自動的に挿入してエンディアンネス依存処理を修正するコンパイル技術が開示されている。この技術は、作業者が変数に付与したエンディアンネス情報を基にしてエンディアンネスの一貫しない代入文を見つけ出す方針を採っている。この技術の問題点としては、移植を試みる作業者が移植対象のソフトウェアの構造・挙動について十分な知識を持っていなければならないことが挙げられる。また、特許文献2には、ソフトウェアのソースコードを基にエンディアンネス依存箇所を指摘する技術が開示されている。検査対象のプログラムの変数の代入関係についてグラフ構造を作り、代入前後で型変換が行われている箇所をエンディアンネス依存の疑いありと判定する。型変換を抽出する関係上、エンディアンネス情報が変数に付与されていないと検出精度が大幅に落ちると考えられる。
これら2件の提案で述べられている手法は、ソフトウェアのソースコード上の型情報からエンディアンネス依存箇所の推定を静的に行っている。一方、一般的なプログラミングにおいては型を無視した変数の操作が行われる場合があり、これらの手法の誤動作・誤検出を招きやすい。特に、組み込み分野やデバイスドライバなどのプログラミングではメモリ使用量の削減、処理時間の短縮、ハードウェアへのアクセス手順の制約などにより、特殊なテクニックが使われる場合がある。
上記したソースコードから静的に得られる情報から依存箇所を推定する二つの技術に対し、実際にソフトウェアを実行して不具合の起こる箇所を特定する手法も考えられる。このような手法は、単純であり、実装が容易である。しかしながら、この手法によれば、修正・テストを繰り返してエンディアンネス依存箇所を順次取り除くことができるが、一度のシミュレーションで確実に発見できるエンディアンネス依存箇所は高々1つであり、作業効率が低い、という問題があった。
特表2008−523514号公報 特開平05−119960号公報
本発明は、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができるソースコード解析システムを提供することを目的とする。
本願発明の一態様によれば、ソースコードをビルドして第1の変数記憶方式に従う実行環境で動作する第1オブジェクトコードを生成する第1ビルド部と、前記第1オブジェクトコードを動作させ、前記第1オブジェクトコードの実行パス上の代入文に代入された値を順次取得し、前記取得した値と前記代入文との対応付けを実行トレースとして順次出力する実行トレース出力処理を実行する第1実行部と、前記ソースコードをビルドして前記第1の変数記憶方式と異なる第2の変数記憶方式に従う実行環境で動作する第2オブジェクトコードを生成する第2ビルド部と、前記第2オブジェクトコードを動作させ、前記第2オブジェクトコードの実行パス上の代入文に値が代入される毎に、前記第2オブジェクトコード実行中に代入された値と前記実行トレースに基づいて求まる前記第2オブジェクトコードの動作中に前記代入文に代入されるべき値である期待値とが一致するか否かを判定し、双方の値が異なった場合、前記第2オブジェクトコード実行中に代入された値を前記期待値で上書きするとともに前記代入文は変数記憶方式依存箇所であるとして前記ソースコードにおける前記代入文の位置情報をレポート出力する変数記憶方式依存箇所特定処理を実行する第2実行部と、を備えることを特徴とするソースコード解析システムが提供される。
本発明によれば、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができるソースコード解析システムを得ることができるという効果を奏する。
図1は、第1の実施の形態のソースコード解析システムの構成を説明する図。 図2は、実行トレースの一例を説明する図。 図3は、第1の実施の形態のエンディアンネス移植動作の概略を説明するフローチャート。 図4は、ソースコード変換処理を説明するフローチャート。 図5は、__assign_hook関数の実装例および__assign_hook関数挿入前後のソースコードの例を説明する図。 図6は、複合型の構造体の例を説明する図。 図7は、実行トレース出力処理を説明するフローチャート。 図8は、エンディアンネス依存箇所特定処理を説明するフローチャート。 図9は、エンディアンネス依存箇所を特定する対象のソースコードの一例を説明する図。 図10は、シミュレーション結果を説明する図。 図11は、エンディアンネス依存箇所レポートの一例を示す図。 図12は、シミュレーション結果を説明する図。 図13は、ソースコード解析システムのハードウェア構成の一例を説明する図。 図14は、対象システムの一例を説明する図。 図15は、第2の実施の形態のソースコード解析システムの構成を説明する図。 図16は、エンディアンネス依存箇所特定処理を説明するフローチャート。
以下に添付図面を参照して、本発明の実施の形態にかかるソースコード解析システムを詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
(第1の実施の形態)
第1の実施の形態のソースコード解析システムは、第1のエンディアン方式に従う実行環境で実行されることを想定したソースコードを第2のエンディアン方式に従う実行環境で実行されることを想定したソースコードに移植する際に特に問題となるソースコード中のエンディアンネス依存箇所を特定することができる。以下では、第1のエンディアンをビッグエンディアン、第2のエンディアンをリトルエンディアンとして説明する。なお、以降の説明においては、ビッグエンディアン方式に従う要素(構成要素、データ)を単にビッグエンディアン処理系と表現することもある。また、リトルエンディアン方式に従う要素をリトルエンディアン処理系と表現することもある。図1は、第1の実施の形態のソースコード解析システムの構成を説明する図である。
ソースコード解析システム100は、図示するように、第1言語ツール部1(第1ビルド部)、第1シミュレータ部2(第1実行部)、実行トレース出力用ライブラリ3、第2言語ツール部4(第2ビルド部)、第2シミュレータ部5(第2実行部)、エンディアンネス依存箇所特定ライブラリ6、およびソースコード変換部7を備えている。
第1の実施の形態のソースコード解析システム100は、第1のエンディアン(ここではビッグエンディアン)方式で記述された移植対象のソースコードD1を第2のエンディアン(ここではリトルエンディアン)方式でビルドして実行した場合、ソースコードD1の代入文に意図した値、言い換えると第1のエンディアン方式でビルドして実行した場合に代入される値(代入値)、と同一の意味に解釈される値が入力されるか否かを検証することによってエンディアンネス依存箇所を特定する。そのための構成として、ソースコード解析システム100は、ビッグエンディアン方式に従った処理を実行するための構成要素(ビッグエンディアン処理系)と、リトルエンディアン方式に従った処理を実行するための構成要素(リトルエンディアン処理系)とを備えている。第1言語ツール部1、第1シミュレータ部2および実行トレース出力用ライブラリ3は、ビッグエンディアン処理系に属し、第2言語ツール部4、第2シミュレータ部5およびエンディアンネス依存箇所特定ライブラリ6はリトルエンディアン処理系に属する。
ソースコード変換部7は、ソースコードD1上の全ての代入文に対して、実行トレース出力用ライブラリ3、エンディアンネス依存箇所特定ライブラリ6を呼び出す処理を挿入し、変換済みソースコードD4を出力する。
第1言語ツール部1は、ソースコードをビルドしてビッグエンディアン方式に従う実行環境で動作するオブジェクトコードを生成する言語ツールである。第1言語ツール部1は、ソースコードD1を動作させるための周辺処理を提供するテストソースD2および変換済みソースコードD4が第1言語ツール部1に入力され、入力されたテストソースD2および変換済みソースコードD4を組み合わせてビルドし、オブジェクトコードD5(第1オブジェクトコード)を生成する。なお、第1言語ツール部1には、コンパイラ、アセンブラ、リンカ、標準ライブラリなどを備える一般的に入手可能なツール群を使用することができる。
実行トレース出力用ライブラリ3は、第1言語ツール部1の変換済みソースコードD4のビルド時に呼び出されてリンクされる。
第1シミュレータ部2は、オブジェクトコードをビッグエンディアン方式に基づいて解釈して実行(シミュレーション)するための実行環境である。言い換えると、第1シミュレータ部2は、ビッグエンディアン方式に従う実行環境である。実行環境とは、例えばプロセッサ、メモリ、および周辺機器を備えるコンピュータ環境である。第1シミュレータ部2として、ビッグエンディアン処理系の実機を用いるようにしてもよいが、ここでは、コンピュータ上に実現されるビッグエンディアン処理系の実機を模擬した仮想環境を用いることとして説明する。
第1シミュレータ部2は、ソースコードD1の動作を検証するためのテストパターンであるテスト用データD3を使用してオブジェクトコードD5を実行する(動作させる)。第1シミュレータ部2は、オブジェクトコードD5を実行した際、オブジェクトコードD5に組み込まれている実行トレース出力用ライブラリ3による制御に基づいて、ソースコードD1をビッグエンディアン方式でビルドして実行した場合における実行パス中に現れる代入文に代入された値(代入値)を順次取得し、代入値と該代入値が代入された代入文との対応付けを実行トレースD6として順次出力する。なお、ここでは、実行トレースD6には、代入値と該代入値が代入された代入文のソースコードD1上の位置とが対応付けられているとする。また、以降、オブジェクトコードD5に組み込まれている実行トレース出力用ライブラリ3に制御された第1シミュレータ部2の処理に関する説明においては、実行トレース出力用ライブラリ3を該処理の動作主体として表現することもある。
図2は、実行トレースD6の一例を説明する図である。図示するように、実行トレースD6には、時系列順に、実行した代入文のソースコードD1上の位置と代入値とが対応付けられて記述されている。ここでは、ソースコードD1上の位置を示す表記方法としてファイル名と行番号とを使用しているが、ソースコードD1上の位置を作業者が特定できる表記方法であれば別の表記方法を用いてもよい。なお、ソースコードD1上の代入文を識別することができるのであれば、実行した代入文のソースコードD1上の位置の代わりに他の識別情報を用いてもよい。
第2言語ツール部4は、ソースコードをリトルエンディアン方式に従う実行環境で動作するオブジェクトコードを生成する言語ツールである。第2言語ツール部4は第1言語ツール部1とはエンディアンネスの違いを除いて同じ機能を備えている。第2言語ツール部4は、テストソースD2および変換済みソースコードD4が入力され、入力されたテストソースD2および変換済みソースコードD4を組み合わせてビルドし、オブジェクトコードD7(第2オブジェクトコード)を生成する。
エンディアンネス依存箇所特定ライブラリ6は、変換済みソースコードD4が言語ツール部4によりビルドされる際にリンクされる。
第2シミュレータ部5は、オブジェクトコードをリトルエンディアン方式に基づいて解釈して実行するための実行環境である。第2シミュレータ部5は、エンディアンネスの違いを除いて第1シミュレータ部2と同じ機能を備えている。第2シミュレータ部5は、テスト用データD3を使用してオブジェクトコードD7を実行する。
第2シミュレータ部5は、オブジェクトコードD7を実行した際、オブジェクトコードD7に組み込まれたエンディアンネス依存箇所特定ライブラリ6による制御に基づいて、実行トレースD6を読み出し、オブジェクトコードD7の実行パス中の代入文に代入値が代入される毎に、実行トレースD6に基づいて前記代入文に代入されるべき値である期待値を求め、オブジェクトコードD7の実行中に実際に代入された代入値と前記求めた期待値とを比較する。そして、エンディアンネス依存箇所特定ライブラリ6は、代入値と期待値との相異を発見した場合、エンディアンネス依存箇所を発見したとみなしてエンディアンネス依存箇所レポートD8を出力する。なお、以降、オブジェクトコードD7に組み込まれたエンディアンネス依存箇所特定ライブラリ6に制御された第1シミュレータ部2の処理に関する説明においては、エンディアンネス依存箇所特定ライブラリ6を該処理の動作主体として表現することもある。
ここで、オブジェクトコードD7の実行中にある代入文で意図した値(期待値)と異なる値が代入された場合、データ誤りが伝播し、この代入文以降の処理は意図した処理と異なったものとなる。そして、エンディアンネス依存のない代入文であってもエンディアンネス依存箇所として検出されてしまう可能性が生じる。そこで、このようなデータ誤りの伝播を防止するために、オブジェクトコードD7に組み込まれたエンディアンネス依存箇所特定ライブラリ6は、オブジェクトコードD7中の代入文の代入値と期待値との相異を発見する毎に、前記代入値を期待値で上書きする。オブジェクトコードD7は、エンディアンネス依存の代入値が逐次期待値に置き換えられつつ実行されるため、ソースコード解析システム100は、実行パス中に複数のエンディアンネス依存箇所が存在する場合であっても、一回のシミュレーションで実行パス中の複数のエンディアンネス依存箇所を特定することができる。
次に、第1の実施の形態のソースコード解析システム100を用いてエンディアンネス依存箇所を特定する方法を説明する。なお、ここでは、C言語で記述されているソースコードD1をビッグエンディアン方式からリトルエンディアン方式に移植する動作の一環としてエンディアンネス依存箇所の特定が行われるものとして説明する。
図3は、第1の実施の形態のソースコード解析システム100を用いて行われるエンディアンネス移植動作の概略を説明するフローチャートである。まず、ソースコード変換部7は、ソースコードD1に対して構文解析を行い、ライブラリ(実行トレース出力用ライブラリ3、エンディアンネス依存箇所特定ライブラリ6)を呼び出して実行する関数である__assign_hook関数を挿入する処理であるソースコード変換処理を行う(S1)。なお、ここでは、__assign_hook関数は、第1言語ツール部1にてビルドされたとき、実行トレース出力用ライブラリ3にリンクされ、第2言語ツール部4にてビルドされたとき、エンディアンネス依存箇所特定ライブラリ6にリンクされることとしている。図4は、ソースコード変換処理を説明するフローチャートである。
図4に示すように、まず、ソースコード変換部7は、ソースコードD1が含む代入文を一つ選択し(S11)、一つの代入文に対して、左辺式の型が値型であるか否かを判定する(S12)。ここで、値型の値あるいは変数とは、値あるいは変数の内容そのものが意味を持つ場合を指す。対して、参照型の値あるいは変数とは、値あるいは変数の内容そのものに意味が無く、別の変数を指し示す場合を指す。C言語ではポインタ型が参照型にあたる。
ソースコード変換部7は、参照型変数への代入文には__assign_hook関数を挿入しない。参照型の値はビルドや実行時の条件によって変わりうるので、比較しても有益な情報は得られないためである。S12において、左辺値が値型ではなく、参照型であった場合(S12、No)、S17に移行する。
左辺式の型が値型であった場合(S12、Yes)、ソースコード変換部7は、左辺式が複数の値を格納する構造体である否かをさらに判定する(S13)。
構造体に格納される複数の値は全て同一の型であるとは限らない。そこで、ソースコード変換部7は、左辺式が構造体であった場合(S13、Yes)、構造体を構成する夫々の構成要素を再帰的にスキャンし、夫々の構成要素の型を示す型リストを作成する(S14)。そして、ソースコード変換部7は、現在選択している代入文に__assign_hook関数を挿入する(S15)。
左辺式が構造体ではなかった場合(S13、No)、ソースコード変換部7は、左辺式の型を一つの構成要素だけの型リストとし(S16)、S15に移行する。
S15を経た後、全ての代入文を選択したか否かを判定する(S17)。未選択の代入文が存在する場合(S17、No)、S11に移行してソースコード変換部7は未選択の代入文のうちから一つの代入文を選択する。全ての代入文が選択済みである場合(S17、Yes)、ソースコード変換処理を終了する。
図5(a)は、__assign_hook関数の実装例を説明する図である。図5(a)に示す__assign_hook関数は擬似コードで示されている。__assign_hook関数は引数として、代入文左辺値の格納アドレスである左辺値参照アドレス、代入文のソースコード中での位置(代入文の位置)、代入値の総バイト数(代入総バイト数)、代入文左辺値の型を構成する要素のリスト(型リスト)、の4つを受け取る。図5(b)は、ソースコードD1の一例として、ソースコード「sample.c」を示している。sample.cの6行目に、値型の値が一つ代入される「*pa」を左辺値にもつ代入文が存在している。図5(c)は、図5(b)に示したソースコード「sample.c」に__assign_hook関数が挿入された変換済みソースコードD4としてのソースコード「sample_hooked.c」を示している。sample_hooked.cの6行目に挿入された__assign_hook関数は、左辺値参照アドレスとして「&(*pa)」、代入文の位置として、ファイル名「sample.c」の「6」行目、代入値の総バイト数として「4」、型リストとして一つの4バイト(32ビット)の整数型の値を示す「T_INT32」を受け取る。
図6(a)は、複合型の構造体を含むソースコードD1の一例としてソースコード「structcopy.c」を示している。char型の値「arg0」および「arg1」とshort型の値「arg2」とlong型の値「arg3」とがこの順番で格納される複合型の構造体「st_sample」が定義されている。「st_sample」型の変数「src」は、7行目において初期値「0x01」、「0x02」、「0x1234」、「0x12345678」付きで宣言されている。また、9行目に、ポインタ「dest」が示すアドレスに格納されている「st_sample」型の変数「*dest」に変数「src」の値を代入する代入文が記述されている。
図6(b)は、図6(a)に示したソースコード「structcopy.c」の9行目に挿入される__assign_hook関数が受け取る引数を概念的に説明する図である。アドレス「&(*dest)」を先頭アドレスとするメモリ領域に、先頭アドレスから順番に、「arg0」、「arg1」、「arg2」、「arg3」の合計8バイトの値がこの順番で格納される。__assign_hook関数は、左辺値参照アドレスとして「&(*dest)」を、総バイト数として「8」を、文の場所として、「"structcopy.c" line 9」を受け取る。また、アドレス「&(*dest)」を先頭アドレスとしてchar型の値「arg0」、char型の値「arg1」、short型の値「arg2」、long型の値「arg3」が格納されるので、__assign_hook関数は、「T_INT8」、「T_INT8」、「T_INT16」、「T_INT32」の文字列をこの順番で可変長引数として受け取る。
因みに、9行目の代入文によれば、「arg0」、「arg1」、「arg2」、「arg3」に、夫々、「0x01」、「0x02」、「0x1234」、「0x12345678」が代入される。ビッグエンディアン方式によれば、「arg2」への代入値0x1234は、「arg2」を格納するメモリ領域に、先頭アドレスから0x12、0x34の順番で格納される。また、「arg3」への代入値0x12345678は、「arg3」が格納されるメモリ領域に、先頭アドレスから0x12、0x34、0x56、0x78の順番で格納される。
このように、ソースコード変換部7は、ソースコードD1に含まれる、左辺値の型が値型である代入文に__assign_hook関数を挿入する。
S1のソースコード変換処理の後、第1言語ツール部1は、変換済みソースコードD4のビルドを実行し(S2)、オブジェクトコードD5を生成する。このとき、第1言語ツール部1は変換済みソースコードD4に挿入されている__assign_hook関数に実行トレース出力用ライブラリ3をリンクする。
続いて、第1シミュレータ部2は、オブジェクトコードD5をビッグエンディアン方式に従って解釈し、実行するビッグエンディアンシミュレーション処理を行う。その際、実行部位が__assign_hook関数が挿入されている代入文に至ると、オブジェクトコードD5に組み込まれた実行トレース出力用ライブラリ3により実行トレースD6を出力する実行トレース出力処理が行われる(S3)。
図7は、実行トレース出力処理を説明するフローチャートである。実行部位が__assign_hook関数が挿入されている代入文に至ると、実行トレース出力用ライブラリ3は、実行トレースD6の空エントリに引数として受け取る文の位置(ファイル名および行番号)を書き込む(S31)。そして、実行トレース出力用ライブラリ3は、型リストから一つ構成要素(以下、単に要素)を取り出し(S32)、取り出した要素に対応する値のバイト幅を取得する(S33)。取得したバイト幅をNbバイトとすると、左辺値参照アドレスからNbバイトのデータを読み出し、左辺値参照アドレスをNbバイト進め、代入総バイト数からNbバイト減算する(S34)。実行トレース出力用ライブラリ3は、読み出したデータを実行トレースD6に記録するための予め定められているエンディアンネス(記録用エンディアンネス)に変換し、変換した値を代入値として実行トレースD6に書き込む(S35)。なお、記録用エンディアンネスは、どのようなエンディアンネスであってもよい。実行トレース出力用ライブラリ3は、代入総バイト数がゼロ値を越える(総バイト数>0である)か否かを判定し(S36)、ゼロ値を越える場合(S36、Yes)、構造体を構成する要素のうち未取得の要素が存在するので、S32に移行し、ゼロ値を越えない、つまりゼロ値に等しい場合(S36、No)、リターンとなる。
このように、第1シミュレータ部2は、オブジェクトコードD5に組み込まれている実行トレース出力用ライブラリ3に基づいて、オブジェクトコードD5の動作中にソースコードD1に含まれる代入文に代入された代入値をソースコードD1上における代入文の位置と対応付けて記録した実行トレースD6を出力する。
S3に続いて、第2言語ツール部4は、変換済みソースコードD4のビルドを実行し(S4)、オブジェクトコードD7を生成する。このとき、前述したように、第2言語ツール部4は変換済みソースコードD4に挿入されている__assign_hook関数にエンディアンネス依存箇所特定ライブラリ6をリンクする。
そして、第2シミュレータ部5は、オブジェクトコードD7をリトルエンディアン方式に従って解釈して実行するリトルエンディアンシミュレーション処理を行う(S5)。その際、実行部位が__assign_hook関数が挿入されている代入文に至ると、オブジェクトコードD7に組み込まれたエンディアンネス依存箇所特定ライブラリ6により該代入文がエンディアンネス依存箇所であるか否かを検査するエンディアンネス依存箇所特定処理が行われる。
図8は、エンディアンネス依存箇所特定処理を説明するフローチャートである。最初に、エンディアンネス依存箇所特定ライブラリ6は、実行トレースD6からエントリを一つ読み出し(S51)、読み出したエントリに記述されている代入文の位置と__assign_hook関数の引数として受け取った代入文の位置とを比較し、双方の位置が一致するか否かを判定する(S52)。
ここで、実行トレースD6には、ビッグエンディアン処理系で実行中において実行パス中に現れる順番で代入文の位置と該代入文への代入値との対応付け(エントリ)が記述されている。ビッグエンディアンシミュレーション処理時と同一の実行パスを通る限り、リトルエンディアンシミュレーション処理時における実行パス中には、__assign_hook関数が挿入されている代入文が実行トレースD6に記述されているエントリの順番と同じ順番で現れる。そこで、S51では、前回読み出したエントリの次に記述されているエントリを読み出すようにするようにするとよい。S52において双方の位置が一致しない場合(S52、No)、エンディアンネス依存箇所特定ライブラリ6は、ビッグエンディアンシミュレーション処理時とリトルエンディアンシミュレーション処理時とで同一の実行パスを通っていないとして警告を発行し(S53)、リトルエンディアンシミュレーション処理を終了する。ビッグエンディアンシミュレーション処理時とリトルエンディアンシミュレーション処理時とで同一の実行パスを通らない原因としては、リトルエンディアンシミュレーション処理において、本エンディアンネス依存箇所特定処理以前にエンディアンネス依存箇所を見落としたことが考えられる。
S52において、双方の文の位置が一致した場合(S52、Yes)、エンディアンネス依存箇所特定ライブラリ6は、__assign_hook関数の引数として受け取った型リストから一つの要素を取り出し(S54)、取り出した型リストに対応する値のバイト幅を取得する(S55)。このとき取得したバイト幅をNbバイトとする。そして、エンディアンネス依存箇所特定ライブラリ6は、左辺値参照アドレスからNbバイトのデータを代入値として読み出す(S56)。
続いて、エンディアンネス依存箇所特定ライブラリ6は、S51にて読み出したエントリから、記録用エンディアンネスで記述されているNbバイトのデータを読み出し、読み出したデータをリトルエンディアン方式に変換して期待値を求める(S57)。
そして、エンディアンネス依存箇所特定ライブラリ6は、S54にて取得した型リストに基づき、S56にて読み出した代入値の型が参照型であるか否かを判定する(S58)。代入値の型が参照型ではない場合(S58、No)、エンディアンネス依存箇所特定ライブラリ6は、S56にて読み出した代入値とS57にて求めた期待値とを比較し、双方の値が一致するか否かをさらに判定する(S59)。一致しなかった場合(S59、No)、エンディアンネス依存箇所特定ライブラリ6は、この代入文はエンディアンネス依存箇所であると認識し、ソースコード上の代入文の位置、期待値、代入値をエンディアンネス依存箇所レポートD8に書き出す(S60)。さらに、エンディアンネス依存箇所特定ライブラリ6は、左辺値参照アドレスに格納されている前記代入値を期待値で上書きし(S61)、左辺値参照アドレスをNbバイト分インクリメントし、代入総バイト数をNbバイト分デクリメントする(S62)。
代入値の型が参照型であった場合(S58、Yes)、S62に移行する。また、S56にて読み出した代入値とS57にて求めた期待値とが一致した場合(S59、Yes)、S62に移行する。
S62の後、エンディアンネス依存箇所特定ライブラリ6は、代入総バイト数がゼロ値を越えるか否か判定し(S63)、ゼロ値を越える場合(S63、Yes)、構造体を構成する要素のうちの未取得の要素が存在するので、S54に移行し、ゼロ値を越えない、すなわちゼロ値に等しい場合(S63、No)、リターンとなる。
このように、第2シミュレータ部5は、エンディアンネス依存箇所特定ライブラリ6に基づき、オブジェクトコードD7の実行パス上の代入文に値が代入される毎に、値が代入された代入文に対応付けられている値を実行トレースD6から読み出して、読み出した値に基づいて期待値を算出し、代入値と算出した期待値とが一致するか否かを判定し、双方の値が異なった場合、代入値を期待値で上書きするとともにこの代入文はエンディアンネス依存箇所であるとしてソースコードD1におけるこの代入文の位置をレポート出力する。
S1〜S5の動作により、実行パス中に含まれる一つ以上のエンディアンネス依存箇所が全て特定される。S5の後、作業者は、エンディアンネス依存箇所を発見したか否かを判定し(S6)、エンディアンネス依存箇所を発見した場合(S6、Yes)、エンディアンネス依存箇所を修正し(S7)、エンディアンネス依存箇所が無くなったか否かを検証するために、ソースコード解析システム100を用いてS1からの動作を再度実行する。エンディアンネス依存箇所が発見されなかった場合(S6、No)、ソースコードD1のリトルエンディアン方式への移植が完了し、動作が終了となる。
なお、S1〜S5の動作によれば、前述したように、通った実行パス中に含まれるエンディアンネス依存箇所しか特定できない。ソースコードD1上のエンディアンネス依存箇所の特定対象を広げるためには、カバレッジが大きくなるようにテスト用データD3を選択するようにするとよい。また、複数パターンのテスト用データD3を用いてS1〜S5の動作を実行するようにしてもよい。複数のテスト用データD3を用いることによって実行パスのパターンが増え、ひいてはエンディアンネス依存箇所の特定対象を広げることができるようになる。
次に、具体例を示して複数のエンディアンネス依存箇所が特定される様子を説明する。図9は、エンディアンネス依存箇所を特定する対象のソースコードD1の一例である。図示するように、ポインタ「buffer」が指すアドレスには、{0x00、0x10}というバイト列が予め格納されているとし、4行目において「temp」にポインタ「buffer」が指すアドレスに格納されている値が代入される。また、6行目において「temp」の値が2で除されて得られた値が「temp2」に代入される。そして、8行目〜13行目において、「temp」が「0xFF」より大きいという条件を満たす場合、「temp2」に「0x100」が加算され、前記条件を満たさない場合、「temp2」から「0x100」が減算される。
図10は、第1の実施の形態によるシミュレーション結果を説明する図である。図示するように、4行目においては、ビッグエンディアンでの期待値が「0x0010」であることに対し、リトルエンディアンでの代入値が「0x1000」となり、依存ありと判定される。そして、依存ありの場合、4行目の代入値「0x1000」が期待値「0x0010」で上書きされてリトルエンディアンシミュレーション処理が続行され、6行目では期待値も代入値もともに「0x0008」となり、6行目は依存なしと判定される。そして、6行目の正しい代入値に基づいて8行目の分岐条件判定が実行され、双方のエンディアンネスで9行目のパスが通る。9行目では、6行目の正しい代入値に「0x100」が加算され、期待値も代入値もともに「0x108」となり、9行目の代入文は依存なしと判定される。
図11は、エンディアンネス依存箇所レポートD8の一例を示す図である。図示するように、4行目がエンディアンネス依存箇所であると特定されている。
続いて、仮にS61に示した期待値上書きを行わないでS5を実行した場合を考える。図12は、その場合のシミュレーション結果を説明する図である。図示するように、4行目では、ビッグエンディアンでの期待値が「0x0010」、リトルエンディアンでの代入値が「0x1000」となり、依存ありと判定される。また、4行目のデータ誤りが伝播し、6行目では、期待値が「0x0008」、代入値が「0x0800」となり、依存ありと判定される。さらに、ビッグエンディアンでは、6行目での代入値に基づいて8行目に示す分岐条件判定が行われ、9行目が実行パスとなる。これに対し、リトルエンディアンでは、誤ったデータ「0x1000」に基づいて分岐条件判定が行われ、9行目ではなく12行目のパスを通る。そして、実行パスがビッグエンディアンとリトルエンディアンとで異なるので、警告が発行されてシミュレーション終了となる。このように4行目のデータ誤りが後の処理に伝播することによって、5行目以降ではエンディアンネス依存であるか否かが正しく判定できていない。これに対し、第1の実施の形態では、エンディアンネス依存箇所を発見した場合、代入値を期待値で上書きして以降の処理を行うようにしているので、データ誤りの伝播を防ぐことができるので、エンディアンネス依存の処理があったとしても、以降の処理中にエンディアンネス依存の箇所の検出を続行することができる。すなわち、一回の実行で複数のエンディアンネス依存箇所を特定することができるので、効率的にエンディアンネス依存箇所を特定することができる。
なお、以上説明したソースコード解析システム100は、一般的なコンピュータを用いて実現されるものであってよい。図13は、ソースコード解析システム100のハードウェア構成の一例を説明する図である。ソースコード解析システム100は、CPU(Central Processing Unit)11、ROM(Read Only Memory)12、RAM(Random Access Memory)13、表示部14、入力部15を備えるコンピュータ構成となっている。CPU11、ROM12、RAM13、表示部14、入力部15は、バスラインを介して夫々接続されている。
CPU11は、ソースコードのエンディアンネス依存箇所を特定するコンピュータプログラムであるソースコード解析プログラム16を実行する。表示部14は、液晶モニタなどの表示装置であり、CPU11からの指示に基づいて、操作画面などのユーザに対する出力情報を表示する。入力部15は、マウスやキーボードを備えて構成され、ユーザからのソースコード解析システム100の操作が入力される。入力部15へ入力された操作情報は、CPU11へ送られる。
ソースコード解析プログラム16は、ROM12内に格納されており、バスラインを介してRAM13へロードされる。CPU11はRAM13内にロードされたソースコード解析プログラム16を実行する。具体的には、ソースコード解析システム100では、設計者による入力部15からの指示入力に従って、CPU11がROM12内からソースコード解析プログラム16を読み出してRAM13内のプログラム格納領域に展開して各種処理を実行する。ソースコードD1、テストソースD2、テスト用データD3は、外部記憶装置などから入力される。CPU11は、外部記憶装置などから入力されたソースコードD1、テストソースD2、テスト用データD3に基づいて各種処理を実行し、この各種処理に際して生じる変換済みソースコードD4、オブジェクトコードD5、実行トレースD6、オブジェクトコードD7などのデータをRAM13内に形成されるデータ格納領域に一時的に記憶させておく。CPU11は、作成したエンディアンネス依存箇所レポートD8をRAM13内のプログラム格納領域あるいは外部記憶装置などに出力する。なお、ソースコード解析プログラム16は、DISKなどの記憶装置に格納しておいてもよい。また、ソースコード解析プログラム16は、DISKなどの記憶装置にロードしてもよい。
第1の実施の形態のソースコード解析プログラム16は、前述の各部(第1言語ツール部1、第1シミュレータ部2、実行トレース出力用ライブラリ3、第2言語ツール部4、第2シミュレータ部5、エンディアンネス依存箇所特定ライブラリ6、およびソースコード変換部7)を含む構成となっており、上記各部が主記憶装置上にロードされ、第1言語ツール部1、第1シミュレータ部2、実行トレース出力用ライブラリ3、第2言語ツール部4、第2シミュレータ部5、エンディアンネス依存箇所特定ライブラリ6およびソースコード変換部7が主記憶装置上に生成される。なお、実行トレース出力用ライブラリ3およびエンディアンネス依存箇所特定ライブラリ6は外部記憶装置上にロードされるようにしてもよい。
なお、第1言語ツール部1、第1シミュレータ部2、第2言語ツール部4および第2シミュレータ部5は、一般的に利用されているツールやプログラムを実行することにより実現することができる。したがって、実行トレース出力用ライブラリ3、エンディアンネス依存箇所特定ライブラリ6およびソースコード変換部7を含むソースコード解析プログラム16を提供するようにしてもよい。
また、第1言語ツール部1、第1シミュレータ部2、実行トレース出力用ライブラリ3、第2言語ツール部4、第2シミュレータ部5、エンディアンネス依存箇所特定ライブラリ6、およびソースコード変換部7は、複数のコンピュータによって実現されるようにしてもよい。例えば、第1シミュレータ部2、第2シミュレータ部5としてオブジェクトコードをそれぞれのエンディアンネスに従って実行する実機のコンピュータを使用することができる。第1シミュレータ部2、第2シミュレータ部5に実機のコンピュータを使用する場合、第1言語ツール部1、実行トレース出力用ライブラリ3、第2言語ツール部4、エンディアンネス依存箇所特定ライブラリ6、およびソースコード変換部7を含む構成のソースコード解析プログラム16を実行することによって主記憶装置上に第1言語ツール部1、実行トレース出力用ライブラリ3、第2言語ツール部4、エンディアンネス依存箇所特定ライブラリ6が生成されたホスト装置としてのコンピュータと、第1シミュレータ部2、第2シミュレータ部5として機能するスレーブ装置としての実機のコンピュータとによって第1の実施の形態のソースコード解析システム100を実現するようにしてもよい。ホスト−スレーブ間の各種データの授受はネットワークや着脱可能な外部記憶装置を介して実行される。
なお、ソースコード解析プログラム16を、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また、ソースコード解析プログラム16をインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、ソースコード解析プログラム16を、ROM等に予め組み込んでソースコード解析システム100に提供するように構成してもよい。
なお、上記説明においては、ソースコード変換部7は、第1言語ツール部1に実行トレース出力用ライブラリ3をリンクさせるための関数と、第2言語ツール部4にエンディアンネス依存箇所特定ライブラリ6をリンクさせるための関数として、同一の関数__assign_hookを挿入するようにしたが、第1言語ツール部1に実行トレース出力用ライブラリ3をリンクさせるための関数と第2言語ツール部4にエンディアンネス依存箇所特定ライブラリ6をリンクさせるための関数とは異なる関数であってもよい。
また、実行トレース出力用ライブラリ3およびエンディアンネス依存箇所特定ライブラリ6はビルド時にリンクされるとして説明したが、オブジェクトコードの実行時にリンクされるようにしてもよい。オブジェクトコードの実行時にリンクさせる場合、第1シミュレータ部2、第2シミュレータ部5は、実行時、夫々実行トレース出力用ライブラリ3、エンディアンネス依存箇所特定ライブラリ6にアクセス可能に構成しておくとよい。
また、C言語で記述されたソースコードD1の例を上げて説明したが、ソースコードD1のプログラム言語はC言語以外の手続き型言語であってもかまわない。また、ビッグエンディアンを第1のエンディアン、リトルエンディアンを第2のエンディアンとして説明したが、第1のエンディアンと第2のエンディアンとの組み合わせはこの組み合わせだけでなく、どのようなエンディアンネスの組み合わせであっても第1の実施の形態を適用することができる。
以上説明したように、第1の実施の形態によれば、第2のエンディアン方式に従ったシミュレーションの実行中に代入文が実行される毎に、前記代入文に第1のエンディアン方式に従ったシミュレーションと第2のエンディアン方式に従ったシミュレーションとで、同一の意味に解釈される値が代入されるか否かを判定し、同一の意味に解釈される値が代入されない場合には、第2のエンディアン方式で代入された値を期待値で上書するとともに該代入文をエンディアンネス依存箇所としてレポート出力するように構成した。よって、エンディアンネス依存箇所の処理以降であっても別のエンディアンネス依存箇所を正しく特定でき、一回の実行で複数のエンディアンネス依存箇所を特定することができる。すなわち、ソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができる。また、作業者によるエンディアンネスに関する入力を必要としないので、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を特定することができる。
(第2の実施の形態)
第1の実施の形態を用いてビッグエンディアンからリトルエンディアンへの移植を行うと、移植されたソースコードから生成されたオブジェクトコードがメモリに書き込むデータは全てリトルエンディアンになる。この場合、メモリマップI/Oで接続されたハードウェアアクセラレータや他の処理系と通信を行うライブラリをビッグエンディアンの処理系から再利用する際に問題が発生する。
例えば、図14に示す対象システムのように、リトルエンディアン(LE)処理系のCPU17と、メモリ18と、ビッグエンディアン処理系のハードウェアアクセラレータ19と、その他のI/O20とがバス接続されて構成されているシステムにおいては、例えばメモリ空間は、リトルエンディアンで読み書きされるヒープ領域およびスタック領域と、ハードウェアアクセラレータ19とCPU17とが通信を行うための、ビッグエンディアンで書き込まれ、リトルエンディアンで読み出される領域と、が存在することになる。
そこで、第2の実施の形態では、特定のアドレス範囲を特定のエンディアンネスで書き込めるように構成されている。図15は、第2の実施の形態のソースコード解析システムの構成を説明する図である。なお、ここでは、第1の実施の形態と同じ機能を備えた構成要素には同一の符号を付し、該構成要素に関する詳細な説明は省略する。
図15に示すように、ソースコード解析システム101は、第1言語ツール部1、第1シミュレータ部2、実行トレース出力用ライブラリ3、第2言語ツール部21、第2シミュレータ部5、エンディアンネス依存箇所特定ライブラリ22およびソースコード変換部7を備えている。また、ソースコード解析システム101には、ソースコードD1、テストソースD2、テスト用データD3のほかに、ビッグエンディアンで書き込みを行うべきアドレスの範囲が記述されたテーブルであるビッグエンディアン書き出しテーブルD9が入力される。
第2言語ツール部21は、変換済みソースコードD4とテストソースD2とビッグエンディアン書き出しテーブルD9とを組み合わせてビルドし、オブジェクトコードD10を生成する。第2言語ツール部21は、ビルドを行う際、エンディアンネス依存箇所特定ライブラリ22をリンクさせる。
第2シミュレータ部5は、オブジェクトコードD10をシミュレーションする。その際、オブジェクトコードD10に組み込まれているエンディアンネス依存箇所特定ライブラリ22により、次に示すエンディアンネス依存箇所特定処理が実行される。エンディアンネス依存箇所は、エンディアンネス依存箇所レポートD11として出力される。
図16は、エンディアンネス依存箇所特定処理を説明するフローチャートである。図16において、エンディアンネス依存箇所特定ライブラリ22は、S71〜S76により、S51〜S56と同様の処理を実行する。エンディアンネス依存箇所特定ライブラリ22は、S76の後、S71にて取得した実行トレースD6のエントリから記録用エンディアンネスで記述されているNbバイトのデータを読み出し、参照値とする(S77)。そして、エンディアンネス依存箇所特定ライブラリ22は、オブジェクトコードD10に組み込まれているビッグエンディアン書き出しテーブルD9を参照し、左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれているか否かを判定する(S78)。
左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれている場合(S78、Yes)、エンディアンネス依存箇所特定ライブラリ22は、参照値を記録用エンディアンネスからビッグエンディアンに変換し、期待値とし(S80)、S81に移行する。また、左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれていない場合(S78、No)、エンディアンネス依存箇所特定ライブラリ22は、参照値を記録用エンディアンネスからリトルエンディアンに変換し、期待値とし(S79)、S81に移行する。
エンディアンネス依存箇所特定ライブラリ22は、S81〜S86により、S58〜S63と同等の処理を実行する。
このように、ビッグエンディアン(第1のエンディアン)の変数記憶方式で書き込みアクセスすべきメモリアドレスの範囲を指定するビッグエンディアン書き出しテーブルD9(メモリアドレス範囲指定)を受け付け、左辺値参照アドレスがメモリアドレス範囲指定に指定されている範囲に含まれる場合、第1のエンディアンで記述された値を期待値とし、左辺値参照アドレスがメモリアドレス範囲指定に指定されている範囲に含まれない場合、リトルエンディアン(第2のエンディアン)で記述された値を期待値とするように構成したので、対象のシステムが特定のエンディアンで書き込みアクセスを行うべきメモリアドレス領域がある場合であっても正しくエンディアンネス依存箇所を特定することができるようになる。
1 第1言語ツール部、2 第1シミュレータ部、3 実行トレース出力用ライブラリ、4 第2言語ツール部、5 第2シミュレータ部、6 エンディアンネス依存箇所特定ライブラリ、7 ソースコード変換部、11 CPU、12 ROM、13 RAM、14 表示部、15 入力部、16 ソースコード解析プログラム、18 メモリ、19 ハードウェアアクセラレータ、21 第2言語ツール部、22 エンディアンネス依存箇所特定ライブラリ、100 ソースコード解析システム、101 ソースコード解析システム。

Claims (5)

  1. ソースコードをビルドして第1の変数記憶方式に従う実行環境で動作する第1オブジェクトコードを生成する第1ビルド部と、
    前記第1オブジェクトコードを動作させ、前記第1オブジェクトコードの実行パス上の代入文に代入された値を順次取得し、前記取得した値と前記代入文との対応付けを実行トレースとして順次出力する実行トレース出力処理を実行する第1実行部と、
    前記ソースコードをビルドして前記第1の変数記憶方式と異なる第2の変数記憶方式に従う実行環境で動作する第2オブジェクトコードを生成する第2ビルド部と、
    前記第2オブジェクトコードを動作させ、前記第2オブジェクトコードの実行パス上の代入文に値が代入される毎に、前記第2オブジェクトコード実行中に代入された値と前記実行トレースに基づいて求まる前記第2オブジェクトコードの動作中に前記代入文に代入されるべき値である期待値とが一致するか否かを判定し、双方の値が異なった場合、前記第2オブジェクトコード実行中に代入された値を前記期待値で上書きするとともに前記代入文は変数記憶方式依存箇所であるとして前記ソースコードにおける前記代入文の位置情報をレポート出力する変数記憶方式依存箇所特定処理を実行する第2実行部と、
    を備えることを特徴とするソースコード解析システム。
  2. 前記第1ビルド部は、前記実行トレース出力処理を実行するためのライブラリである実行トレース出力用ライブラリを備え、前記ソースコードのビルド時に前記ソースコードに前記実行トレース出力用ライブラリをリンクさせ、
    前記第2ビルド部は、前記変数記憶方式依存箇所特定処理を実行するためのライブラリである変数記憶方式依存箇所特定ライブラリを備え、前記ソースコードのビルド時に前記ソースコードに前記変数記憶方式依存箇所特定ライブラリをリンクさせる、
    ことを特徴とする請求項1に記載のソースコード解析システム。
  3. 前記ソースコードに含まれる代入文にライブラリ呼び出し関数を挿入するソースコード変換部をさらに備え、
    前記第1ビルド部は、前記ソースコードに挿入された前記ライブラリ呼び出し関数に前記実行トレース出力用ライブラリをリンクさせ、
    前記第2ビルド部は、前記ソースコードに挿入された前記ライブラリ呼び出し関数に前記変数記憶方式依存箇所特定ライブラリをリンクさせる、
    ことを特徴とする請求項2に記載のソースコード解析システム。
  4. 前記第2ビルド部は、前記第1の変数記憶方式で書き込みアクセスすべきメモリアドレスの範囲を指定するアドレス範囲指定の入力を受け付け、前記第2オブジェクトコードの実行中に代入文に代入された値の格納アドレスが前記アドレス範囲指定に指定されている範囲に含まれる場合、第1の変数記憶方式で記述された値を期待値とし、前記代入文に代入された値の格納アドレスが前記アドレス範囲指定に指定されている範囲に含まれない場合、前記第2の変数記憶方式で記述された値を期待値とする、ことを特徴とする請求項1に記載のソースコード解析システム。
  5. 前記第2ビルド部は、前記第2オブジェクトコード実行中に値が代入された代入文に対する値の対応付けが前記実行トレースに記述されていなかったとき、警告を出力して前記第2オブジェクトコードの動作を停止させる、
    ことを特徴とする請求項1に記載のソースコード解析システム。
JP2009195859A 2009-08-26 2009-08-26 ソースコード解析システム Expired - Fee Related JP5050019B2 (ja)

Priority Applications (2)

Application Number Priority Date Filing Date Title
JP2009195859A JP5050019B2 (ja) 2009-08-26 2009-08-26 ソースコード解析システム
US12/713,817 US8266596B2 (en) 2009-08-26 2010-02-26 Source code analyzing system and source code analyzing method

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2009195859A JP5050019B2 (ja) 2009-08-26 2009-08-26 ソースコード解析システム

Publications (2)

Publication Number Publication Date
JP2011048581A true JP2011048581A (ja) 2011-03-10
JP5050019B2 JP5050019B2 (ja) 2012-10-17

Family

ID=43626747

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2009195859A Expired - Fee Related JP5050019B2 (ja) 2009-08-26 2009-08-26 ソースコード解析システム

Country Status (2)

Country Link
US (1) US8266596B2 (ja)
JP (1) JP5050019B2 (ja)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015077418A (ja) * 2004-11-24 2015-04-23 バイエル メディカル ケア インコーポレーテッド 注入処理の1又は複数フェーズのパラメータを決定する装置、システム及び方法

Families Citing this family (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN102236574A (zh) * 2011-06-24 2011-11-09 浙江工业大学 一种可视化表示和解释c/c++语言声明语句的方法
JP2015043198A (ja) * 2013-07-22 2015-03-05 株式会社東芝 解析システム、解析方法および解析プログラム
US9733911B2 (en) * 2015-11-11 2017-08-15 National Instruments Corporation Value transfer between program variables using dynamic memory resource mapping
US10282274B2 (en) * 2017-06-14 2019-05-07 Microsoft Technology Licensing, Llc Presenting differences between code entity invocations
CN109214188B (zh) * 2017-06-30 2022-05-27 阿里巴巴集团控股有限公司 一种漏洞分析方法和装置及数据处理方法和装置
US11516234B1 (en) * 2019-07-08 2022-11-29 Cisco Technology, Inc. In-process correlation through class field injection
CN112083931A (zh) * 2020-09-15 2020-12-15 上海眼控科技股份有限公司 程序处理方法、装置及设备
CN115904855B (zh) * 2023-03-02 2023-07-07 上海合见工业软件集团有限公司 基于信号动态追踪确定目标驱动源码的系统

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5488714A (en) * 1990-05-23 1996-01-30 Unisys Corporation Computer program analyzer for adapting computer programs to different architectures
US5432795A (en) * 1991-03-07 1995-07-11 Digital Equipment Corporation System for reporting errors of a translated program and using a boundry instruction bitmap to determine the corresponding instruction address in a source program
JPH05119960A (ja) 1991-10-25 1993-05-18 Oki Electric Ind Co Ltd バイトオーダ依存コーデイング検出方法
US6173442B1 (en) * 1999-02-05 2001-01-09 Sun Microsystems, Inc. Busy-wait-free synchronization
US7243193B2 (en) * 2004-05-27 2007-07-10 Silverbrook Research Pty Ltd Storage of program code in arbitrary locations in memory
US7552427B2 (en) 2004-12-13 2009-06-23 Intel Corporation Method and apparatus for implementing a bi-endian capable compiler
US7716642B1 (en) * 2005-05-03 2010-05-11 Emc Corporation Techniques for detecting coding incompatibilities

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2015077418A (ja) * 2004-11-24 2015-04-23 バイエル メディカル ケア インコーポレーテッド 注入処理の1又は複数フェーズのパラメータを決定する装置、システム及び方法

Also Published As

Publication number Publication date
US20110055818A1 (en) 2011-03-03
JP5050019B2 (ja) 2012-10-17
US8266596B2 (en) 2012-09-11

Similar Documents

Publication Publication Date Title
JP5050019B2 (ja) ソースコード解析システム
CN109918903B (zh) 一种基于llvm编译器的程序非控制数据攻击防护方法
JP5333232B2 (ja) プログラムデバッグ方法、プログラム変換方法及びそれを用いるプログラムデバッグ装置、プログラム変換装置並びにデバッグ用プログラム
US7266809B2 (en) Software debugger and software development support system for microcomputer operable to execute conditional execution instruction
CN107480476B (zh) 一种基于ELF感染的Android本地层指令编译虚拟化加壳方法
US9626170B2 (en) Method and computer program product for disassembling a mixed machine code
US7093165B2 (en) Debugging Method
JP2011530768A (ja) ソフトウェア・アプリケーションの性能向上
US20110126179A1 (en) Method and System for Dynamic Patching Software Using Source Code
EP2141587A1 (en) Method and system for generating of a control flow graph for representing a program code
EP1085412A2 (en) A relocation format for linking
CN115017516A (zh) 一种基于符号执行的模糊测试方法
US20120011490A1 (en) Development system
US20050216897A1 (en) Converter, automation device with a converter, and a development environment having an automation device with converter
JP2002532804A (ja) ハイブリッドコンピュータプログラミング環境
US8490073B2 (en) Controlling tracing within compiled code
Sadolewski et al. Compiler and virtual machine of a multiplatform control environment
JP2008052688A (ja) プログラムのパッチデータ生成装置
CN114090440A (zh) 一种基于安卓操作系统的一体化免源码调试方法
US7296199B1 (en) Systems and methods for defining and utilizing attributes of a processor resource
Verbeek et al. Highly Automated Formal Proofs over Memory Usage of Assembly Code
JP6116983B2 (ja) エントリーポイント抽出装置
JP2012018641A (ja) ソフトウェア開発システム
US11630757B1 (en) System and method for developing, testing and debugging software for microcontrollers
KARAPATEAS RETARGETING AN ASSEMBLY OPTIMIZER FOR THE MIPS/SCALE ASSEMBLY

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20110802

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20120118

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20120124

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20120326

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20120626

A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20120723

FPAY Renewal fee payment (event date is renewal date of database)

Free format text: PAYMENT UNTIL: 20150727

Year of fee payment: 3

LAPS Cancellation because of no payment of annual fees