Model checking 错误:索引数组';频道';
我在Spin 6.4.8中遇到这个错误: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: 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];
}
}