自動プログラム検証ツールの検証で信頼性向上を目指す
新しい方法が自動プログラム検証への信頼を高める。
― 1 分で読む
自動プログラム検証ツールは、プログラムが指定されたルールに従って正しく動作することを確認するためのツールだよ。これを実現するために、BoogieやWhy3みたいな中間検証言語(IVL)を使うツールが多いんだ。このプロセスは主に2つの部分があるよ。まず、ツールがプログラムをこの中間言語に翻訳する。次に、翻訳されたプログラムが必要なルールを満たしているかをチェックする。このチェックは、特定の条件が真であるかを判断するツールであるソルバーを使って行われるんだ。
これらの検証ツールが正しく機能するための重要な要件は、元のプログラムからIVLへの翻訳が、その意図された動作を正確に反映していることだよ。また、最終的なチェックは、プログラムが正しいと確認された場合にのみ正しさを報告する必要があるから、翻訳とチェックの両方のプロセスがしっかりしていることが重要なんだ。
この記事では、中間検証言語への翻訳を検証するための新しい方法を紹介するよ。私たちのアプローチは、翻訳が元のプログラムを正しく表現していることを保証する正式な保証を提供するんだ。これによって、自動プログラム検証ツールをより信頼性の高いものにできるんだ。
背景
自動プログラム検証では、2つの主要なタスクが必要なんだ:
プログラムの翻訳:最初のタスクは、元のプログラムを中間検証言語に変換すること。これは、検証プロセスがプログラムの簡素化されたバージョンで働く必要があるから重要なんだ。この翻訳は、元のプログラム言語とIVLの間に違いがあるため、簡単ではないんだ。
ソルバーによるチェック:翻訳の後、次のタスクはソルバーを使って、翻訳されたプログラムが期待通りに動作するかを検証すること。このソルバーは、プログラムがその仕様に対して正しいかどうかを表現する論理式を評価するんだ。
検証ツールの信頼性を確保するためには、これらのステップが実装においても理論的基盤だけでなく、しっかりしている必要がある。妥当性とは、正しい翻訳がIVL内で正しいプログラムをもたらし、ソルバーがプログラムの正しさを正しく特定できることを意味するんだ。
検証における挑戦
翻訳を検証する際に克服しなければならないいくつかの障害があるんだ:
意味のギャップ:最初の挑戦は、元のプログラム言語とIVLとの間の大きな違いから生じるんだ。それぞれの言語は変数、メモリ、操作を扱うアプローチが異なることが多く、忠実な翻訳を確保するのが難しいんだ。
多様な翻訳:元のプログラムの同じ機能に対して異なる翻訳が使われることがあって、翻訳ツールの改善や最適化に伴って時間が経つにつれて変わることがあるんだ。この翻訳の多様性が検証プロセスを複雑にするんだ。
非局所チェック:翻訳を検証する際には、プログラムのさまざまな部分に依存する特性をチェックすることが頻繁にあるんだ。このチェックは翻訳が行われる場所にはない場合が多く、依存関係を追跡して正しさを確保するのが難しくなるんだ。
提案する方法論
これらの挑戦に取り組むために、元のプログラムからIVLへの翻訳を妥当性を持って検証できる正式な検証方法論を提案するよ。このアプローチは、いくつかの主要な要素で構成されているんだ:
正式な意味論:元のプログラム言語とIVLの両方に対して明確で正式な意味論を確立することが、どの検証作業においても基礎となるんだ。この意味論は、それぞれの言語の構造の意味を定義するんだ。
証明生成:この方法論は、翻訳の正しさを示す証明を自動的に生成するんだ。これらの証明は独立してチェックできるから、翻訳が元のプログラムの意図した動作を忠実に捉えていることを確信できるんだ。
モジュール化:このアプローチは、翻訳のさまざまな側面を別々に扱えるモジュール設計を採用しているんだ。このモジュール化によって、複雑な翻訳を考えるのが楽になり、検証でのエラーのリスクが減るんだ。
前方シミュレーション:この方法論の核心は、前方シミュレーションという概念に基づいているんだ。これによって、元のプログラムの動作と翻訳されたプログラムの動作をつなぐ検証プロセスが可能になるんだ。元のプログラムの任意の実行が翻訳されたプログラムの実行でシミュレーションできることを示すことで、翻訳を通じて正しさが保たれることを確保できるんだ。
ViperとBoogieへの適用
私たちの方法は、プログラム検証に使われる命令型言語のViperと、さまざまなプログラミング言語からの翻訳の対象となるIVLであるBoogieの文脈で実装されたんだ。
Viperの特徴
Viperは、ヒープメモリを操作するプログラムについての推論を可能にする分離論理のような先進的な検証技術をサポートするように設計されているんだ。この能力は、IVLへの翻訳時に複雑さをもたらし、特にパーミッションの管理やヒープアクセスの表現に関して問題になるんだ。
Boogieの役割
Boogieは、プログラムの意味論を正しさを検証できる論理式に変えることで、検証プロセスを簡素化するんだ。Viperに見られる動的フレームや複雑な主張などの先進的な機能は直接サポートされていなくて、これらの機能をBoogieが扱える簡素な構造に慎重に翻訳する必要があるんだ。
方法論の実装
私たちの方法論は、ViperからBoogieへの翻訳を検証するために適用されたんだ。この実装には、妥当性を確保するためのいくつかのステップが含まれているんだ:
翻訳の証明:ViperからBoogieへのすべての翻訳に対して、対応する証明が生成される。この証明は、翻訳されたプログラムが両方の言語に確立された意味論に従って正しく動作することを示すんだ。
ツール統合:私たちは、Viperの検証ツールに私たちの検証アプローチを統合して、翻訳プロセスの中で自動的に証明を生成できるようにしたんだ。
多様な例の検証:私たちの評価には、多様なViperプログラムを含めて、私たちの方法がさまざまなシナリオや翻訳ケースで動作することを保証しているんだ。
方法論の評価
私たちの検証方法論の効果を評価するために、さまざまなViperプログラムを使って実験を行ったんだ。結果は、私たちのアプローチが独立した定理証明器でチェックできる証明を成功裏に生成したことを示しているんだ。
ベンチマーク
ベンチマークでは、異なる複雑性を持つViperファイルをいくつか収集したんだ。これらのファイルに含まれるViperメソッドの数、ViperとBoogie実装の行数、生成された証明の数、定理証明器がこれらの証明をチェックするのにかかる時間を測定したんだ。
結果は、私たちの検証プロセスが効果的かつ効率的であり、大きくて複雑な例を合理的な時間内に処理できることを示しているんだ。
結論
中間検証言語への翻訳を正式に検証するための提案された方法論は、自動プログラム検証ツールの信頼性を高めるんだ。意味のギャップ、多様な翻訳、非局所チェックに関連する挑戦に取り組むことで、検証ツールの妥当性を保証する基盤を提供しているんだ。
私たちの作業は、自動プログラム検証が信頼できるものであることを確認するための重要な一歩となり、正しさが重要な現実のアプリケーションでこれらのツールの使用を可能にしているんだ。今後の作業は、Viperのサポート機能を拡張し、私たちの方法論を他の検証シナリオ、特に同時プログラムやオブジェクト指向プログラムに適用することに焦点を当てていくつもりだよ。
タイトル: Towards Trustworthy Automated Program Verifiers: Formally Validating Translations into an Intermediate Verification Language (extended version)
概要: Automated program verifiers are typically implemented using an intermediate verification language (IVL), such as Boogie or Why3. A verifier front-end translates the input program and specification into an IVL program, while the back-end generates proof obligations for the IVL program and employs an SMT solver to discharge them. Soundness of such verifiers therefore requires that the front-end translation faithfully captures the semantics of the input program and specification in the IVL program, and that the back-end reports success only if the IVL program is actually correct. For a verification tool to be trustworthy, these soundness conditions must be satisfied by its actual implementation, not just the program logic it uses. In this paper, we present a novel validation methodology that, given a formal semantics for the input language and IVL, provides formal soundness guarantees for front-end implementations. For each run of the verifier, we automatically generate a proof in Isabelle showing that the correctness of the produced IVL program implies the correctness of the input program. This proof can be checked independently from the verifier, in Isabelle, and can be combined with existing work on validating back-ends to obtain an end-to-end soundness result. Our methodology based on forward simulation employs several modularisation strategies to handle the large semantic gap between the input language and the IVL, as well as the intricacies of practical, optimised translations. We present our methodology for the widely-used Viper and Boogie languages. Our evaluation shows that it is effective in validating the translations performed by the existing Viper implementation.
著者: Gaurav Parthasarathy, Thibault Dardinier, Benjamin Bonneau, Peter Müller, Alexander J. Summers
最終更新: 2024-05-09 00:00:00
言語: English
ソースURL: https://arxiv.org/abs/2404.03614
ソースPDF: https://arxiv.org/pdf/2404.03614
ライセンス: https://creativecommons.org/licenses/by/4.0/
変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。
オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。