带内联的select()语句中的错误?

时间:2017-08-03 01:18:12

标签: model-checking spin promela

我会在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'

1 个答案:

答案 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);
}