我在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
经过进一步分析(此处未显示),当我尝试访问它们时,pc
和sc
似乎始终初始化为正确的通道值。
问:为什么我会收到错误消息,我该如何解决?
答案 0 :(得分:0)
注意:由于更新,问题中建议的代码将不会再从Spin
版本6.4.9
开始产生任何错误。
以下是解决方案:
在proctype体中的任何地方使用的变量都会被实例化 该过程已创建。 [...]为了避免这种事情,它会更好 将声明与初始化分开。
[G。 H.,私人通讯]
由于某些原因,如果在同一语句中声明和初始化变量,当Spin 6.4.8
在创建进程时实例化它们时,它也会尝试执行 Promela Model <中指定的相同类型的初始化/ em>的
在给定示例中,node
_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];
}
}