問題タブ [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 - jmp_buf構造体でのバッファオーバーフローの悪用
jmp_buf構造体のバッファオーバーフローを利用するための支援が必要です。
スタックには次の値があります(gdbで確認)。
2番目は次のIP(setjmpの後)ですが、それを変更してもプログラムの動作は変更されません。
最後の値を変更した場合にのみ、フローを変更できる(そしてセグメンテーションを取得できる)ことに気づきました。
しかし、最後の単語の意味と、それを変更して目的の動作を実現する方法がわかりません。
linux - setjmp と longjmp - 例で理解する
setjmp と longjmp の定義を知っています。setjmp は環境をスタック コンテキストに保存し、もう一方は復元します。
ただ、私の理解不足はどこかにあると思います。どうすれば保証できるか、どのように保存され、どのように復元されるかについて、良い例を挙げて説明してもらえますか?
jmp_buf で指定されている CPU レジスタが多数あることがわかりました。しかし、どうすればそれが復元されたことを保証できますか?
きちんとした例で説明するのを手伝ってください。スタックオーバーフローに関する他の質問をグーグルで参照しましたが、明確な例はありません。
事前に多大な感謝を申し上げます。
PS: Linux/Unix コンテキストのみからのものである必要があります。
c - sigsetjmpをリセットして再び「0」を返すことはできますか(sigsetjmpをリセット)?
sigsetjmpとsiglongjmpを使用して、セグメンテーション違反ハンドラーを作成しました。シグナルハンドラーに移動したら、siglongjmpを呼び出して、誤った命令をスキップします。
問題は、もう一度SIGSEGVを発生させて同じハンドラーに移動したいのですが、sigsetjmpは1を返します。
sigsetjmpをリセットする方法は?
これが私のコードです:
c++ - setjmp がスタックを保存しないのはなぜですか?
setjmp がスタックを保存しないのはなぜですか?
次のコードを検討してください。
私が例外としているのは、コードがメインから関数に前後にジャンプし、毎回増加する数を逆に表示することです。
実際に起こることは、それが印刷0され、その後1無限に繰り返されることです。関数にジャンプして戻ると、スタックがデフォルトにリセットされるかのようです。なぜそれをしているのですか?スタックも保存する方法はありますか?コーディング スタイルや読み取り可能なコードに関しては、さらに悪いことは
わかっsetjmpていますが、現在実験中であり、このコードが使用可能なアプリケーションの光を見ることはおそらくないでしょう。longjmpgoto
c++ - C++ライブラリにリンクするときのCでのsetjmpおよびlongjmpの使用
C ++で実装されている(ただしC APIを備えている)ライブラリにリンクするCプログラムでsetjmpとlongjmpを使用したいと思います。
C ++コードは動的メモリ割り当てを行い、ポインタはAPIを介して渡されますが、コードのC側がそれらの(不透明な)オブジェクトを正しく管理している限り、longjmpを使用するときに混乱することはありませんよね?
これらの関数をC++コードで使用するのは安全ではないことは知っていますが、C ++コードにリンクされているCコードでは安全である必要がありますか?
c++ - 「goto」でキャッチブロックから飛び出した場合、例外オブジェクトが解放されることが保証されますか?
私は次のようなコードを持っています
私の質問は、C ++ランタイムによって保存される例外オブジェクトはgoto、catchブロックから出たときに解放されますか?または、ランタイムは、周囲の関数またはそのようなものが存在するまで、それをキャッシュすることを許可されていますか?上記のコードを複数回実行する場合、巻き戻しコードを取得するたびに、メモリがリークしないようにしたいだけです(longjmpコンパイラによって生成されたクリーンアップコードが関数プロローグ内またはその前に実行されないため)。
c - シグナルハンドラーからLongjmp?
質問から:
Cでsetjmpとlongjmpを使用するのは良いプログラミング手法ですか?
残されたコメントの2つは言った:
「シグナルハンドラで例外をスローすることはできませんが、何をしているのかを知っている限り、longjmpを安全に実行できます。– Dietrich Epp8月31日19:57@Dietrich:コメントに+1。これはあまり知られておらず、完全に過小評価されている事実です。シグナルハンドラーからlongjmpを使用しないと解決できない問題(厄介な競合状態)がいくつかあります。システムコールのブロックの非同期中断が典型的な例です。」
例外的な条件(たとえば、ゼロ除算)が発生したときに、カーネルによってシグナルハンドラーが呼び出されたという印象を受けました。また、特別に登録した場合にのみ呼び出されます。
これは、(私には)通常のコードでは呼び出されないことを意味しているように見えます。
その考えを続けてください...私が理解しているように、setjmpとlongjmpは、スタックを前のポイントと状態に折りたたむためのものです。シグナルハンドラーが呼び出されたときにスタックを折りたたむ方法がわかりません。これは、独自のコードからではなく、カーネルから1回限りの状況として呼び出されるためです。シグナルハンドラからスタックの次のものは何ですか!?
c++ - C ++でgotoとlongjmpを(計算)する方法は?
私は通常C++をコーディングしませんが、私の奇妙な計算機科学の友人は、私のすばらしいFORTRANプログラムを見るのにうんざりし、私のC ++コードの方が好きなので、そのうちの1つをC++で書き直すように要求しました。(ここでお金を賭けています。)正確な用語は、最新のC++コンパイラーでコンパイル可能である必要があるということです。多分彼は良いconio.hを嫌っています-私は知りません。
今では、C ++で書くのに完全に良い方法があることに気づきましたが、C ++バージョンを可能な限りFORTRAN風にすることで、ここで個人的な勝利を収めようとしています。ボーナスポイントについては、コードを変換するときに時間と労力を節約できる可能性があります。
それで!これにより、次の関連クエリが表示されます。
gotosについて:
- どのように後藤を動かしますか?
- C ++でのgotoの制約は何ですか?
- スコープについて何か懸念はありますか?(私は可能な限りグローバルにスコープを設定しようとしますが、あなたは決して知りません。)
- GCC拡張機能を使用してvoidポインター配列に移動する場合、未定義の動作などに関する新しい懸念はありますか?
longjmpの場合:
- longjmpをどのように安全に使用しますか?
- C ++でのlongjmpsの制約は何ですか?
- スコープに対して何をしますか?
- longjmpが安全であるように見える特定の瞬間はありますが、実際には注意する必要はありませんか?
- longjmpを使用して計算されたgotoをどのようにシミュレートしますか?
- プログラムに関数が1つしかない場合、gotoよりもlongjmpを使用することに具体的なメリットはありますか?
今のところ、私の主な関心事は、このために計算されたgotoを機能させることです。voidポインタ配列はC++標準の一部ではなく、GCC固有の拡張機能であるため、おそらくlongjmpを使用してこれを機能させるようです。
c - これらの破壊された変数の警告はどのような意味を持ちますか?
私はこのような機能を持っています:
GCC (gcc (Debian 4.4.5-8) 4.4.5) は警告を出します:
どうして????xつまり、返品後は使用できない可能性があるため、が壊れているかどうかは明らかに気にしませんsetjmp。コンパイラでさえ、ある種の特別な知識を持っていることを考えると、非常に明白なことを認識しているはずですsetjmp。
私の主な関心は、継承したコード ベースのバグを見つけることなので、「代わりにこのコーディング スタイルを使用してください」というアドバイスは求めていません。ただし、ここには多くの奇妙なひねりがあります。たとえば、xがパラメーターではなくローカル変数である場合、GCC は文句を言いません。また、GCC はこの行がなくても文句を言いませんif (some_global)。良い。何かが GCC のフロー解析を台無しにしているか、GCC が私が知らない何かを知っているのかもしれません。
そう、
未使用のパラメーターをにキャストできるのと同じ方法で、この関数のこの警告を抑制する簡単な方法はあります
(void)か?それとも、プロジェクト全体で警告を抑制するだけですか?
または、何か不足していますか?
更新:警告を生成しないわずかに異なるバージョンを共有させてください:
c++ - 含めるときにstd名前空間にsetjmpがないのはなぜですか?
タイトルはそれをすべて言います。を含めた後<csetjmp>、longjmpとjmp_bufはstd名前空間にありますが、そうでsetjmpはありません。MinGW4.5 と MSVC10 でこれを確認しました。ヘッダーを調べたところ<csetjmp>、この選択の理由がわかりませんでした。私は常に、すべてのファイルが名前空間で<cheader>a をラップしていると想定してい<header.h>ました。std
私が間違っている ?setjmp特殊なケースの背後にある理論的根拠は何ですか? 教えてください!
注 : C++ で setjmp/longjmp を誤用する問題を認識しています。