代码之家  ›  专栏  ›  技术社区  ›  firearian

在proctype错误中未获取Promela自旋

  •  2
  • firearian  · 技术社区  · 7 年前

    我对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); }
    }
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Patrick Trentin    7 年前

    一般答覆

    这是一个 警告 告诉你 有些状态无法访问 由于从未进行的转换。

    一般来说,这是 错误 你建模的每一个例程 ,并检查您是否希望它们都无法访问。 i、 e.如果模型不正确,则说明预期行为 .

    笔记 您可以使用标签 结束: 在标记有效终止状态的特定代码行之前, e、 g.当您的程序未终止时 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
    

    特别是,我缺少关于 班长 过程就我而言,从源代码来看,我得到的警告都没有问题。

    快速旋转 或者你的问题中没有包含完整的源代码。在后一种情况下,您可以编辑您的问题并添加代码吗?之后我会更新我的答案。


    :在评论中,您会问以下消息是什么意思: “在权利要求ltl_0_spin_nvr中未达到。tmp:10,状态13,”-结束-” ".

    如果你打开文件 _spin_nvr.tmp ,您可以看到 波美拉 代码,对应于 Bchi自动机 它只接受所有违反ltl属性的执行 [((等待->>(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;
    }
    

    该消息只是警告您,此代码的执行永远不会到达最后一个结束括号 (国家 “-为此— ),这意味着该过程永远不会终止。