プログラミングなどなど

プログラミングに関係しそうな内容を

SPIN:-searchオプションを指定した場合の動きについて

PROMELAで記述したモデルから検証器を生成する際にnever claimが2つ以上になると、どれか一つを選択して欲しい旨と-searchオプションを指定する例が出力されます。

本などには以下の流れで記載されていますが、何か違いがあったりするのでしょうか。

  1. 検証器の生成
  2. 検証器のコンパイル
  3. 検証器の実行

straceコマンドを利用して見てみたいと思います。

サンプルソース : sample.pml
byte b = 0;

active proctype p()
{
  if
  :: b = 1;
  :: b = 2;
  fi
}

ltl l01  { <>(b == 1)  }
検証器の生成
$ spin -a sample.pml 
ltl l01: <> ((b==1))
コンパイルと実行
$ gcc -w pan.c -o pan
$ ./pan -a
pan:1: acceptance cycle (at depth 4)
pan: wrote sample.pml.trail

(Spin Version 6.4.9 -- 17 December 2018)
Warning: Search not completed
	+ Partial Order Reduction

Full statespace search for:
	never claim         	+ (l01)
	assertion violations	+ (if within scope of claim)
	acceptance   cycles 	+ (fairness disabled)
	invalid end states	- (disabled by never claim)

State-vector 28 byte, depth reached 5, errors: 1
        4 states, stored
        0 states, matched
        4 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)

Stats on memory usage (in Megabytes):
    0.000	equivalent memory usage for states (stored*(State-vector + overhead))
    0.292	actual memory usage for states
  128.000	memory used for hash table (-w24)
    0.534	memory used for DFS stack (-m10000)
  128.730	total actual memory usage

ltlの追加

サンプルソース(ltl追加) : sample.pml

以下のようにltlを追加します。

byte b = 0;
  
active proctype p()
{
  if
  :: b = 1;
  :: b = 2;
  fi
}

ltl l01  {   <>(b == 1)  }
ltl l01n { !(<>(b == 1)) }
検証器の生成(ltl追加後)

検証器を生成しようとすると1つの場合とは異なりオプションの説明が出力されます。

$ spin -a sample.pml 
ltl l01: <> ((b==1))
ltl l01n: ! (<> ((b==1)))
  the model contains 2 never claims: l01n, l01
  only one claim is used in a verification run
  choose which one with ./pan -a -N name (defaults to -N l01)
  or use e.g.: spin -search -ltl l01 sample.pml
検証器の生成からコンパイル、実行

例に習って-searchオプションを指定してみます。

$ spin -search -ltl l01 sample.pml
ltl l01: <> ((b==1))
ltl l01n: ! (<> ((b==1)))
  the model contains 2 never claims: l01n, l01
  only one claim is used in a verification run
  choose which one with ./pan -a -N name (defaults to -N l01)
  or use e.g.: spin -search -ltl l01 sample.pml
pan: ltl formula l01
pan:1: acceptance cycle (at depth 4)
pan: wrote sample.pml.trail

(Spin Version 6.4.9 -- 17 December 2018)
Warning: Search not completed
	+ Partial Order Reduction

Full statespace search for:
	never claim         	+ (l01)
	assertion violations	+ (if within scope of claim)
	acceptance   cycles 	+ (fairness disabled)
	invalid end states	- (disabled by never claim)

State-vector 20 byte, depth reached 5, errors: 1
        4 states, stored
        0 states, matched
        4 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)

Stats on memory usage (in Megabytes):
    0.000	equivalent memory usage for states (stored*(State-vector + overhead))
    0.290	actual memory usage for states
  128.000	memory used for hash table (-w24)
    0.534	memory used for DFS stack (-m10000)
  128.730	total actual memory usage

-searchオプションを指定した際の動作を追う

-searchオプションを使用した場合のspinコマンドの動作をstraceコマンドを使用して追ってみます。

straceによるシステムコールのトレース取得
$ strace -o sout -f spin -search -ltl l01 sample.pml
トレース確認

以下はトレースの抜粋です。
コンパイル時のオプションが手動で実行した場合と異なりますが、生成、コンパイル、実行を順に行ってくれていることがわかります。

$ less sout 
5255  execve("/home/makoto/bin/spin", ["spin", "-search", "-ltl", "l01", "sample.pml"], 0x7ffeb6c98828 /* 67 vars */) = 0
:
5255  openat(AT_FDCWD, "pan.c", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3 <-- pan.cの生成部分
:
fd=3についてwriteが呼び出されている。
:
5255  close(3)                          = 0
:
5260  execve("/usr/bin/gcc", ["gcc", "-std=gnu99", "-O", "-DNOFAIR", "-o", "pan", "pan.c"], 0x5573ac3132d8 /* 67 vars */) = 0 <-- コンパイル部分
;
5265  execve("/bin/sh", ["sh", "-c", "./pan  -N l01 -a"], 0x7ffed5d7edc8 /* 67 vars */) = 0 <-- 実行部分