プログラミングなどなど

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

SPIN:-o2オプションを使用して書き込みだけの変数も検証させる

spinのヘルプを見ているときに-o2オプションが気になりました。

-o2オプションのヘルプの説明を読むと書き込みだけの変数も隠さずに検証するような記述になっています。このオプションの説明から、もしかすると「SPINモデル検査入門」で紹介されている8クイーン問題の解を書き込み用のダミー変数(_)を使うことなく全て列挙できるのではないかと思い試してみました。

-o2オプションを試した結果、ダミー変数(_)を使用せずに状態で全ての解である92個が列挙されました。

ソース 8qeen.pml

使用したソースは「SPINモデル検査入門」のp.192(ソースコード 11.5)のものとなります。

-o2オプション無しでの実行

本のとおり86個の解が検出されます。

$ spin -run -E -c0 8qeen.pml
pan:1: assertion violated 0 (at depth 104)

(Spin Version 6.4.9 -- 17 December 2018)
	+ Partial Order Reduction

Full statespace search for:
	never claim         	- (none specified)
	assertion violations	+
	cycle checks       	- (disabled by -DSAFETY)
	invalid end states	- (disabled by -E flag)

State-vector 56 byte, depth reached 106, errors: 86
    39249 states, stored
      788 states, matched
    40037 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)

Stats on memory usage (in Megabytes):
    3.144	equivalent memory usage for states (stored*(State-vector + overhead))
    2.923	actual memory usage for states (compression: 92.98%)
         	state-vector as stored = 50 byte + 28 byte overhead
  128.000	memory used for hash table (-w24)
    0.534	memory used for DFS stack (-m10000)
  131.366	total actual memory usage


unreached in proctype Queens
	(0 of 41 states)

pan: elapsed time 0.02 seconds
pan: rate   1962450 states/second

-o2オプション有りでの実行

書き込みダミー(_)を使用していませんが92個の解が検出されます。

$ spin -o2 -run -E -c0 8qeen.pml
pan:1: assertion violated 0 (at depth 104)

(Spin Version 6.4.9 -- 17 December 2018)
	+ Partial Order Reduction

Full statespace search for:
	never claim         	- (none specified)
	assertion violations	+
	cycle checks       	- (disabled by -DSAFETY)
	invalid end states	- (disabled by -E flag)

State-vector 64 byte, depth reached 106, errors: 92
    41433 states, stored
        0 states, matched
    41433 transitions (= stored+matched)
        0 atomic steps
hash conflicts:         0 (resolved)

Stats on memory usage (in Megabytes):
    3.635	equivalent memory usage for states (stored*(State-vector + overhead))
    3.411	actual memory usage for states (compression: 93.84%)
         	state-vector as stored = 58 byte + 28 byte overhead
  128.000	memory used for hash table (-w24)
    0.534	memory used for DFS stack (-m10000)
  131.855	total actual memory usage


unreached in proctype Queens
	(0 of 41 states)

pan: elapsed time 0.02 seconds
pan: rate   2071650 states/second

spinヘルプ -o2オプション

-o2オプションを見ると書き込みだけが行われた変数を
隠さずに検証器が処理するような記述が有ります。

$ spin --help
use: spin [-option] ... [-option] file
	Note: file must always be the last argument
	-A apply slicing algorithm
:
(省略)
:
	-o1 turn off dataflow-optimizations in verifier
	-o2 don't hide write-only variables in verifier
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	-o3 turn off statement merging in verifier
: