1050 计算机研究与发展2013,50(5) 生两个验证条件:循环人口点的断言蕴涵循环不变 到相应程序点的形状图G上的信息,因此验证条件 式和循环体最后一个语句之后的那个程序点的断言 应该是G∧Q→Q,但G上的信息必须符号化.把G 蕴涵循环不变式。 上的指针相等(包括指针等于NULL)断言符号化, 下面介绍把生成的验证条件提交给Z3时碰到 再加上浓缩节点下方的约束断言、链表长度断言(在 的3个问题及其解决办法 验证条件中出现链表长度断言时需要),形成符号断 1)把结构体的域名看成函数名,结构体的指针 言P,因此实际的验证条件是P∧Q→Q'.若G是空 看成函数的变元,以此克服Z3不具备有关访问路 图(如不涉及指针类型的程序),则验证条件直接就 径的知识带来的困难。 是Q→Q'. Bornat在考虑指针程序的证明时,把数据堆看 在把指针相等信息符号化时,为避免冗余,给出 成由指针索引的一群对象[门,把对象看成由名字索 G上相邻两个静态声明指针变量之间的关系,剩下 引的一组成员. 的相等关系可以推导.例如对于图3(b)的第1种情 在此采用类似的方式,把结构体的域名看成整 况,指针之间的相等关系转换成的符号断言如下: 数域上的一元函数名,把结构体的指针当成整型,作 ptrl==head(->next)A ptr==ptrl-> 为函数的变元.例如,第4节例1的结构体类型有两 next A ptrl(>next)"-==NULL, 个域ne.xt和data,它们分别被看成函数.验证条件 其中,第3个子断言不用给出,因为经过一个浓缩节 中可能有的head->next,ptr->data和ptrl-> 点再指向NULL节点的信息对验证条件的证明通 next->data这样的访问路径分别被翻译成next 常没有用处 (head),data(ptr)data (next(ptr1)).Z3 next 对于双向链表,相邻两个节点之间指向对方的 和data当成未解释函数[1町,就是不知其定义的函 指针形成一个等式,若域名分别是right和left,则 数.若有head==ptrl,则从编程语言的语义知道 有p>right>left==p或p>left>right-== head->next==tr1l->ext;在Z3中,若有head== p.那么,代表n个节点的浓缩节点之间就有很多个 ptr1,则从函数的性质也会得出ext(head)== 等式,好在一般来说,当这n个节点在G上被浓缩, next(ptrl). 验证条件就不会涉及其中的指针相等关系,所以在 2)引入辅助的二元函数来克服带上角标的访 将G符号化时不用给出这些相等关系。 问路径引起的困难。 断言中会出现像p(->next)”->data这样带 4 系统原型 上角标n并且n可以是线性表达式的访问路径,由 于n的值一般不能静态确定,因此该访问路径不可 基于形状图逻辑和程序分析的支持,我们实现 能翻译成data(next(…next(p)…)并且其中函数 了PointerC语言的一个程序验证器[a町,它能够验证 next的应用次数确定的表达式. 不涉及易变数据结构的程序,也能验证涉及各种链 可以把p(->next)"翻译成nextn(p,n),并引 表和二叉树的构建、插入和删除等的程序.除了验证 入一个二元函数nextn(p,n),它基于函数next来定 形状外,还能验证节点上数据的一些性质。 义(其中n≥0) 该验证器无需程序员提供有关数据结构形状的 p,n=0: 函数前后条件和循环不变式,但要求提供非指针型 extn(p,n)=df了ext(p),n=1; 数据的函数前后条件和循环不变式. (next(nextn(p,n-1)),n>1. 4.1系统流程及验证条件的生成 显然,nextn(p,n)表达的意思就是p(一> 该验证器分成下面几个模块,按所列次序顺序 next)".在访问路径的表示中,p(->next)+1就是 执行 p(>next)"->next;Z3有了函数extn的定义 1)普通编译器的前端 后,很容易推出nextn(p,n+1)==next(nextn(p, 对源程序进行词法分析、语法分析和静态语义 n)). 检查后生成抽象语法树, 3)将形状图上的信息用符号断言表示,以支持 2)形状分析 验证条件的证明. 遍历抽象语法树,根据形状声明和形状图逻辑 符号断言形式的验证条件Q→Q'的证明需要用 来生成各程序点的形状图.其中在遇到循环语句时,NçD@#9:n¸S8;op9:¨ò K9:þºæmç<£íæSçVÓ¸S8; op9:¨òD z.cdNtSD@½ô I(Gqü S(ç(©ì¶
D $"¶¦þSA6tÉ´6$¶¦þSrs tÉ´Sò|$Tïrs I(¨ýth3(4 S6uªÃS/0H ^/1238¯JKrsVÓSÝG$´µ t;rsvSmwPö'$+($Pöt;6vv SmÐt¼D ¯ïÒmÕÿS
$¶¦þSA6t1 ´AÍSm|É´6$¶¦þSrst1$² 1É´Sò|Dè$BÑ$S¶¦þÕ çA/,G+K10+0$Ïà5tÉ´DD@ 6aS#,01C$/,G+$)+-C$10+0 K)+-$C$ /,G+C$10+0 ®ÜS3(4à5xyt/,G+ !#,01"$10+0!)+-"K10+0!/,G+!)+-$""DI(/,G+ K10+0 tê
ßÉ´'$E($An¨6¶~SÉ ´D}#,01ZZ)+-$$¤ôPV<;S<6z #,01C$/,G+ZZ)+-$C$/,G+%¯I(6$}#,01ZZ )+-$$¤ ô É ´ S c « H J û " /,G+!#,01"ZZ /,G+!)+-$"D '"ÇÈSÛ|É´ÃrsªÍ¹ÃS3 (4gS/0D 8;6J"ÈÚ)!C$/,G+"/ C$10+0®Üª ͹Ã/ ¥Ø/ aTnüc=>S3(4$; ¿/Smh¨{^~$+ïI3(4¨a xyt10+0!/,G+!,/,G+!)",""¥Ø¶6É´ /,G+Slm½´^~S=>D aT)!C$/,G+"/ xyt/,G+/!)$/"$¥ mçÛ|É´/,G+/!)$/"$/¿É´/,G+Ã~ !¶6/*%"# /,G+/!)$/"A1& )$/A%% /,G+!)"$/A$% /,G+!/,G+/!)$/O$""$/$$ + , - D | ,$/,G+/!)$/"= > S } ~ A n )!C$ /,G+"/ D¯3(4S= 6$)!C$/,G+"/_$ An )!C$/,G+"/ C$/,G+%I( u É ´ /,G+/ S ~ æ$_`³Ð"/,G+/!)$/_$"ZZ/,G+!/,G+/!)$ /""D ("iÍSs[mêë8;= $T\w D@SÝD êë8;SD@@.@LSݹqm üálVÓ¸SiK ÍSs[$+ïD@ lInK#@.@L$#K ÍSs[¦êë@DK ÍSrsáf!_`rsf¿ #[KK"8;êë@$ ¢ÖÍ'(Ѹz
S238;&Æ=ZW8;!¯ D@6"ÈÆ=ZW8;G¹q"$têë8 ;P$+ïCSD@nP#@.@LD}K n i!è¨VìrsÕSVÓ"$¤D@A n@.@LD ¯rsáfs[êë@G$1íî$$ô" K Íá*ç{×ÝrsòÅíShQ$#z SáfhQaTÐCDèP¿i(!Q"S$¿ À$rsíSáfhQiótSêë8;èz# )+-$ZZ#,01!C$/,G+"QC$ #)+-ZZ)+-$C$ /,G+#)+-$!C$/,G+"(CQC$ZZ#[KK$ ¶6$(ç8;¨mô"$+1xmç'(Ñ ¸¢rÒ #[KKѸSs[PD@SÝ Mæm]D P¿ÚÒÆ=$á*çѸírÒP
S rstmçf$}A6à5n-.3#+K%,&+$¤ )C$-.3#+C$%,&+ZZ)Û)C$%,&+C$-.3#+ZZ )DÙ$É=/çѸS'(ѸíA_Hç f$¯mhÃ$®/çѸ¯K Í'($ D@A¨JVì¶6SrsáfhQ$T¯ K êë@G¨mô"®éáfhQD ? ]pqr /¿iÎÏKVÓàXS\w$ÎÏCÈ u -/G2891*<;SmçVÓDÞ'$)($ D ¨Vì³ò´µ¶¦SVÓ$HDVìhÆ =KÛÜÝS¦e&KUVfSVÓHVuD -$ñDѸʹµSméc«H IDÞ%¹VÓ¼&h´µ¶¦S É´æ@K9:¨ò$#qù&"rs ´µSÉ´æ@K9:¨òH ?<; ]ps1t34uv6wx IDÞàtz.óç$~.½ÓÓ
£H $"·PyÞS P-VÓ¢£®àX&<àXK{< æNtõö<ÝH '"àX õö<Ý$,µ×ÝKiÎÏ ÃNthVÓ¸SiH¶6¯ü9:<£G$ $%A% !"#$%&'( '%$($A%!A"