問題タブ [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の場合:funcポインターの送信、それを使用したfuncの呼び出し、EIP、jmp_buf、およびlongjmpでの再生
最初にいくつかの基本的なことを理解していることを確認する必要があります:
- 関数Aをパラメーターとして関数Bに渡すにはどうすればよいですか?
- Bの内側から関数Aを呼び出すにはどうすればよいですか?
さて、大きな苦痛のために:
私はこれに沿って何かをしようとしています:
longjmp関数に行くために使いたいという意味。どうすればいいですか?
c++ - longjmpの質問
longjmpを使用してgoto命令をシミュレートしたいのですが、構造体タイプ(int、float、bool、char)の要素を含む配列DSがあります。xがDS[TOP].int_valである「lablex」とラベル付けされた場所にジャンプしたいと思います。どうすればこれを処理できますか?
サンプルコード:
しかし、問題があると思ったので、どうすればよいですか?
エラー:
output.cpp:関数内'int main()':
output.cpp:101:エラー:タイプ'std :: basic_string、std ::allocator>'からタイプ'__jmp_buf_tag(*)[1]'</p>への無効なキャスト
c++ - jmp_buf をポインタとして指定
jmp_buf をポインターとして定義し、ネストされた longjmp(s) で使用しようとしています。次のように:
そうでなければ書く:
保存された bfj を longjmp に使用する別の場所
DS[TOP].int_val は、保存した場所です。明らかなように、ネストされた goto を実行し、保存された bfj を使用して戻りたいと考えています。しかし、デバッグしようとすると、「未処理の例外」が発生します。私はまさに出発点でこれを取得します:
どなたか解決策を教えていただけると幸いです。
c++ - ジョブ/スレッドをクラッシュから隔離する方法
私は、比較的大ざっぱな、または危険なプラットフォーム固有の作業を行うサードパーティのライブラリにさまざまなタスクを委託しているライブラリに取り組んでいます。(具体的には、LLVM や libjit などの JIT コンパイラを呼び出してマシン コードを構築する数学関数パーサーを作成しています。) 実際には、これらのサードパーティ製ライブラリはクラッシュする傾向があります (一部は私のせいです)。 、もちろん、しかし私はまだいくつかの保険が欲しい)。
次に、私のコードの残りの部分 (または私のライブラリ関数を呼び出すユーザーのコード) をダウンさせることなく、恐ろしく死んでいくジョブ (SIGSEGV、SIGILL など) を非常に優雅に処理できるようにしたいと考えています。明確にするために、その特定のジョブが続行できるかどうかは気にしません (クラッシュ状態を修復しようとするつもりはありません)。また、そのようなクラッシュの後のオブジェクトの状態についてもあまり気にしません (破棄します)。クラッシュが発生した場合はすぐにそれらを削除します)。クラッシュが発生したことを検出し、クラッシュがプロセス全体を停止するのを止め、クラッシュしているものの呼び出しを停止し、実行を再開できるようにしたいだけです。
(もう少し詳しく説明すると、現在のコードは for ループであり、利用可能な JIT コンパイラをそれぞれテストしています。これらのコンパイラの一部はクラッシュする可能性があります。クラッシュした場合は、continue;別のコンパイラを実行してテストを続けたいと思います。 )
現在、signal()かなりひどく失敗するベースの実装があります。もちろん、シグナル ハンドラのアウトは未定義の動作longjmp()であり、シグナル ハンドラはexit()orで終わることがほとんど期待されていterminate()ます。コードを別のスレッドに投げ込むだけでは、少なくとも私がこれまでにテストした方法では役に立ちません。また、C++ 例外を使用してこれを機能させる方法をハックすることもできません。
では、特定の一連の命令/スレッド/ジョブをクラッシュから隔離する最善の方法は何でしょうか?
c - setjmp と GCC の合法的な使用
GCC(私にとっては4.0)を使用すると、これは合法です:
2003 年に GCC で問題が発生したという議論を見つけましたが、今では修正されていると思います。setjmpC 標準では、次の 4 つの条件のいずれかである場合を除き、使用は違法であると規定されています。
- 関係演算子または等値演算子の 1 つのオペランドと、他のオペランドが整数定数式であり、結果の式が選択ステートメントまたは反復ステートメントの制御式全体になります。
しかし、これが GCC 拡張機能である場合、GCC で動作することを保証できますか? 既に非標準の機能であるためです。私はそれをテストし、実際にそれを破るためにどれだけのテストをしなければならないかわかりませんが、うまくいくように見えました. __builtin_expect(非 GCC の no-op として定義されているマクロの背後に呼び出しを隠しているため、他のコンパイラでは完全に合法です。)
c++ - longjmp と RAII
abort()そのため、残念ながら特定のエラーを処理するために使用するライブラリ(私が作成したものではありません)があります。アプリケーション レベルでは、これらのエラーは回復可能であるため、ユーザーがクラッシュするのではなく、エラーを処理したいと考えています。したがって、次のようなコードを書くことになります。
非常にエレガントなコードではありません。このパターンはコードのいくつかの場所で繰り返さなければならないので、少し単純化し、再利用可能なオブジェクトにラップしたいと思います。私の最初の試みは、RAII を使用してシグナル ハンドラーのセットアップ/ティアダウンを処理することです (各関数で異なるエラー処理が必要なため、実行する必要があります)。だから私はこれを思いついた:
確かに の体はこの方functionがはるかに単純で明快ですが、今朝、ある考えが浮かびました。これは動作することが保証されていますか? ここに私の考えがあります:
setjmp/の呼び出し間で揮発性または変化する変数はありませんlongjmp。- と
longjmp同じスタック フレーム内の場所に移動し、setjmp通常returnは ing を実行するため、関数の終了ポイントでコンパイラが出力したクリーンアップ コードをコードが実行できるようにしています。 - 期待どおりに動作するようです。
しかし、これは未定義の動作である可能性が高いと感じています。皆さんはどう思いますか?
c++ - setjmp longjmp 使用時のセグメンテーション違反
私はこの学校のプロジェクトを持っており、setjmp と longjmp を使用して不正確な計算を行うことについてです。プログラムは、シグナル ハンドラにシグナルを送るタイマーを開始します。
タイマーが切れる前に、いくつかの反復計算があります (デモ用に、何も役に立たないループだけです)。このループの最初に setjmp 呼び出しがあり、シグナル ハンドラに longjmp 呼び出しがあります。これは基本的に、ループが途中で計算を停止し、longjmp を呼び出すシグナル ハンドラを実行するように強制します。
私が抱えている問題は、計算部分が非常に短い場合は常にかなり一貫してセグメンテーション違反をしているように見えることですが、計算部分が長い場合 (内部ループに多くの反復がある場合)、問題なく実行されます (まだセグメンテーション違反に遭遇していません)。 . 明らかに、セグメンテーション違反はその計算セクションの周囲の領域で発生しているに違いありませんが、印刷ステートメントを使用する場合と同様に、デバッグによって状況が変化するため、どこから発生しているのかわかりません。
ここに私が持っているコードがあります:
シグナルハンドラで longjmp を使用することに同意しない人もいるかもしれませんが、これは私の教授がそうするように言った方法です。また、longjmp が呼び出された後に SIGALRM のブロックを解除することに注意してください (main の else ステートメントを参照)。
dmesg を見ると、次のようになります。
]
c - C setjmp.h and ucontext.h, which is better?
Hi I'm need to jump from a place to another...
But I would like to know which is better to use, setjmp or ucontext, things like:
- Are setjmp and ucontext portable?
- My code is thread safe using these library?
- Why use one instead another?
- Which is fast and secure?
- ...(Someone please, can answer future question that I forgot to put here?)
Please give a little more information that I'm asking for, like examples or some docs...
I had searching on the web, but I only got exception handling in C like example of setjmp, and I got nothing about ucontex.h, I got that it was used for multitask, what's the difference of it and pthread?
Thanks a lot.
c - setjmp と省略フレーム ポインター
私は自分のコード (setjmp を使用) で断続的にクラッシュするバグを追跡しようとしており、次のように絞り込みました: /O2 でコンパイルすると表示され、/O2 /Oy- で表示されなくなります。フレームポインタ。
http://msdn.microsoft.com/en-us/library/2kxx5t2c(v=vs.80).aspxは、setjmp にはフレーム ポインターが必要であることを示唆しています。したがって:
setjmp を使用するプログラムが /O2 でコンパイルされると、Visual C++ は、断続的なスタック破損を引き起こすコードをサイレント モードで生成するようです。これは本当ですか、それとも何か不足していますか?
setjmp を呼び出す関数のみをフレーム ポインターでコンパイルする必要があるように思われます。プログラムの残りの部分 (longjmp を呼び出す関数であっても) は、フレーム ポインターを省略してもかまいません。これは本当ですか?
編集:もう少し絞り込みました。
setjmp を呼び出していた関数でフレーム ポインターを有効にしても違いはありませんでしたが、これは、コンパイラーが既にそれを実行していたためであり、実行する必要があることに明らかに気づき、自動的に実行していました。
違いがあったのは、メインでフレーム ポインターを有効にしたことです。クラッシュはメインから返ってきたので、それは思ったほど奇妙ではありません。考えてみると、setjmp の使用法を Google で簡単に検索すると、すべての例が main で実行されます。おそらく、マイクロソフトのコンパイラ チームがその方法でしかテストしなかったのでしょう。
これは慣用的な使用方法ですが、おそらく最善の回避策は、setjmp を使用する関数を main にインライン化することです。
c - longjmp はどのように機能しますか?
longjmp 関数がどのように機能するかを理解する必要があります。私はそれが何をするかを知っていますが、それがどのように行うかを知る必要があります.
gdb のコードを disas しようとしましたが、いくつかの手順を理解できません。コードは次のとおりです。
誰かがコードを簡単に説明してくれたり、システム内のソース コードの場所を教えてくれませんか?