我会在spinroot Bug Reports发布此内容,但是spinroot论坛目前还没有接受新用户...如果有人在那里负责,那就读这个,请让我进去:)
当我尝试使用select语句时,会发生一些非常奇怪的事情。 Promela不允许在结构字段上调用select()
,所以我必须创建一个这样的临时变量:
typedef someStruct {
int someField;
}
someStruct struct;
inline SetSelect() {
int temp;
select(temp: -1 .. 1);
struct.someField = temp;
}
init{
SetSelect();
}
这很好。我测试了它,struct.someField
被正确设置为-1,0或1. 然而,当我尝试将内联代码直接放入init()
进程时,我收到语法错误。代码如下所示:
typedef someStruct {
int someField;
}
someStruct struct;
init{
int temp;
select(temp: -1 .. 1);
struct.someField = temp;
}
错误信息是:
spin: select_test.pml:9, Error: syntax error saw ''-' = 45'
答案 0 :(得分:1)
<强> BUG 强>:
实际上,它似乎是 Spin 版本6.4.6
的错误。
(错误已在版本6.4.7
中修复)
有趣的是,只需撰写temp :
代替temp:
即可让它消失。
我建议您联系Gerard Holzmann提交错误报告。我还要提到 select 似乎不适用于 struct field 的事实,也许这也可以修复(即使它可能是设计的)
<强>建议:强>
我并不完全乐意创建一个别名变量来解决带有struct字段的内置select函数的问题。由于 select 的实现相当简单,如docs中所示,我将介绍一种新颖的内联函数来替换内置的select 函数:
typedef Struct
{
int field;
}
inline my_select (var, lower, upper)
{
var = lower;
do
:: var < upper -> var++;
:: break;
od;
}
init
{
Struct st;
my_select(st.field, -1, 1);
printf("%d\n", st.field);
}