$30 off During Our Annual Pro Sale. View Details »

形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kerne...

Avatar for y_taka_23 y_taka_23
December 06, 2025

形式手法特論:CEGAR を用いたモデル検査の状態空間削減 #kernelvm / Kernel VM Study Hokuriku Part 8

Kernel/VM 探検隊@北陸 Part 8 で使用したスライドです。

モデル検査は形式手法の一種であり、システムやプログラムを Kripke 構造と呼ばれるグラフに変換し、与えられた仕様に反した状態に到達しないことを網羅的・自動的に検査する技術です。全自動でシステマティックに検査が可能である点では有望ですが、同時に、現実的なプログラムをモデル検査にかけようとすると状態数の爆発が問題となり、産業界への普及の障害の一つとなっていました。

この問題に対して、Clarke らによって 2000 年に提案された手法が CEGAR(CounterExample-Guided Abstraction Refinement)です。

https://doi.org/10.1007/10722167_15

CEGAR ではまず、プログラムの動作を変えないように変数の振る舞いを抽象化(abstraction)することで、検査対象となるグラフを単純化し状態数を削減します。このとき、抽象化したグラフで反例が検出できなければ、元となるグラフにも反例は存在しません。しかし逆は成り立たず、元となるグラフに反例が存在しないにも関わらず、抽象化したことによって新たに反例が生じることがあります。このような反例を偽反例(spurious counterexample)と呼びます。

そこで CEGAR では次の段階として、詳細化(refinement)を行います。具体的には、抽象化された側で見つかった(偽反例の可能性がある)反例に対して、元の問題の側に引き戻して考え、もし元のグラフとは両立し得ない場合は偽反例と判断します。その場合、偽反例の元となっている過剰な抽象化を特定し、抽象化を緩め、この手続を繰り返すことで、元の構造をより正確に反映したグラフを得ることができます。

今回の講演では、シンプルなログイン処理を模した具体例を用いて、CAGAR の抽象化 - 詳細化の処理の流れを図を使って解説しています。

Avatar for y_taka_23

y_taka_23

December 06, 2025
Tweet

More Decks by y_taka_23

Other Decks in Technology

Transcript

  1. 例:ログイン処理の状態遷移 • 4 個の Bool 変数フラグからなる系 ◦ loggedIn:ログインセッションが有効 ◦ trusted:デバイスが信頼済み

    ◦ redirect:ログイン画面へのリダイレクトフラグ ◦ locked:アカウントがロック状態 • 検査したい仕様「locked ならば必ず redirect」
  2. TTTT FTTT TTFT FTFT TFTT FFTT TFFT FFFT TTTF FTTF

    TTFF FTFF TFTF FFTF TFFF FFFF 仕様 locked -> redirect に対する違反
  3. locked locked -> redirect TTTT T T TFTT T T

    FTTT T T FFTT T T TTFT T F TFFT T F FTFT T F FFFT T F locked locked -> redirect TTTF F T TFTF F T FTTF F T FFTF F T TTFF F T TFFF F T FTFF F T FFFF F T
  4. locked locked -> redirect TTTT T T TFTT T T

    FTTT T T FFTT T T TTFT T F TFFT T F FTFT T F FFFT T F locked locked -> redirect TTTF F T TFTF F T FTTF F T FFTF F T TTFF F T TFFF F T FTFF F T FFFF F T
  5. *FTT **TT TTTT FTTT FFTT TFTT *TTT TTTT FTTT FFTT

    TFTT 初期状態 違反状態 初期状態 違反状態 trusted(二つ目の変数)で詳細化しても 偽反例パスの原因となっている状態が分離できない
  6. **TT TTTT FTTT FFTT TFTT 初期状態 違反状態 初期状態 違反状態 loggedIn(一つ目の変数)で詳細化すれば

    偽反例パスの原因となっている状態が分離できる T*TT TTTT FTTT FFTT TFTT F*TT