わかりにくいタイトルですみません。
とあるアプリケーション(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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
コンパイルできない
-
C++ で、「)」が必要 というエ...
-
fortranのコンパイラでInvalid ...
-
変数(関数)名の頭に_
-
sprintfを用いたフォーマット文...
-
Eclipseの環境設定について
-
GNUコンパイラとIntelコンパイ...
-
Fortran90/Fortran95→Fortran77
-
C用ビルダー
-
バイナリファイルとソースコー...
-
pro*cにて
-
コンパイラについて
-
エクセルに入力した数値を出力...
-
io.hをincludeするとそのような...
-
C/C++を使用する環境について
-
Excelで4096点以上のFFTの方法
-
65536は2の何乗なのでしょうか?
-
あるプログラムのコマンドライ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++ で、「)」が必要 というエ...
-
コンパイルできない
-
C++でアボート(Abort)で処理が...
-
io.hをincludeするとそのような...
-
__extension__
-
初心者はIDE使わないほうが良く...
-
ABAQUS ユーザーサブルーチン...
-
Delphiの逆コンパイル
-
コンパイラの制限 : ヒープの領...
-
Eclipseの環境設定について
-
fortranでのNaNについて
-
cobolの文法チェックソフト
-
変数(関数)名の頭に_
-
graph.hがincludeできない
-
PICマイコンによる乱数の表示に...
-
どのプログラミング言語ででき...
-
Visual C++とVisual C++.NETの違い
-
コンパイラフラグ(compiler fla...
-
ccコマンドの使い方
おすすめ情報