アプリ版:「スタンプのみでお礼する」機能のリリースについて

わかりにくいタイトルですみません。

とあるアプリケーション(Win3.11 EXE)が存在し、そのソースコードも存在します。

しかし、15年以上の時間経過で当時の担当者達は全員退職し、また会社の吸収合併や組織変更などの影響で、そのソースコードが現在動いているアプリケーションと同じバージョンかどうか、つまり今あるソースコードで現在のアプリケーションのバイナリファイルを作成できるのかどうかがわからなくなりました。

そのソースコードが現在動いているアプリケーションと同じバージョンかどうかを確認するには、どのような方法が考えられるでしょうか?

例えば、ソースコードをコンパイルしてファイルサイズが同じならかなりの確立でバージョンが一致していると想定していいのではないかと考えていますが、Windows(3.11)やコンパイラ(VC++1.52)が同じなら、同じソースを同じオプションでコンパイルしたら同じバイナリファイルが生成されるでしょうか?

また、上記の方法がNGな場合、他にどのような確認方法が考えられますでしょうか?

今までこのような問題に遭遇したことがないため、いろいろなアイディアがほしいです。お知恵をお貸しください。

A 回答 (5件)

まず、とにかく、当時と同じとおもわれる環境を準備して、ビルドしてみる。



if サイズがちがう → おそらく、同じではない部分がある。どこが、違うのか、調べたい場合は、別のQをたてられたし。

else {
この場合、同じである可能性もあるが、中味をみないとなんともいえない。バイナリファイルのコンペアができるつーるなどで、中味を調べる。(ちなみに、タイムスタンプなどの問題で、同一にはならないはずなので)
 バイナリファイルの比較で、あたまのexeファイルヘッダー部分だけが、ちがうなら、意味的におなじものがせいせいされている可能性がある。exeヘッダーについては、マイクロソフトの文書などを参照されたい。

}

この回答への補足

コメントありがとうございます。

なるほど、バイナリ比較をしてもファイルヘッダーの部分は同じにならないのですね。

実際、ビルドを2度続けて行って(つまり同じソースファイル)比較してみましたがそれが確認できました。とても参考になりました。

補足日時:2010/12/24 02:29
    • good
    • 1

生成した ObjなりEXEを fc.EXE に /Bをつけて比較してみればいいのでは



FC.EXEはWindowsならたいてい標準でインストールされていたと思いますよ

この回答への補足

コメントありがとうございます。

UNIXのdiffを使ってバイナリーの比較をと考えましたが、Windowsにもあるのですね。知りませんでした。使わせていただきます。

補足日時:2010/12/24 02:21
    • good
    • 0

生成バイナリはコンパイラ以外のものには依存しないので、DOSのバージョン、更に言うとWindowsのバージョンもあまり関係はないはずです。


VC++1.52本体と、これが動く環境があれば。

この回答への補足

コメントありがとうございます。

なるほど、それではコンパイラとコンパイルオプションが同じならいい結果が期待できそうですね。

VC++1.52をXPで動作させてみました。さすがに32ビットと16ビットの違いがあるので同じバイナリは生成できませんでしたが、Win3.11の環境は用意できると思うのでそちらで試してみます。

補足日時:2010/12/24 02:24
    • good
    • 0

「サイズが同じ」だけでダメなのは#1でも言われている通りで、最低でもバイナリ差分がないことは確認しなくてはいけません。


が、コンパイルオプションの些細な違いでソースは同じでもバイナリは全然違うなんて話はざらですから、コンパイラが同じというだけではだめで、当時ビルドしていた時の環境、特にコンパイラに渡しているオプションの情報は存在していないと話になりません。
その辺の情報が消失していると、同一であることを確認するのはかなり困難です。
「動作同一性を持って同じであるとする」しかないかと。

この回答への補足

コメントありがとうございます。

確かに、ファイルサイズの一致だけでというのは甘い考えだったようです。バイナリ差分がないかを確認する必要があるのですね。

幸い、コンパイルオプションはバージョン管理ソフトウェアに残されていました。せめて同じ環境さえ用意できればと思うのですが、わかっているのはWindows3.11とVC++1.52というバージョンだけで、(DOSのバージョンがWin3.1でのコンパイルに影響するのかはわかりませんが)Winが動いているのはどのバージョンのDOS上かなどは不明で、現実的には同じバイナリを生成することは難しそうです。

最悪のケースでは仰るとおり動作同一性を確認するブラックボックステスティングを行う必要がありそうです(それを避けるための方法を模索している経緯での今回の質問でした)。それをするなら一から書き直したいところですが、上の判断なのでどうなるかわかりません。

補足日時:2010/12/23 09:46
    • good
    • 0

> ソースコードをコンパイルしてファイルサイズが同じならかなりの確立でバージョンが一致していると想定していいのではないか



確度はかなり低いでしょう。

int x = 1; /* version 1.0 */

int x = 0; /* version 1.1 (修正) */
とをコンパイルした場合、ファイルサイズは変わらんでしょうから。

versionを表す文字列が埋め込まれていれば掘り起こすことができますけども。
const char* version = "$Revision: 1.1 初期値を修正 $";
みたいな。

この回答への補足

コメントありがとうございます。

なるほど。例えばソースコード中のハードコードされたパラメータ数値なりが変わっていただけなら、動作が変わったにもかかわらずコンパイルされたファイルのサイズは同じになってしまいますね・・・。

バージョンをあらわす文字列が埋め込まれていればというアイディア、ありがとうございます。コメントで記述されていたらきっと消えてしまっているでしょうが、例のようにバイナリに残る形で記述されている可能性もあるので調査してみます。

補足日時:2010/12/23 09:40
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!