状況が曖昧なため、この質問をするのをためらっていますが、これがどのように可能であるかを理解したいと思います. Visual Studio 2008 を使用して開発した C++ アプリケーションがあります。Windows 7 64 ビット (または Vista 32 ビット) でアプリケーションをコンパイルすると、アプリケーションは正常に動作します。32 ビット Windows XP SP3 でアプリケーションをコンパイルすると、バッファ オーバーランの警告が表示され、プロセスが終了します。これは、Visual Studio 2008 C++ コンパイラと同じバージョンを使用しています。XP ではバッファ オーバーランが発生するのに、他の Windows プラットフォームでは発生しないのはなぜですか?
5 に答える
運、宇宙の根本的な不確定性、または(以前よりも可能性が高い)XPと7の間でmsvcrt.dllで変更された実装の詳細。
結論としては、アプリケーションにバグがあり、それを修正する必要があります。
バッファオーバーランが発生せず、どのプラットフォームでもこの問題が発生しないようにコードを記述します。つまり、アクセスしているバッファの境界をチェックして、適切な境界の外側で読み取り/書き込みを試みていないことを確認してください。
どちらの場合も、おそらくバッファオーバーランが発生しています。最初の場合、バッファオーバーランは検出されず、(明らかに)害を及ぼしません。2番目にそれが検出されます。(動的に割り当てられたメモリ上にある場合、アロケータは要求されたものよりも多くを割り当てることが多いことを知っておく必要があります。したがって、最初のケースではオーバーランがそのゾーンに留まり、2番目のケースではそうではないというのがもっともらしい説明です)。
データ型のサイズは、コンパイラによって異なる場合があります (@AndreyT に感謝)。コードでデータ型のサイズを表すようなハードコーディングされた数値を使用sizeof(4)
すると、アプリケーションでバグが発生する可能性があります。sizeof(int)
代わりに、または興味のあるタイプを使用する必要があります。
Windows-7 has a feature called fault-tolerant-heap which ,as it says, is tolerant about some faulty buffer accesses. Windows XP doesn't have this feature (Vista ,I don't know). There is a video about it on channel9.msdn.com or sysinternal.com (forgot exactly where) by Mark Russinovich.