[論文レビュー] Array-Carrying Symbolic Execution for Function Contract Generation
数式実行フレームワークが配列不変量と連続配列セグメントを保持して、ACSL/Frama-Cで関数契約を合成する。LLVM上で実装され、外部不変性生成器と統合される。
Function contract generation is a classical problem in program analysis that targets the automated analysis of functions in a program with multiple procedures. The problem is fundamental in inter-procedural analysis where properties of functions are first obtained via the generation of function contracts and then the generated contracts are used as building blocks to analyze the whole program. Typical objectives in function contract generation include pre-/post-conditions and assigns information (that specifies the modification information over program variables and memory segments during function execution). In programs with array manipulations, a crucial point in function contract generation is the treatment of array segments that imposes challenges in inferring invariants and assigns information over such segments. To address this challenge, we propose a novel symbolic execution framework that carries invariants and assigns information over contiguous segments of arrays. We implement our framework as a prototype within LLVM, and further integrate our prototype with the ACSL assertion format and the Frama-C software verification platform. Experimental evaluation over a variety of benchmarks from the literature and functions from realistic libraries shows that our framework is capable of handling array manipulating functions that indeed involve the carry of array information and are beyond existing approaches.
研究の動機と目的
- 配列を操作する関数の前提条件/後条件および代入の自動生成を実現する。
- シンボリック実行中にループ不変量と要約を外部の不変生成器で供給する。
- プログラム経路全体で連続配列セグメントと分離不変量を維持・伝搬する。
- 配列セグメントの変更とループ退出を正確に表現する契約を可能にする。
- プロトタイプをACSLとFrama-Cと統合してエンドツーエンドの検証を実現する。
提案手法
- 実行パスに沿って不変量と連続配列セグメントを保持する数式実行フレームワークを提案する。
- 解析中にループ不変量とループ要約を供給するために外部不変生成器を使用する。
- 配列をメモリモデルとSeg構造で表現し、連続配列セグメントと内容パターンを追跡する。
- 分岐、分割、統合を扱い、正確なセグメントレベル情報を保持する。
- C++ LLVMプロトタイプ(約19000行)を実装し、外部検証のためにACSL/Frama-Cと統合する。
- 経路条件とメモリの変化から前提条件・後条件・代入を導出して、最終的な記号配置から関数契約を推定する。

実験結果
リサーチクエスチョン
- RQ1シンボリック実行を用いて配列を操作する関数の契約を自動的に合成するにはどうすればよいか。
- RQ2外部不変生成器を効果的に統合して、シンボリック実行中のループ不変量と要約を供給できるか。
- RQ3正確な代入情報を得るために、連続配列セグメントをどのように表現・統合・分割すべきか。
- RQ4実世界のライブラリに対して本手法が前提条件・後条件をどれだけ正確に生成できるか。
主な発見
- このフレームワークは、分離不変量と連続配列セグメントを保持することにより、配列を操作する挙動を正確に記述する関数契約を生成する。
- 拡張されたメモリモデルとSeg構造により、連続配列セグメントとその内容パターンを追跡できる。
- ACSLとFrama-Cとの統合により、外部検証器による検証が可能になる。
- 実験評価は、既存のアプローチを超える配列操作関数をこのフレームワークが扱えることを示している。
- プロトタイプは、LLVM実装と外部不変バックエンドを組み合わせて契約合成を実現できることを示す。

より良い研究を、今すぐ始めましょう
論文設計から論文執筆まで、研究時間を劇的に削減しましょう。
クレジットカード登録不要
このレビューはAIが作成し、人間の編集者が確認しました。