旋转模型检查器-错误:由于yacc堆栈大小,内存耗尽

时间:2018-08-21 18:05:25

标签: memory verification model-checking promela spin

我创建了一个相当大的Promela模型(2362个状态,其中总共29592个转换),我希望验证基础系统的LTL属性。该模型的定义过程如下:

int state=1;
bool p1a=true, p3=false, p1b=false;
active proctype model()
{
do
:: atomic{ state==1 -> state=1; p1a=true; p3=false; p1b=false }
:: atomic{ state==1 -> state=4; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=5; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=6; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=133; p1a=true; p3=false; p1b=false }
:: atomic{ state==1 -> state=134; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=136; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=137; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=138; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=265; p1a=true; p3=false; p1b=false }
:: atomic{ state==1 -> state=266; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=267; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=268; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=269; p1a=false; p3=false; p1b=false }
:: atomic{ state==1 -> state=270; p1a=false; p3=false; p1b=false }
:: atomic{ state==4 -> state=13; p1a=true; p3=false; p1b=false }
:: atomic{ state==4 -> state=14; p1a=false; p3=false; p1b=false }

.
. /* continues similarly */
.

:: atomic{ state==2376 -> state=1825; p1a=true; p3=true; p1b=false }
:: atomic{ state==2376 -> state=1837; p1a=true; p3=true; p1b=false }
od
}

ltl F {[]((p1a && p3) -> (<> p1b))}

您可以在这里找到整个文件:https://github.com/alevizada/bioFSA/blob/master/spin_files/abs_file_1.pml

当我跑步时:

spin -a filename.pml

我得到以下信息:

spin: filename.pml:19980, Error: memory exhausted   saw 'operator: ='
spin: filename.pml:19980, Error: no runable process saw 'operator: ='

检查.pml文件,这等效于已存储19974个状态转换对。

我在计算机和服务器上都尝试过此操作,所以我想系统内存不是问题。

旋转最多可以存储这样的对吗?如果是,我该如何解决并继续进行验证?

非常感谢!


编辑:似乎是使用(yacc)的解析器旋转导致了此问题。 yacc分配具有预定义/有限内存的堆栈。我找到了this参考,了解如何更改它,但是我不确定这些变量的定义应该在文件中。我怀疑是y.tab.c。

有帮助吗?

谢谢!


解决方案

在spin.y中编辑以下行:

#define YYMAXDEPTH      20000

增加数量,然后重新安装spin。它应该可以工作:)

1 个答案:

答案 0 :(得分:2)

在spin.y中编辑以下行:

#define YYMAXDEPTH      20000

增加数量,然后重新安装spin。它应该可以工作:)