张志天等:一个程序验证器的设计和实现 1047 点再指向剩余节点构成的表)两种情况 谓词节点和浓缩节点下侧的长度或个数表达式 图2(b)是单链表的一种非归纳定义list(s,n, 是仅使用常量和声明变量的整型线性表达式,断言 a).灰色矩形节点称为浓缩节点(condensation node), 则是这类表达式的关系运算的逻辑合取式, 是若干个(可以是0个)相邻的、属于同一数据结构 图2(c)是循环双向链表的一种定义,两种情况 的结构节点的概括表示.这些节点上和节点之间只 分别表示空表和非空表.非空则至少有一个节点, 有维系该数据结构的必要的边,外来的边只指向这 后面有n一1个节点.以图3(a)和图3(b)(分别为第 组节点序列的边缘节点,浓缩节点的下侧可以有代 4节例1的循环语句之前那个程序点的形状图和该 表被浓缩节点个数的整型表达式n以及约束该表达 循环的循环不变形状图)为例说明形状图和程序点 式的断言a.若没有这样的表达式和约束,则表示被 指针等信息的联系.从图3(a)可知,head==ptrl, 浓缩节点的个数是某个自然数,但和程序中任何常 ptr==ptrl>next,head指向的链表的长度是m 量或声明变量都联系不起来。 并且tr指向的浓缩节点代表m一1个节点 m-1,m-1>0 (a)Example one □w G next j-1,i-10 m-j-1,m-j-10 j-1,j-10Am-j==0 (b)Example two Fig.3 Two examples of shape graph. 图3形状图的两个例子 形状图上的路径和它所代表的程序中的访问路 ptr: 径用同样的语法表示.只需要考虑从声明节点开始 2)指向NULL节点(悬空节点)的指针都等于 到达某个节点的路径,分成下面两种情况 NULL(是悬空指针): 1)路径的完全表示:在路径不穿越浓缩节点的 3)指向谓词节点的指针都满足相应的谓词。 情况下,由依次列出路径各边上的标记来表示该路 因此,形状图可以作为程序断言,它是该图所能 径.若边上的标记依次为p,left,right,则写成p-> 表达的指针相等、不相等和别名断言等的合取,包括 left>right,即不是用逗号而是用->连接边上的 其中谓词节点和浓缩节点下侧有关表长或被浓缩节 标记 点个数的整型数据断言, 2)路径的浓缩表示:若路径包括某浓缩节点的 形状图逻辑就是基于上面观点来设计的Hoare 一条出边left,并且该节点浓缩了n个节点,则需要 逻辑的一种扩展1).程序规范的形式是{G∧Q}S 让(->left)而不是->left出现在路径上,例如 {G'八Q〉,其中G是形状图,Q是表达程序其他性 (>left)"->right..若n=0,则可以简化为p-> 质的符号断言,两部分的合取G八Q作为程序点完 right. 整的断言.本文程序验证器的第1步工作是,在无需 这样,从声明节点开始到达某个节点的一条路 程序员提供有关形状的函数前后条件和循环不变式 径指称该路径最后那条边所代表的程序指针」 的情况下,利用形状图逻辑对程序进行形状分析.由 形状图是如下断言的图形表示: 于从一个语句前的G推导该语句后的G'不受Q的 1)指向同一个结构节点或谓词节点的指针相 影响,因此形状分析时,把程序规范简化为{G}S 等,指向浓缩节点展开后的同一个结构节点的指针 {G〉,以此来使用形状图逻辑的推理规则,建立各程 相等,例如图3(a)表示的断言中有head->ne.xt== 序点的形状图G.在形状分析的过程中,还利用循环¸¢rÒ#$Ѹ¦tS="¿ÀD i'!Q"n¨Æ=Sm"õö~%.7+!7$/$ 0"D%&ýѸÄ1'(Ѹ!</2>92;38G/22/>9"$ n})ç!aTn%ç"á*S&+¿Fm´µ¶¦ S¶¦Ñ¸S,`= D®éѸÍKѸíà {QI´µ¶¦SqSù$-ÃSùàrÒ® ÐѸÓ.Sù/ѸD'(ѸSz0aTÉ ='(Ѹç´S1=>/Tì23I=> S8;0D}æ®ÜS=>K23$¤= '(ѸSç´nãç+,´$#KVÓ6èjM ÅÛ×ÝòÅD4Q¨gÃD ¾®Ñ¸K'(Ѹz0SZWÛç´=> n¡ÙmMÅK×ÝòÅS1üc=>$8; ¤n®Õ=>ShQâ"SÎÏ;«D i'!<"n9:ÚÒÆ=Sm~$¿À à5= =K"=H"¤o5mçѸ$ æ./C$çѸHTi(!3"Ki(!Q"!à51 BÑ$S9:<£íçVÓ¸SiKI 9:S9:¨òi"1ÝiKVÓ¸ rsfs[S4QHôi(!3"a6$#,01ZZ)+-$$ )+-ZZ)+-$C$/,G+$#,01 rÒSÆ=SZWn( ¥Ø)+- rÒS'(ѸÉ=(C$çѸD OGJH( ,R/9\36749;/5;=379J137=H i( iSç iÍS4KÉ=SVÓ6S3(4 mFÜS<= Dà¹qJKô×ÝѸl7 ü>ãçѸS4$àtz.¿ÀD $"4S8B= #¯4¨9:'(ѸS ¿Àz$;T½."4hùÍSÃúÃ= I4 D}ùÍSÃúT½1)$%,&+$-.3#+$¤<t)C$ %,&+C$-.3#+$w¨nm=ënmC$¬ùÍS ÃúD '"4S'(= #}4_`ã'(ѸS m"ù%,&+$¥ØIѸ'(u/çѸ$¤¹q >!C$%,&+"/ ¨nC$%,&+"ȯ4Í$è )!C$%,&+"/ C$-.3#+D}/Z%$¤aT?@1)C$ -.3#+D ®Ü$ô×ÝѸl7ü>ãçѸSm4 rÄI4ºæùÉ=SVÓrsD inèz8;Si= # $"rÒFm綦Ѹ۾®Ñ¸Srsá f$rÒ'(Ѹ(læSFm綦ѸSrs áf$èi(!3"= S8;6#,01C$/,G+ZZ )+-% '"rÒ #[KKѸ!!Ѹ"SrsDf¿ #[KK!n!rs"% ("rÒ¾®Ñ¸SrsD©ªálS¾®D +ï$iaT²1VÓ8;$nIi =>Srsáf&¨áfK568;fS;«$_` ¶6¾®Ñ¸K'(Ѹz0h=ZÛ'(Ñ ¸ç´S1´µ8;D iÎÏAn/¿Í.B¸Ãj!S V/319 ÎÏSmº('$B( DVÓÀ÷Sn)K#@*! )KL#@L*$¶6 K ni$@ n=>VÓ¶Wc «Sêë8;$ßàS;« K#@ ²1VÓ¸8 1S8;DabVÓDÞS$ï°²n$¯%¹ VÓ¼&hSÉ´æ@K9:¨ò S¿Àz$kmiÎÏPVÓ¢£àXD; ¿ômç<£SK ÐCI<£æSKL¨E@ S ÔÕ$+ ï à X G$ V Ó À ÷ ? @ 1 )K*! )KL*$TïÃÙmiÎÏSÐÑÀ¤$efhV Ó¸SiKD¯àXSV6$ñkm9: ËÌÍf#mçVÓDÞSj!KCÈ $%B+