
わかりにくいタイトルですみません。
とあるアプリケーション(Win3.11 EXE)が存在し、そのソースコードも存在します。
しかし、15年以上の時間経過で当時の担当者達は全員退職し、また会社の吸収合併や組織変更などの影響で、そのソースコードが現在動いているアプリケーションと同じバージョンかどうか、つまり今あるソースコードで現在のアプリケーションのバイナリファイルを作成できるのかどうかがわからなくなりました。
そのソースコードが現在動いているアプリケーションと同じバージョンかどうかを確認するには、どのような方法が考えられるでしょうか?
例えば、ソースコードをコンパイルしてファイルサイズが同じならかなりの確立でバージョンが一致していると想定していいのではないかと考えていますが、Windows(3.11)やコンパイラ(VC++1.52)が同じなら、同じソースを同じオプションでコンパイルしたら同じバイナリファイルが生成されるでしょうか?
また、上記の方法がNGな場合、他にどのような確認方法が考えられますでしょうか?
今までこのような問題に遭遇したことがないため、いろいろなアイディアがほしいです。お知恵をお貸しください。

No.4ベストアンサー
- 回答日時:
まず、とにかく、当時と同じとおもわれる環境を準備して、ビルドしてみる。
if サイズがちがう → おそらく、同じではない部分がある。どこが、違うのか、調べたい場合は、別のQをたてられたし。
else {
この場合、同じである可能性もあるが、中味をみないとなんともいえない。バイナリファイルのコンペアができるつーるなどで、中味を調べる。(ちなみに、タイムスタンプなどの問題で、同一にはならないはずなので)
バイナリファイルの比較で、あたまのexeファイルヘッダー部分だけが、ちがうなら、意味的におなじものがせいせいされている可能性がある。exeヘッダーについては、マイクロソフトの文書などを参照されたい。
}
この回答への補足
コメントありがとうございます。
なるほど、バイナリ比較をしてもファイルヘッダーの部分は同じにならないのですね。
実際、ビルドを2度続けて行って(つまり同じソースファイル)比較してみましたがそれが確認できました。とても参考になりました。
No.3
- 回答日時:
生成バイナリはコンパイラ以外のものには依存しないので、DOSのバージョン、更に言うとWindowsのバージョンもあまり関係はないはずです。
VC++1.52本体と、これが動く環境があれば。
この回答への補足
コメントありがとうございます。
なるほど、それではコンパイラとコンパイルオプションが同じならいい結果が期待できそうですね。
VC++1.52をXPで動作させてみました。さすがに32ビットと16ビットの違いがあるので同じバイナリは生成できませんでしたが、Win3.11の環境は用意できると思うのでそちらで試してみます。
No.2
- 回答日時:
「サイズが同じ」だけでダメなのは#1でも言われている通りで、最低でもバイナリ差分がないことは確認しなくてはいけません。
が、コンパイルオプションの些細な違いでソースは同じでもバイナリは全然違うなんて話はざらですから、コンパイラが同じというだけではだめで、当時ビルドしていた時の環境、特にコンパイラに渡しているオプションの情報は存在していないと話になりません。
その辺の情報が消失していると、同一であることを確認するのはかなり困難です。
「動作同一性を持って同じであるとする」しかないかと。
この回答への補足
コメントありがとうございます。
確かに、ファイルサイズの一致だけでというのは甘い考えだったようです。バイナリ差分がないかを確認する必要があるのですね。
幸い、コンパイルオプションはバージョン管理ソフトウェアに残されていました。せめて同じ環境さえ用意できればと思うのですが、わかっているのはWindows3.11とVC++1.52というバージョンだけで、(DOSのバージョンがWin3.1でのコンパイルに影響するのかはわかりませんが)Winが動いているのはどのバージョンのDOS上かなどは不明で、現実的には同じバイナリを生成することは難しそうです。
最悪のケースでは仰るとおり動作同一性を確認するブラックボックステスティングを行う必要がありそうです(それを避けるための方法を模索している経緯での今回の質問でした)。それをするなら一から書き直したいところですが、上の判断なのでどうなるかわかりません。
No.1
- 回答日時:
> ソースコードをコンパイルしてファイルサイズが同じならかなりの確立でバージョンが一致していると想定していいのではないか
確度はかなり低いでしょう。
int x = 1; /* version 1.0 */
と
int x = 0; /* version 1.1 (修正) */
とをコンパイルした場合、ファイルサイズは変わらんでしょうから。
versionを表す文字列が埋め込まれていれば掘り起こすことができますけども。
const char* version = "$Revision: 1.1 初期値を修正 $";
みたいな。
この回答への補足
コメントありがとうございます。
なるほど。例えばソースコード中のハードコードされたパラメータ数値なりが変わっていただけなら、動作が変わったにもかかわらずコンパイルされたファイルのサイズは同じになってしまいますね・・・。
バージョンをあらわす文字列が埋め込まれていればというアイディア、ありがとうございます。コメントで記述されていたらきっと消えてしまっているでしょうが、例のようにバイナリに残る形で記述されている可能性もあるので調査してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C++ で、「)」が必要 というエ...
-
コンパイラの制限 : ヒープの領...
-
0除算して、落ちるプログラムと...
-
コンパイラについて
-
自分の声が遅れて聞こえてくる...
-
Bluestacks内でダウンロードし...
-
65536は2の何乗なのでしょうか?
-
あるプログラムのコマンドライ...
-
Photoshopで、できますか?
-
自動クエリとはどういうもので...
-
正しい五十音順について
-
VBAにてメール作成した際、一部...
-
階乗のマクロ
-
OS入ってる機器のソフト・アプ...
-
C言語 バッファについて。
-
脱出ゲームを自分で作ってみたい
-
Excelで4096点以上のFFTの方法
-
N88basicを用いたGPIB制御
-
ベイチ・カルノー図以外のとき方。
-
数値計算の高速化 (cos, sin, exp)
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C++ で、「)」が必要 というエ...
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
volatile修飾について
-
Delphiの逆コンパイル
-
__extension__
-
Eclipseの環境設定について
-
linuxのセキュリティ対策と致し...
-
プリコンパイラとは?
-
fortranでのNaNについて
-
MFC
-
C言語のワーニングメッセージの...
-
関数の戻り値による変数の初期化
-
コンパイラについて
-
FORTRANとC++の連動について
-
Fortran90を使いたい
-
「.c」拡張子でC++文法を使...
-
PICマイコンによる乱数の表示に...
おすすめ情報