一种基于uml模型的软件架构正确性验证方法
【专利摘要】本发明公开了一种基于UML模型的软件架构正确性验证方法,主要用于处理软件架构的建模与验证问题,本发明涉及到的关键操作包括:(1)将包括类图、状态图和顺序图的UML模型分别定义为状态机,并将所述得到的状态机分别转换成kripke结构状态机;(2)将表示类图信息的kripke结构状态机转换成PROMELA模型中的进程信息;(3)将表示状态图信息的kripke结构状态机转换成PROMELA模型中的进程内部执行信息;(4)将表示顺序图信息的kripke结构状态机转换成PROMELA模型中的线性时序逻辑语句;(5)将得到的PROMELA模型转换成代码并输入Spin工具进行验证。
【专利说明】一种基于UML模型的软件架构正确性验证方法
【技术领域】
[0001] 本发明属于计算机软件领域,涉及一种基于UML的软件架构正确性验证方法。
【背景技术】
[0002] 随着软件系统规模和复杂性的不断增大,为保证软件质量,提高软件可靠性、可重 用性和可维护性,软件设计的核心已从传统计算模式转向对系统的总体结构,即以连接件 (connect)、部件和连接件交互约束为核心的软件体系结构(Software Architecture,以下 简称SA)的设计和规范。SA主要着眼于软件系统的全局组织形式,在更高层次上把握系统 各组件之间的内在联系,并从全局的、整体的角度去理解和分析整个系统的行为和特性。然 而由于SA的设计的关系到后续软件开发的成功与否,因此保障SA设计的正确性、安全性等 属性变的尤为重要,形式化验证方法就可以很好地解决这个问题。
[0003] 越来越多的形式化验证方法及工具应用于SA的验证,其中基于模型检验(Model Checking)的简单进程元语言解释器Spin能有效准确地实现软件体系结构的验证工作。模 型检验的一般流程如图2所示,并且Spin工具的实用性已经得到验证,但是由于其支持的 建模语言PR0MELA有着难以直观理解、不具有通用性等特点,使得SA的设计难以体现一般 化。本发明针对PR0MELA语言的相关缺陷,采用UML对SA进行建模,提出一种将UML模型 转换成PR0MELA的模型转换方法,并利用其转换结果对SA设计进行模型检验。UML (统一建 模语言)是一种将软件开发过程中出现的各种模型用可视化图形来描述的语言。它融合了 多种面向对象开发方法的优点,采用统一的图形和符号从多个视角描述软件系统的各种抽 象模型,获得了国际标准化组织的认可,并被国际软件界广泛接纳。
【发明内容】
[0004] 技术问题:本发明提供一种用于对软件体系结构进行验证,可以直接对软件体系 结构进行形式化建模,很好地对通用建模语言所建的软件体系结构模型进行验证,通用性 好的基于UML模型的软件结构正确性验证方法。
[0005] 技术方案:本发明的基于UML模型的软件架构正确性验证方法,包括如下步骤:
[0006] 步骤1)将包括类图、状态图和顺序图的UML模型分别定义为状态机,即以一个 三元组SM= (S,T,S_)来表示,其中,S为状态集合,T为转换集合,st()p是默认状态,有 Stop ^ S ;
[0007] 步骤2)将所述步骤1)得到的状态机分别转换成kripke结构状态机,即以一个五 元组KSM= (Sk,S(l,R,P,L)表示,其中Sk是一个有限状态集合; S(le Sk是初始状态;转移关 系集合R e SkX Sk包括所有的转移关系,并且仅由转移关系构成;P是一组原子命题及其否 命题的集合;标记映射L是S k中的每个状态s与s所对应的p中的所有原子命题为真的命 题集合的映射关系所构成的映射关系集。
[0008] 步骤3)将表示类图信息的kripke结构状态机转换成PR0MELA模型中的进程信 息,具体为:将获取类名转换成进程名,获取类中变量转换成进程中变量,获取类间关系转 换成进程间通信通道;
[0009] 步骤4)将表示状态图信息的kripke结构状态机转换成PR0MELA模型中的进程内 部执行信息;
[0010] 步骤5)将表示顺序图信息的kripke结构状态机转换成PR0MELA模型中的线性时 序逻辑语句;
[0011] 步骤6)将得到的PR0MELA模型转换成代码并输入Spin工具进行验证。
[0012] 本发明方法中,步骤1)中状态集合S包括:
[0013] 原子状态sinitial = (n, ac, en, ex),其中η为状态名,ac、en、ex分别为处于原子状 态、进入原子状态、退出原子状态时SM执行的动作序列;
[0014] 或状态SOT = (n,SOT,1,Ts,ac,en,ex),其中SOT为或状态sOT的子状态的集合;1是 处于激活状态的子状态的编号;Ts是或状态s OT的所有子状态间转换的集合,ac、en、ex分 别为处于或状态、进入或状态、退出或状态时SM执行的动作序列;
[0015] 与状态sand = (n,Sand,ac,en,ex),其中Sand为与状态sand的子状态的集合,ac、en、 ex分别为处于与状态、进入与状态、退出与状态时SM执行的动作序列;
[0016] 所述转换集合T由转换t构成,所述转换t = (n, i, sou, e, g, ac, tar, j, ht),其中 i为转换的最外层源状态的序号,j为目标状态的序号;转换t由sou和tar描述,sou是受 限原状态,tar是确定目标状态,分别表示转换t的确切原状态和目标状态;e是转换t的触 发事件;g是转换t的触发条件;ac是转换时执行的动作序列;ht是转换t的历史类型。
[0017] 本发明方法的优选方案中,步骤4)的具体流程为:
[0018] a.遍历kripke结构状态机的状态,并获取初始状态,将其作为当前状态;
[0019] b.判断当前状态的类型,若该状态为初始状态,则从转移关系集合R中获取该状 态对应的转移路径后,进入步骤d ;
[0020] 若该状态是终止状态,则结束步骤4);
[0021] 若该状态是一般状态,则依次获取状态类型、状态转移路径后进入步骤c ;
[0022] c.将状态类型转换成PR0MELA模型中的结构;
[0023] d.根据转移路径,构建PR0MELA模型中的跳转语句与状态转移,然后根据转移路 径获取下一状态,用所述下一状态更新当前状态后返回步骤b。
[0024] 本发明方法的优选方案中,步骤5)的具体流程为:
[0025] a.将顺序图对应的kripke结构状态机的所有状态,按照其在顺序图中的位置自 上而下进行排序;
[0026] b.获取初始状态,并将其作为当前状态;
[0027] c.判断当前状态的类型:若该状态是终止状态,则进入步骤e,否则将当前状态的 内容和转移路径分别转换成现行时序逻辑中的原子命题后进入步骤d ;
[0028] d.根据转移路径获取下一状态,用所述下一状态更新当前状态后返回步骤c ;
[0029] e.将所有原子命题按照其产生的时间先后顺序连接,将其作为线性时序逻辑语 句。
[0030] 本发明方法的优选方案中,步骤2)的具体过程为:
[0031] 21)将状态机的默认状态转换成kripke结构状态机的初始状态;
[0032] 22)对状态机的当前状态CS,如果在kripke结构状态机中已经存在状态(CS,0), 则进入步骤25),否则构造对应的kripke结构的状态(CS,0),计算其可能事件集PES ;
[0033] 23)对PES中的每个事件e,构造对应的kripke状态(CS,e),连接(CS,0)与 (CS, e);
[0034] 24)对PES中的每个事件e,计算其所有可能的最大可触发转换集的集合SETS,执 行集合SETS中的每个转换集ETS的所有转换,得到用下一层递归调用的状态集并用其更新 当前状态CS后返回步骤22);
[0035] 25)返回底层递归调用的上一层,开始逐层连接(CS,e)与(NS,0),直至完成所有 递归调用的(CS,e)与(NS,0)连接,即得到kripke结构状态机,其中NS为本层递归调用的 状态,(NS,0)为下一层构造的kripke结构的状态(CS,0)。
[0036] 本发明的方法首先利用UML对软件体系结构进行建模,而后将其转换成kripke结 构,再进行自动模型转换为Spin支持的模型PR0MELA,然后生成PR0MELA代码,并结合UML 中顺序图所对应或用户手动输入的LTL代码作为Spin的输入。
[0037] 本发明方法可以直接对软件体系结构进行形式化建模,并且将UML设计中的与之 相关模型,包括类模型、状态模型以及顺序模型,转换为PR0MELA模型,进而使用Spin进行 验证。与过去的方法相比,本发明既可以很好地对通用建模语言所建的软件体系结构模型 进行验证,又弥补了 PR0MELA不够通用、一般化的弱点。
[0038] 有益效果:本发明与现有技术相比,具有以下优点:
[0039] 经过实例分析证明,本发明完成了由UML模型中的类模型、状态模型和顺序模型 向PR0MELA程序的转换。使用UML可以很方便的对复杂的软件架构进行建模,并且通过转换 规则实现将类模型和状态模型转成kripke模型,而后向PR0MELA模型的转换,利用LTL描 述的顺序模型对系统属性进行描述,然后将PR0MELA代码和LTL公式输入SPIN进行验证。 本发明使得对软件架构从建模到验证的过程变得更加方便和容易。
[0040] 与现有的技术相比,本发明主要有两个优点。一是先将UML状态机转换成kripke 结构的状态机,再将kripke结构的状态机转换成PR0MELA模型,而非直接将UML状态机转 换成PR0MELA模型。由于UML状态图是多个静态图组成,传统的直接转换方法会导致状态 类型信息与状态内容信息混杂,而通过kripke结构的状态机中转则能够将这些静态图关 联起来,并反映程序执行过程中的状态。这样能够有效的利用kripke结构中的命题控制转 移关系的功能,来完整的保留状态图里的信息,并分离状态类型与状态内容,从而优化生成 的PR0MELA模型;二是实现了由UML顺序图自动生成线性时序逻辑语句LTL的功能,对于较 为繁琐的顺序图能够避免复杂并且容易出错的手动生成LTL的过程,降低验证人员的工作 量。
【专利附图】
【附图说明】
[0041] 图1是本发明方法的流程图。
[0042] 图2是一般模型检验的过程。
[0043] 图3是将表示状态图的kripke结构状态机转换成PR0MELA模型中结构的流程图。
[0044] 图4是将表示顺序图的kripke结构状态机转换成PR0MELA模型中线性时序逻辑 语句LTL。
[0045] 图5是将UML状态机转换成kripke结构状态机的流程图。
[0046] 图6是UML模型中的类模型。
[0047] 图7是UML模型中的状态模型,其中左侧的为User类的状态模型,右侧的为 responser类的状态模型。
[0048] 图8是UML模型中的顺序模型。
【具体实施方式】
[0049] 下面结合实施例和说明书附图对发明的技术方案进行详细说明。
[0050] 本发明从元模型的角度出发,将包括类图、状态图和顺序图的UML模型定义为状 态机,而后将状态机转换成kripke结构的状态机,再实现kripke结构的状态机到PR0MELA 模型的同态映射,将得到的PR0MELA模型转换成代码并输入Spin工具进行验证,其中 PR0MELA是Spin工具输入所特有的程序语言。具体包括以下步骤:
[0051] 步骤1)通过函数definedUMLO将包括类图、状态图和顺序图的UML模型分别表 不成定义的 UML 状态机,分别有 CSM = definedUML (Class)、SeSM = definedUML (Sequence)、 StSM= definedUML(State),其中Class表示UML模型中的类图,CSM表示类图对应的状态 机;Sequence表示UML模型中的顺序图,SeSM表示顺序图对应的状态机;State表示UML模 型中的状态图,StSM表示状态图对应的状态机。具体的UML状态机的定义为:
[0052] 将包括类图、状态图和顺序图的UML模型分别定义为状态机,即以一个三元组SM =(S,T,st()p)来表示,其中,S为状态集合,T为转换集合,S_是默认状态,有s t()p e S ;状态 集合S包括以下三种状态:
[0053] 原子状态sinitial = (n, ac, en, ex),其中η为状态名,ac、en、ex分别为处于原子状 态、进入原子状态、退出原子状态时SM执行的动作序列;
[0054] 或状态sOT = (n,SOT,1,Ts,ac,en,ex),其中SOT为或状态sOT的子状态的集合;1是 处于激活状态的子状态的编号;Ts是或状态s OT的所有子状态间转换的集合,ac、en、ex分 别为处于或状态、进入或状态、退出或状态时SM执行的动作序列。对处于激活状态的或状 态s OT,它的子状态中有且只有一个s处于激活状态,称之为串行;
[0055] 与状态sand = (n, Sand, ac, en, ex),其中Sand为与状态sand的子状态的集合,ac、en、 ex分别为处于与状态、进入与状态、退出与状态时SM执行的动作序列。对处于激活状态的 与状态sand,它的所有子状态都处于激活状态,称之为并发;
[0056] 所述转换集合T由转换t构成,所述转换t = (n, i, sou, e, g, ac, tar, j, ht),其中 i为转换的最外层源状态的序号,j为目标状态的序号;转换t由sou和tar描述,sou是受 限原状态,tar是确定目标状态,分别表示转换t的确切原状态和目标状态;e是转换t的触 发事件;g是转换t的触发条件;ac是转换时执行的动作序列;ht是转换t的历史类型。
[0057] 步骤2)Kripke结构是一种数学结构,目前大部分被用在了模型检验上,可以用状 态图表示,主要采用命题来刻画状态之间的转移关系。定义函数SMtoKRIPKE (),将所述步骤 1)得到的状态机分别转换成kripke结构状态机,即以一个五元组KSM = (Sk,S(l,R,P,L)表 示,其中Sk是一个有限状态集合; S(l e Sk是初始状态;转移关系集合R e SkXSk包括所有 的转移关系,并且仅由转移关系构成,满足Va· e S,3.s''e S /?,即对状态集合Sk中 的任一状态s,都存在另一个状态s',使得从s到s'的转移关系属于R ;P是一组原子命题 及其否命题的集合;标记映射L = Sk - 2P是Sk中的每个状态s与s所对应的p中的所有 原子命题为真的命题集合的映射关系所构成的映射关系集,有状态S e Sk。其中2P是状态 s下P中的所有原子命题为真的命题集合,该集合是P的一个子集。
[0058] 分别对CSM、SeSM、StSM执行UML状态机至kripke结构的状态机的转换,有KCSM =SMtoKRIPKE (CSM)、KSeSM = SMtoKRIPKE (SeSM)、KStSM = SMtoKRIPKE (StSM),其中 KCSM 为表示类图的kripke结构的状态机,KSeSM为表示顺序图的kripke结构的状态机,KStSM 为表示状态图的kripke结构的状态机,
[0059] 函数SMtoKRIPKE()包含了转换的具体过程为:
[0060] a.通过函数defconf ()将状态机的默认状态st()p转换成kripke结构状态机的初 始状态 CS,即 CS = defconf (stQp);
[0061] b.对状态机的当前状态CS,如果在kripke结构状态机中已经存在状态(CS,0), 则进入步骤25),否则构造对应的kripke结构的状态(CS,0),计算其可能事件集PES (CS)。 其中(CS,0)指kripke结构状态机中的不包含事件e的单个状态;
[0062] c.对PES(CS)中的每个事件e,构造对应的kripke状态(CS,e),连接(CS,0)与 (CS,e)。其中(CS,e)指kripke结构状态机中的包含事件e的单个状态,(CS,e)与(CS,0) 都是由状态机CS转换得到,二者区别在于(CS,e)存储了状态的转移信息,包括状态类型 和转移路径;而(CS,0)存储了状态本身信息,例如状态名等。其中状态类型是指状态图中 描述当前状态所属的类别,这些类别包括强制、并发、选择、循环等等,状态类型信息存储于 kripke结构状态机的状态中;
[0063] d.对(NS,0)中的每个事件e,计算其所有可能的最大可触发转换集的集合SETS, 执行集合SETS中的每个转换集ETS的所有转换,即ETS(CS,e),得到用下一层递归调用 的状态集并用其更新当前状态CS后返回步骤b。其中更新当前状态CS通过函数CS = NextState (CS, ETS)实现;
[0064] f.返回底层递归调用的上一层,开始逐层连接(CS,e)与(NS,0),直至完成所有递 归调用的(CS,e)与(NS,0)连接,即得到kripke结构状态机,其中NS为本层递归调用的状 态,(NS,0)为下一层构造的kripke结构的状态(CS,0)。
[0065] 上述转换中所用到的未详细说明函数计算公式如下表所示:
【权利要求】
1. 一种基于UML模型的软件架构正确性验证方法,其特征在于,该方法包括如下步骤: 步骤1)将包括类图、状态图和顺序图的UML模型分别定义为状态机,即以一个三元组 SM = (S,T,s_)来表示,其中,S为状态集合,T为转换集合,st()p是默认状态,有 s_ e S ; 步骤2)将所述步骤1)得到的状态机分别转换成kripke结构状态机,即以一个五元组 KSM = (Sk,S(l,R,P,L)表示,其中Sk是一个有限状态集合; S(l e Sk是初始状态;转移关系集 合R e SkXSk包括所有的转移关系,并且仅由转移关系构成;P是一组原子命题及其否命题 的集合;标记映射L是S k中的每个状态s与s所对应的p中的所有原子命题为真的命题集 合的映射关系所构成的映射关系集; 步骤3)将表示类图信息的kripke结构状态机转换成PROMELA模型中的进程信息,具 体为:将获取类名转换成进程名,获取类中变量转换成进程中变量,获取类间关系转换成进 程间通信通道; 步骤4)将表示状态图信息的kripke结构状态机转换成PROMELA模型中的进程内部执 行信息; 步骤5)将表示顺序图信息的kripke结构状态机转换成PROMELA模型中的线性时序逻 辑语句; 步骤6)将得到的PROMELA模型转换成代码并输入Spin工具进行验证。
2. 根据权利要求1所述的基于模型转换的软件架构建模与验证方法,其特征在于,所 述步骤1)中状态集合S包括: 原子状态sinitial = (n, ac, en, ex),其中η为状态名,ac、en、ex分别为处于原子状态、 进入原子状态、退出原子状态时SM执行的动作序列; 或状态sOT = (n,SOT,1,Ts,ac,en,ex),其中SOT为或状态sOT的子状态的集合;1是处于 激活状态的子状态的编号;Ts是或状态s"的所有子状态间转换的集合,ac、en、ex分别为 处于或状态、进入或状态、退出或状态时SM执行的动作序列; 与状态sand = (n, Smd, ac, en, ex),其中Sand为与状态smd的子状态的集合,ac、en、ex分 别为处于与状态、进入与状态、退出与状态时SM执行的动作序列; 所述转换集合T由转换t构成,所述转换t = (n, i, sou, e, g, ac, tar, j, ht),其中i为 转换的最外层源状态的序号,j为目标状态的序号;转换t由sou和tar描述,sou是受限 原状态,tar是确定目标状态,分别表示转换t的确切原状态和目标状态;e是转换t的触发 事件;g是转换t的触发条件;ac是转换时执行的动作序列;ht是转换t的历史类型。
3. 根据权利要求1所述的基于UML模型的软件架构正确性验证方法,其特征在于,所述 步骤4)的具体流程为: a. 遍历kripke结构状态机的状态,并获取初始状态,将其作为当前状态; b. 判断当前状态的类型,若该状态为初始状态,则从转移关系集合R中获取该状态对 应的转移路径后,进入步骤d; 若该状态是终止状态,则结束步骤4); 若该状态是一般状态,则依次获取状态类型、状态转移路径后进入步骤c ; c. 将状态类型转换成PROMELA模型中的结构; d. 根据转移路径,构建PROMELA模型中的跳转语句与状态转移,然后根据转移路径获 取下一状态,用所述下一状态更新当前状态后返回步骤b。
4. 根据权利要求1所述的基于UML模型的软件架构正确性验证方法,其特征在于,所述 步骤5)的具体流程为: a. 将顺序图对应的kripke结构状态机的所有状态,按照其在顺序图中的位置自上而 下进行排序; b. 获取初始状态,并将其作为当前状态; c. 判断当前状态的类型:若该状态是终止状态,则进入步骤e,否则将当前状态的内容 和转移路径分别转换成现行时序逻辑中的原子命题后进入步骤d ; d. 根据转移路径获取下一状态,用所述下一状态更新当前状态后返回步骤c ; e. 将所有原子命题按照其产生的时间先后顺序连接,将其作为线性时序逻辑语句。
5. 根据权利要求1、2、3或4所述的基于UML模型的软件架构正确性验证方法,其特征 在于,所述步骤2)的具体过程为: 21) 将状态机的默认状态转换成kripke结构状态机的初始状态; 22) 对状态机的当前状态CS,如果在kripke结构状态机中已经存在状态(CS,0),则进 入步骤25),否则构造对应的kripke结构的状态(CS,0),计算其可能事件集PES ; 23) 对PES中的每个事件e,构造对应的kripke状态(CS,e),连接(CS,0)与(CS,e); 24) 对PES中的每个事件e,计算其所有可能的最大可触发转换集的集合SETS,执行集 合SETS中的每个转换集ETS的所有转换,得到用下一层递归调用的状态集并用其更新当前 状态CS后返回步骤22); 25) 返回底层递归调用的上一层,开始逐层连接(CS,e)与(NS,0),直至完成所有递归 调用的(CS,e)与(NS,0)连接,即得到kripke结构状态机,其中NS为本层递归调用的状态, (NS, 0)为下一层构造的kripke结构的状态(CS, 0)。
【文档编号】G06F11/36GK104050087SQ201410319016
【公开日】2014年9月17日 申请日期:2014年7月4日 优先权日:2014年7月4日
【发明者】李必信, 俞析蒙, 陈艺, 孔祥龙, 王璐璐 申请人:东南大学