错误:索引数组'频道'

时间:2018-04-18 12:26:08

标签: model-checking spin promela

我在Spin 6.4.8

时遇到此错误
spin: indexing channels[-1] - size is 3
spin: 2.pml:13, Error: indexing array 'channels'

运行以下 Promela Model 的模拟时:

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 = channels[pred];
        chan sc = channels[succ];
    }
}

正如以下输出跟踪所见,我访问错误消息所声明的有问题的-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

经过进一步分析(此处未显示),当我尝试访问它们时,pcsc似乎始终初始化为正确的通道值。

问:为什么我会收到错误消息,我该如何解决?

1 个答案:

答案 0 :(得分:0)

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

以下是解决方案:

  

在proctype体中的任何地方使用的变量都会被实例化   该过程已创建。 [...]为了避免这种事情,它会更好   将声明与初始化分开。

     

[G。 H.,私人通讯]

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

在给定示例中,node _pid等于0pred在创建时等于-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];
    }
}