問題タブ [setjmp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - C++ の try/catch は C の setjmp/longjmp とどう違うのですか?
andブロックC++を使用する際の例外処理については認識していました。この機能が にあるのだろうかと思いました。これで、 の基本的なエラー処理は によって行われることがわかりました。trycatchCCsetjmp/longjmp
setjmp/longjmpには存在しないのでC++、そのtry/catch方が良いと思いますか? どんな風に???
を使用してtry/catch機能を実装できます。どう違うの??Csetjmp/longjmp
c - ucontextがPOSIXに追加された後、POSIXから削除されたのはなぜですか?
私の知る限り、ucontextそれよりも優れたものを提供していますsetjmp。ただし、非推奨になり、POSIX仕様から削除されました。では、なぜそれが表示され、なぜ削除されたのでしょうか。
c - マクロ地獄:setjmp/sigsetjmpへのプラットフォームに依存しないポインター
setjmp/sigsetjmpへのポインターを使用する必要があるマルチプラットフォームコードを書いています。通常、それは行うのと同じくらい簡単です
ただし、ISOとPOSIXは、setjmp / sigsetjmpをマクロとして定義できると述べており、実際、私のLinuxボックスの場合はそうです。これがからの抜粋です/usr/include/setjmp.h:
問題は、引数をに渡してsigsetjmpいないため、マクロが展開されず、プレーンsigsetjmpシンボルがlibcで定義されていないことです。マクロ「黒魔術」を使って「__sigsetjmp」の名前を抽出できることを望んでいましたが、これまでのところ惨めに失敗しました。
別のオプションは __sigsetjmp直接使用することですが、これはサポートされているすべてのプラットフォームの拡張をチェックすることを意味します。これは私がやりたくないことです(したがって、この質問の理由)。
PS:私はマクロが嫌いです。
ノート:
これが必要な理由は少しわかりにくいですが、簡単にするために、ポインター比較を実行したいとします。
編集:
はいはい。sigsetjmp特定のプラットフォームでは関数ではない可能性があるため、ポインタを取得することを期待すべきではないことはわかっていますが、これでは問題は解決しません。
実際には、私が知っているすべてのプラットフォームは、それを関数として実装します。
sigsetjump数年後には、特定のプラットフォームで機能しない場合が発生することに対処できます。しかし、私が対処したくないのは、サポートされているすべてのプラットフォームを調べsetjmp.hて、マクロ定義をチェックすることです。これは、現在の私の唯一のオプションです。
標準への参照に感謝しますが、純粋なものではなく、実用的な答えを得たいと思います。
windows - ベクトル化された例外ハンドラからのlongjmp
64ビットWindowsプログラムの特定の種類のイベント(ゼロ除算、nullポインター参照、ガードページで検出された場合のスタックオーバーフローなど)は、通常、構造化またはベクトル化された例外で処理されます(それらを処理する必要があると判断したプログラムで)。 。
JITコンパイラのコンテキストでは、アンワインド情報を提供し、すべての関数のアンワインドプロトコルに準拠する必要があるため、構造化例外は少し厄介です。これは、コードブロックを移動するコピーガベージコレクタなどとうまく相互作用しない可能性があります。ベクトル化された例外の使用。
ベクトル化された例外ハンドラーは通常戻ることが期待されますが、この目的でそれらを使用するには、巻き戻しを行わずにスタックポインターをリセットするlongjmpまたは同等のコードでハンドラーを終了する必要があります。
これは合法ですか、それとも私が見落としている障害がありますか?
Unixでの同等のものは合法であるように思われますが、その価値は次のとおりです。Longjmpがシグナルハンドラから外れていますか?
c++ - longjmp/croak の前のデストラクタへの明示的な呼び出し
C++ ライブラリへの PERL XS インターフェイスを作成しています。croakライブラリが例外をスローしたときに呼び出す必要があります。
例外ハンドラーで直接実行すると、呼び出しに期待されるように、キャッチされた例外のデストラクタへの呼び出しが失われlongjmpます。例外には解放されない文字列メンバーが含まれているため、これは重要です。
明らかな解決策はcroak、例外がキャッチされた場合、次のように catch ブロックの後に実行することです。
しかし、私は疑問に思っています:キャッチされた例外のデストラクタを直前に明示的に呼び出すだけで十分でしょうlongjmpか? このような:
visual-c++ - longjmp を呼び出すと、msvc 2010 でプログラムがコード 0 で終了する
エラー処理に使用しようとしてsetjmp/longjmpいますが、MSVC 2010 を使用してコンパイルすると、longjmp を呼び出すと、プログラムがコード 0 で終了します。完全なメッセージは次のとおりです。
コードは次のとおりです。
gnu ベースのコンパイラ (cygwin では bfin-elf-gcc) を使用して同じコードをコンパイルしましたが、問題なく動作しました。すなわち、
msvcで動作しない理由はありますか?
ハサン、よろしくお願いします。
c - setjmp.h で定義された C の非ローカル ジャンプはどのように機能しますか?
C リファレンス マニュアルの付録 B では、2 つの関数setjmpと、非ローカル ジャンプlongjmpと呼ばれるものについて説明しています。状態情報を保存し、longjmp が を復元するという基本的な理解は別として、この機能の正確なフローと使用例を理解できていません。setjmpstate
では、この機能は正確には何を達成し、どこで役立つのでしょうか?
c - 非局所的なジャンプが存在する場合でも再帰を確実に検出する
再帰を検出したい特定の関数 (シグナル ハンドラ) があります。つまり、関数が直接または間接的に自分自身を呼び出しているかどうかを調べます。注意が必要な点は、ある時点で関数がその制御下にないコードを呼び出し、そのコードが何でもできることです。
通常、私は次のようなものを書くだけです
othercodeしかし、この場合、 a などを使用しlongjmpて抜け出し、結果として 1 のままになる可能性があることを懸念していrecursedます。後で呼び出された場合の再帰 (それ以外の場合は、それがlongjmp外れるという事実は問題ではありません)。
注:longjmp可能性が高いと思います。これは、他のイン ザ ワイルド コードからのチェーン シグナル ハンドラであり、たとえば、コンテキストを復元するために使用othercodeするハンドラが存在します(たとえば、「障害保護」例外ハンドラとして)。同期シグナルハンドラでの使用は、一般的に安全であることに注意してください。いずれにせよ、他のコードが安全かどうかは特に気にしません。それは私の管理下にあるものではないからです。SIGSEGVlongjmplongjmp