(57)【要約】【課題】システム移行時にＣＰＵやＯＳのアーキテクチャ変更に伴いプログラムのメモリ配置が変更になる場合、移行前システムでは問題なく動作していたユーザプログラムが移行後システムでは異なる動作をして問題になることがある。ソース修正とテストは人手によるため大きな工数が必要であるが、この課題の対策として、移行後のメモリ配置を移行前と同じメモリ配置にするためのソース変換の仕組みを提供する。【解決手段】移行前のソースを解析し、移行前システムのメモリ割当の条件を元に変数メモリ配置を計算する。次に、移行後のシステムのアーキテクチャに合わせて移行後の変数メモリ配置を計算する。前述の両者の比較を行い、異なっている場合は差分情報を抽出する。差分情報を元に移行前ソースにダミーデータの宣言文の追加を行い、移行後ソースを生成する。【選択図】  図２
2012128752.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより実施する、異なるアーキテクチャ間のシステム移行においてメモリ配置を同じにするソースの変換方法であって、
メモリ配置を解析するステップと、
システム移行前とシステム移行後のアドレスを比較するステップと、
差分情報を出力するステップと、
差分情報を元にソースを変換するステップと、を有する、
ことを特徴とするソース変換方法。
【請求項２】
さらに、前記ソースの変換に必要なアーキテクチャに依存する、任意の開始アドレスの情報を受け付けるステップを有する、
ことを特徴とする請求項１に記載のソース変換方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、アーキテクチャが異なるシステムへの移行において、システム移行前とシステム移行後のプログラム動作が変わらないように自動的にソースを変換する技術に関する。
【背景技術】
【０００２】
従来技術において、システム移行に伴うソースの変換処理に対する仕組みは検討されてきた。アーキテクチャが異なるシステム間の移行においてもメモリ配置についてはＯＳとコンパイラの仕様に依存しており、正しいソースであれば移行後もユーザが意識することなく正しく動作する。
【０００３】
しかし、ソースに不良（バグ）が含まれており、特にバッファオーバーランの不良が存在しているシステムを移行する場合は、アーキテクチャに依存するメモリ配置変更の影響により移行前と移行後で処理結果が異なる場合があり、人手によるソース修正以外に有効な手段がなかった。バッファオーバーランを検出する技術は検討されているが、ソースの不良を修正した結果、移行前と移行後で処理結果が異なることが不可避な場合がある。
【０００４】
そのため、バッファオーバーランの不良を修正することなく、移行前と移行後で同じ処理結果を得られる仕組みが求められている。
【０００５】
なお、下記特許文献１では、バッファオーバーランを検出する考え方を示しているが、メモリ配置を変更するソース変換方法については述べていない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−２５９０７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
システム移行時にＣＰＵやＯＳのアーキテクチャ変更に伴いプログラムのメモリ配置が変更になる場合、移行前システムでは問題なく動作していたユーザプログラムが移行後システムでは異なる動作をして問題になることがある。
【０００８】
異なる動作の例としては、移行前システムに存在していたバッファオーバーランの潜在不良（バグ）が移行前システムでは未使用のメモリを上書きすることにより正常に動作していたが、移行後システムではメモリ配置が異なっており使用中のメモリを破壊するといったことがあげられる。これは配置するメモリの開始アドレスが、２の倍数や８の倍数などシステムによって異なる仕様に起因している。
【０００９】
バッファオーバーランを検出し、該当するソースを修正するのが本来の対策であるが、修正は人手によるため大きな工数が必要であり、さらに修正箇所の影響が広範囲に及ぶ場合はシステムとしての動作が異なることがある。
【００１０】
本発明は、ソースの不良を修正することなく、システム移行前とシステム移行後で同じ処理結果を得られるようにメモリ配置を変更するためのソース変換の仕組みを提供することを目的とする。
【課題を解決するための手段】
【００１１】
移行前のソースを解析し、移行前システムのメモリ割当ての条件を元に変数メモリ配置を計算する。次に、移行後のシステムのアーキテクチャに合わせて移行後の変数メモリ配置を計算する。前述の両者の比較を行い、差分情報を抽出する。差分情報を元に移行前ソースにダミーデータの宣言文の追加を行い、移行後ソースを生成する。
【発明の効果】
【００１２】
本発明によれば、バッファオーバーランなどメモリ破壊の不良の影響を移行前と移行後のシステムで同じにすることが出来る。これにより、ソース修正と確認の工数を要することなく、システム移行および移行後の稼動における問題の発生を抑制できるという効果がある。
【図面の簡単な説明】
【００１３】
【図１】コンピュータ１の全体構成例を示す図である。
【図２】ソース変換プログラム領域１４の構成例を示す図である。
【図３】ソース変換プログラム領域１４が具備する処理のうち、変数メモリ配置解析部１４１の詳細な処理を表すフローチャートである。
【図４】ソース変換プログラム領域１４が具備する処理のうち、移行前・移行後アドレス比較部１４２の詳細な処理を表すフローチャートである。
【図５】ソース変換プログラム領域１４が具備する処理のうち、ソースコード変換部１４３の詳細な処理を表すフローチャートである。
【図６】移行前ソース１４４の例を示すソースである。
【図７】移行前ソース１４４が移行前システムで動作する際のメモリのアドレスの例を示す図である。
【図８】移行前ソース１４４が移行後システムで動作する際のメモリのアドレスの例を示す図である。
【図９】移行前ソース１４４が移行前システムで動作する際のメモリ配置の例を示す図である。
【図１０】移行前ソース１４４が移行後システムで動作する際のメモリ配置の例を示す図である。
【図１１】移行前システムでバッファオーバーランが発生した場合の例を示す図である。
【図１２】移行後システムでバッファオーバーランが発生した場合の例を示す図である。
【図１３】変換後ソース１４８の例を示すソースである。
【図１４】変換後ソース１４８が移行後システムで動作する際のメモリ配置の例を示す図である。
【図１５】変換後ソース１４８が移行後システムで動作する際のメモリ配置とバッファオーバーランが発生した場合の例を示す図である。
【発明を実施するための形態】
【００１４】
以下、本発明の一実施例について、図面を参照して詳細に説明する。
【００１５】
図１は、本実施例に係わるコンピュータ１の全体構成例を示す図である。
【００１６】
コンピュータ１はメモリ１０とＣＰＵ２０から構成される。
【００１７】
メモリ１０はＯＳ領域１１とユーザプログラム１２とユーザデータ領域１３とソース変換プログラム領域１４から構成される。
【００１８】
ユーザプログラム１２は変数などの情報をユーザデータ領域１３に格納しながらＣＰＵ２０により実行される。
【００１９】
図２は、ソース変換プログラム領域１４の構成例を示す図である。
【００２０】
ソース変換プログラム領域１４は変数メモリ配置解析部１４１と移行前・移行後アドレス比較部１４２とソース変換部１４３とシステム情報１４５と移行前・移行後変数メモリ配置情報１４６と差分情報１４７とを具備する。
【００２１】
変数メモリ配置解析部１４１は移行前ソース１４４とシステム情報１４５を読み込み、移行前・移行後変数メモリ配置情報１４６を出力する機能を有する。例では移行前システムの開始アドレスが８の倍数（ｎ１＝８）、移行後システムの開始アドレスが２の倍数（ｎ２＝２）をシステム情報１４５として与える。
【００２２】
移行前・移行後アドレス比較部１４２は移行前・移行後変数メモリ配置情報１４６を読み込み、アドレスを比較した結果を差分情報１４７として出力する機能を有する。
【００２３】
ソース変換部１４３は移行前ソース１４４と差分情報１４７を読み込み、ソース変換を行い、変換後ソース１４８を出力する機能を有する。
【００２４】
図３は、ソース変換プログラム領域１４が具備する処理のうち、変数メモリ配置解析部１４１の詳細な処理を表すフローチャートである。
【００２５】
移行前ソース読込（ステップS１４１１）は移行前ソース１４４を読み込む。メモリ配置シミュレーション（ステップS１４１２）は移行前ソース１４４とシステム情報１４５を元に開始アドレスが８の倍数(ｎ１＝８)である移行前システムのメモリ配置を計算する。図６に示すソースの例では、char型の変数aを２バイト宣言しており、この場合のアドレス割当は図７に示すように開始アドレス３０２が0x10000となり、終了アドレス３０３が0x10001となる。char型の変数ｂは２バイト宣言しており、システムの制約により開始アドレスが８の倍数(ｎ１＝８)になるため、開始アドレス３０２が0x10008となり、終了アドレス３０３が0x10009として割り当てられる。変数メモリ配置情報格納（ステップS１４１３）は前述のアドレス情報を出力する。
【００２６】
次に、メモリ配置シミュレーション（ステップS１４１４）は開始アドレスが２の倍数(ｎ２＝２)である移行後システムのメモリ配置を計算する。図６に示すソースの例では、char型の変数ｂを２バイト宣言しており、システムの制約により開始アドレスが２の倍数(ｎ２＝２)になるため、図８に示すように開始アドレス４０２が0x10002となり、終了アドレス４０３が0x10003として割り当てられる。変数メモリ配置情報格納（ステップS１４１５）は前述のアドレス情報を出力する。
【００２７】
図４は、ソース変換プログラム領域１４が具備する処理のうち、移行前・移行後アドレス比較部１４２の詳細な処理を表すフローチャートである。
【００２８】
比較処理（ステップS１４２１）は移行前・移行後変数メモリ配置情報１４６を元に、移行前システムと移行後システムでアドレスを比較し、一致しているかを判定する（ステップS１４２２）。図７の変数aと図８の変数aの比較では開始アドレス３０２と開始アドレス４０２に差異はないが、変数ｂについては開始アドレス３０２が0x10008に対して開始アドレス４０２が0x10002と異なっているため、一致していないと判定する。
【００２９】
一致していない場合は差分情報蓄積（ステップS１４２３）により差分情報１４７を出力する。一致している場合は差分情報を出力せずに処理を終了する。
【００３０】
図５は、ソース変換プログラム領域１４が具備する処理のうち、ソースコード変換部１４３の詳細な処理を表すフローチャートである。
【００３１】
差分情報読込（ステップS１４３１）にて差分情報１４７を移行前ソース読込（ステップS１４３２）にて移行前ソース１４４を読み込む。
【００３２】
差分情報１４７を元に修正箇所検索（ステップS１４３３）では修正箇所を特定し、ダミー追加処理（ステップS１４３４）にて移行後システムの開始アドレスが８の倍数になるようダミーのメモリ確保宣言文を追加する。最後に、変換後ソース出力 （ステップS１４３５）にて変換したソースを出力する。
【００３３】
図６は、移行前ソース１４４の例を示すソースである。
【００３４】
例では、char型の変数としてa,bを２バイトずつ宣言している。
【００３５】
図７は、移行前ソース１４４が移行前システムで動作する際の移行前変数メモリ配置情報１４６の例を示す図である。
【００３６】
変数宣言３０１により変数aは開始アドレス３０２が0x10000となり、終了アドレス３０３が0x10001として割り当てられる。また、変数ｂは開始アドレスが８の倍数になるため、開始アドレス３０２が0x10008となり、終了アドレス３０３が0x10009として割り当てられる。
【００３７】
図８は、移行前ソース１４４が移行後システムで動作する際の移行後変数メモリ配置情報１４６の例を示す図である。
【００３８】
変数宣言４０１により変数aは開始アドレス４０２が0x10000となり、終了アドレス４０３が0x10001として割り当てられる。また、変数ｂは開始アドレスが２の倍数になるため、開始アドレス４０２が0x10002となり、終了アドレス４０３が0x10003として割り当てられる。結果、移行前と移行後のシステムでは、変数aのアドレスは同じだが、変数ｂのアドレスが異なっている。
【００３９】
図９は、移行前ソース１４４が移行前システムで動作する際のメモリ配置の例を示す図である。
【００４０】
移行前システムでは変数aの後続のアドレス0x10002から0x10007までが空きとなっている。
【００４１】
図１０は、移行前ソース１４４が移行後システムで動作する際のメモリ配置の例を示す図である。
【００４２】
移行後システムでは変数aに続いて変数ｂが割り当てられている点が異なる。
【００４３】
図１１は、移行前システムでバッファオーバーランが発生した場合の例を示す図である。
【００４４】
変数宣言３０１では変数aは２バイトしか宣言していないが、ユーザプログラム１２の不良によりa[2]およびa[3]に値を代入した場合、0x10002と0x10003のメモリに値が書き込まれる。ただし、移行前システムでは空き領域であるためメモリ破壊は発生せずシステムは正常に動作する。
【００４５】
図１２は、移行後システムでバッファオーバーランが発生した場合の例を示す図である。
【００４６】
変数宣言４０１では変数aは２バイトしか宣言していないにもかかわらず、ユーザプログラム１２の不良によりa[2]およびa[3]に値を代入した場合、0x10002と0x10003のメモリに値が書き込まれる。しかし、0x10002と0x10003のアドレスは変数b[0]とb[1]に割り当てられているため、移行後システムではメモリ破壊が発生し、システムが異常な動作をする。図１１および図１２の結果から、移行前システムでは問題がなかったユーザプログラムが移行後システムでは正常に動作しない現象が発生する。
【００４７】
図１３は、変換後ソース１４８の例を示すソースである。
【００４８】
ソース変換部１４３の処理によりchar a[2]; の次行にchar d1[6]; を追加している。変数aの宣言の後に、ダミーデータとして変数ｄ１を６バイト確保することにより変数ｂの開始アドレスを移行前と同じ0x10008にしている。
【００４９】
図１４は、変換後ソース１４８が移行後システムで動作する際のメモリ配置の例を示す図である。
【００５０】
変数aの後に、ダミーデータとして変数ｄ１を６バイト割り当てることにより変数ｂの開始アドレスを移行前と同じ0x10008にしている。
【００５１】
図１５は、変換後ソース１４８が移行後システムで動作する際のメモリ配置とバッファオーバーランが発生した場合の例を示す図である。
【００５２】
ユーザプログラム１２の不良によりa[2]およびa[3]に値を代入した場合、0x10002と0x10003のメモリに値が書き込まれる。変数d1[0]とd1[1]の値がへんこうされるがダミーデータのため、メモリ破壊は発生せずシステムは正常に動作する。
【００５３】
以上本発明の実施例を説明したが、本発明はこれに限定されるものではなく、その要旨を逸脱しない範囲で種々変更可能である。
【符号の説明】
【００５４】
１…コンピュータ、１０…メモリ、１１…ＯＳ領域、１２…ユーザプログラム、１３…ユーザデータ領域、１４…ソース変換プログラム領域、２０…ＣＰＵ、３０１、４０１…変数宣言、３０２、４０２…開始アドレス、３０３、４０３…終了アドレス
【図１】
2012128752.tif 000003
【図２】
2012128752.tif 000004
【図３】
2012128752.tif 000005
【図４】
2012128752.tif 000006
【図５】
2012128752.tif 000007
【図６】
2012128752.tif 000008
【図７】
2012128752.tif 000009
【図８】
2012128752.tif 000010
【図９】
2012128752.tif 000011
【図１０】
2012128752.tif 000012
【図１１】
2012128752.tif 000013
【図１２】
2012128752.tif 000014
【図１３】
2012128752.tif 000015
【図１４】
2012128752.tif 000016
【図１５】
2012128752.tif 000017