JP2012018641A - ソフトウェア開発システム - Google Patents
ソフトウェア開発システム Download PDFInfo
- Publication number
- JP2012018641A JP2012018641A JP2010157211A JP2010157211A JP2012018641A JP 2012018641 A JP2012018641 A JP 2012018641A JP 2010157211 A JP2010157211 A JP 2010157211A JP 2010157211 A JP2010157211 A JP 2010157211A JP 2012018641 A JP2012018641 A JP 2012018641A
- Authority
- JP
- Japan
- Prior art keywords
- instruction
- software development
- access
- model
- development system
- 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
Links
Images
Landscapes
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
【課題】ソフトウェアに含まれるエンディアン依存箇所を検出すること。
【解決手段】実行プログラムを模擬実行するCPUモデルおよび前記CPUモデルのワークエリアとしてのメモリモデルを備える命令セットシミュレータと、前記実行プログラムが含む前記メモリモデルに対するアクセス命令の実行を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出したとき、検出時の実行箇所をエンディアン依存箇所として通知するチェッカと、を備える。
【選択図】図3
【解決手段】実行プログラムを模擬実行するCPUモデルおよび前記CPUモデルのワークエリアとしてのメモリモデルを備える命令セットシミュレータと、前記実行プログラムが含む前記メモリモデルに対するアクセス命令の実行を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出したとき、検出時の実行箇所をエンディアン依存箇所として通知するチェッカと、を備える。
【選択図】図3
Description
本発明の実施形態は、ソフトウェア開発システムに関する。
従来、あるプロセッサ向けに開発されたソフトウェアを、そのプロセッサとは異なるエンディアン方式の別のプロセッサに移植する場合、ソフトウェアにエンディアン依存コードが含まれているとき、該エンディアン依存コードを修正する必要が生じる。
本発明は、ソフトウェアに含まれるエンディアン依存箇所を検出するソフトウェア開発システムを提供することを目的とする。
本願発明の一態様によれば、実行プログラムを模擬実行するCPUモデルおよび前記CPUモデルのワークエリアとしてのメモリモデルを備える命令セットシミュレータと、前記実行プログラムが含む前記メモリモデルに対するアクセス命令の実行を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出したとき、検出時の実行箇所をエンディアン依存箇所として通知するチェッカと、を備えることを特徴とするソフトウェア開発システムが提供される。
以下に添付図面を参照して、本発明の実施の形態にかかるソフトウェア開発システムを詳細に説明する。なお、これらの実施の形態により本発明が限定されるものではない。
(第1の実施の形態)
図1は、本発明の第1の実施の形態にかかるソフトウェア開発システムのハードウェア構成例を示すブロック図である。
図1は、本発明の第1の実施の形態にかかるソフトウェア開発システムのハードウェア構成例を示すブロック図である。
図示するように、ソフトウェア開発システム100は、CPU(Central Processing Unit)1、RAM(Random Access Memory)2、ROM(Read Only Memory)3、入力装置4および表示装置5を備えるコンピュータ構成となっている。CPU1、RAM2、ROM3、入力装置4および表示装置5は、バスラインを介して夫々接続されている。
表示装置5は、液晶モニタなどの表示装置であり、CPU1からの指示に基づいて、操作画面などのユーザに対する出力情報を表示する。入力装置4は、マウスやキーボードを備えて構成され、ユーザからのソフトウェア開発システム100の操作が入力される。入力装置4へ入力された操作情報は、CPU1へ送られる。
ROM3は、特定のエンディアン方式のプロセッサを実行対象として開発されたソフトウェア(コンパイル済みの実行プログラム)である開発対象プログラム32と、開発対象プログラム32からエンディアン依存箇所を検出するためのコンピュータプログラムであるソフトウェア開発プログラム31と、が格納されている。
エンディアンとはメモリ上に複数バイトのデータを配置する方式であり、現在のほとんどのプロセッサはビッグエンディアンとリトルエンディアンのどちらかの方式をとっている。ソフトウェアがメモリ上のデータにアクセスする場合、データの先頭アドレスとアクセス単位(データ長)とを指定してメモリにアクセスを行う。ここで、メモリ上の同一箇所に対するアクセス単位が常に同じであれば、プロセッサのエンディアン方式に関係なくソフトウェアは正しく動作する。しかし、メモリ上の同一箇所に異なるアクセス単位でアクセスをしている場合、プロセッサのエンディアン方式が変わると誤動作する可能性がある。
図2は、開発対象プログラム32の例を説明する図である。このプログラムは、1ワードが4バイト(32ビット)で、ビッグエンディアン方式のプロセッサをターゲットとしたものである。図示するプログラムによれば、(1)の行において、ポインタ“arg”が指すワード(unsigned int)単位の領域にバイト(unsigned char)単位のデータ“tmp[0]”、“tmp[1]”、“tmp[2]”および“tmp[3]”を夫々書き込み位置をずらして書き込む。そして、(2)の行において、ポインタ“arg”が指すアドレスから2バイト目を読み出す。このプログラムは、ビッグエンディアンでは、(1)の行において“0x22”がポインタ“arg”が指すアドレスから2バイト目に書き込まれるため、(2)の行において“0x22”が読み出され、正しく動作するが、リトルエンディアンでは、(1)の行の実行時に“arg”が指すアドレスから2バイト目に“0x33”が書き込まれるため、正しく動作しない。
ソフトウェア開発プログラム31は、開発対象プログラム32を仮想的に実行(シミュレーション)するとともにメモリに対するアクセス命令の実行を監視し、上述の(1)および(2)によるメモリアクセスのように、メモリ上の同一の位置に対する異なるアクセス単位のアクセスが行われたとき、該位置にアクセスしたときに実行した命令(マシン語)をエンディアン依存箇所として検出する。
CPU1は、ユーザによる入力装置4からの指示入力に従って、CPU1がROM3内からソフトウェア開発プログラム31を読み出してRAM2内のプログラム格納領域に展開して実行することにより、次に説明するエンディアン依存箇所を検出するための各種機能を実現する。
図3は、ソフトウェア開発システム100の機能構成を説明するブロック図である。図示するように、ソフトウェア開発システム100は、ターゲットプロセッサの命令セットアーキテクチャを模擬する命令セットシミュレータ(Instruction Set Simulator;ISS)21と、ISS21により実行された命令がターゲットプロセッサのエンディアンに依存している命令コードであることを検出するチェッカ24と、を備えている。
ISS21は、開発対象プログラム32のターゲットプロセッサの挙動を模擬するCPUモデル22と、該ターゲットプロセッサが使用するメインメモリを模擬するメモリモデル23とをさらに備えている。シミュレーション時には、開発対象プログラム32がメモリモデル23内にロードされる。そして、CPUモデル22は、メモリモデル23内にワークエリアを確保して、メモリモデル23にロードされた開発対象プログラム32を実行する。
なお、第1の実施の形態では、CPUモデル22のターゲットプロセッサのエンディアン方式は開発対象プログラム32のターゲットプロセッサのエンディアン方式と等しいものが用いられる。
チェッカ24は、CPUモデル22が実行する命令を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出する。より詳しくは、チェッカ24は、メモリモデル23に対する書き込みを行う命令(メモリ書き込み命令)を実行したとき、書き込みのアクセス範囲(領域)をアクセス履歴テーブル25に登録する。そして、チェッカ24は、メモリモデル23に対する読み出しを行う命令(メモリ読み出し命令)を実行したとき、アクセス履歴テーブル25を検索して、読み出しアクセス対象のアクセス範囲がアクセス履歴テーブル25に登録されているアクセス範囲と同一のアクセス範囲であるか否かを判定する。チェッカ24は、アクセス範囲が異なるとき、実行した命令をエンディアン依存箇所として通知する。ここでは、チェッカ24は、エンディアン依存箇所をファイルや表示装置5などにレポート出力することとする。
図4は、アクセス履歴テーブル25のデータ構造例を説明する図である。図示するように、書き込み毎に書き込みアクセス先の領域の先頭アドレスと末尾アドレスとが記録されている。
開発対象プログラム32が含むローカル変数は、プログラムの実行位置がそのスコープから抜ければ無効になるため、アクセス履歴テーブル25からそのローカル変数に割り当てられたアドレスを削除する必要がある。チェッカ24は、CPUモデル22がスタックをポップする命令を実行したとき、ポップされたアドレスを含むエントリをアクセス履歴テーブル25から削除する。
なお、CPUモデル22は、実行対象の命令をCPUモデル22が含む命令レジスタに逐次取り込んで、命令レジスタに格納されている命令を実行する。したがって、チェッカ24は、命令レジスタの中身を監視することによって命令の実行を監視するようにするとよい。また、プログラムカウンタが指すアドレスを監視することによって命令の実行を監視することもできる。また、スタックがポップされるとき、CPUモデル22が含むスタックポインタの操作が実行される。チェッカ24は、命令レジスタの中身やプログラムカウンタが指すアドレスを監視する以外に、スタックポインタを監視することによって、ポップする命令が実行されたことを検知することもができる。
図5は、ソフトウェア開発システム100の動作を説明するフローチャートである。なお、開発対象プログラム32の例として図2に示したプログラムをコンパイルしたものを用いて説明する。ISS21および開発対象プログラム32のターゲットプロセッサはビッグエンディアン方式とする。また、開発対象プログラム32のターゲットプロセッサは、1ワードは4バイト(32ビット)であるものとし、ワード単位とバイト単位のロード・ストア命令をもつものとしている。例えば、コンパイラは、図2の(1)の行からワード単位のストア命令を生成し、図1の(2)の行からは、8ビット同士の代入であるからバイト単位のロード、ストア命令を生成する。また、ターゲットプロセッサは、アドレスが低位な方に向かってスタックを積み上げるものとする。そして、チェッカ24はスタックポインタを監視し、スタックポインタの値の増加によってポップの実行を検知するものとする。
開発対象プログラム32のシミュレーションがスタートすると、CPUモデル22は、メモリモデル23にロードされている開発対象プログラム32が含む命令を順次実行する。図5に示すように、CPUモデル22が命令を1つフェッチして実行すると(ステップS1)、チェッカ24は、実行した命令がメモリ書き込み命令であるか否かを判定する(ステップS2)。メモリ書き込み命令には、ストア命令のほかに、プッシュ命令がある。実行した命令がメモリ書き込み命令であった場合(ステップS2、Yes)、チェッカ24は、書き込み先が既にアクセス履歴テーブル25に登録済みであるか否かをさらに判定する(ステップS3)。アクセス履歴テーブル25に未登録であった場合(ステップS3、No)、チェッカ24は書き込み先のアクセス範囲をアクセス履歴テーブル25に登録し(ステップS4)、ステップS1に移行する。アクセス先がアクセス履歴テーブル25に登録済みであった場合(ステップS3、Yes)、ステップS4をスキップしてステップS1に移行する。
CPUモデル22は図2のプログラムの(1)の行が実行箇所となったとき、ワード単位のストア命令を実行する。このとき(1)の行のポインタ“arg”はメモリモデル23上のアドレス“0x1000”に割り当てられていたとする。ここでのストア命令によるアクセスは“0x1000”に対するワード書き込みアクセスであり、アクセス範囲は“0x1000”〜“0x1003”となる。チェッカ24は、ステップS4において、先頭アドレスを“0x1000”とし、末尾アドレスを“0x1003”としたエントリをアクセス履歴テーブル25に登録する。なお1バイトの書き込みアクセスであれば先頭アドレスと末尾アドレスとは同一アドレスとなる。
ステップS2において、実行した命令がメモリ書き込み命令ではなかった場合(ステップS2、No)、チェッカ24は、実行した命令がメモリ読み出し命令であったか否かを判定する(ステップS5)。メモリ読み出し命令には、ストア命令のほかに、ポップ命令がある。実行した命令がメモリ読み出し命令であった場合(ステップS5、Yes)、チェッカ24は、アクセス先が既にアクセス履歴テーブル25に登録済みであるか否かをさらに判定する(ステップS6)。読み出し先がアクセス履歴テーブル25に登録済みであった場合(ステップS6、Yes)、チェッカ24は、読み出し先のアクセス範囲がアクセス履歴テーブル25に登録されているエントリと一致するか否かをさらに判定する(ステップS7)。読み出し先のアクセス範囲がアクセス履歴テーブル25に登録されているエントリと一致していなかった場合(ステップS7、No)、チェッカ24は、実行した命令をエンディアン依存箇所としてレポート出力する(ステップS8)。
CPUモデル22は図2のプログラムの(2)の行が実行箇所となったとき、バイト単位のロード命令を実行する。このとき“tmp”は“arg”と同じ“0x1000”を指し、“tmp[1]”は“0x1001”に格納されている値を示すため、“0x1001”へのバイト単位のロード命令となる。すると、(1)の行の実行時に登録した“0x1000”〜“0x1003”と今回のアクセス先“0x1001”は重複するため、チェッカ24はステップS6において読み出し先“0x1001”は登録済みと判定する。そして、読み出し先のアクセス範囲が“0x1001”であり、登録されているアクセス範囲が“0x1000”〜“0x1003”であるので、チェッカ24はステップS7においてアクセス範囲が一致しないと判定し、ステップS8において、開発対象プログラム32における(2)の行が実行箇所となったときに実行したロード命令をエンディアン依存箇所としてレポート出力する。
ステップS5において、実行した命令がメモリ読み出し命令ではなかった場合(ステップS5、No)、チェッカ24は、スタックポインタの値が増加したか否かを判定する(ステップS9)。なお、ステップS6において読み出し先が未登録であった場合(ステップS6、No)や、ステップS7において読み出し先のアクセス範囲が登録されているエントリと一致した場合(ステップS7、Yes)や、ステップS8の後、ステップS9に移行する。
スタックポインタの値が増加した場合(ステップS9、Yes)、チェッカ24は、アクセス履歴テーブル25からポップされたアドレスに対応するエントリを削除し(ステップS10)、ステップS1へ移行する。スタックポインタの値が増加していない場合(ステップS9、No)、ステップS10をスキップしてステップS1へ移行する。
なお、ここでは、図2の開発対象プログラム32によって、先にワード単位の書き込みが行われ、後にバイト単位の読み出しが行われたとき、エンディアン依存箇所として検出するようにしたが、先にバイト単位の書き込みが行われ、後にワード単位の読み出しが行われる場合でも同様の手順でエンディアン依存箇所として検出する。また、アクセス単位は、ワード単位とバイト単位とだけに限定されない。
また、オペコード内の即値はCPUモデル22内のレジスタに直接格納されるため、エンディアンに依存しない。値が利用されるときはストア命令によりメモリモデル23へ転送されるため、エンディアン依存コードであれば上述の手順で検出できる。即値を使う命令へ変換される初期値つきローカル変数を利用したエンディアン依存コードは上述の手順で検出できる。
また、第1の実施の形態では、開発対象プログラム32とCPUモデル22のエンディアン方式を同一のものとしているので、開発対象プログラム32を最後まで実行することができるため、チェッカ24は開発対象プログラム32の実行パス上の全てのエンディアン依存箇所を出力することができる。ユーザは、レポート出力された箇所を修正することによって、別のエンディアン(ここではリトルエンディアン)方式のプロセッサをターゲットとしたプログラムに移植することができる。
なお、近年、コンパイラやアセンブラなどを用いてプログラムを静的に解析し、エンディアン依存箇所を検出するツールがある。このようなツールによると、コンパイラやアセンブラはファイル単位で解析を行うため、例えば図2の開発対象プログラム32が含む“funcO”が“main()”と別のファイルにある場合、“funcO”内のコードがエンディアン依存であることを検出することは困難である。本第1の実施の形態では、シミュレーションにより開発対象プログラム32を動的に解析するので、開発対象プログラム32が複数のファイルに分割されている場合であってもエンディアン依存箇所を検出することができる。
なお、本第1の実施の形態のソフトウェア開発システム100で実行されるソフトウェア開発プログラム31を、インターネット等のネットワークに接続されたコンピュータ上に格納し、ネットワーク経由でダウンロードさせることにより提供または配布するように構成しても良い。また、ソフトウェア開発プログラム31を、ROM3等に予め組み込んで提供するように構成してもよい。また、ソフトウェア開発プログラム31を、CD−ROMや外付けのメモリデバイスなどに格納して提供するようにしてもよい。
以上述べたように、本発明の第1の実施の形態によれば、開発対象プログラム32を模擬実行するCPUモデル22およびCPUモデル22のワークエリアとしてのメモリモデル23を備えるISS21と、開発対象プログラム32が含むメモリモデル23に対するアクセス命令(メモリ書き込み命令、メモリ読み出し命令)の実行を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出したとき、検出時の実行箇所をエンディアン依存箇所として通知するチェッカ24と、を備えるように構成したので、開発対象プログラム32が含むエンディアン依存箇所を検出することができるようになる。
また、チェッカ24は、メモリモデル23に対するメモリ書き込み命令毎の書き込み領域を記録するアクセス履歴テーブル25を更新管理し、アクセス履歴テーブル25に基づいて同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出する。そして、チェッカ24は、CPUモデル22によるスタックポインタの操作を監視し、スタックのポップを検出したとき、アクセス履歴テーブル25からポップされた書き込み領域を削除する、ように構成したので、ポップが行われる毎にポップされた箇所にプッシュされていたデータに関するアクセス履歴を消去できるので、スタック領域に対するメモリアクセスにかかるエンディアン依存箇所を検出できるようになる。
(第2の実施の形態)
第1の実施の形態では、開発対象プログラムとCPUモデルとが同一のエンディアン方式である場合について述べた。第2の実施の形態では、開発対象プログラムとCPUモデルとがエンディアン方式が異なる場合について述べる。なお、第2の実施の形態のソフトウェア開発システムのハードウェア構成は第1の実施の形態と等しいので、ハードウェア構成に関する説明を省略する。なお、第2の実施の形態のソフトウェア開発システムに符号200を付して第1の実施の形態と区別する。
第1の実施の形態では、開発対象プログラムとCPUモデルとが同一のエンディアン方式である場合について述べた。第2の実施の形態では、開発対象プログラムとCPUモデルとがエンディアン方式が異なる場合について述べる。なお、第2の実施の形態のソフトウェア開発システムのハードウェア構成は第1の実施の形態と等しいので、ハードウェア構成に関する説明を省略する。なお、第2の実施の形態のソフトウェア開発システムに符号200を付して第1の実施の形態と区別する。
図6は、第2の実施の形態のソフトウェア開発システム200の機能構成を説明する図である。第1の実施の形態と等しい機能部には同一の符号を付し、詳細な説明を省略する。
図6に示すように、ソフトウェア開発システム200は、CPUモデル22およびメモリモデル23を有するISS21と、アクセス履歴テーブル25を有するチェッカ24と、バイト入れ替え部26と、を備えている。
バイト入れ替え部26は、CPUモデル22が実行する夫々の命令のバイト入れ替えを行う。また、バイト入れ替え部26は、ワード単位のアクセスなどマルチバイトアクセス(マルチバイト書き込みおよびマルチバイト読み出し)を行う際、アクセスデータのバイト入れ替え(言い換えると、アクセス先のバイト入れ替え)を実行する。
なお、I/OやDMAC(Direct Memory Access Controller)など、CPU以外のハードウェア・リソースがメモリ上にリトルエンディアンのデータを配置した場合、バイト入れ替えを行うと誤動作してしまう。しかしCPUはそのデータのバイト並びがどのエンディアン方式なのか知る手段がない。このような状況を回避するため、第2の実施の形態では、バイト入れ替え禁止領域をあらかじめ外部から与えられるものとする。バイト入れ替え部26は、バイト入れ替え禁止領域を記憶するバイト入れ替え禁止領域保存部27を備えている。
図7は、ソフトウェア開発システム200の動作を説明するフローチャートである。図示するように、CPUモデル22が命令を1つフェッチすると(ステップS21)、バイト入れ替え部26は、CPUモデル22がフェッチした命令をバイト入れ替えする(ステップS22)。そして、バイト入れ替え部26は、フェッチした命令がマルチバイトアクセス命令であるか否かを判定する(ステップS23)。
命令がマルチバイトアクセス命令ではなかった場合(ステップS23、No)、CPUモデル22は、命令を実行する(ステップS24)。命令がマルチバイトアクセス命令であった場合(ステップS23、Yes)、バイト入れ替え部26は、アクセス先がバイト入れ替え禁止領域であるか否かをさらに判定する(ステップS25)。アクセス先がバイト入れ替え禁止領域である場合(ステップS25、Yes)、ステップS24に移行する。アクセス先がバイト入れ替え禁止領域ではない場合(ステップS25、No)、バイト入れ替え部26はアクセス先のバイト入れ替えを行い、CPU21は命令を実行し、バイト入れ替えされたアクセス先にアクセスする(ステップS26)。
ステップS24の後およびステップS26の後、チェッカ24は、実行した命令がメモリ書き込み命令であるか否かを判定する(ステップS27)。実行した命令がメモリ書き込み命令であった場合(ステップS27、Yes)、チェッカ24は、書き込み先が既にアクセス履歴テーブル25に登録済みであるか否かをさらに判定する(ステップS28)。アクセス履歴テーブル25に未登録であった場合(ステップS28、No)、チェッカ24は書き込み先のアクセス範囲をアクセス履歴テーブル25に登録し(ステップS29)、ステップS21に移行する。アクセス先がアクセス履歴テーブル25に登録済みであった場合(ステップS28、Yes)、ステップS29をスキップしてステップS21に移行する。
ステップS27において、実行した命令がメモリ書き込み命令ではなかった場合(ステップS27、No)、チェッカ24は、実行した命令がメモリ読み出し命令であったか否かを判定する(ステップS30)。実行した命令がメモリ読み出し命令であった場合(ステップS30、Yes)、チェッカ24は、アクセス先が既にアクセス履歴テーブル25に登録済みであるか否かをさらに判定する(ステップS31)。読み出し先がアクセス履歴テーブル25に登録済みであった場合(ステップS31、Yes)、チェッカ24は、読み出し先のアクセス範囲がアクセス履歴テーブル25に登録されているエントリと一致するか否かをさらに判定する(ステップS32)。読み出し先のアクセス範囲がアクセス履歴テーブル25に登録されているエントリと一致していなかった場合(ステップS32、No)、チェッカ24は、実行した命令をエンディアン依存箇所としてレポート出力する(ステップS33)。
ステップS30において、実行した命令がメモリ読み出し命令ではなかった場合(ステップS30、No)、チェッカ24は、スタックポインタの値が増加したか否かを判定する(ステップS34)。なお、ステップS31において読み出し先が未登録であった場合(ステップS30、No)や、ステップS32において読み出し先のアクセス範囲が登録されているエントリと一致した場合(ステップS32、Yes)や、ステップS33においてメモリ読み出し命令をエンディアン依存箇所としてレポート出力した後にも、ステップS34に移行する。
スタックポインタの値が増加した場合(ステップS34、Yes)、チェッカ24は、アクセス履歴テーブル25からポップされたアドレスに対応するエントリを削除し(ステップS35)、ステップS21へ移行する。スタックポインタの値が増加していない場合(ステップS34、No)、ステップS35をスキップしてステップS21へ移行する。
なお、バイト入れ替え部26によるバイト入れ替え機能を有効にするかどうかは、シミュレーション前にユーザからの指定により選択されるようにしてもよい。
以上述べたように、本発明の第2の実施の形態によれば、開発対象プログラム32が含む命令に対してバイト入れ替えを行ってCPUモデル22に実行させるとともに、CPUモデル22が実行する命令がマルチバイトのアクセス命令であるとき、マルチバイトのアクセス命令の実行時にアクセス先のバイト入れ替えを行うバイト入れ替え部26をさらに備えるように構成したので、開発対象プログラム32を作成するためのコンパイラとしてCPUモデル22と同一のエンディアン方式のCPUをターゲットCPUとしたコンパイラが入手できない場合や、開発対象プログラム32を作成したコンパイラのターゲットCPUと同一のエンディアン方式のCPUモデル22を入手できない場合であっても、開発対象プログラム32を最後までシミュレーションでき、開発対象プログラム32が含むエンディアン依存箇所を検出することができるようになる。
また、メモリモデル23にバイト入れ替え禁止領域を設定することができるので、CPU以外のハードウェア・リソースからのメモリ書き込みがある場合であっても開発対象プログラム32を意図した通りにシミュレートすることができる。
なお、CPU以外のハードウェア・リソースからの書き込みデータについては特に言及しなかったが、書き込みデータをユーザが初期値として与えるようにしてよい。この場合、ユーザは、メモリモデル23におけるバイト入れ替え禁止領域に初期値をロードしておくことになる。
また、CPU以外のハードウェア・リソースの動作を模擬するモデルを追加し、ユーザがこれらのリソースからの書き込みデータを初期値として用意することなく動作させることができるようにしてもよい。図8は、該ハードウェア・リソースの動作を模擬するモデルが追加された場合のソフトウェア開発システム200の機能構成を説明する図である。図示するように、拡張インタフェース(I/F)モデル28は、CPU以外に使用されるハードウェア・リソースの動作を模擬する。拡張インタフェースモデル28は、CPUモデル22と協調して動作し、バイト入れ替え禁止領域に適宜アクセスを行う。
また、第2の実施の形態によれば、フェッチするときにターゲットのエンディアン方式に合わせてフェッチするため、第1の実施の形態と同じく即値を問題なく扱うことができる。
(第3の実施の形態)
図9は、開発対象プログラムの別の例を説明する図である。図示するように、(3)の行においてstatic変数の初期値が設定されている。そして、“main()”により呼び出されて使用される“funcO”が含む(4)の行において、前記初期値の先頭から2バイト目の読み出しが行われている。
図9は、開発対象プログラムの別の例を説明する図である。図示するように、(3)の行においてstatic変数の初期値が設定されている。そして、“main()”により呼び出されて使用される“funcO”が含む(4)の行において、前記初期値の先頭から2バイト目の読み出しが行われている。
上記のような初期値は、“.word”命令などのアセンブラに対する擬似命令によりメモリに設定される。つまり、コンパイラは、このような数値をストア命令によってメモリへ転送させるのではなく、メモリの初期値として最初から変数がマップされているアドレスにデータが配置されているものとしてバイナリコードを作成する。したがって、シンボル情報を含まないバイナリコードとなっている開発対象プログラムを見るだけでは、そのビット列がデータなのかコードなのか区別できない。また、データと認識できてもデータ長を特定することができない。
第3の実施の形態では、このようにメモリに設定される初期値(メモリ初期値データ)に関し、アクセス履歴テーブルと同じ形式でメモリ初期値データに関する情報を入力できるようにした。
第3の実施の形態のソフトウェア開発システムのハードウェア構成は第1の実施の形態と等しいので、ハードウェア構成に関する説明を省略する。なお、第3の実施の形態のソフトウェア開発システムに符号300を付して第1の実施の形態と区別する。
図10は、第3の実施の形態のソフトウェア開発システム300の機能構成を説明する図である。第1の実施の形態と等しい機能部には同一の符号を付し、詳細な説明を省略する。図示するように、ソフトウェア開発システム300は、CPUモデル22およびメモリモデル23を有するISS21と、アクセス履歴テーブル25を有するチェッカ24と、テーブル入力受付部29と、を備えている。
ユーザは、メモリ初期値データに関するアクセス履歴テーブルを予め作成しておく。例えば、ユーザは、初期値がコンパイラやリンカを通してメモリに設定される過程でそれらのツールにデータ長や配置されたアドレスを出力させるようにし、出力されたデータ長およびアドレスを用いてメモリ初期値データに関するアクセス履歴テーブルを作成するとよい。ユーザは、開発対象プログラム32のシミュレーションを開始する前に、入力装置4を操作して外部記憶装置(図示せず)などから前記作成したアクセス履歴テーブルを入力する。
テーブル入力受付部29は、アクセス履歴テーブルの入力を受け付けて、入力されたアクセス履歴テーブルをチェッカ24に登録する。
このように、第3の実施の形態によれば、擬似命令によりバイナリコードに埋め込まれる初期値に関するアクセス履歴テーブルを登録できるようにしたので、メモリ初期値データが存在する場合であっても第1の実施の形態と同様のシミュレーション動作でエンディアン依存箇所を検出できるようになる。
なお、以上の説明においては、第1の実施の形態のソフトウェア開発システムにテーブル入力受付部29を設けた構成として説明しているが、第2の実施の形態のソフトウェア開発システムにテーブル入力受付部29を設けるようにしてもよい。
1 CPU、2 RAM、3 ROM、4 入力装置、5 表示装置、21 ISS、22 CPUモデル、23 メモリモデル、24 チェッカ、25 アクセス履歴テーブル、26 バイト入れ替え部、27 バイト入れ替え禁止領域保存部、28 拡張インタフェースモデル、29 テーブル入力受付部、31 ソフトウェア開発プログラム、32 開発対象プログラム、100、200、300 ソフトウェア開発システム。
Claims (7)
- 実行プログラムを模擬実行するCPUモデルおよび前記CPUモデルのワークエリアとしてのメモリモデルを備える命令セットシミュレータと、
前記実行プログラムが含む前記メモリモデルに対するアクセス命令の実行を監視し、同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出したとき、検出時の実行箇所をエンディアン依存箇所として通知するチェッカと、
を備えることを特徴とするソフトウェア開発システム。 - 前記チェッカは、前記メモリモデルに対するメモリ書き込み命令毎の書き込み領域を記録するアクセス履歴情報を更新管理し、前記アクセス履歴情報に基づいて同一箇所に対する書き込み時のデータ長と読み出し時のデータ長との相異を検出する、
ことを特徴とする請求項1に記載のソフトウェア開発システム。 - 前記チェッカは、前記CPUモデルによるスタックポインタの操作を監視し、ポップ操作を検出したとき、前記アクセス履歴情報から前記ポップされた書き込み領域の記録を削除する、
ことを特徴とする請求項2に記載のソフトウェア開発システム。 - 前記実行プログラムは、アセンブラに対する擬似命令により前記メモリモデルに設定される初期値を含み、
前記初期値に関するアクセス履歴情報の入力を受け付ける情報受け付け部をさらに備える、
ことを特徴とする請求項2に記載のソフトウェア開発システム。 - 前記実行プログラムが含む命令に対してバイト入れ替えを行って前記CPUモデルに実行させるとともに、前記CPUモデルが実行する命令がマルチバイトのアクセス命令であるとき、前記マルチバイトのアクセス命令の実行時にアクセス先のバイト入れ替えを行うバイト入れ替え部をさらに備える、
ことを特徴とする請求項1〜4の何れか一項に記載のソフトウェア開発システム。 - 前記メモリモデルは、前記バイト入れ替え部によるバイト入れ替えを禁止するバイト入れ替え禁止領域が確保されている、
ことを特徴とする請求項5に記載のソフトウェア開発システム。 - 前記バイト入れ替え禁止領域にアクセスする、前記CPUモデルと異なるハードウェアモデルをさらに備える、
ことを特徴とする請求項6に記載のソフトウェア開発システム。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010157211A JP2012018641A (ja) | 2010-07-09 | 2010-07-09 | ソフトウェア開発システム |
US13/070,354 US20120011490A1 (en) | 2010-07-09 | 2011-03-23 | Development system |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
JP2010157211A JP2012018641A (ja) | 2010-07-09 | 2010-07-09 | ソフトウェア開発システム |
Publications (1)
Publication Number | Publication Date |
---|---|
JP2012018641A true JP2012018641A (ja) | 2012-01-26 |
Family
ID=45603828
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
JP2010157211A Pending JP2012018641A (ja) | 2010-07-09 | 2010-07-09 | ソフトウェア開発システム |
Country Status (1)
Country | Link |
---|---|
JP (1) | JP2012018641A (ja) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013114789A1 (en) | 2012-01-31 | 2013-08-08 | Canon Kabushiki Kaisha | Image forming apparatus for forming electrostatic latent image for correction |
JP2020173616A (ja) * | 2019-04-10 | 2020-10-22 | 株式会社沖データ | シミュレーション装置、シミュレーション方法及び情報処理装置 |
-
2010
- 2010-07-09 JP JP2010157211A patent/JP2012018641A/ja active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2013114789A1 (en) | 2012-01-31 | 2013-08-08 | Canon Kabushiki Kaisha | Image forming apparatus for forming electrostatic latent image for correction |
JP2020173616A (ja) * | 2019-04-10 | 2020-10-22 | 株式会社沖データ | シミュレーション装置、シミュレーション方法及び情報処理装置 |
JP7226049B2 (ja) | 2019-04-10 | 2023-02-21 | 沖電気工業株式会社 | シミュレーション装置、シミュレーション方法及び情報処理装置 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US9530006B2 (en) | Method and system for performing a memory safety check of a program written in an unmanaged programming language | |
TWI423040B (zh) | 一種用於藉由一安全性虛擬機器執行一安全政策的方法以及系統 | |
JP6994071B2 (ja) | Protobufベースのプロジェクトのための包括的な検証手法 | |
US20120159461A1 (en) | Program optimizing apparatus, program optimizing method, and program optimizing article of manufacture | |
JP5050019B2 (ja) | ソースコード解析システム | |
EP2615551B1 (en) | Abnormality inspection device, central processing unit, and abnormality inspection method | |
US20120011490A1 (en) | Development system | |
JP6234639B2 (ja) | シミュレーション装置及びシミュレーション方法及びシミュレーションプログラム | |
JP2012018641A (ja) | ソフトウェア開発システム | |
JP5437964B2 (ja) | 解析方法、解析装置及び解析プログラム | |
JP6667733B2 (ja) | シミュレーション装置、シミュレーション方法およびシミュレーションプログラム | |
US8612942B2 (en) | System for debugging computer program | |
JP2009020695A (ja) | 情報処理装置及びシステム | |
JP7050587B2 (ja) | 違反依存検出装置および違反依存検出プログラム | |
US7886133B2 (en) | Information processing apparatus and method for accelerating information processing | |
KR101225577B1 (ko) | 어셈블리 언어 코드의 분석 장치 및 방법 | |
CN113835927B (zh) | 一种指令执行方法、计算设备及存储介质 | |
JP2013218574A (ja) | エンディアン問題検出装置 | |
JP2007041777A (ja) | 言語処理方法 | |
JP2019114117A (ja) | ソフトウエアシミュレータ及びプログラム | |
JP2008107990A (ja) | 情報処理装置、カバレッジ計測方法及びカバレッジ計測プログラム | |
JP2021033567A (ja) | 電子制御装置 | |
JP5263498B2 (ja) | 信号処理プロセッサ及び半導体装置 | |
JP5003557B2 (ja) | 情報処理装置、情報処理方法、及び、情報処理プログラム | |
JP6474055B2 (ja) | 情報処理装置及びその制御方法 |