問題タブ [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.

0 投票する
1 に答える
1544 参照

c - jmp_buf構造体でのバッファオーバーフローの悪用

jmp_buf構造体のバッファオーバーフローを利用するための支援が必要です。

スタックには次の値があります(gdbで確認)。

2番目は次のIP(setjmpの後)ですが、それを変更してもプログラムの動作は変更されません。

最後の値を変更した場合にのみ、フローを変更できる(そしてセグメンテーションを取得できる)ことに気づきました。

しかし、最後の単語の意味と、それを変更して目的の動作を実現する方法がわかりません。

0 投票する
1 に答える
6832 参照

linux - setjmp と longjmp - 例で理解する

setjmp と longjmp の定義を知っています。setjmp は環境をスタック コンテキストに保存し、もう一方は復元します。

ただ、私の理解不足はどこかにあると思います。どうすれば保証できるか、どのように保存され、どのように復元されるかについて、良い例を挙げて説明してもらえますか?

jmp_buf で指定されている CPU レジスタが多数あることがわかりました。しかし、どうすればそれが復元されたことを保証できますか?

きちんとした例で説明するのを手伝ってください。スタックオーバーフローに関する他の質問をグーグルで参照しましたが、明確な例はありません。

事前に多大な感謝を申し上げます。

PS: Linux/Unix コンテキストのみからのものである必要があります。

0 投票する
1 に答える
1614 参照

c - sigsetjmpをリセットして再び「0」を返すことはできますか(sigsetjmpをリセット)?

sigsetjmpとsiglongjmpを使用して、セグメンテーション違反ハンドラーを作成しました。シグナルハンドラーに移動したら、siglongjmpを呼び出して、誤った命令をスキップします。

問題は、もう一度SIGSEGVを発生させて同じハンドラーに移動したいのですが、sigsetjmpは1を返します。

sigsetjmpをリセットする方法は?

これが私のコードです:

0 投票する
1 に答える
431 参照

c++ - setjmp がスタックを保存しないのはなぜですか?

setjmp がスタックを保存しないのはなぜですか?
次のコードを検討してください。

私が例外としているのは、コードがメインから関数に前後にジャンプし、毎回増加する数を逆に表示することです。
実際に起こることは、それが印刷0され、その後1無限に繰り返されることです。関数にジャンプして戻ると、スタックがデフォルトにリセットされるかのようです。なぜそれをしているのですか?スタックも保存する方法はありますか?コーディング スタイルや読み取り可能なコードに関しては、さらに悪いことは
わかっsetjmpていますが、現在実験中であり、このコードが使用可能なアプリケーションの光を見ることはおそらくないでしょう。longjmpgoto

0 投票する
3 に答える
861 参照

c++ - C++ライブラリにリンクするときのCでのsetjmpおよびlongjmpの使用

C ++で実装されている(ただしC APIを備えている)ライブラリにリンクするCプログラムでsetjmpとlongjmpを使用したいと思います。

C ++コードは動的メモリ割り当てを行い、ポインタはAPIを介して渡されますが、コードのC側がそれらの(不透明な)オブジェクトを正しく管理している限り、longjmpを使用するときに混乱することはありませんよね?

これらの関数をC++コードで使用するのは安全ではないことは知っていますが、C ++コードにリンクされているCコードでは安全である必要がありますか?

0 投票する
2 に答える
709 参照

c++ - 「goto」でキャッチブロックから飛び出した場合、例外オブジェクトが解放されることが保証されますか?

私は次のようなコードを持っています

私の質問は、C ++ランタイムによって保存される例外オブジェクトはgoto、catchブロックから出たときに解放されますか?または、ランタイムは、周囲の関数またはそのようなものが存在するまで、それをキャッシュすることを許可されていますか?上記のコードを複数回実行する場合、巻き戻しコードを取得するたびに、メモリがリークしないようにしたいだけです(longjmpコンパイラによって生成されたクリーンアップコードが関数プロローグ内またはその前に実行されないため)。

0 投票する
6 に答える
8275 参照

c - シグナルハンドラーからLongjmp?

質問から:

Cでsetjmpとlongjmpを使用するのは良いプログラミング手法ですか?

残されたコメントの2つは言った:

「シグナルハンドラで例外をスローすることはできませんが、何をしているのかを知っている限り、longjmpを安全に実行できます。– Dietrich Epp8月31日19:57@Dietrich:コメントに+1。これはあまり知られておらず、完全に過小評価されている事実です。シグナルハンドラーからlongjmpを使用しないと解決できない問題(厄介な競合状態)がいくつかあります。システムコールのブロックの非同期中断が典型的な例です。」

例外的な条件(たとえば、ゼロ除算)が発生したときに、カーネルによってシグナルハンドラーが呼び出されたという印象を受けました。また、特別に登録した場合にのみ呼び出されます。

これは、(私には)通常のコードでは呼び出されないことを意味しているように見えます。

その考えを続けてください...私が理解しているように、setjmpとlongjmpは、スタックを前のポイントと状態に折りたたむためのものです。シグナルハンドラーが呼び出されたときにスタックを折りたたむ方法がわかりません。これは、独自のコードからではなく、カーネルから1回限りの状況として呼び出されるためです。シグナルハンドラからスタックの次のものは何ですか!?

0 投票する
7 に答える
3163 参照

c++ - C ++でgotoとlongjmpを(計算)する方法は?

私は通常C++をコーディングしませんが、私の奇妙な計算機科学の友人は、私のすばらしいFORTRANプログラムを見るのにうんざりし、私のC ++コードの方が好きなので、そのうちの1つをC++で書き直すように要求しました。(ここでお金を賭けています。)正確な用語は、最新のC++コンパイラーでコンパイル可能である必要があるということです。多分彼は良いconio.hを嫌っています-私は知りません。

今では、C ++で書くのに完全に良い方法があることに気づきましたが、C ++バージョンを可能な限りFORTRAN風にすることで、ここで個人的な勝利を収めようとしています。ボーナスポイントについては、コードを変換するときに時間と労力を節約できる可能性があります。

それで!これにより、次の関連クエリが表示されます。

gotosについて:

  1. どのように後藤を動かしますか?
  2. C ++でのgotoの制約は何ですか?
  3. スコープについて何か懸念はありますか?(私は可能な限りグローバルにスコープを設定しようとしますが、あなたは決して知りません。)
  4. GCC拡張機能を使用してvoidポインター配列に移動する場合、未定義の動作などに関する新しい懸念はありますか?


longjmpの場合:

  1. longjmpをどのように安全に使用しますか?
  2. C ++でのlongjmpsの制約は何ですか?
  3. スコープに対して何をしますか?
  4. longjmpが安全であるように見える特定の瞬間はありますが、実際には注意する必要はありませんか?
  5. longjmpを使用して計算されたgotoをどのようにシミュレートしますか?
  6. プログラムに関数が1つしかない場合、gotoよりもlongjmpを使用することに具体的なメリットはありますか?

今のところ、私の主な関心事は、このために計算されたgotoを機能させることです。voidポインタ配列はC++標準の一部ではなく、GCC固有の拡張機能であるため、おそらくlongjmpを使用してこれを機能させるようです。

0 投票する
2 に答える
7183 参照

c - これらの破壊された変数の警告はどのような意味を持ちますか?

私はこのような機能を持っています:

GCC (gcc (Debian 4.4.5-8) 4.4.5) は警告を出します:

どうして????xつまり、返品後は使用できない可能性があるため、が壊れているかどうかは明らかに気にしませんsetjmpコンパイラでさえ、ある種の特別な知識を持っていることを考えると、非常に明白なことを認識しているはずですsetjmp

私の主な関心は、継承したコード ベースのバグを見つけることなので、「代わりにこのコーディング スタイルを使用してください」というアドバイスは求めていません。ただし、ここには多くの奇妙なひねりがあります。たとえば、xがパラメーターではなくローカル変数である場合、GCC は文句を言いません。また、GCC はこの行がなくても文句を言いませんif (some_global)。良い。何かが GCC のフロー解析を台無しにしているか、GCC が私が知らない何かを知っているのかもしれません。

そう、

  • 未使用のパラメーターをにキャストできるのと同じ方法で、この関数のこの警告を抑制する簡単な方法はあります(void)か?

  • それとも、プロジェクト全体で警告を抑制するだけですか?

  • または、何か不足していますか?

更新:警告を生成しないわずかに異なるバージョンを共有させてください:

0 投票する
1 に答える
260 参照

c++ - 含めるときにstd名前空間にsetjmpがないのはなぜですか?

タイトルはそれをすべて言います。を含めた後<csetjmp>longjmpjmp_bufstd名前空間にありますが、そうでsetjmpはありません。MinGW4.5 と MSVC10 でこれを確認しました。ヘッダーを調べたところ<csetjmp>、この選択の理由がわかりませんでした。私は常に、すべてのファイルが名前空間で<cheader>a をラップしていると想定してい<header.h>ました。std

私が間違っている ?setjmp特殊なケースの背後にある理論的根拠は何ですか? 教えてください!

注 : C++ で setjmp/longjmp を誤用する問題を認識しています。