正在加载图片...
张志天等:一个程序验证器的设计和实现 1051 需要对它进行多次遍历,以推断循环不变状态图) 入节点后链表保持有序,返回结果链表的指针,代码 若整个程序不涉及指针类型,则在每个程序点 和断言如图4所示,其中作为链表节点的结构体类 生成的是空图 型的定义是typedef struct listnode{Node¥:LIST 3)验证条件的生成 next:int data;}Node.该程序不仅涉及形状,而且 遍历抽象语法树,根据程序员提供的函数前后 需关注各节点数据之间的大小关系。 条件和循环不变式,按最强后条件演算方式为各函 Node insert(Node'head.int data) 数生成验证条件. assertion m==length(head,next)A 若仅验证易变数据结构的形状,程序员不用提 Yi:1..m-1.(head(>next)>datahead(>next) 供任何断言,则程序验证在上一步就结束 >data) 下面以4.2节例1为例,说明在本阶段如何将 Node ptr;Node ptrl;Node'ret;Node'p: int j: 分先后得到的G和Q进行对应.在该例中,pr== p=malloc(Node):p->data=data:p->next=NULL; NULL和ptr!=NULL直接出现在程序员提供的 if(head==NULL) 循环不变式的两种情况(Q,VQ2)中,以表示Q和 ret=p: }else if(p>datahead->data) Q2分别联系到ptr是否等于NULL.该循环的循环 p->next=head:ret=p: 不变形状图如图3(b)(G1VG2)所示,r在这两个 else 图上分别表现为等于和不等于NULL.因此,当完 ptrl=head:pir=head->next:j=1: 整的断言(G1VG2)∧(Q1VQ2)展开成析取范式时, while((pir NULL)&(pir->data<p>data)) loop_assertion 在析取范式的4种情况中,上述tr断言不是因和 ptr NULL A Yi:1..j-1.(head (-next)1 形状图有矛盾而导致该情况被删除,就是因一致而 data 被吸收.这样,在它们被吸收的两种情况中,符号断 head(>next)i->data)A ptrl->datasptr->data 言和与之相适应的形状图就联系在一起, A ptrl->data<p->data Aj21A Yi:1..m-j-1. pr(next)i-1dataptr(>next)i-data) 4)验证条件的证明 Vptr==NULLA Yi:1..j-1.(head(>next)1 将生成的各验证条件G∧Q→Q',按照第3节 data≤ 所介绍的方法翻译成P∧Q→Q'的形式,逐个交给 head (>next)i->data)A ptrl->data<pdata Z3进行证明.由于Z3是可满足性的证明工具,因此 Aj1 /loop invariant ptrl=pir;ptr=ptr>>next:j=j+1; 实际是从Z3证明一(P∧Q→Q)不可满足来得出 } P∧Q→Q成立. p>next=pirl->next:ptrl->next=p;ret=head: 在2.1节提到G中也会有符号断言,G和Q的 } return ret: 符号断言一般不会有矛盾,但G有时会给出更准确 assertion length(ret.next)==m+1A 的信息.在例1中,≤m不能加入循环不变式,因为 yi:1..m.(ret(>next)i-1->dataret(->next)i> 仅j在循环中增1.因此通过最强后条件演算在循 data) 环出口点只能得出j≥1,而从G(这时是G1VG2)可 以得到j<m和j==m两种情况,因为它们分别出 Fig.4 Program and assertions of function for inserting 现在G1和G2的某个浓缩节点附带的约束断言中, a node into an ordered singly-linked list. 用该系统原型已经验证过的简单程序分成3类: 图4有序单链表的节点插入函数的代码和断言 1)只涉及数据结构形状的程序:单链表、循环 链表节点的有序性可以用带全称量词的断言来 单链表、双向链表、循环双向链表和二叉树的创建、 刻画,参看图4的函数前后断言,其中m是一个逻 插人和删除等函数. 辑变量或者叫辅助变量.用全称量词表示链表的有 2)不涉及指针类型数据的程序:冒泡排序、快 序性时需要有链表的长度信息,断言语言有一个预 速排序等程序 定义的函数length,用于各种链表.length(head, 3)两者都涉及的程序:有序单链表的插入程 next)是指针head顺着next域的表长. 序等 通过最强后条件演算,循环前的那个程序点的 4.2两个例子 断言Q是:m==length(head)∧j==1 Ahead-> 例1.本例是在有序单链表中插人一个节点,插 data<p->data A Yi:1..m-1.head (¹qP•¢£H½™$TÐ89:¨ò›œi'$B( H }1çVÓ¨VìrsՒ$¤¯îçVÓ¸ NtSniH ("Dƒ€@SNt ™õö<†Ý$,µVÓ¼„&SÉ´ƒæ €@K9:¨ò‚$~ºÓæ€@ä"…‚1hÉ ´NtDƒ€@H }¡Dƒ³ò´µ¶¦S›$VÓ¼¨m„ &èj8;$¤VÓDƒ¯ÍmïA¶3H z.TBD'Ñ­$1­$ŠÝ¯a‰°èj’ àæûüSK K@ ¢£PlD¯I­6$)+-ZZ #[KKK)+-+ Z#[KK€­"ȯVÓ¼„&S 9:¨ò‚SŒ¿À!@$ '@'"6$T=  @$ K @' à54Qü)+-nJf¿ #[KKDI9:S9: ¨ò›ièi(!Q"!K$'K'"š $)+-¯®Œç iÍà5=È1f¿K¨f¿ #[KKD+ï$•8 1S8;!K$'K'"#!@$'@'"(ltX«÷‚G$ ¯X«÷‚SB¿À6$ÍÂ)+-8;¨n+K ›i‹NO„C[I¿ÀUV$An+m[„ MYD®Ü$¯•ÏMYSŒ¿À6$êë8 ;K&íáŠlS›iA4Q¯mgD B"Dƒ€@SƒÝ ’NtShDƒ€@ K#@.@L$~‹(Ñ šcdS…†xyt P#@.@LS‚$øç½ô I(¢£ƒÝD;¿I(na©ªcSƒÝ°ý$+ï Cnô I(ƒÝ/!P#@.@L"¨a©ªÃû" P#@.@LtfD ¯'D$фüK 6HJ‹êë8;$K K@ S êë8;mh¨J‹NO$#K ‹GJô"YZ^ Ss[D¯­$6$Q)( ¨ŸÖ‰9:¨ò‚$+1 ¡Q¯9:6Y$D+ïºÓæ€@ä"¯9 :"n¸àŸû"Q*$$„ôK!®GnK$'K'"a TûüQ0( KQZZ( Œ¿À$+1•Ïà5" ȯK$ KK' Sãç'(ѸWªS238;6D mIQR*’!xDƒS?¨VÓàt(Õ# $"àVì´µ¶¦›SVÓ#¨Æ=&9: ¨Æ=&ÚÒÆ=&9:ÚÒÆ=KÛÜÝSŒe& ƒ‰KUVfÉ´D '"¨VìrsՒ´µSVÓ#ŽUÓ& UÓfVÓD ("ŒXDVìSVÓ#‹Ó¨Æ=Sƒ‰V ÓfD ?<= y0z{ z;<a­n¯‹Ó¨Æ=6ƒ‰mçѸ$ƒ ‰Ñ¸æÆ=dw‹Ó$‘’¶Æ=Srs$ÉÊ K8;èiBš $¶6²1Æ=ѸS¶¦þÕ ’S~šn8M79>95;810<8%.7+/$1,)R$1,"#:=!2 /,G+%G2810+0%*R$1,DIVÓ¨¡V쁛$„Ø ¹hGhѸ´µížS9»hQD R$1,"./7,-+!R$1,"#,01$G2810+0") 3;;918G/2(ZZ%,/3+#!#,01$/,G+"# (.#$DD(C$D!#,01!C$/,G+".C$C$10+0)#,01!C$/,G+". C$10+0" R$1," )+-%R$1," )+-$%R$1,"-,+%R$1," )% G28Q% ) Z(0%%$"!R$1," "%)C$10+0Z10+0%)C$/,G+Z#[KK% G5!#,01ZZ#[KK") -,+Z)% *94;9G5!)C$10+0)#,01C$10+0") )C$/,G+Z#,01%-,+Z)% *94;9) )+-$Z#,01%)+-Z#,01C$/,G+%QZ$% R=G49!!)+-+ Z#[KK"]] !)+-C$10+00 )C$10+0"" 4//7-3;;918G/2 )+-+ Z#[KK# (.#$DDQC$D!#,01!C$/,G+".C$ C$ 10+0 )#,01!C$/,G+".C$10+0"#)+-$C$10+0))+-C$10+0 #)+-$C$10+00 )C$10+0#Q*$#(.#$DD(CQC$D !)+-!C$/,G+".C$C$10+0))+-!C$/,G+".C$10+0" ')+-ZZ#[KK#(.#$DDQC$D!#,01!C$/,G+".C$C$ 10+0) #,01!C$/,G+".C$10+0"#)+-$C$10+00 )C$10+0 #Q*$""4//7G2@31G328"") )+-$Z)+-%)+-Z)+-C$/,G+%QZQ_$% * )C$/,G+Z)+-$C$/,G+%)+-$C$/,G+Z)%-,+Z#,01% * 198012-,+% 3;;918G/2%,/3+#!-,+$/,G+"ZZ(_$# (.#$DD(D!-,+!C$/,G+".C$C$10+0)-,+!C$/,G+". C$ 10+0" * OGJHB -1/J13632>3;;918G/2;/5502<8G/25/1G2;918G2J 32/>9G28/32/1>919>;G2J4M&4G2W9>4G;8H iB ‹Ó¨Æ=SѸƒ‰É´SÉÊK8; Æ=ѸS‹ÓcaTmªBÄÅ®S8;à •$ãiBSÉ´ƒæ8;$¶6 ( nmçÎ ÏòÅÛXÇÈòÅDmBÄÅ®= Æ=S‹ ÓcG¹q‹Æ=SZWs[$8;<;‹mçç ~š S É ´%,/3+#$m ¿ h  Æ =D%,/3+#!#,01$ /,G+"nrs#,01„H/,G+AS=ZD ºÓæ€@ä"$9:ƒSçVÓ¸S 8;@ n#(ZZ%,/3+#!#,01"#QZZ$##,01C$ 10+00) C$10+0# (.#$DD( C$D#,01!C$ ËÌÍf#mçVÓDƒÞSj!KCÈ $%A$
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有