【问题标题】:Promela SPIN unreached in proctype errorproctype 错误中未达到 Promela SPIN
【发布时间】:2016-10-11 07:35:15
【问题描述】:

我对 SPIN 和 Promela 还很陌生,在尝试验证模型中的 liveness 属性时遇到了这个错误。

错误代码:

unreached in proctype P
        (0 of 29 states)
unreached in proctype monitor
        mutex_assert.pml:39, state 1, "assert(!((mutex>1)))"
        mutex_assert.pml:42, state 2, "-end-"
        (2 of 2 states)
unreached in init
        (0 of 3 states)
unreached in claim ltl_0
        _spin_nvr.tmp:10, state 13, "-end-"
        (1 of 13 states)

pan: elapsed time 0 seconds

代码基本上是彼得森算法的实现,我检查了安全性,它似乎是有效的。但是,每当我尝试使用 ltl {[]((wait -> (cs)))} 验证 liveness 属性时,都会出现上述错误。我不确定他们的意思,所以我不知道如何继续......

我的代码如下:

#define N 3
#define wait   (P[1]@WAIT)
#define cs     (P[1]@CRITICAL)

int pos[N]; 
int step[N]; 
int enter;
byte mutex;
ltl {[]((wait -> <> (cs)))}

proctype P(int i) {
  int t;
  int k;
  WAIT:
  for (t : 1 .. (N-1)){
  pos[i] = t
  step[t] = i
  k = 0;
  do
  ::  atomic {(k != i && k < N && (pos[k] < t|| step[t] != i)) -> k++}
  ::  atomic {k == i -> k++}
  ::  atomic {k == N -> break}
  od;
  }

CRITICAL:
  atomic {mutex++;
  printf("MSC: P(%d) HAS ENTERED THE CRITICAL SECTION.\n", i);
  mutex--;}
  pos[i] = 0;
}

init {
  atomic { run P(0); }
}

【问题讨论】:

    标签: cygwin mutual-exclusion model-checking spin promela


    【解决方案1】:

    一般回答

    这是一个警告,告诉您某些状态由于从未进行过转换而无法访问

    一般来说,这不是一个错误,但仔细查看不可达状态是一个良好做法 em>您建模的每个例程,并检查您是否期望它们都不可访问。 即在模型不正确的情况下。预期的行为

    注意。您可以在特定代码行前面使用标签 end: 来标记有效的终止状态,以便摆脱这些警告,例如当您的程序没有终止时。更多信息here


    具体答案

    我无法重现您的输出。特别是,通过运行

    ~$ spin -a file.pml
    ~$ gcc pan.c
    ~$ ./a.out -a
    

    我得到以下输出,与你的不同:

    (Spin Version 6.4.3 -- 16 December 2014)
        + Partial Order Reduction
    
    Full statespace search for:
        never claim             + (ltl_0)
        assertion violations    + (if within scope of claim)
        acceptance   cycles     + (fairness disabled)
        invalid end states  - (disabled by never claim)
    
    State-vector 64 byte, depth reached 47, errors: 0
           41 states, stored (58 visited)
           18 states, matched
           76 transitions (= visited+matched)
            0 atomic steps
    hash conflicts:         0 (resolved)
    
    Stats on memory usage (in Megabytes):
        0.004   equivalent memory usage for states (stored*(State-vector + overhead))
        0.288   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
    
    
    unreached in proctype P
        (0 of 29 states)
    unreached in init
        (0 of 3 states)
    unreached in claim ltl_0
        _spin_nvr.tmp:10, state 13, "-end-"
        (1 of 13 states)
    
    pan: elapsed time 0 seconds
    

    特别是,我缺少关于 monitor 过程中未达到状态的警告。就我而言,从源代码来看,我得到的警告都没有问题。

    要么您使用的 Spin 版本与我不同,要么您没有在问题中包含完整的源代码。在后一种情况下,您可以编辑您的问题并添加代码吗?之后我会更新我的答案。


    编辑:在 cmets 中,您询问以下消息是什么意思:"unreached in claim ltl_0 _spin_nvr.tmp:10, state 13, "-end-"”。

    如果你打开文件_spin_nvr.tmp,你可以看到下面这段Promela代码,它对应一个Büchi automaton接受所有且仅违反您的 ltl 属性的执行 []((wait -> (cs))).

    never ltl_0 {    /* !([] ((! ((P[1]@WAIT))) || (<> ((P[1]@CRITICAL))))) */
    T0_init:
        do
        :: (! ((! ((P[1]@WAIT)))) && ! (((P[1]@CRITICAL)))) -> goto accept_S4
        :: (1) -> goto T0_init
        od;
    accept_S4:
        do
        :: (! (((P[1]@CRITICAL)))) -> goto accept_S4
        od;
    }
    

    该消息只是警告您此代码的执行将永远不会到达最后一个右括号}(状态“-end-”),这意味着该过程确实永不终止。

    【讨论】:

    • 非常感谢!是的,我最后一次编辑了我的代码,然后在这里发布它,这似乎已经修复了它。下面的代码是什么意思?我认为这是错误的一部分?未达到索赔 ltl_0 _spin_nvr.tmp:10,状态 13,“-end-”
    • @firearian 我更新了我的帖子来回答你的问题。再次,请务必理解那里没有没有错误
    • 非常感谢!这回答了我的问题!不过,如果可以的话,我会做一个小的后续行动。我是否理解这意味着 ltl 属性已成功验证,因为该进程从未进入“never ltl_0”?
    • @firearian 为了验证模型 M 满足 LTL 公式 FSpin 生成一个 Buchi自动机对应于F的否定,并与M自动机计算其同步积 [我在简化一点]。如果后一种产品包含验收周期,那么您的属性F就有了反例。否则,您的系统是安全的。一般来说,严格来说,是否执行 Buchi Automata 的某些转换并不相关,而是您是否在接受路径上执行。
    • 因此,专注于您的示例,这意味着您的模型 M + never ltl_0 的同步产品的执行不会进入状态标记为 accept_S4。但是,执行仍然通过代码 :: (1) -> goto T0_init 的状态(它循环遍历它)。
    猜你喜欢
    • 2014-02-02
    • 2014-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2014-04-11
    • 1970-01-01
    • 2023-03-07
    • 2016-02-17
    相关资源
    最近更新 更多