• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バイナリファイルとソースコードのバージョン一致確認)

バイナリファイルとソースコードのバージョン一致確認

このQ&Aのポイント
  • バイナリファイルとソースコードのバージョン一致確認の方法を考える
  • Windowsやコンパイラが同じなら同じソースを同じオプションでコンパイルすれば同じバイナリファイルが生成されるかどうかを検討する
  • 他に考えられる確認方法についてアイディアを募集する

質問者が選んだベストアンサー

  • ベストアンサー
noname#29459
noname#29459
回答No.4

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

stoutontap
質問者

補足

コメントありがとうございます。 なるほど、バイナリ比較をしてもファイルヘッダーの部分は同じにならないのですね。 実際、ビルドを2度続けて行って(つまり同じソースファイル)比較してみましたがそれが確認できました。とても参考になりました。

その他の回答 (4)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.5

生成した ObjなりEXEを fc.EXE に /Bをつけて比較してみればいいのでは FC.EXEはWindowsならたいてい標準でインストールされていたと思いますよ

stoutontap
質問者

補足

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

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.3

生成バイナリはコンパイラ以外のものには依存しないので、DOSのバージョン、更に言うとWindowsのバージョンもあまり関係はないはずです。 VC++1.52本体と、これが動く環境があれば。

stoutontap
質問者

補足

コメントありがとうございます。 なるほど、それではコンパイラとコンパイルオプションが同じならいい結果が期待できそうですね。 VC++1.52をXPで動作させてみました。さすがに32ビットと16ビットの違いがあるので同じバイナリは生成できませんでしたが、Win3.11の環境は用意できると思うのでそちらで試してみます。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

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

stoutontap
質問者

補足

コメントありがとうございます。 確かに、ファイルサイズの一致だけでというのは甘い考えだったようです。バイナリ差分がないかを確認する必要があるのですね。 幸い、コンパイルオプションはバージョン管理ソフトウェアに残されていました。せめて同じ環境さえ用意できればと思うのですが、わかっているのは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 初期値を修正 $"; みたいな。

stoutontap
質問者

補足

コメントありがとうございます。 なるほど。例えばソースコード中のハードコードされたパラメータ数値なりが変わっていただけなら、動作が変わったにもかかわらずコンパイルされたファイルのサイズは同じになってしまいますね・・・。 バージョンをあらわす文字列が埋め込まれていればというアイディア、ありがとうございます。コメントで記述されていたらきっと消えてしまっているでしょうが、例のようにバイナリに残る形で記述されている可能性もあるので調査してみます。