(57)【要約】【課題】プログラムにおいてエンディアン問題が起こる箇所を効率的に発見し、発見した当該箇所において本当にエンディアン問題が発生するか否かを確認する。【解決手段】解析手段はオリジナルソースコードにおいてエンディアン問題が発生しうる部分である問題箇所を特定し特定した問題箇所を列挙した問題箇所リストを生成し出力する。生成手段は問題箇所リストに挙げられた問題箇所のそれぞれについてエンディアン問題が発生するか否かを検証するためのプログラムである判定プログラムを生成し出力する。第１実行手段は第1のエンディアン環境下で判定プログラムを実行し第１実行結果を出力する。第２実行手段は第２のエンディアン環境下で判定プログラムを実行し第２実行結果を出力する。結果出力手段は第1実行結果と第２実行結果の内容が異なった場合第１実行結果及び第１実行結果の内容と問題箇所を示す情報とを含む結果を出力する。【選択図】図１
2013218574.tif 000002
【特許請求の範囲】
【請求項１】
オリジナルソースコードにおいてエンディアン問題が発生しうる部分である問題箇所を特定し、特定した問題箇所を列挙した問題箇所リストを生成し、出力する解析手段と、
問題箇所リストに挙げられた問題箇所のそれぞれについて、エンディアン問題が発生するか否かを検証するためのプログラムであって、その問題箇所を示す情報を出力するプログラムである判定プログラムを生成し、出力する生成手段と、
第1のエンディアン環境下で前記判定プログラムを実行し、第１実行結果を出力する第１実行手段と、
第２のエンディアン環境下で前記判定プログラムを実行し、第２実行結果を出力する第２実行手段と、
第1実行結果と第２実行結果の内容が異なった場合、第１実行結果及び第２実行結果の内容と、前記問題箇所を示す情報とを含む結果を出力する結果出力手段と
を有するエンディアン問題検出装置。
【請求項２】
前記解析手段は、入力されたオリジナルソースコードを構文解析して構文木を生成し、前記オリジナルソースコードの意味論解析を行い、前記構文木にデータ型を含む情報を付加した情報である情報付加構文木を生成し、前記情報付加構文木のノードがエンディアン問題を生じさせる可能性があるノードか否かを判定し、当該ノードがエンディアン問題を生じさせる可能性があるノードであると判定した場合は、当該ノードが問題条件を満たすか否かを判定し、当該ノードが問題条件を満たすと判定した場合は当該ノードを問題箇所リストに追加する、請求項１に記載のエンディアン問題検出装置。
【請求項３】
前記生成手段は、問題箇所リストから一つの問題箇所を読み込み、当該問題箇所の変数型判断を行い、構造体・共用体定義文を判定プログラムソースコード用ファイルに書き込み、問題箇所を示す情報を、前記判定プログラムソースコード用ファイルに書き込み、前記構造体・共用体の各メンバに代入するための値であって、エンディアン問題の発生を確認できる値を生成し、前記メンバに前記生成した値を代入するステートメントを生成し、前記判定プログラムソースコード用ファイルに書き込み、テスト値の計算文であるステートメントを前記判定プログラムソースコード用ファイルに書き込み、前記テスト値及び問題箇所を示す情報の出力文であるステートメントを前記判定プログラムソースコード用ファイルに書き込む、請求項１又は２に記載のエンディアン問題検出装置。
【請求項４】
前記生成手段は、問題箇所リストから一つの問題箇所を読み込み、当該問題箇所の変数型判断を行い、問題箇所を示す情報を、前記判定プログラムソースコード用ファイルに書き込み、問題箇所に含まれる変数に代入するための値であって、エンディアン問題の発生を確認できる値を生成し、前記変数に前記生成した値を代入するステートメントを生成し、前記判定プログラムソースコード用ファイルに書き込み、テスト値の計算文であるステートメントを前記判定プログラムソースコード用ファイルに書き込み、前記テスト値及び問題箇所を示す情報の出力文であるステートメントを前記判定プログラムソースコード用ファイルに書き込む、請求項１又は２に記載のエンディアン問題検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本明細書に記載の実施の形態は、エンディアン問題検出装置に関する。
【背景技術】
【０００２】
近年、多種多様の情報処理装置（ＰＣ，タブレットＰＣ，スマートフォン、ネットワーク家電等）が開発され普及されるようになってきた。そのため、ある情報処理装置において使用されているソフトウエアを他の情報処理装置に移植する必要が増大している。
【０００３】
ところで、これら情報処理装置に搭載されるＣＰＵには、データをメモリ上に書き込む際上位から書き込むもの（ビッグエンディアン）と、逆に下位から書き込むもの（リトルエンディアン）が存在する。より詳しく述べると、ＣＰＵのデザインにより、メモリにデータを配置する並び順が異なる。そのため、同じソースコードをコンパイル、実行しても、異なるエンディアン型のＣＰＵで実行すると実行結果が異なる場合が発生する。これがエンディアン問題である。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平７−２６１９９６号公報
【特許文献２】特開２０１１−４８５８１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかし、エンディアン問題はプログラム開発段階では発見し難いものであり、
実際に開発したプログラムを様々な環境下で実行してみてはじめて気づく場合が多い。これは、（１）コンパイラでは発見できない；（２）変数の値によっては偶然正しく動く場合がある；（３）テストケースを見つけることが難しい、という理由による。
【０００６】
従来、エンディアン問題を解決するためには、開発者がプログラムのソースコードを目視等で追い、問題が発生する可能性がある箇所を洗い出し、そのような箇所について、エンディアン問題が発生するか否かを実際にそのプログラムを実行して確認する手法が採られていたが、効率的にそのような箇所を発見し、テストを実行することは、膨大なプログラムについては現状では困難であった。
【０００７】
本発明は、プログラムにおいてエンディアン問題が起こる箇所を効率的に発見するとともに、発見した当該箇所において本当にエンディアン問題が発生するか否かを確認する手法を提供することを目的とする。
【課題を解決するための手段】
【０００８】
一の実施の形態によれば、エンディアン問題検出装置が提案される。このエンディアン問題検出装置は、解析手段と、生成手段と、第１実行手段と、第２実行手段と、出力手段とを有する。解析手段はオリジナルソースコードにおいてエンディアン問題が発生しうる部分である問題箇所を特定し、特定した問題箇所を列挙した問題箇所リストを生成し、出力する。生成手段は問題箇所リストに挙げられた問題箇所のそれぞれについて、エンディアン問題が発生するか否かを検証するためのプログラムである判定プログラムを生成し、出力する。第１実行手段は第1のエンディアン環境下で前記判定プログラムを実行し、第１実行結果を出力する。第２実行手段は第２のエンディアン環境下で前記判定プログラムを実行し、第２実行結果を出力する。結果出力手段は、第1実行結果と第２実行結果の内容が異なった場合、第１実行結果及び第１実行結果の内容と、前記問題箇所を示す情報とを含む結果を出力する。
【図面の簡単な説明】
【０００９】
【図１】本装置の構成例を示すブロック図
【図２】エンディアン問題チェック処理の例を示すフローチャート
【図３】ソースコード解析処理（Ｓ１０）の一例を示したフローチャート
【図４】ソースコード解析処理の対象となるソースコードの一部の例を示した図
【図５】図４に示したソースコードを構文解析して生成した構文木の例を示す図
【図６】図５に示した構文木から生成された情報付加構文木の例を示す図
【図７Ａ】判定プログラム生成処理（Ｓ２０）の一例を示したフローチャート
【図７Ｂ】オリジナルソースコードの一部を示す図
【図７Ｃ】図７ＢのオリジナルソースコードからステップＳ２０３の処理よって判定プログラムソースコード用ファイルに書き込まれるソースコードの例を示す図
【図７Ｄ】オリジナルソースコードの一部を示す図
【図７Ｅ】図７ＤのオリジナルソースコードからステップＳ２０４の処理よって判定プログラムソースコード用ファイルに書き込まれるソースコードの例を
【図８】ステップＳ２０４において書き込まれる構造体Ａの例を示す図
【図９Ａ】ステップＳ２０４において書き込まれる別の構造体Ｂの例を示す図
【図９Ｂ】図８及び図９Ａの構造体についての、ポインタチェック条件文の例を疑似コードで示す図
【図１０】結果出力処理（Ｓ４０）の一例を示したフローチャート
【図１１】本装置に入力されるオリジナルソースコードの一部を示した図
【図１２】結果出力部５０から出力される、問題箇所を示す情報の一例を示す図
【図１３】図１２に示すオリジナルソースコードから判定プログラム生成処理によって生成された判定プログラムのソースコードの例を示す図
【図１４】エンディアン問題を発生する可能性のある箇所（問題箇所）を含むプログラムのソースコードの例を示す図
【図１５】ビッグエンディアン環境下で図１４のプログラムが実行されたときの、メモリ上への値の格納の様相を示す図
【図１６】リトルエンディアン環境下で図１４のプログラムが実行されたときの、メモリ上への値の格納の様相を示す図
【発明を実施するための形態】
【００１０】
以下、図面を参照して本発明の実施の形態に係るエンディアン問題検出装置（以下「本装置」と略す）を説明する。
【００１１】
[０．用語の定義]
本明細書中で使用する用語の定義を述べる。
（１）「ＣＰＵ」とは、中央演算処理装置をいう。
（２）「ソースコード」とは、プログラマがプログラミング言語を用いて作成する一連の動作内容が書かれたテキストファイルをいう。
（３）「エンディアン」とは、ＣＰＵがメモリにデータを書き込む際の配置の仕方をいう。
【００１２】
［０．１．エンディアン問題の事例］
エンディアン問題の事例を述べる。図１４は、エンディアン問題を発生する可能性のある箇所（問題箇所）を含むプログラムのソースコードの例である。このプログラムではint型の変数iに「１２３４５６７８」（１６進数）が代入された後、この変数iをshort型に変換する処理が行われる。
【００１３】
図１５は、ビッグエンディアン環境下で図１４のプログラムが実行されたときの、メモリ上への値の格納の様相を示す図である。ビッグエンディアン環境下では最上位ビット(Most significant Bit)の属するバイト(Most Significant Byte)を低位のアドレスへ格納するため、4byteのint型では「１２３４５６７８」と格納される。このint型の「１２３４５６７８」が2byteのshort型に変換されると、低位アドレス側2byteのみデータ「１２３４」となる。
【００１４】
一方、同じ図１４のプログラムをリトルエンディアン環境下で実行すると、図１６のようになる。すなわち、リトルエンディアン環境下では最下位ビット(Least Significant Bit)の属するバイト(Least Significant Byte)を低位のアドレスへ格納していく方式であるため、4byteのint型では「７８５６３４１２」と格納される。このint型の「７８５６３４１２」が2byteのshort型に変換されると、低位アドレス側2byteのみデータ「７８５６」となる。
【００１５】
すなわち、同じ図１４の部ログラムを実行しても、ビッグエンディアン環境下では「１２３４」という出力となるのに対して、リトルエンディアン環境下では「５６７８」という出力という異なった出力結果になるのである。
【００１６】
[１．本装置の構成例]
次に、本装置の構成例について説明する。本装置は、例えばコンピュータ、ワークステーションなどの情報処理装置によって実現される装置である。この情報処理装置は、演算処理装置（ＣＰＵ）、主メモリ（ＲＡＭ）、読出し専用メモリ（ＲＯＭ）、入出力装置（Ｉ／Ｏ）、及び必要な場合にはハードディスク装置等の外部記憶装置を具備している装置である。
【００１７】
本装置は、オリジナルソースコードを構文解析し、構文解析の結果に基づいて、当該オリジナルソースコードがエンディアン問題を発生させるか否かを判定するためのプログラムである判定プログラムを自動生成し、その判定プログラムをビッグエンディアン環境下で実行した結果とリトルエンディアン環境下で実行した結果とを比較した結果を出力する装置である。
【００１８】
図１に本装置の構成例を示すブロック図を掲げる。本装置１は、ソースコード解析部１０と、判定プログラム生成部２０と、第1判定プログラム実行部３０と、第２判定プログラム実行部４０と、結果出力部５０とを有する。ソースコード解析部１０は、本実施の形態の解析手段に相当する。判定プログラム生成部２０は本実施の形態の生成手段に相当する。第1判定プログラム実行部３０は、本実施の形態の第１実行手段に相当する。第２判定プログラム実行部４０は本実施の形態の第２実行手段に相当する。結果出力部５０は本実施の形態の出力手段に相当する。なお、これら構成要素は本装置１の機能を機能ごとにまとめてブロックとして捉えたものであり、本装置１は各構成要素に対応するモジュール、装置、回路、部品などを備えていることを意味するわけではない。
【００１９】
ソースコード解析部１０は判定プログラム生成部２０に接続されている。判定プログラム生成部２０は第1判定プログラム実行部３０及び第２判定プログラム実行部４０に接続されている。第1判定プログラム実行部３０及び第２判定プログラム実行部４０は結果出力部５０に接続されている。ここで「接続されている」とは、データ、情報、命令などの送受信、授受が可能な状態になっていることをいい、配線で連結されているような物理的な接続に限られる意味ではない。
【００２０】
ソースコード解析部１０は、解析対象であるオリジナルソースコードにおいてエンディアン問題が発生しうる部分（以下「問題箇所」という）を特定し、特定した問題箇所を列挙した問題箇所リストを生成し、出力する機能を有する。
【００２１】
より詳しく述べると、ソースコード解析部１０はエンディアン問題処理の対象であるオリジナルソースコードを構文解析してオリジナルソースコードの構文木を生成し、意味論解析によりその構文木にデータ型情報等を付加した構文木（「情報付加構文木」と呼ぶ）を生成し、情報付加構文木の各ノードについて、エンディアン問題が発生する可能性があるか否か、及び問題条件を満たすか否かを判定し、この判定結果に基づいてエンディアン問題を発生させる可能性の高い箇所（「問題箇所」という）を記述した問題箇所リストを生成し出力する機能を有する。
【００２２】
判定プログラム生成部２０は、問題箇所リスト中の個々の問題箇所について、判定プログラムを自動生成する機能を有する。判定プログラムは、問題箇所を解析対象であるオリジナルソースコード内の行番号等と対応付けて出力するように生成される。オリジナルソースコード内の行番号等とは、後述する「問題箇所を示す情報」として使用されることができる。
【００２３】
より詳しく述べると、判定プログラム生成部２０は、ソースコード解析部１０から出力された問題箇所リストに挙げられた問題箇所のそれぞれについて、エンディアン問題が発生するか否かを検証するためのプログラムである判定プログラムを生成し、出力する機能を有する。その判定プログラムでは、使用される変数の値としてエンディアン問題を発生し易い値（テスト値）が判定プログラム生成部２０により生成され、当該判定プログラム内に記述されている。
【００２４】
第1判定プログラム実行部３０及び第２判定プログラム実行部４０はそれぞれ、前記判定プログラムを互いに異なるエンディアンのハードウェア環境でそれぞれコンパイルして実行し、実行結果を出力する機能を有する。
【００２５】
より詳しく述べると、第1判定プログラム実行部３０は第1のエンディアン環境下（本例ではリトルエンディアン環境下）でコンパイルし、実行し、実行結果（「第1実行結果」と呼ぶ）を出力する。第２判定プログラム実行部４０は第1のエンディアン環境とは異なる環境である第２のエンディアン環境下（本例ではビッグエンディアン環境下）で第1判定プログラム実行部３０がコンパイル、実行するものと同一の判定プログラムをコンパイルし、実行し、実行結果（「第２実行結果」と呼ぶ）を出力する。なお、第１のエンディアン環境（リトルエンディアン環境）での実行と、第２のエンディアン環境（ビッグエンディアン環境）での実行は、エンディアンの異なる別々のＣＰＵ上で実行する構成としても良いし、或いは一つのＣＰＵを使って別のエンディアン環境をエミュレーションして実行する構成としても良い。
【００２６】
結果出力部５０は、第1実行結果と第２実行結の内容を比較した結果である比較結果を出力する機能を有する。第1実行結果と第２実行結の内容が異なった場合、実行結果の内容に加えて、問題箇所を示す情報（例えば、関数名、行番号（カラム番号を含んでもよい））から、ユーザやオペレータなどは、解析対象であるオリジナルソースコードにおけるエンディアン問題発生部分を容易に特定することが可能である。
【００２７】
[２．本装置の動作例]
次に、本装置１の動作例について説明する。図２は、本装置１の動作例であるエンディアン問題チェック処理の例を示すフローチャートである。以下、図２のフローチャートを参照して本装置１の動作例を説明する。
【００２８】
エンディアン問題のチェック対象であるオリジナルソースコードが本装置１に入力されると、本装置１、より詳しくはソースコード解析部１０はソースコード解析情報を生成するソースコード解析処理を実行する（Ｓ１０）。
【００２９】
次に、本装置１、より詳しくは判定プログラム生成部２０は、ソースコード解析情報から判定プログラムを生成する判定プログラム生成処理を実行する（Ｓ２０）。
【００３０】
次に、本装置１、より詳しくは第1判定プログラム実行部３０及び第２判定プログラム実行部４０はそれぞれのエンディアン環境下で判定プログラムを実行、し、実行結果を出力する処理である判定プログラム実行処理を行う（Ｓ３０）。
【００３１】
次に、本装置１、より詳しくは結果出力部５０は２つのエンディアン環境下で実行された実行結果を比較した情報である比較結果を出力する処理である結果出力処理を実行する（Ｓ４０）。出力された比較結果から、ユーザやオペレータは、オリジナルソースコードにおいてエンディアン問題が起こる場所を効率的に発見することができ、且つ発見した場所が本当に問題となるのかを確認することも可能となる。
以上で、本装置１の動作例の説明を終了する。
【００３２】
[２．１．ソースコード解析処理]
次に、上述したソースコード解析処理（Ｓ１０）の内容について説明する。図３は、ソースコード解析処理（Ｓ１０）の一例を示したフローチャートである。
【００３３】
ソースコード解析処理（Ｓ１０）において、ソースコード解析部１０は、入力されたオリジナルソースコードを構文解析し、構文木を生成する（Ｓ１０１）。構文解析とは、字句解析を通してトークン列を受け取り、構文木や抽象構文木のようなデータ構造を生成し、その後の処理に渡す処理である。構文木の生成処理プログラムは、一般的なコンパイラの構文解析プログラムに基づいて作成することが可能である。
【００３４】
図４は、ソースコード解析処理の対象となるソースコードの一部の例を示した図である。この例では、int型の変数ａの宣言と、short型のポインタ変数ｂの宣言と、ポインタ変数ｂに変数ａのアドレスを代入する処理が記述されている。
【００３５】
図４に示したソースコードを構文解析して生成した構文木の例を、図５に示す。この構文木は演算子「＝」をルートノードとし、ルートノード「＝」は、子ノードの変数「ｂ」と演算子「＆」を有し、ノード「＆」は、その子ノードの変数「ａ」を有する。
【００３６】
図３に戻り、ソースコード解析処理の説明を続ける。ソースコード解析部１０は、ソースコードの意味論解析を行い、ステップＳ１０１で生成した構文木にデータ型等の情報を付加した情報である情報付加構文木を生成する（Ｓ１０２）。意味論解釈処理プログラムは、一般的なコンパイラの意味論解析プログラムに基づいて作成することが可能である。図６に、図５に示した構文木から生成された情報付加構文木の例を示す。図６に示す情報付加構文木において、ルートノード「＝」には、当該演算子「＝」の左辺がshort型のポインタ変数であることを示す「left:short*」と、右辺が
int型のポインタ変数であることを示す「right:int*」という情報が付加される。第１世代の子ノード「ｂ」には、ｂがshort型のポインタ変数であることを示す「b:short*」という情報が付加される。もう一つの第１世代の子ノード「＆」には、＆がint型のポインタ変数であることを示す「&:int*」という情報が付加される。第２世代のノード「ａ」には、ａがint型の変数であることを示す「a:int」という情報が付加される。
【００３７】
図３に戻り、ソースコード解析処理の説明を続ける。ソースコード解析部１０は、情報付加構文木から一つのノードを読み込む（Ｓ１０３）。次にソースコード解析部１０は、読み込んだノードが危険なパターンのノード（エンディアン問題を生じさせる可能性があるノード）か否かを判定する（Ｓ１０４）。
エンディアン問題の原因が、ポインタキャストによる場合は、危険なパターンであるノードであるか否かは、危険パターンであるか否かを判定する条件が記述された危険パターン判定条件ファイルに記述されている。危険パターン判定条件ファイルは、危険パターンごとにその危険パターンに該当するか否かを判定するための条件が記述されている。危険パターン判定条件ファイルは、本装置１内等に記憶されていればよい。
【００３８】
危険パターン判定条件ファイルの内容の一例として、ポインタキャストを判定する条件を示す。
条件１：演算子「＝」の左辺の型と右辺の型がともにポインタである
条件２：キャスト命令である  (例：(int *)b)
【００３９】
このステップＳ１０４において、危険なパターンであるノードでない（Ｓ１０４、Ｎｏ）と判定した場合ソースコード解析部１０は、当該ノードを処理済みとし、他の未処理のノードに移行し（Ｓ１０９）、ステップＳ１０３に戻る。
【００４０】
一方、ステップＳ１０４において、危険なパターンであるノードである（Ｓ１０４、Ｙｅｓ）と判定した場合ソースコード解析部１０は、当該ノードが問題条件を満たすか否かを判定する（Ｓ１０５）。問題条件は各危険パターンごとに設定されており、問題条件ファイルなどの形式で本装置１内等に記憶されていればよい。
以下に、危険パターンがポインタキャストである場合の問題条件の例を示す。
【００４１】
条件３：キャスト元の型とキャスト先の型が異なる
（例：typedef int aaa; int i;(aaa*) i;）
条件４：サイズが異なる、又は共用体・構造体ポインタがある。
条件５： 演算子の両辺はvoid型ではない。
【００４２】
このステップＳ１０５において、問題条件を満たすノードでない（Ｓ１０５、Ｎｏ）と判定した場合ソースコード解析部１０は、当該ノードを処理済みとし、他の未処理のノードに移行し（Ｓ１０９）、ステップＳ１０３に戻る。
【００４３】
一方、ステップＳ１０５において、当該ノードが問題条件を満たすノードである（Ｓ１０５、Ｙｅｓ）と判定した場合ソースコード解析部１０は、当該ノードを問題箇所リストに追加する（Ｓ１０６）。
【００４４】
次にソースコード解析部１０は、情報付加構文木中の全てのノードを処理したか否かを判定する（Ｓ１０７）。情報付加構文木中の全てのノードを処理していない（Ｓ１０７、Ｎｏ）と判定した場合ソースコード解析部１０は、当該ノードを処理済みとし、他の未処理のノードに移行（Ｓ１０９）した後、ステップＳ１０３に戻る。一方、情報付加構文木中の全てのノードを処理した（Ｓ１０７、Ｙｅｓ）と判定した場合ソースコード解析部１０は、問題箇所リストを出力する（Ｓ１０８）。その後ソースコード解析部１０は、ソースコード解析処理を終了する。以上でソースコード解析処理の説明を終了する。
【００４５】
[２．２．判定プログラム生成処理]
次に、図２に示した判定プログラム生成処理（Ｓ２０）の内容について説明する。図７Ａは、判定プログラム生成処理（Ｓ２０）の一例を示したフローチャートである。
【００４６】
判定プログラム生成処理において、判定プログラム生成部２０はステップＳ１０において生成された構文木を読み込む（Ｓ２０１）。次に判定プログラム生成部２０は問題箇所リストから一つの問題箇所を読み込む（Ｓ２０２）。次に、判定プログラム生成部２０は当該問題箇所の変数型判断を行い、変数型宣言を判定プログラムソースコード用ファイルに書き込む（Ｓ２０３）。例として、オリジナルソースコードの一部を図７Ｂに示し、図７ＢのオリジナルソースコードからステップＳ２０３の処理よって判定プログラムソースコード用ファイルに書き込まれるソースコードの例を図７Ｃに示す。
次に判定プログラム生成部２０は構造体・共用体定義文を判定プログラムソースコード用ファイルに書き込む（Ｓ２０４）。構造体・共用体定義文書き込みの一例として、オリジナルソースコードの一部を図７Ｄに示し、図７ＤのオリジナルソースコードからステップＳ２０４の処理よって判定プログラムソースコード用ファイルに書き込まれるソースコードの例を図７Ｅに示す。
なお、オリジナルソースコードに共用体、構造体が入っていない場合は、ステップＳ２０４の処理は行わない。
【００４７】
次に判定プログラム生成部２０はポインタチェック条件文（ステートメント）を前記判定プログラムソースコード用ファイルに書き込む（Ｓ２０５）。図８にステップＳ２０４において書き込まれる構造体Ａの例を示し、図９Ａに同じくステップＳ２０４において書き込まれる別の構造体Ｂの例を示す。ポインタチェック条件文の目的は、構造体・共用体ポインタキャストの場合、もし同じアドレスのメンバが両方ポインタなら、そのメンバが指すアドレスもチェックすることにある。上記目的のために、キャスト元のポインタメンバアドレスリストを利用して、キャスト先を処理するときにアドレス確認可能である。
【００４８】
例えば、図８、図９Ａに示した構造体Ａから構造体Ｂにキャストする場合、b.b1を処理するとき、a.a1はポインタではないので、b->b1はテストしない。b.b2を処理するとき、a.a2はポインタなので、b->b1もテストする。
図９Ｂに、図８及び図９Ａの構造体についての、ポインタチェック条件文の例を疑似コードで示す。
【００４９】
次に判定プログラム生成部２０はステップＳ２０１において読み込んだ問題箇所を示す情報の一形態であるファイル名・行番号の出力文（ステートメント）を、前記判定プログラムソースコード用ファイルに書き込む（Ｓ２０６）。
上記ファイル名・行番号の出力文の例を示すと
41:printf("example.c@24:10|\n");
である。なお、「問題箇所を示す情報」はファイル名・行番号以外であっても、通常の技術者がオリジナルソースコード内の問題箇所を特定できる情報であればどのようなものでもよい（例えば、ノード番号）。
【００５０】
次に判定プログラム生成部２０はステップＳ２０４において生成した構造体・共用体の各メンバに代入するための値であって、エンディアン問題の発生を確認できる値を生成する（Ｓ２０７）。この値は、テストデータの各バイトが異なる値となるように決定、若しくは選択される。全てのバイトが異なる値なら、エンディアン問題が発生するとき、ビッグエンディアン環境下の値とリトルエンディアン環境下の値とが偶然に同じになる可能性はない。上記値の生成方法は、当該値のそれぞれのバイトを01,02,03,...のような順番で生成する方法が考えられる。例えば、前述の図８、図９Ａの構造体Ａ、構造体Ｂについて各メンバの値を定めるとすれば、
a.a1 = 0x01020304;
a.a2 = malloc(...);
a->a2 = 0x05060708;
と判定プログラム生成部２０が判定用プログラムソースコード用ファイルに出力する。
【００５１】
このような値を用いた場合、b->b2をテストするとき、ビッグエンディアン環境での結果は「0x0506」となり、リトルエンディアン環境での結果は「0x0708」となり、問題箇所においてエンディアン問題が発生したことを知ることができる。
【００５２】
次に判定プログラム生成部２０はステップＳ２０４において生成した構造体・共用体の各メンバにステップＳ２０７で生成した値を代入するステートメント（設定文）を生成し、前記判定プログラムソースコード用ファイルに書き込む（Ｓ２０８）。
【００５３】
次に判定プログラム生成部２０はテスト値の計算文（ステートメント）を前記判定プログラムソースコード用ファイルに書き込む（Ｓ２０９）。この計算文は、対象の変数のアドレスを計算する文である。図８、図９Ａに示した例では、テスト値の対象となるのは、構造体Ｂのｂ１とｂ２が指す値である。
【００５４】
次に判定プログラム生成部２０はテスト値の出力文を前記判定プログラムソースコード用ファイルに書き込む（Ｓ２１０）。なお、ステップＳ２０６の問題箇所を示すファイル名・行番号の出力文は、テスト値の出力文と同一のステートメントに含まれていてもよい。
【００５５】
次に判定プログラム生成部２０は、問題箇所リスト中の全ての問題箇所を読み込んだか否かを判定する（Ｓ２１１）。問題箇所リスト中の全ての問題箇所を読み込んでいないと判定した場合（Ｓ２１１、Ｎｏ）、判定プログラム生成部２０は直近のステップＳ２０２で読み込んだ問題箇所を処理済みとし、他の未処理の問題箇所に移行（Ｓ２１２）した後、ステップＳ２０２に戻り判定プログラム生成処理を続行する。一方、問題箇所リスト中の全ての問題箇所を読み込んだと判定した場合（Ｓ２１１、Ｙｅｓ）、判定プログラム生成部２０は、判定プログラム用ソースコードファイルを出力して、判定プログラム生成部２０は判定プログラム生成処理を終了する。以上で判定プログラム生成処理の説明を終了する。
【００５６】
［２．３．判定プログラム実行処理］
次に、図２に示した判定プログラム実行処理（Ｓ３０）の内容について説明する。判定プログラム実行処理において、第1判定プログラム実行部３０は第１のエンディアン環境下で判定プログラム（ソースコード）をコンパイルし、実行し、第１実行結果を出力し、一方第２判定プログラム実行部４０が第２のエンディアン環境下で第1判定プログラム実行部３０がコンパイル、実行するものと同一の判定プログラムをコンパイルし、実行し、第２実行結果を出力する。
【００５７】
［２．４．結果出力処理］
次に、図２において述べた結果出力処理（Ｓ４０）の内容について説明する。図１０は、結果出力処理（Ｓ４０）の一例を示したフローチャートである。
【００５８】
結果出力処理において、結果出力部５０は第１実行結果及び第２実行結果の２対応する１行をそれぞれ読み込む（Ｓ３０１）。次に結果出力部５０はステップＳ３０１で読み込んだ２つの行の内容が異なるか否かを判定する（Ｓ３０２）。ステップＳ３０２において２つの行の内容が異ならないと判定した場合（Ｓ３０２、Ｎｏ）、結果出力部５０は２つの実行結果における次の未処理の行に移行し（Ｓ３０５）、その後ステップＳ３０１に戻り結果出力処理を継続する。
【００５９】
一方、ステップＳ３０２において２つの行の内容が異なると判定した場合（Ｓ３０２、Ｙｅｓ）、結果出力部５０は第１実行結果及び第２実行結果が異なることを示す情報、例えばそれぞれの実行結果中の異なる部分（オリジナルソースコード名、及びオリジナルソースコード中の行番号、カラム番号など）を結果出力用ファイルに書き込む（Ｓ３０３）。
【００６０】
ステップＳ３０３の次に、結果出力部５０は第１実行結果及び第２実行結果の全ての行を読み込んだか否かを判定する（Ｓ３０４）。ステップＳ３０４において全ての行を読み込んでいないと判定した場合（Ｓ３０４、Ｎｏ）、結果出力部５０はステップＳ３０５に移行し結果出力処理を続行する。一方、ステップＳ３０４において全ての行を読み込んでいないと判定した場合（Ｓ３０４、Ｎｏ）、結果出力部５０は結果出力用ファイルを出力し、結果出力処理を終了する。以上で判定プログラム生成処理の説明を終了する。
【００６１】
（実施例）
本装置１の実施例を述べる。図１１は、本装置１に入力されるオリジナルソースコードの一部を示した図である。本装置１は図１１のオリジナルソースコード中の５２行目：「52:     short *b=(short *) &a;」のステートメントがエンディアン問題を発生させる可能性がある箇所、すなわち問題箇所であるとソースコード解析処理（Ｓ１０）により決定する。図１２は、結果出力部５０から出力される、問題箇所を示す情報の一例である。このメッセージから、問題箇所の原因がint型のポインタからshort型のポインタにキャストが行われていることにあり、問題箇所は関数foo()の５２行目、１７カラム以降の部分に存在すること、という情報を読み取れるようになっている。
【００６２】
図１３は、図１２に示すオリジナルソースコードから判定プログラム生成処理によって生成された判定プログラムのソースコードの例である。判定プログラムのソースコードは、値の設定文である第１のステートメント「int a=0x01020304;」、テスト値の計算文である第２のステートメント「short *b=(short *)&a;」、及びテスト値の出力文である第３のステートメント「printf("%08x -cast int *->short*|foo.c@52:17|",*b);」より構成されている。
【００６３】
値の設定文における「0x01020304」は、本装置１、より詳しくは判定プログラム生成部２０が自動的に問題発生が確認できる値として設定した値である（図７Ａ、Ｓ２０７参照）。
【００６４】
また、出力文の内容には、テスト値（*bの値）に加えて、問題の原因を示す情報「cast int *->short*」及び問題箇所を示す情報「|foo.c@52:17|」が結果出力に含まれるように記述されている。
【００６５】
さらに、オリジナルソースコードに時間がかかるステートメント（例えば、図１１中の「51:     int a=bar()」）、条件命令が存在しても、判定プログラムではそのようなステートメントなどは省かれるため、判定プログラムの実行は時間を要しないものとなる。
【００６６】
［３．まとめ、その他］
本実施の形態によれば、
（１）オリジナルソースコードにおいて、エンディアン問題が起こる可能性のある場所を効率的に発見することができ、
（２）発見した場所が本当に問題となるのかを確認する
ことが可能となる。
【００６７】
以上、本発明の実施の形態を説明したが、本発明はこれらに限定されるものではなく、発明の趣旨を逸脱しない範囲内において、種々の変更、追加、組み合わせ等が可能である。
【符号の説明】
【００６８】
１・・・エンディアン問題検出装置；  １０・・・ソースコード解析部；  ２０・・・判定プログラム生成部；  ３０・・・第１判定プログラム実行部；  ４０・・・第２判定プログラム実行部；  ５０・・・結果出力部
【図１】
2013218574.tif 000003
【図２】
2013218574.tif 000004
【図３】
2013218574.tif 000005
【図４】
2013218574.tif 000006
【図５】
2013218574.tif 000007
【図６】
2013218574.tif 000008
【図７Ａ】
2013218574.tif 000009
【図７Ｂ】
2013218574.tif 000010
【図７Ｃ】
2013218574.tif 000011
【図７Ｄ】
2013218574.tif 000012
【図７Ｅ】
2013218574.tif 000013
【図８】
2013218574.tif 000014
【図９Ａ】
2013218574.tif 000015
【図９Ｂ】
2013218574.tif 000016
【図１０】
2013218574.tif 000017
【図１１】
2013218574.tif 000018
【図１２】
2013218574.tif 000019
【図１３】
2013218574.tif 000020
【図１４】
2013218574.tif 000021
【図１５】
2013218574.tif 000022
【図１６】
2013218574.tif 000023