2

製品にクロスプラットフォームのスクリプト言語を実装しています。言語 VM では、スタック オーバーフロー状態を検出して適切に処理する必要があります。飛び込んで、そもそもスタック オーバーフローがないことを確認する前に、私の最初の文をもう一度読んでください。再帰。

これで、Windows でスタック オーバーフローを検出して回復する方法がわかりました ( http://support.microsoft.com/kb/315937を参照)。ただし、Mac OS X の解決策が見つかりません。

VM は C++ で実装されています。Windows では MSVC++、Mac OS X では GCC です。

Linux への移植も計画しているため、理想的にはメカニズムは UNIX の機能に基づいている必要があります。

ありがとう。

4

3 に答える 3

3

OCamlにはあなたと同じ制約があります(プログラマーがスタックオーバーフローを引き起こす可能性のある「スクリプト」言語)。そのネイティブコンパイラは、関数呼び出しにシステムスタックを使用し(あなたがそうするように)、スタックオーバーフローを処理します(例外としてそれらを具体化します)。

より明確な答えが得られない場合は、OCamlソースでどのように行われているかを確認することをお勧めします。

~/ppc $ cat >> t.ml

let rec f x = (f x) + (f x) ;;

f 0 ;;

~/ppc $ ocamlopt t.ml
~/ppc $ ./a.out 
Fatal error: exception Stack_overflow

上記はMacOSXLeopardの場合です。#ifdef HAS_STACK_OVERFLOW_DETECTIONソースファイルで検索します。

于 2009-11-19T13:07:04.487 に答える
0

libsigsegvを見てください。これは、とりわけスタック オーバーフロー ハンドラの実装を支援するルーチンを備えた C ライブラリです。

于 2009-11-20T06:08:13.680 に答える
0

プログラムの最大スタック サイズ、スタックの開始を決定してから、スタック アドレスの終了を計算できませんか? vm での各操作の前に、スタックがオーバーフローする (最大アドレスを超える) かどうかを確認してから、例外を発生させることができます。別の方法は、スタックの終了後に識別子を書き込み (DEADBEEF など)、各スタック操作の後にその値を確認することです。


チェックを追加できない理由はまだわかりません (これがスタック操作の通常の検出方法です)。ただし、スタック領域の最後にハードウェア ブレークポイント (書き込み時) を追加することはできます。壊れたら、スタックオーバーフローがあることがわかります。ただし、デバッグ環境が台無しになる可能性があるため、お勧めしません。

ただし、基本的には、VM がある場合は、コード (バイトコードなど) を読み取り、コンパイル / 解釈する場所もあります。これは、マークをチェックできる場所です (スタック バッファー オーバーフローを検出するためのチェックに匹敵します)。

于 2009-11-19T13:15:19.793 に答える