setjmp と longjmp の不適切な使用によるクラッシュ

setjmp は、CPU コアのレジスタのセットを jmp_buf の一部に保存します。ローカル変数は保存しないことに注意してください。関数呼び出しが深すぎるときにエラーが発生した場合、longjmp を使用して元の状態に戻ることができますsetjmpの場所. setjmpの戻り値により、setjmpが初めて呼び出されたのか、longjmpから返されたのかが分かります。

setjmpやlongjmpの使用はチェーンコール関係の関数内で行う必要がありますが、並列関数内だと後続の関数でスタックフレームを再利用しているためジャンプバック時にローカル変数が無効となり、各種例外が発生します。

libpng ライブラリは、例外を処理するために多数の setjmp および longjmp を使用します。ビジネス レイヤーがこれらの関数を使用すると、setjmp および longjmp の呼び出しを直接確認できないため、非線形呼び出しが発生し、ローカル ポインター変数が上書きされます。クラッシュ、スタックは 2 層を遡って fp = 0 に遭遇し、続行できませんでした。そのとき、すべてのスタック データが出力され、スタック上の疑わしい命令アドレスに対応するすべての関数が徹底的に解析されました ( nmコマンドでジャンプするコードセグメントの範囲を確認する(不要なデータを渡す)ことで、main関数の呼び出し関係が特定され、最終的にlongjmpの後にローカルポインタ変数が変更されたことを特定することが困難になり、リリースエラーが発生します。

ビジネス コードの呼び出しレベルとシーケンスを調整した後、クラッシュの問題は発生しなくなります。

おすすめ

転載: blog.csdn.net/konga/article/details/122376566