(57)【要約】【課題】ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定すること。【解決手段】第２のエンディアン方式に従ったシミュレーションの実行中に代入文が実行される毎に、前記代入文に第１のエンディアン方式に従ったシミュレーションと第２のエンディアン方式に従ったシミュレーションとで、同一の意味に解釈される値が代入されるか否かを判定し、同一の意味に解釈される値が代入されない場合には、第２のエンディアン方式で代入された値を期待値で上書するとともに該代入文をエンディアンネス依存箇所としてレポート出力する。【選択図】図８
2011048581.tif 000002
【特許請求の範囲】
【請求項１】
ソースコードをビルドして第１の変数記憶方式に従う実行環境で動作する第１オブジェクトコードを生成する第１ビルド部と、
前記第１オブジェクトコードを動作させ、前記第１オブジェクトコードの実行パス上の代入文に代入された値を順次取得し、前記取得した値と前記代入文との対応付けを実行トレースとして順次出力する実行トレース出力処理を実行する第１実行部と、
前記ソースコードをビルドして前記第１の変数記憶方式と異なる第２の変数記憶方式に従う実行環境で動作する第２オブジェクトコードを生成する第２ビルド部と、
前記第２オブジェクトコードを動作させ、前記第２オブジェクトコードの実行パス上の代入文に値が代入される毎に、前記第２オブジェクトコード実行中に代入された値と前記実行トレースに基づいて求まる前記第２オブジェクトコードの動作中に前記代入文に代入されるべき値である期待値とが一致するか否かを判定し、双方の値が異なった場合、前記第２オブジェクトコード実行中に代入された値を前記期待値で上書きするとともに前記代入文は変数記憶方式依存箇所であるとして前記ソースコードにおける前記代入文の位置情報をレポート出力する変数記憶方式依存箇所特定処理を実行する第２実行部と、
を備えることを特徴とするソースコード解析システム。
【請求項２】
前記第１ビルド部は、前記実行トレース出力処理を実行するためのライブラリである実行トレース出力用ライブラリを備え、前記ソースコードのビルド時に前記ソースコードに前記実行トレース出力用ライブラリをリンクさせ、
前記第２ビルド部は、前記変数記憶方式依存箇所特定処理を実行するためのライブラリである変数記憶方式依存箇所特定ライブラリを備え、前記ソースコードのビルド時に前記ソースコードに前記変数記憶方式依存箇所特定ライブラリをリンクさせる、
ことを特徴とする請求項１に記載のソースコード解析システム。
【請求項３】
前記ソースコードに含まれる代入文にライブラリ呼び出し関数を挿入するソースコード変換部をさらに備え、
前記第１ビルド部は、前記ソースコードに挿入された前記ライブラリ呼び出し関数に前記実行トレース出力用ライブラリをリンクさせ、
前記第２ビルド部は、前記ソースコードに挿入された前記ライブラリ呼び出し関数に前記変数記憶方式依存箇所特定ライブラリをリンクさせる、
ことを特徴とする請求項２に記載のソースコード解析システム。
【請求項４】
前記第２ビルド部は、前記第１の変数記憶方式で書き込みアクセスすべきメモリアドレスの範囲を指定するアドレス範囲指定の入力を受け付け、前記第２オブジェクトコードの実行中に代入文に代入された値の格納アドレスが前記アドレス範囲指定に指定されている範囲に含まれる場合、第１の変数記憶方式で記述された値を期待値とし、前記代入文に代入された値の格納アドレスが前記アドレス範囲指定に指定されている範囲に含まれない場合、前記第２の変数記憶方式で記述された値を期待値とする、ことを特徴とする請求項１に記載のソースコード解析システム。
【請求項５】
前記第２ビルド部は、前記第２オブジェクトコード実行中に値が代入された代入文に対する値の対応付けが前記実行トレースに記述されていなかったとき、警告を出力して前記第２オブジェクトコードの動作を停止させる、
ことを特徴とする請求項１に記載のソースコード解析システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ソースコード解析システムに関する。
【背景技術】
【０００２】
プロセッサがバイト単位でアドレスを持つメモリにマルチバイトデータを書き込む場合、データの格納順序（変数記憶方式）に関して自由度が存在する。一般的に使われる格納順序として、重み付けの小さいバイトから順に記述する方式（リトルエンディアン）と重み付けの大きいバイトから順に記述する方式（ビッグエンディアン）とがある。16進数の整数を0x1234のように先頭に0xをつけて表記し、メモリ上で連続して配置されるバイト列を0x12、0x34のように小さいアドレスに位置するバイトから順にカンマで区切って表記することとすると、例えば4バイト長の整数0x12345678は、リトルエンディアン方式では、0x78、0x56、0x34、0x12のように記述され、ビッグエンディアン方式では、0x12、0x34、0x56、0x78のように記述される。なお、このようなマルチバイトデータの格納順序のことを簡単にエンディアンネスと呼ぶ。
【０００３】
ビッグエンディアン方式で書き込まれた4バイト整数値0x12345678をリトルエンディアン方式の4バイト整数値として読み出そうと試みると、値0x78563412が得られる。このため、ビッグエンディアン方式に従うプロセッサを想定して書かれたプログラムをリトルエンディアン方式に従うプロセッサでそのまま動作させると、メモリの読み書きで誤動作を起こす可能性がある。
【０００４】
バイトアクセスとシフト演算を組み合わせることで、特定の格納順序を意図してマルチバイトデータを読み書きすることは可能である。この場合、処理系のエンディアンネスに依存しないソフトウェアを記述できるが、メモリアクセスの回数が増加するので処理速度の低下は避けられない。このため、特定のエンディアンネスに従うプロセッサで実行することを前提としてそのエンディアンネスに依存したプログラムを書くことは多々見られる。
【０００５】
異なるエンディアンネスに従うプロセッサへのソフトウェアの移植を支援する技術は幾つか報告されている。例えば特許文献１には、バイトスワップ命令を自動的に挿入してエンディアンネス依存処理を修正するコンパイル技術が開示されている。この技術は、作業者が変数に付与したエンディアンネス情報を基にしてエンディアンネスの一貫しない代入文を見つけ出す方針を採っている。この技術の問題点としては、移植を試みる作業者が移植対象のソフトウェアの構造・挙動について十分な知識を持っていなければならないことが挙げられる。また、特許文献２には、ソフトウェアのソースコードを基にエンディアンネス依存箇所を指摘する技術が開示されている。検査対象のプログラムの変数の代入関係についてグラフ構造を作り、代入前後で型変換が行われている箇所をエンディアンネス依存の疑いありと判定する。型変換を抽出する関係上、エンディアンネス情報が変数に付与されていないと検出精度が大幅に落ちると考えられる。
【０００６】
これら２件の提案で述べられている手法は、ソフトウェアのソースコード上の型情報からエンディアンネス依存箇所の推定を静的に行っている。一方、一般的なプログラミングにおいては型を無視した変数の操作が行われる場合があり、これらの手法の誤動作・誤検出を招きやすい。特に、組み込み分野やデバイスドライバなどのプログラミングではメモリ使用量の削減、処理時間の短縮、ハードウェアへのアクセス手順の制約などにより、特殊なテクニックが使われる場合がある。
【０００７】
上記したソースコードから静的に得られる情報から依存箇所を推定する二つの技術に対し、実際にソフトウェアを実行して不具合の起こる箇所を特定する手法も考えられる。このような手法は、単純であり、実装が容易である。しかしながら、この手法によれば、修正・テストを繰り返してエンディアンネス依存箇所を順次取り除くことができるが、一度のシミュレーションで確実に発見できるエンディアンネス依存箇所は高々１つであり、作業効率が低い、という問題があった。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特表２００８−５２３５１４号公報
【特許文献２】特開平０５−１１９９６０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
本発明は、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができるソースコード解析システムを提供することを目的とする。
【課題を解決するための手段】
【００１０】
本願発明の一態様によれば、ソースコードをビルドして第１の変数記憶方式に従う実行環境で動作する第１オブジェクトコードを生成する第１ビルド部と、前記第１オブジェクトコードを動作させ、前記第１オブジェクトコードの実行パス上の代入文に代入された値を順次取得し、前記取得した値と前記代入文との対応付けを実行トレースとして順次出力する実行トレース出力処理を実行する第１実行部と、前記ソースコードをビルドして前記第１の変数記憶方式と異なる第２の変数記憶方式に従う実行環境で動作する第２オブジェクトコードを生成する第２ビルド部と、前記第２オブジェクトコードを動作させ、前記第２オブジェクトコードの実行パス上の代入文に値が代入される毎に、前記第２オブジェクトコード実行中に代入された値と前記実行トレースに基づいて求まる前記第２オブジェクトコードの動作中に前記代入文に代入されるべき値である期待値とが一致するか否かを判定し、双方の値が異なった場合、前記第２オブジェクトコード実行中に代入された値を前記期待値で上書きするとともに前記代入文は変数記憶方式依存箇所であるとして前記ソースコードにおける前記代入文の位置情報をレポート出力する変数記憶方式依存箇所特定処理を実行する第２実行部と、を備えることを特徴とするソースコード解析システムが提供される。
【発明の効果】
【００１１】
本発明によれば、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができるソースコード解析システムを得ることができるという効果を奏する。
【図面の簡単な説明】
【００１２】
【図１】図１は、第１の実施の形態のソースコード解析システムの構成を説明する図。
【図２】図２は、実行トレースの一例を説明する図。
【図３】図３は、第１の実施の形態のエンディアンネス移植動作の概略を説明するフローチャート。
【図４】図４は、ソースコード変換処理を説明するフローチャート。
【図５】図５は、__assign_hook関数の実装例および__assign_hook関数挿入前後のソースコードの例を説明する図。
【図６】図６は、複合型の構造体の例を説明する図。
【図７】図７は、実行トレース出力処理を説明するフローチャート。
【図８】図８は、エンディアンネス依存箇所特定処理を説明するフローチャート。
【図９】図９は、エンディアンネス依存箇所を特定する対象のソースコードの一例を説明する図。
【図１０】図１０は、シミュレーション結果を説明する図。
【図１１】図１１は、エンディアンネス依存箇所レポートの一例を示す図。
【図１２】図１２は、シミュレーション結果を説明する図。
【図１３】図１３は、ソースコード解析システムのハードウェア構成の一例を説明する図。
【図１４】図１４は、対象システムの一例を説明する図。
【図１５】図１５は、第２の実施の形態のソースコード解析システムの構成を説明する図。
【図１６】図１６は、エンディアンネス依存箇所特定処理を説明するフローチャート。
【発明を実施するための形態】
【００１３】
以下に添付図面を参照して、本発明の実施の形態にかかるソースコード解析システムを詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
【００１４】
（第１の実施の形態）
第１の実施の形態のソースコード解析システムは、第１のエンディアン方式に従う実行環境で実行されることを想定したソースコードを第２のエンディアン方式に従う実行環境で実行されることを想定したソースコードに移植する際に特に問題となるソースコード中のエンディアンネス依存箇所を特定することができる。以下では、第１のエンディアンをビッグエンディアン、第２のエンディアンをリトルエンディアンとして説明する。なお、以降の説明においては、ビッグエンディアン方式に従う要素（構成要素、データ）を単にビッグエンディアン処理系と表現することもある。また、リトルエンディアン方式に従う要素をリトルエンディアン処理系と表現することもある。図１は、第１の実施の形態のソースコード解析システムの構成を説明する図である。
【００１５】
ソースコード解析システム１００は、図示するように、第１言語ツール部１（第１ビルド部）、第１シミュレータ部２（第１実行部）、実行トレース出力用ライブラリ３、第２言語ツール部４（第２ビルド部）、第２シミュレータ部５（第２実行部）、エンディアンネス依存箇所特定ライブラリ６、およびソースコード変換部７を備えている。
【００１６】
第１の実施の形態のソースコード解析システム１００は、第１のエンディアン（ここではビッグエンディアン）方式で記述された移植対象のソースコードＤ１を第２のエンディアン（ここではリトルエンディアン）方式でビルドして実行した場合、ソースコードＤ１の代入文に意図した値、言い換えると第１のエンディアン方式でビルドして実行した場合に代入される値（代入値）、と同一の意味に解釈される値が入力されるか否かを検証することによってエンディアンネス依存箇所を特定する。そのための構成として、ソースコード解析システム１００は、ビッグエンディアン方式に従った処理を実行するための構成要素（ビッグエンディアン処理系）と、リトルエンディアン方式に従った処理を実行するための構成要素（リトルエンディアン処理系）とを備えている。第１言語ツール部１、第１シミュレータ部２および実行トレース出力用ライブラリ３は、ビッグエンディアン処理系に属し、第２言語ツール部４、第２シミュレータ部５およびエンディアンネス依存箇所特定ライブラリ６はリトルエンディアン処理系に属する。
【００１７】
ソースコード変換部７は、ソースコードＤ１上の全ての代入文に対して、実行トレース出力用ライブラリ３、エンディアンネス依存箇所特定ライブラリ６を呼び出す処理を挿入し、変換済みソースコードＤ４を出力する。
【００１８】
第１言語ツール部１は、ソースコードをビルドしてビッグエンディアン方式に従う実行環境で動作するオブジェクトコードを生成する言語ツールである。第１言語ツール部１は、ソースコードＤ１を動作させるための周辺処理を提供するテストソースＤ２および変換済みソースコードＤ４が第１言語ツール部１に入力され、入力されたテストソースＤ２および変換済みソースコードＤ４を組み合わせてビルドし、オブジェクトコードＤ５（第１オブジェクトコード）を生成する。なお、第１言語ツール部１には、コンパイラ、アセンブラ、リンカ、標準ライブラリなどを備える一般的に入手可能なツール群を使用することができる。
【００１９】
実行トレース出力用ライブラリ３は、第１言語ツール部１の変換済みソースコードＤ４のビルド時に呼び出されてリンクされる。
【００２０】
第１シミュレータ部２は、オブジェクトコードをビッグエンディアン方式に基づいて解釈して実行（シミュレーション）するための実行環境である。言い換えると、第１シミュレータ部２は、ビッグエンディアン方式に従う実行環境である。実行環境とは、例えばプロセッサ、メモリ、および周辺機器を備えるコンピュータ環境である。第１シミュレータ部２として、ビッグエンディアン処理系の実機を用いるようにしてもよいが、ここでは、コンピュータ上に実現されるビッグエンディアン処理系の実機を模擬した仮想環境を用いることとして説明する。
【００２１】
第１シミュレータ部２は、ソースコードＤ１の動作を検証するためのテストパターンであるテスト用データＤ３を使用してオブジェクトコードＤ５を実行する（動作させる）。第１シミュレータ部２は、オブジェクトコードＤ５を実行した際、オブジェクトコードＤ５に組み込まれている実行トレース出力用ライブラリ３による制御に基づいて、ソースコードＤ１をビッグエンディアン方式でビルドして実行した場合における実行パス中に現れる代入文に代入された値（代入値）を順次取得し、代入値と該代入値が代入された代入文との対応付けを実行トレースＤ６として順次出力する。なお、ここでは、実行トレースＤ６には、代入値と該代入値が代入された代入文のソースコードＤ１上の位置とが対応付けられているとする。また、以降、オブジェクトコードＤ５に組み込まれている実行トレース出力用ライブラリ３に制御された第１シミュレータ部２の処理に関する説明においては、実行トレース出力用ライブラリ３を該処理の動作主体として表現することもある。
【００２２】
図２は、実行トレースＤ６の一例を説明する図である。図示するように、実行トレースＤ６には、時系列順に、実行した代入文のソースコードＤ１上の位置と代入値とが対応付けられて記述されている。ここでは、ソースコードＤ１上の位置を示す表記方法としてファイル名と行番号とを使用しているが、ソースコードＤ１上の位置を作業者が特定できる表記方法であれば別の表記方法を用いてもよい。なお、ソースコードＤ１上の代入文を識別することができるのであれば、実行した代入文のソースコードＤ１上の位置の代わりに他の識別情報を用いてもよい。
【００２３】
第２言語ツール部４は、ソースコードをリトルエンディアン方式に従う実行環境で動作するオブジェクトコードを生成する言語ツールである。第２言語ツール部４は第１言語ツール部１とはエンディアンネスの違いを除いて同じ機能を備えている。第２言語ツール部４は、テストソースＤ２および変換済みソースコードＤ４が入力され、入力されたテストソースＤ２および変換済みソースコードＤ４を組み合わせてビルドし、オブジェクトコードＤ７（第２オブジェクトコード）を生成する。
【００２４】
エンディアンネス依存箇所特定ライブラリ６は、変換済みソースコードＤ４が言語ツール部４によりビルドされる際にリンクされる。
【００２５】
第２シミュレータ部５は、オブジェクトコードをリトルエンディアン方式に基づいて解釈して実行するための実行環境である。第２シミュレータ部５は、エンディアンネスの違いを除いて第１シミュレータ部２と同じ機能を備えている。第２シミュレータ部５は、テスト用データＤ３を使用してオブジェクトコードＤ７を実行する。
【００２６】
第２シミュレータ部５は、オブジェクトコードＤ７を実行した際、オブジェクトコードＤ７に組み込まれたエンディアンネス依存箇所特定ライブラリ６による制御に基づいて、実行トレースＤ６を読み出し、オブジェクトコードＤ７の実行パス中の代入文に代入値が代入される毎に、実行トレースＤ６に基づいて前記代入文に代入されるべき値である期待値を求め、オブジェクトコードＤ７の実行中に実際に代入された代入値と前記求めた期待値とを比較する。そして、エンディアンネス依存箇所特定ライブラリ６は、代入値と期待値との相異を発見した場合、エンディアンネス依存箇所を発見したとみなしてエンディアンネス依存箇所レポートＤ８を出力する。なお、以降、オブジェクトコードＤ７に組み込まれたエンディアンネス依存箇所特定ライブラリ６に制御された第１シミュレータ部２の処理に関する説明においては、エンディアンネス依存箇所特定ライブラリ６を該処理の動作主体として表現することもある。
【００２７】
ここで、オブジェクトコードＤ７の実行中にある代入文で意図した値（期待値）と異なる値が代入された場合、データ誤りが伝播し、この代入文以降の処理は意図した処理と異なったものとなる。そして、エンディアンネス依存のない代入文であってもエンディアンネス依存箇所として検出されてしまう可能性が生じる。そこで、このようなデータ誤りの伝播を防止するために、オブジェクトコードＤ７に組み込まれたエンディアンネス依存箇所特定ライブラリ６は、オブジェクトコードＤ７中の代入文の代入値と期待値との相異を発見する毎に、前記代入値を期待値で上書きする。オブジェクトコードＤ７は、エンディアンネス依存の代入値が逐次期待値に置き換えられつつ実行されるため、ソースコード解析システム１００は、実行パス中に複数のエンディアンネス依存箇所が存在する場合であっても、一回のシミュレーションで実行パス中の複数のエンディアンネス依存箇所を特定することができる。
【００２８】
次に、第１の実施の形態のソースコード解析システム１００を用いてエンディアンネス依存箇所を特定する方法を説明する。なお、ここでは、Ｃ言語で記述されているソースコードＤ１をビッグエンディアン方式からリトルエンディアン方式に移植する動作の一環としてエンディアンネス依存箇所の特定が行われるものとして説明する。
【００２９】
図３は、第１の実施の形態のソースコード解析システム１００を用いて行われるエンディアンネス移植動作の概略を説明するフローチャートである。まず、ソースコード変換部７は、ソースコードＤ１に対して構文解析を行い、ライブラリ（実行トレース出力用ライブラリ３、エンディアンネス依存箇所特定ライブラリ６）を呼び出して実行する関数である__assign_hook関数を挿入する処理であるソースコード変換処理を行う（Ｓ１）。なお、ここでは、__assign_hook関数は、第１言語ツール部１にてビルドされたとき、実行トレース出力用ライブラリ３にリンクされ、第２言語ツール部４にてビルドされたとき、エンディアンネス依存箇所特定ライブラリ６にリンクされることとしている。図４は、ソースコード変換処理を説明するフローチャートである。
【００３０】
図４に示すように、まず、ソースコード変換部７は、ソースコードＤ１が含む代入文を一つ選択し（Ｓ１１）、一つの代入文に対して、左辺式の型が値型であるか否かを判定する（Ｓ１２）。ここで、値型の値あるいは変数とは、値あるいは変数の内容そのものが意味を持つ場合を指す。対して、参照型の値あるいは変数とは、値あるいは変数の内容そのものに意味が無く、別の変数を指し示す場合を指す。Ｃ言語ではポインタ型が参照型にあたる。
【００３１】
ソースコード変換部７は、参照型変数への代入文には__assign_hook関数を挿入しない。参照型の値はビルドや実行時の条件によって変わりうるので、比較しても有益な情報は得られないためである。Ｓ１２において、左辺値が値型ではなく、参照型であった場合（Ｓ１２、Ｎｏ）、Ｓ１７に移行する。
【００３２】
左辺式の型が値型であった場合（Ｓ１２、Ｙｅｓ）、ソースコード変換部７は、左辺式が複数の値を格納する構造体である否かをさらに判定する（Ｓ１３）。
【００３３】
構造体に格納される複数の値は全て同一の型であるとは限らない。そこで、ソースコード変換部７は、左辺式が構造体であった場合（Ｓ１３、Ｙｅｓ）、構造体を構成する夫々の構成要素を再帰的にスキャンし、夫々の構成要素の型を示す型リストを作成する（Ｓ１４）。そして、ソースコード変換部７は、現在選択している代入文に__assign_hook関数を挿入する（Ｓ１５）。
【００３４】
左辺式が構造体ではなかった場合（Ｓ１３、Ｎｏ）、ソースコード変換部７は、左辺式の型を一つの構成要素だけの型リストとし（Ｓ１６）、Ｓ１５に移行する。
【００３５】
Ｓ１５を経た後、全ての代入文を選択したか否かを判定する（Ｓ１７）。未選択の代入文が存在する場合（Ｓ１７、Ｎｏ）、Ｓ１１に移行してソースコード変換部７は未選択の代入文のうちから一つの代入文を選択する。全ての代入文が選択済みである場合（Ｓ１７、Ｙｅｓ）、ソースコード変換処理を終了する。
【００３６】
図５（ａ）は、__assign_hook関数の実装例を説明する図である。図５（ａ）に示す__assign_hook関数は擬似コードで示されている。__assign_hook関数は引数として、代入文左辺値の格納アドレスである左辺値参照アドレス、代入文のソースコード中での位置（代入文の位置）、代入値の総バイト数（代入総バイト数）、代入文左辺値の型を構成する要素のリスト（型リスト）、の４つを受け取る。図５（ｂ）は、ソースコードＤ１の一例として、ソースコード「sample.c」を示している。sample.cの６行目に、値型の値が一つ代入される「*pa」を左辺値にもつ代入文が存在している。図５（ｃ）は、図５（ｂ）に示したソースコード「sample.c」に__assign_hook関数が挿入された変換済みソースコードＤ４としてのソースコード「sample_hooked.c」を示している。sample_hooked.cの６行目に挿入された__assign_hook関数は、左辺値参照アドレスとして「&(*pa)」、代入文の位置として、ファイル名「sample.c」の「6」行目、代入値の総バイト数として「4」、型リストとして一つの４バイト（３２ビット）の整数型の値を示す「T_INT32」を受け取る。
【００３７】
図６（ａ）は、複合型の構造体を含むソースコードＤ１の一例としてソースコード「structcopy.c」を示している。char型の値「arg0」および「arg1」とshort型の値「arg2」とlong型の値「arg3」とがこの順番で格納される複合型の構造体「st_sample」が定義されている。「st_sample」型の変数「src」は、7行目において初期値「0x01」、「0x02」、「0x1234」、「0x12345678」付きで宣言されている。また、９行目に、ポインタ「dest」が示すアドレスに格納されている「st_sample」型の変数「*dest」に変数「src」の値を代入する代入文が記述されている。
【００３８】
図６（ｂ）は、図６（ａ）に示したソースコード「structcopy.c」の９行目に挿入される__assign_hook関数が受け取る引数を概念的に説明する図である。アドレス「&(*dest)」を先頭アドレスとするメモリ領域に、先頭アドレスから順番に、「arg0」、「arg1」、「arg2」、「arg3」の合計８バイトの値がこの順番で格納される。__assign_hook関数は、左辺値参照アドレスとして「&(*dest)」を、総バイト数として「８」を、文の場所として、「"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の順番で格納される。
【００４０】
このように、ソースコード変換部７は、ソースコードＤ１に含まれる、左辺値の型が値型である代入文に__assign_hook関数を挿入する。
【００４１】
Ｓ１のソースコード変換処理の後、第１言語ツール部１は、変換済みソースコードＤ４のビルドを実行し（Ｓ２）、オブジェクトコードＤ５を生成する。このとき、第１言語ツール部１は変換済みソースコードＤ４に挿入されている__assign_hook関数に実行トレース出力用ライブラリ３をリンクする。
【００４２】
続いて、第１シミュレータ部２は、オブジェクトコードＤ５をビッグエンディアン方式に従って解釈し、実行するビッグエンディアンシミュレーション処理を行う。その際、実行部位が__assign_hook関数が挿入されている代入文に至ると、オブジェクトコードＤ５に組み込まれた実行トレース出力用ライブラリ３により実行トレースＤ６を出力する実行トレース出力処理が行われる（Ｓ３）。
【００４３】
図７は、実行トレース出力処理を説明するフローチャートである。実行部位が__assign_hook関数が挿入されている代入文に至ると、実行トレース出力用ライブラリ３は、実行トレースＤ６の空エントリに引数として受け取る文の位置（ファイル名および行番号）を書き込む（Ｓ３１）。そして、実行トレース出力用ライブラリ３は、型リストから一つ構成要素（以下、単に要素）を取り出し（Ｓ３２）、取り出した要素に対応する値のバイト幅を取得する（Ｓ３３）。取得したバイト幅をNbバイトとすると、左辺値参照アドレスからNbバイトのデータを読み出し、左辺値参照アドレスをNbバイト進め、代入総バイト数からNbバイト減算する（Ｓ３４）。実行トレース出力用ライブラリ３は、読み出したデータを実行トレースＤ６に記録するための予め定められているエンディアンネス（記録用エンディアンネス）に変換し、変換した値を代入値として実行トレースＤ６に書き込む（Ｓ３５）。なお、記録用エンディアンネスは、どのようなエンディアンネスであってもよい。実行トレース出力用ライブラリ３は、代入総バイト数がゼロ値を越える（総バイト数＞０である）か否かを判定し（Ｓ３６）、ゼロ値を越える場合（Ｓ３６、Ｙｅｓ）、構造体を構成する要素のうち未取得の要素が存在するので、Ｓ３２に移行し、ゼロ値を越えない、つまりゼロ値に等しい場合（Ｓ３６、Ｎｏ）、リターンとなる。
【００４４】
このように、第１シミュレータ部２は、オブジェクトコードＤ５に組み込まれている実行トレース出力用ライブラリ３に基づいて、オブジェクトコードＤ５の動作中にソースコードＤ１に含まれる代入文に代入された代入値をソースコードＤ１上における代入文の位置と対応付けて記録した実行トレースＤ６を出力する。
【００４５】
Ｓ３に続いて、第２言語ツール部４は、変換済みソースコードＤ４のビルドを実行し（Ｓ４）、オブジェクトコードＤ７を生成する。このとき、前述したように、第２言語ツール部４は変換済みソースコードＤ４に挿入されている__assign_hook関数にエンディアンネス依存箇所特定ライブラリ６をリンクする。
【００４６】
そして、第２シミュレータ部５は、オブジェクトコードＤ７をリトルエンディアン方式に従って解釈して実行するリトルエンディアンシミュレーション処理を行う（Ｓ５）。その際、実行部位が__assign_hook関数が挿入されている代入文に至ると、オブジェクトコードＤ７に組み込まれたエンディアンネス依存箇所特定ライブラリ６により該代入文がエンディアンネス依存箇所であるか否かを検査するエンディアンネス依存箇所特定処理が行われる。
【００４７】
図８は、エンディアンネス依存箇所特定処理を説明するフローチャートである。最初に、エンディアンネス依存箇所特定ライブラリ６は、実行トレースＤ６からエントリを一つ読み出し（Ｓ５１）、読み出したエントリに記述されている代入文の位置と__assign_hook関数の引数として受け取った代入文の位置とを比較し、双方の位置が一致するか否かを判定する（Ｓ５２）。
【００４８】
ここで、実行トレースＤ６には、ビッグエンディアン処理系で実行中において実行パス中に現れる順番で代入文の位置と該代入文への代入値との対応付け（エントリ）が記述されている。ビッグエンディアンシミュレーション処理時と同一の実行パスを通る限り、リトルエンディアンシミュレーション処理時における実行パス中には、__assign_hook関数が挿入されている代入文が実行トレースＤ６に記述されているエントリの順番と同じ順番で現れる。そこで、Ｓ５１では、前回読み出したエントリの次に記述されているエントリを読み出すようにするようにするとよい。Ｓ５２において双方の位置が一致しない場合（Ｓ５２、Ｎｏ）、エンディアンネス依存箇所特定ライブラリ６は、ビッグエンディアンシミュレーション処理時とリトルエンディアンシミュレーション処理時とで同一の実行パスを通っていないとして警告を発行し（Ｓ５３）、リトルエンディアンシミュレーション処理を終了する。ビッグエンディアンシミュレーション処理時とリトルエンディアンシミュレーション処理時とで同一の実行パスを通らない原因としては、リトルエンディアンシミュレーション処理において、本エンディアンネス依存箇所特定処理以前にエンディアンネス依存箇所を見落としたことが考えられる。
【００４９】
Ｓ５２において、双方の文の位置が一致した場合（Ｓ５２、Ｙｅｓ）、エンディアンネス依存箇所特定ライブラリ６は、__assign_hook関数の引数として受け取った型リストから一つの要素を取り出し（Ｓ５４）、取り出した型リストに対応する値のバイト幅を取得する（Ｓ５５）。このとき取得したバイト幅をNbバイトとする。そして、エンディアンネス依存箇所特定ライブラリ６は、左辺値参照アドレスからNbバイトのデータを代入値として読み出す（Ｓ５６）。
【００５０】
続いて、エンディアンネス依存箇所特定ライブラリ６は、Ｓ５１にて読み出したエントリから、記録用エンディアンネスで記述されているNbバイトのデータを読み出し、読み出したデータをリトルエンディアン方式に変換して期待値を求める（Ｓ５７）。
【００５１】
そして、エンディアンネス依存箇所特定ライブラリ６は、Ｓ５４にて取得した型リストに基づき、Ｓ５６にて読み出した代入値の型が参照型であるか否かを判定する（Ｓ５８）。代入値の型が参照型ではない場合（Ｓ５８、Ｎｏ）、エンディアンネス依存箇所特定ライブラリ６は、Ｓ５６にて読み出した代入値とＳ５７にて求めた期待値とを比較し、双方の値が一致するか否かをさらに判定する（Ｓ５９）。一致しなかった場合（Ｓ５９、Ｎｏ）、エンディアンネス依存箇所特定ライブラリ６は、この代入文はエンディアンネス依存箇所であると認識し、ソースコード上の代入文の位置、期待値、代入値をエンディアンネス依存箇所レポートＤ８に書き出す（Ｓ６０）。さらに、エンディアンネス依存箇所特定ライブラリ６は、左辺値参照アドレスに格納されている前記代入値を期待値で上書きし（Ｓ６１）、左辺値参照アドレスをNbバイト分インクリメントし、代入総バイト数をNbバイト分デクリメントする（Ｓ６２）。
【００５２】
代入値の型が参照型であった場合（Ｓ５８、Ｙｅｓ）、Ｓ６２に移行する。また、Ｓ５６にて読み出した代入値とＳ５７にて求めた期待値とが一致した場合（Ｓ５９、Ｙｅｓ）、Ｓ６２に移行する。
【００５３】
Ｓ６２の後、エンディアンネス依存箇所特定ライブラリ６は、代入総バイト数がゼロ値を越えるか否か判定し（Ｓ６３）、ゼロ値を越える場合（Ｓ６３、Ｙｅｓ）、構造体を構成する要素のうちの未取得の要素が存在するので、Ｓ５４に移行し、ゼロ値を越えない、すなわちゼロ値に等しい場合（Ｓ６３、Ｎｏ）、リターンとなる。
【００５４】
このように、第２シミュレータ部５は、エンディアンネス依存箇所特定ライブラリ６に基づき、オブジェクトコードＤ７の実行パス上の代入文に値が代入される毎に、値が代入された代入文に対応付けられている値を実行トレースＤ６から読み出して、読み出した値に基づいて期待値を算出し、代入値と算出した期待値とが一致するか否かを判定し、双方の値が異なった場合、代入値を期待値で上書きするとともにこの代入文はエンディアンネス依存箇所であるとしてソースコードＤ１におけるこの代入文の位置をレポート出力する。
【００５５】
Ｓ１〜Ｓ５の動作により、実行パス中に含まれる一つ以上のエンディアンネス依存箇所が全て特定される。Ｓ５の後、作業者は、エンディアンネス依存箇所を発見したか否かを判定し（Ｓ６）、エンディアンネス依存箇所を発見した場合（Ｓ６、Ｙｅｓ）、エンディアンネス依存箇所を修正し（Ｓ７）、エンディアンネス依存箇所が無くなったか否かを検証するために、ソースコード解析システム１００を用いてＳ１からの動作を再度実行する。エンディアンネス依存箇所が発見されなかった場合（Ｓ６、Ｎｏ）、ソースコードＤ１のリトルエンディアン方式への移植が完了し、動作が終了となる。
【００５６】
なお、Ｓ１〜Ｓ５の動作によれば、前述したように、通った実行パス中に含まれるエンディアンネス依存箇所しか特定できない。ソースコードＤ１上のエンディアンネス依存箇所の特定対象を広げるためには、カバレッジが大きくなるようにテスト用データＤ３を選択するようにするとよい。また、複数パターンのテスト用データＤ３を用いてＳ１〜Ｓ５の動作を実行するようにしてもよい。複数のテスト用データＤ３を用いることによって実行パスのパターンが増え、ひいてはエンディアンネス依存箇所の特定対象を広げることができるようになる。
【００５７】
次に、具体例を示して複数のエンディアンネス依存箇所が特定される様子を説明する。図９は、エンディアンネス依存箇所を特定する対象のソースコードＤ１の一例である。図示するように、ポインタ「buffer」が指すアドレスには、{0x00、0x10}というバイト列が予め格納されているとし、４行目において「temp」にポインタ「buffer」が指すアドレスに格納されている値が代入される。また、６行目において「temp」の値が２で除されて得られた値が「temp2」に代入される。そして、８行目〜１３行目において、「temp」が「0xFF」より大きいという条件を満たす場合、「temp2」に「0x100」が加算され、前記条件を満たさない場合、「temp2」から「0x100」が減算される。
【００５８】
図１０は、第１の実施の形態によるシミュレーション結果を説明する図である。図示するように、４行目においては、ビッグエンディアンでの期待値が「0x0010」であることに対し、リトルエンディアンでの代入値が「0x1000」となり、依存ありと判定される。そして、依存ありの場合、４行目の代入値「0x1000」が期待値「0x0010」で上書きされてリトルエンディアンシミュレーション処理が続行され、６行目では期待値も代入値もともに「0x0008」となり、６行目は依存なしと判定される。そして、６行目の正しい代入値に基づいて８行目の分岐条件判定が実行され、双方のエンディアンネスで９行目のパスが通る。９行目では、６行目の正しい代入値に「0x100」が加算され、期待値も代入値もともに「0x108」となり、９行目の代入文は依存なしと判定される。
【００５９】
図１１は、エンディアンネス依存箇所レポートＤ８の一例を示す図である。図示するように、４行目がエンディアンネス依存箇所であると特定されている。
【００６０】
続いて、仮にＳ６１に示した期待値上書きを行わないでＳ５を実行した場合を考える。図１２は、その場合のシミュレーション結果を説明する図である。図示するように、４行目では、ビッグエンディアンでの期待値が「0x0010」、リトルエンディアンでの代入値が「0x1000」となり、依存ありと判定される。また、４行目のデータ誤りが伝播し、６行目では、期待値が「0x0008」、代入値が「0x0800」となり、依存ありと判定される。さらに、ビッグエンディアンでは、６行目での代入値に基づいて８行目に示す分岐条件判定が行われ、９行目が実行パスとなる。これに対し、リトルエンディアンでは、誤ったデータ「0x1000」に基づいて分岐条件判定が行われ、９行目ではなく１２行目のパスを通る。そして、実行パスがビッグエンディアンとリトルエンディアンとで異なるので、警告が発行されてシミュレーション終了となる。このように４行目のデータ誤りが後の処理に伝播することによって、５行目以降ではエンディアンネス依存であるか否かが正しく判定できていない。これに対し、第１の実施の形態では、エンディアンネス依存箇所を発見した場合、代入値を期待値で上書きして以降の処理を行うようにしているので、データ誤りの伝播を防ぐことができるので、エンディアンネス依存の処理があったとしても、以降の処理中にエンディアンネス依存の箇所の検出を続行することができる。すなわち、一回の実行で複数のエンディアンネス依存箇所を特定することができるので、効率的にエンディアンネス依存箇所を特定することができる。
【００６１】
なお、以上説明したソースコード解析システム１００は、一般的なコンピュータを用いて実現されるものであってよい。図１３は、ソースコード解析システム１００のハードウェア構成の一例を説明する図である。ソースコード解析システム１００は、ＣＰＵ（Central  Processing  Unit）１１、ＲＯＭ（Read  Only  Memory）１２、ＲＡＭ（Random  Access  Memory）１３、表示部１４、入力部１５を備えるコンピュータ構成となっている。ＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３、表示部１４、入力部１５は、バスラインを介して夫々接続されている。
【００６２】
ＣＰＵ１１は、ソースコードのエンディアンネス依存箇所を特定するコンピュータプログラムであるソースコード解析プログラム１６を実行する。表示部１４は、液晶モニタなどの表示装置であり、ＣＰＵ１１からの指示に基づいて、操作画面などのユーザに対する出力情報を表示する。入力部１５は、マウスやキーボードを備えて構成され、ユーザからのソースコード解析システム１００の操作が入力される。入力部１５へ入力された操作情報は、ＣＰＵ１１へ送られる。
【００６３】
ソースコード解析プログラム１６は、ＲＯＭ１２内に格納されており、バスラインを介してＲＡＭ１３へロードされる。ＣＰＵ１１はＲＡＭ１３内にロードされたソースコード解析プログラム１６を実行する。具体的には、ソースコード解析システム１００では、設計者による入力部１５からの指示入力に従って、ＣＰＵ１１がＲＯＭ１２内からソースコード解析プログラム１６を読み出してＲＡＭ１３内のプログラム格納領域に展開して各種処理を実行する。ソースコードＤ１、テストソースＤ２、テスト用データＤ３は、外部記憶装置などから入力される。ＣＰＵ１１は、外部記憶装置などから入力されたソースコードＤ１、テストソースＤ２、テスト用データＤ３に基づいて各種処理を実行し、この各種処理に際して生じる変換済みソースコードＤ４、オブジェクトコードＤ５、実行トレースＤ６、オブジェクトコードＤ７などのデータをＲＡＭ１３内に形成されるデータ格納領域に一時的に記憶させておく。ＣＰＵ１１は、作成したエンディアンネス依存箇所レポートＤ８をＲＡＭ１３内のプログラム格納領域あるいは外部記憶装置などに出力する。なお、ソースコード解析プログラム１６は、ＤＩＳＫなどの記憶装置に格納しておいてもよい。また、ソースコード解析プログラム１６は、ＤＩＳＫなどの記憶装置にロードしてもよい。
【００６４】
第１の実施の形態のソースコード解析プログラム１６は、前述の各部（第１言語ツール部１、第１シミュレータ部２、実行トレース出力用ライブラリ３、第２言語ツール部４、第２シミュレータ部５、エンディアンネス依存箇所特定ライブラリ６、およびソースコード変換部７）を含む構成となっており、上記各部が主記憶装置上にロードされ、第１言語ツール部１、第１シミュレータ部２、実行トレース出力用ライブラリ３、第２言語ツール部４、第２シミュレータ部５、エンディアンネス依存箇所特定ライブラリ６およびソースコード変換部７が主記憶装置上に生成される。なお、実行トレース出力用ライブラリ３およびエンディアンネス依存箇所特定ライブラリ６は外部記憶装置上にロードされるようにしてもよい。
【００６５】
なお、第１言語ツール部１、第１シミュレータ部２、第２言語ツール部４および第２シミュレータ部５は、一般的に利用されているツールやプログラムを実行することにより実現することができる。したがって、実行トレース出力用ライブラリ３、エンディアンネス依存箇所特定ライブラリ６およびソースコード変換部７を含むソースコード解析プログラム１６を提供するようにしてもよい。
【００６６】
また、第１言語ツール部１、第１シミュレータ部２、実行トレース出力用ライブラリ３、第２言語ツール部４、第２シミュレータ部５、エンディアンネス依存箇所特定ライブラリ６、およびソースコード変換部７は、複数のコンピュータによって実現されるようにしてもよい。例えば、第１シミュレータ部２、第２シミュレータ部５としてオブジェクトコードをそれぞれのエンディアンネスに従って実行する実機のコンピュータを使用することができる。第１シミュレータ部２、第２シミュレータ部５に実機のコンピュータを使用する場合、第１言語ツール部１、実行トレース出力用ライブラリ３、第２言語ツール部４、エンディアンネス依存箇所特定ライブラリ６、およびソースコード変換部７を含む構成のソースコード解析プログラム１６を実行することによって主記憶装置上に第１言語ツール部１、実行トレース出力用ライブラリ３、第２言語ツール部４、エンディアンネス依存箇所特定ライブラリ６が生成されたホスト装置としてのコンピュータと、第１シミュレータ部２、第２シミュレータ部５として機能するスレーブ装置としての実機のコンピュータとによって第１の実施の形態のソースコード解析システム１００を実現するようにしてもよい。ホスト−スレーブ間の各種データの授受はネットワークや着脱可能な外部記憶装置を介して実行される。
【００６７】
なお、ソースコード解析プログラム１６を、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供するように構成しても良い。また、ソースコード解析プログラム１６をインターネット等のネットワーク経由で提供または配布するように構成してもよい。また、ソースコード解析プログラム１６を、ＲＯＭ等に予め組み込んでソースコード解析システム１００に提供するように構成してもよい。
【００６８】
なお、上記説明においては、ソースコード変換部７は、第１言語ツール部１に実行トレース出力用ライブラリ３をリンクさせるための関数と、第２言語ツール部４にエンディアンネス依存箇所特定ライブラリ６をリンクさせるための関数として、同一の関数__assign_hookを挿入するようにしたが、第１言語ツール部１に実行トレース出力用ライブラリ３をリンクさせるための関数と第２言語ツール部４にエンディアンネス依存箇所特定ライブラリ６をリンクさせるための関数とは異なる関数であってもよい。
【００６９】
また、実行トレース出力用ライブラリ３およびエンディアンネス依存箇所特定ライブラリ６はビルド時にリンクされるとして説明したが、オブジェクトコードの実行時にリンクされるようにしてもよい。オブジェクトコードの実行時にリンクさせる場合、第１シミュレータ部２、第２シミュレータ部５は、実行時、夫々実行トレース出力用ライブラリ３、エンディアンネス依存箇所特定ライブラリ６にアクセス可能に構成しておくとよい。
【００７０】
また、Ｃ言語で記述されたソースコードＤ１の例を上げて説明したが、ソースコードＤ１のプログラム言語はＣ言語以外の手続き型言語であってもかまわない。また、ビッグエンディアンを第１のエンディアン、リトルエンディアンを第２のエンディアンとして説明したが、第１のエンディアンと第２のエンディアンとの組み合わせはこの組み合わせだけでなく、どのようなエンディアンネスの組み合わせであっても第１の実施の形態を適用することができる。
【００７１】
以上説明したように、第１の実施の形態によれば、第２のエンディアン方式に従ったシミュレーションの実行中に代入文が実行される毎に、前記代入文に第１のエンディアン方式に従ったシミュレーションと第２のエンディアン方式に従ったシミュレーションとで、同一の意味に解釈される値が代入されるか否かを判定し、同一の意味に解釈される値が代入されない場合には、第２のエンディアン方式で代入された値を期待値で上書するとともに該代入文をエンディアンネス依存箇所としてレポート出力するように構成した。よって、エンディアンネス依存箇所の処理以降であっても別のエンディアンネス依存箇所を正しく特定でき、一回の実行で複数のエンディアンネス依存箇所を特定することができる。すなわち、ソースコードに含まれるエンディアンネス依存箇所を効率的に特定することができる。また、作業者によるエンディアンネスに関する入力を必要としないので、ソースコードに関する事前知識が無くてもソースコードに含まれるエンディアンネス依存箇所を特定することができる。
【００７２】
（第２の実施の形態）
第１の実施の形態を用いてビッグエンディアンからリトルエンディアンへの移植を行うと、移植されたソースコードから生成されたオブジェクトコードがメモリに書き込むデータは全てリトルエンディアンになる。この場合、メモリマップＩ／Ｏで接続されたハードウェアアクセラレータや他の処理系と通信を行うライブラリをビッグエンディアンの処理系から再利用する際に問題が発生する。
【００７３】
例えば、図１４に示す対象システムのように、リトルエンディアン（ＬＥ）処理系のＣＰＵ１７と、メモリ１８と、ビッグエンディアン処理系のハードウェアアクセラレータ１９と、その他のＩ／Ｏ２０とがバス接続されて構成されているシステムにおいては、例えばメモリ空間は、リトルエンディアンで読み書きされるヒープ領域およびスタック領域と、ハードウェアアクセラレータ１９とＣＰＵ１７とが通信を行うための、ビッグエンディアンで書き込まれ、リトルエンディアンで読み出される領域と、が存在することになる。
【００７４】
そこで、第２の実施の形態では、特定のアドレス範囲を特定のエンディアンネスで書き込めるように構成されている。図１５は、第２の実施の形態のソースコード解析システムの構成を説明する図である。なお、ここでは、第１の実施の形態と同じ機能を備えた構成要素には同一の符号を付し、該構成要素に関する詳細な説明は省略する。
【００７５】
図１５に示すように、ソースコード解析システム１０１は、第１言語ツール部１、第１シミュレータ部２、実行トレース出力用ライブラリ３、第２言語ツール部２１、第２シミュレータ部５、エンディアンネス依存箇所特定ライブラリ２２およびソースコード変換部７を備えている。また、ソースコード解析システム１０１には、ソースコードＤ１、テストソースＤ２、テスト用データＤ３のほかに、ビッグエンディアンで書き込みを行うべきアドレスの範囲が記述されたテーブルであるビッグエンディアン書き出しテーブルＤ９が入力される。
【００７６】
第２言語ツール部２１は、変換済みソースコードＤ４とテストソースＤ２とビッグエンディアン書き出しテーブルＤ９とを組み合わせてビルドし、オブジェクトコードＤ１０を生成する。第２言語ツール部２１は、ビルドを行う際、エンディアンネス依存箇所特定ライブラリ２２をリンクさせる。
【００７７】
第２シミュレータ部５は、オブジェクトコードＤ１０をシミュレーションする。その際、オブジェクトコードＤ１０に組み込まれているエンディアンネス依存箇所特定ライブラリ２２により、次に示すエンディアンネス依存箇所特定処理が実行される。エンディアンネス依存箇所は、エンディアンネス依存箇所レポートＤ１１として出力される。
【００７８】
図１６は、エンディアンネス依存箇所特定処理を説明するフローチャートである。図１６において、エンディアンネス依存箇所特定ライブラリ２２は、Ｓ７１〜Ｓ７６により、Ｓ５１〜Ｓ５６と同様の処理を実行する。エンディアンネス依存箇所特定ライブラリ２２は、Ｓ７６の後、Ｓ７１にて取得した実行トレースＤ６のエントリから記録用エンディアンネスで記述されているＮｂバイトのデータを読み出し、参照値とする（Ｓ７７）。そして、エンディアンネス依存箇所特定ライブラリ２２は、オブジェクトコードＤ１０に組み込まれているビッグエンディアン書き出しテーブルＤ９を参照し、左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれているか否かを判定する（Ｓ７８）。
【００７９】
左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれている場合（Ｓ７８、Ｙｅｓ）、エンディアンネス依存箇所特定ライブラリ２２は、参照値を記録用エンディアンネスからビッグエンディアンに変換し、期待値とし（Ｓ８０）、Ｓ８１に移行する。また、左辺値参照アドレスがビッグエンディアンで書き出すアドレス範囲に含まれていない場合（Ｓ７８、Ｎｏ）、エンディアンネス依存箇所特定ライブラリ２２は、参照値を記録用エンディアンネスからリトルエンディアンに変換し、期待値とし（Ｓ７９）、Ｓ８１に移行する。
【００８０】
エンディアンネス依存箇所特定ライブラリ２２は、Ｓ８１〜Ｓ８６により、Ｓ５８〜Ｓ６３と同等の処理を実行する。
【００８１】
このように、ビッグエンディアン（第１のエンディアン）の変数記憶方式で書き込みアクセスすべきメモリアドレスの範囲を指定するビッグエンディアン書き出しテーブルＤ９（メモリアドレス範囲指定）を受け付け、左辺値参照アドレスがメモリアドレス範囲指定に指定されている範囲に含まれる場合、第１のエンディアンで記述された値を期待値とし、左辺値参照アドレスがメモリアドレス範囲指定に指定されている範囲に含まれない場合、リトルエンディアン（第２のエンディアン）で記述された値を期待値とするように構成したので、対象のシステムが特定のエンディアンで書き込みアクセスを行うべきメモリアドレス領域がある場合であっても正しくエンディアンネス依存箇所を特定することができるようになる。
【符号の説明】
【００８２】
１  第１言語ツール部、２  第１シミュレータ部、３  実行トレース出力用ライブラリ、４  第２言語ツール部、５  第２シミュレータ部、６  エンディアンネス依存箇所特定ライブラリ、７  ソースコード変換部、１１  ＣＰＵ、１２  ＲＯＭ、１３  ＲＡＭ、１４  表示部、１５  入力部、１６  ソースコード解析プログラム、１８  メモリ、１９  ハードウェアアクセラレータ、２１  第２言語ツール部、２２  エンディアンネス依存箇所特定ライブラリ、１００  ソースコード解析システム、１０１  ソースコード解析システム。
【図１】
2011048581.tif 000003
【図２】
2011048581.tif 000004
【図３】
2011048581.tif 000005
【図４】
2011048581.tif 000006
【図５】
2011048581.tif 000007
【図６】
2011048581.tif 000008
【図７】
2011048581.tif 000009
【図８】
2011048581.tif 000010
【図９】
2011048581.tif 000011
【図１０】
2011048581.tif 000012
【図１１】
2011048581.tif 000013
【図１２】
2011048581.tif 000014
【図１３】
2011048581.tif 000015
【図１４】
2011048581.tif 000016
【図１５】
2011048581.tif 000017
【図１６】
2011048581.tif 000018