わかりにくいタイトルですみません。
とあるアプリケーション(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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Cのコンパイルでコメントアウトをそのままオブジェクトに保持したい 7 2023/08/01 22:22
- Mac OS macOS Mojave 1 2022/06/10 18:39
- システム 古いWEBシステム。もう追加プログラムは作れない? それともできる? 6 2022/06/08 13:41
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
- HTML・CSS htmlのデータをwebページみたいに見る方法 5 2023/06/23 17:47
- その他(ソフトウェア) ソフトが異常終了します 1 2022/08/28 01:41
- その他(学校・勉強) 完全無料の教科書や問題集はどのようなものがありますか?日本語と英語について探しています 1 2022/12/18 03:48
- iPod・ウォークマン・音楽プレーヤー Windows10でwindows8やwindows7のアプリケーションを動かしたい 6 2022/09/20 23:16
- JavaScript 読み込んだQRコードをフォームに受け渡したい 1 2023/05/18 11:18
- au(KDDI) 「カメラへのアクセスを許可してください」のせいで年齢確認書類を撮影できない、アップロードできない 2 2022/11/01 00:04
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
コンパイルできない
-
C++ で、「)」が必要 というエ...
-
PICマイコンによる乱数の表示に...
-
Visual C++とVisual C++.NETの違い
-
C言語のワーニングメッセージの...
-
C++でアボート(Abort)で処理が...
-
Eclipseの環境設定について
-
BCB5 「コンパイラ内部エラー」...
-
fortranでのNaNについて
-
javaと.net frameworkの性能に...
-
pro*cにて
-
変数(関数)名の頭に_
-
文字化け
-
コンパイラフラグ(compiler fla...
-
ABAQUS ユーザーサブルーチン...
-
linuxのセキュリティ対策と致し...
-
プリコンパイラとは?
-
C言語で長方形を作る
-
graph.hがincludeできない
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0除算して、落ちるプログラムと...
-
C++でアボート(Abort)で処理が...
-
変数(関数)名の頭に_
-
C++ で、「)」が必要 というエ...
-
io.hをincludeするとそのような...
-
C言語のワーニングメッセージの...
-
Eclipseの環境設定について
-
ABAQUS ユーザーサブルーチン...
-
Visual C++とVisual C++.NETの違い
-
コンパイルできない
-
volatile修飾について
-
コンパイラについて
-
コンパイラフラグ(compiler fla...
-
Delphiの逆コンパイル
-
fortranでのNaNについて
-
cobolの文法チェックソフト
-
不要なインクルードファイルの検出
-
__extension__
-
IPアドレス表示プログラム
-
isnanの取り扱いについて
おすすめ情報