概要
- Fil-C は ucontext API や setjmp/longjmp を安全にサポート
- スタック破壊や権限モデル違反が Fil-C では発生しない設計
- jmp_buf は不正アクセス不可な zjmp_buf で管理
- setjmp/longjmp の危険な挙動を Fil-C がコンパイル時・ランタイムで検出
- メモリ安全性を維持しつつ、例外処理やコルーチン用途を実現
Fil-Cにおけるucontext APIとsetjmp/longjmpの安全なサポート
-
Fil-C は setcontext、 getcontext、 makecontext、 swapcontext (ucontext API)を メモリ安全 にサポート
- これらAPIは 例外処理 や コルーチン、 ファイバー の実装に利用
- longjmp/setjmp はC言語の例外処理やシグナルハンドラからの例外送出に頻用
- ucontext API はBoostなどでファイバー実装に使用
- 一部OS(Darwin等)では非推奨だが、 glibc ではサポート継続
-
API誤用時 の危険性
- setjmp/getcontext 呼び出し後、関数からreturnやスレッド終了で 保存済みスタックフレームが消失
- makecontext で作成したスタックを解放後に swapcontext/setcontext で実行→ ダングリングスタック実行
- swapcontext の引数を逆に指定し、現在実行中のコンテキストへ切り替え→ 未定義動作やクラッシュ
-
Fil-C の安全設計
- 誤用時は panic を発生させ、 ダングリングスタック上での実行不可
- スタック管理を言語ランタイムが制御し、不正なジャンプや復元時に 安全性を保証
- Yolo-C等の従来C処理系では スタック破壊・クラッシュ・脆弱性の発生 が容易
setjmp/longjmpの危険性とFil-Cによる安全化
-
setjmp は呼び出し時の レジスタ・スタックポインタ・命令ポインタ 等を保存
- longjmp で復元し、 setjmp が2回目のreturnを行う
- 保存したフレームが消失 している場合、 スタック破壊 や 未定義動作 へ
-
volatile修飾子 の必要性
- setjmp/longjmp 経由で変数値が期待通り動作するには、対象変数を volatile で宣言
- 最適化やスピルスロット再利用による 値の不整合 を防止
-
コンパイラの対応
- setjmpを検出し、 spill slot再利用禁止 や returns_twice属性 で最適化制御
- setjmp呼び出しを間接参照等で隠蔽すると、 spill slot再利用によるバグや未定義動作 発生
- Fil-Cはこのパターンを コンパイルエラーやpanic で排除
Fil-Cのjmp_bufとzjmp_bufによる安全設計
-
jmp_buf は zjmp_buf という ランタイム管理の不透明オブジェクト へのポインタのみを保持
- Fil-Cコードからzjmp_bufの中身へアクセス不可
- longjmp時は zjmp_bufの有効性検証 を実施し、不正な復元は panic
-
setjmp/longjmpの呼び出し制約
- setjmpシンボルは 直接呼び出しのみ許可、間接参照や関数ポインタ経由は ICE(内部コンパイラエラー)
- 将来的には 詳細な診断メッセージ で警告予定
-
zjmp_bufのライフサイクル管理
- setjmp呼び出し時に zjmp_bufの新規生成とスタックフレームへの登録
- 各スタックフレームは 有効なzjmp_buf集合 を管理
- ジャンプ先の検証 により、 不正なフレーム復元を排除
まとめ:Fil-Cによるメモリ安全な例外・コンテキスト制御
- Fil-C は C言語の危険な例外制御API (setjmp/longjmp、ucontext)を 安全にラップ
- スタック・レジスタ・コンテキストの 一貫した管理 により、 未定義動作・脆弱性を根絶
- 誤用時はpanic で即時検出、 安全な例外処理・コルーチン実装 を実現
- 従来C処理系で発生する難解なバグや攻撃リスク を Fil-C が完全に回避