Model checking 错误:索引数组';频道';

Model checking 错误:索引数组';频道';,model-checking,spin,promela,Model Checking,Spin,Promela,我在Spin 6.4.8中遇到这个错误: spin: indexing channels[-1] - size is 3 spin: 2.pml:13, Error: indexing array 'channels' 运行以下Promela模型的模拟时: 如以下输出跟踪所示,我没有访问错误消息声称的有问题的-1数组位置: Values(0): -1, 1 Values(2): 1, 0 Values(1): 0, 2 Corrected Val

我在Spin 6.4.8中遇到这个错误:

spin: indexing channels[-1] - size is 3
spin: 2.pml:13, Error: indexing array 'channels'
运行以下Promela模型的模拟时:

如以下输出跟踪所示,我没有访问错误消息声称的有问题的
-1
数组位置:

  Values(0): -1, 1
          Values(2): 1, 0
      Values(1): 0, 2
      Corrected Values(1): 0, 2
          Corrected Values(2): 1, 0
  Corrected Values(0): 2, 1
经过进一步的分析(此处未显示),当我尝试访问它们时,
pc
sc
似乎总是初始化为正确的通道值


Q:我为什么会收到错误消息,以及如何修复它?

注意:由于更新,问题中提出的代码从
Spin
版本
6.4.9
开始将不再产生任何错误


以下是解决方案:

出现在proctype主体中任何位置的变量在 该过程已创建。[…]为了避免这种事情,最好 将声明与初始化分开

[G.H.,私人通信]

由于某些原因,如果一个变量在同一语句中声明和初始化,当
Spin 6.4.8
在流程创建时实例化它们时,它也会尝试执行Promela模型中指定的相同类型的初始化

在给定的示例中,
节点
\u pid
等于
0
在创建时
pred
等于
-1
,因此
Spin
尝试也执行
chan pc=channels[pred]导致错误,因为存在越界访问

如上所述,可以通过将声明与初始化分离来解决此问题:

chan channels[3] = [1] of { pid };

active [3] proctype node () {
    short pred = (_pid - 1) % 3;
    short succ = (_pid + 1) % 3;
    printf("Values(%d): %d, %d\n", _pid, pred, succ);
    if
        :: pred == -1 -> pred = 2;
        :: else -> skip;
    fi;
    printf("Corrected Values(%d): %d, %d\n", _pid, pred, succ);
    {
        chan pc;
        chan sc;
        pc = channels[pred];
        sc = channels[succ];
    }
}
具有以下输出:

~$ spin test.pml 
              Values(2): 1, 0
      Values(0): -1, 1
          Values(1): 0, 2
          Corrected Values(1): 0, 2
              Corrected Values(2): 1, 0
      Corrected Values(0): 2, 1
3 processes created

或者,可以绕过该问题,并防止
pred
具有无效值:

chan channels[3] = [1] of { pid };

active [3] proctype node () {
    short pred = (_pid - 1 + 3) % 3;
    short succ = (_pid + 1) % 3;
    printf("Values(%d): %d, %d\n", _pid, pred, succ);
    {
        chan pc = channels[pred];
        chan sc = channels[succ];
    }
}
chan channels[3] = [1] of { pid };

active [3] proctype node () {
    short pred = (_pid - 1 + 3) % 3;
    short succ = (_pid + 1) % 3;
    printf("Values(%d): %d, %d\n", _pid, pred, succ);
    {
        chan pc = channels[pred];
        chan sc = channels[succ];
    }
}