- ベストアンサー
変数の内容が勝手に変わる原因と64bit環境の注意点
- VC++2010でプログラムしていますが、プログラム実行中に変数TESTの内容が勝手に変更されてしまいます。
- 変数TESTを変更する記述はプログラム中に存在しません。
- 64bit環境では変数設定に注意が必要です。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。 その難しいことが起きるから発見されないんですけどね。 世の中の製品のゲームやアプリでも偶然動いていることは良く有ります。 コンパイラが変わるとコンパイラの最適化アルゴリズムが変わるので変数のメモリの配置やコンパイル後の機械語命令コードの並びそのものが完全に変わるのはよく有る出来事です。そのため前のコンパイラでは問題なかったプログラムがいきなりバグだらけのプログラムに変わることがあります。 >ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。 Releaseビルドした上で開発マシンでバグが出なかった場合は、操作方法や稼働負荷で出るバグでない限りバグが表面化する可能性は限りなく低いと思います。 つまり、他のPCやバージョンの違うOSで動く可能性はかなり高いです。と言ってもOSがWin98からWinXPに変わったときにバグが表面化したソフトも実際にかなり有りましたけどね。
その他の回答 (5)
- zwi
- ベストアンサー率56% (730/1282)
それはバグが表面化しただけでバグが潜んでいた可能性が高いです。コンパイラが変わったので問題が表面化しています。つまりバグを直さないと動きません。x86とかx64とか無関係です。 バグを直したくないというなら、素直にVC++6でコンパイルした実行ファイルのまま使ったほうが良いでしょう。
補足
zwiさん、度々ありがとうございます。 コンパイラによりバグをはじき出す基準が変わるのでしょうか?バグが潜んでいるのならNO3の方の回答が考えられそうですが、この場合アクセス違反でも起きない限り発見も難しいと考えます。 やはり、原点に返って変数(配列)領域のアクセスを洗ってみます。 ついでに教えて頂きたいのですが、ちなみにバグの潜んだVC++6でビルドした実行ファイルは開発環境では完動しても、他のマシンで不具合が起きる事もあるのでしょうか?教えてください。
- zwi
- ベストアンサー率56% (730/1282)
配列の添字間違いか、ポインタ操作のミスなど考えられる原因は沢山あります。 64bitか32bitかとか全く無関係でしょうね。 デバッガのデータ変更ブレークの方法を理解したほうが懸命です。
補足
毎回ありがとうございます。 実は最初に大事な事を書くのを忘れていました。 VC++6でプログラムしたソースをVC++2010(Win7,64bit)にそのまま移行しました。 移行後にソースは絶対に変更していません。 VC++6時代ではエラーなく実行されていたのですが、64bit環境になってからのエラーになります。 今回の事態になってからプログラムをやり直す考えは全くありません。 2010の64bitコンパイラで完全な32bit環境でコンパイルできる設定が知りたいのです、コンパイルオプションやリンカーオプションの設定を教えてください。 よろしくお願いします。
- qwertfk
- ベストアンサー率67% (55/81)
提示されているコード中で怪しい部分は特になさそうです。 VCを使っているのであれば、TESTにデータブレークポイントを設定してどこで値が変化しているのか確認するのが良いのではないでしょうか。 ちなみに良くあるミスとしては int a[2] = {0,0}; int b = 0; a[2] = 123; // これでbの値が変わることがある のように、変数の範囲外アクセスが原因で他の変数の値が変わってしまうことがあります。 あと、 >64bit環境での変数設定の注意点を教えてください。 これの意味が良く分からないのですが、これは32ビットでビルドすると問題ないということでしょうか?
補足
qwertfkさん 回答ありがとうございます、実は最初に書き忘れていたのですが、VC++6のソースをそのままVC++2010に移行しただけです。 もちろん、VC++6では問題なく動作していました。 よろしくお願いします。
- Tacosan
- ベストアンサー率23% (3656/15482)
「プログラム実行中にある時点で勝手に変更されてしまいます」といっても, 当然「プログラムがそうなってるからそう動作する」だけだよね. とりあえず「どこで『勝手に変更』されているのか」を調べたら?
補足
毎度、回答ありがとうございます。 質問のプログラムは実際のプログラムではありませんが、仮にこのようなプログラムがあったとしたら、ある時点で勝手にベープ音が鳴ると言う状況で、何処で鳴るかは現実問題として特定出来ない状況です。 実際に変数を変更するプログラムを書いていないに関わらず勝手に変更されてしまいます。 更に、付け加えさせて頂きますと、設定した配列変数の1番目の変数が実行中に何時までたってもゼロのままで変化しないため2番目の配列を使用すると変更されていることが確認されました。 まるで、狐に包まれたような変な状況です。 ただ、プログラムが膨大で全体を提示出来ないのが残念です。 よろしくお願いします。
- zwi
- ベストアンサー率56% (730/1282)
ところでmsgの定義がないけど間違ってない? これが、いちばんあやしい。
補足
MSG msg;の記述ですが、下記の通り設定しています。 今回質問に記述したコードは質問のための1例です。 実際には変数や配列変数は何千と設定しています。 よろしくお願いします。 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow) { MSG msg; ・ ・ ・
お礼
よくわかりました。 デバグ開始でバグ発見に努めます。 色々とありがとうございました。