张志天等:一个程序验证器的设计和实现 1049 除S和Q中的别名,得到S和Q' 任何其他变量的值,因此可靠性证明和无别名语言 我们把Hoare逻辑的赋值公理限定为无别名 的Hoare逻辑的赋值公理的可靠性证明没有区别. 时才能使用,并增加下面的消除别名推理规则: 2)对于指针操作语句,在Q中没有别名的情况 {GΛQ"}S'{GΛQ') 下,这些规则对Q的修改都是可靠的。 {G∧Q}S{G∧Q) 以规则{G∧Q}u=o{G∧Q['Iu]}为例.若一 (S',Q)eliminate_liases(G,S,Q), 条访问路径的前缀被替换,则替换前后的访问路径 就可以对含访问路径别名的程序进行推理, 指称同一个数据单元.若是一条完整的访问路径被 对于修改指针型数据的语句,其前断言Q可能 替换,就目前使用的断言语言来说,“只可能作为参 是程序员提供的,例如不排除循环不变式中Q存在 数出现在链表表长函数length(u,结构体的指针型 别名,因此有时也需要这条规则, 域名)中(见第4节例1的前断言),用相等的指针 复合、条件和循环语句的规则以及推论规则的 来代换,则因它们指在同一个节点上而不改变length 形式和Hoare逻辑相应规则的形式一致. 的值. 在没有指针类型的情况下,使用Hoare逻辑的 3)函数eliminate aliases得到的S'和S有同 赋值公理从赋值语句的前断言Q得到后断言Q'时, 样的语义,Q和Q也有同样的含义.类似2),消除别 不用关心Q是否为Q,VQ2的形式.但是在有指针 名前后的访问路径指称同样的数据单元,因此语义 类型的情况下,GVG2代表相应程序点的形状图有 和含义不变 两种可能,需要对它们分别考虑,因此需要增加一条 4)消除别名的推理规则是可靠的.是3)的推论 分情况规则: 5)分情况规则的可靠性.在文献[14]中已经 {G1∧Q}S{G1∧Qi}{G2AQ2}S{G2∧Q2} 证明. {G∧QVG2AQ}S{Gi∧Q1VG2∧Q2} 有了这几点则可以说所用的程序逻辑是可靠的. 先前提到的选取析取范式G∧QVG2AQV… VG。AQ.的一种情况来讨论就是基于这条规则. 3 易变数据结构上数据性质的验证方法 2.3程序逻辑的可靠性证明 本节简要证明2.2节略加扩展的Hoare逻辑 自动程序验证器的验证能力取决于所用的自动 对PointerC语言的操作语义是可靠的(sound). 定理证明器的能力,供程序员描述函数前后断言和 在有栈和堆的机器上,一个形状图再加上分配 循环不变式用的断言语言也是据此来设计的,通用 在栈上的整型和布尔型变量的图形表示就构成程序 的自动定理证明器一般没有针对易变数据结构的性 状态的一种图形表示.这种图形表示的程序状态区 质证明的部分,本节介绍如何将所需证明的性质转 别于通常状态的主要地方是,每个指针的具体值不 化为Z3可以接受的形式. 清楚,但它们之间相等与否是清楚的,因此可以理解 易变数据结构上数据性质的描述,例如链表数 为每个指针有一个抽象值.基于在这样抽象状态上 据的有序性可以通过引人谓词来表示,也可以通过 的操作语义,文献[14]证明了下面两个重要性质: 使用全称量词来表示,本文设计的验证器采用后者, 1)形状图断言的演算规则是可靠的: 例如,可以用下面的断言来描述head所指向的长度 2)形状图逻辑中修改形状图的指针操作语句 为m的单链表的有序性: 的程序推理规则是可靠的, Yi:1..m-1.(head(->next)->data 有了这两个性质,则2.2节的程序推理规则中, head(>next)i-data). 前后断言中的G和G'是可靠的. 在PointerC的布尔类型表达式的基础上,增加 在没有指针类型的情况下,Hoare逻辑的推理 带上角标的左值表达式和预定义的用于各种链表的 规则对通常的操作语义可靠已是众所周知的.因此 函数length,并增加带量词的断言形式,就构成本文 下面仅非形式地证明几个涉及扩展的性质, 验证器提供的断言语言.为便于阅读,本文描述断言 l)对于非指针操作语句,Hoare逻辑的赋值公 所用的逻辑符号并未遵从所设计的断言语言. 理在没有别名的情况下使用是可靠的。 本文验证器采用最强后条件演算的方式来产生 在无别名的情况下,赋值公理{Q[Ex]}x=E{Q} 验证条件.通常在程序员提供断言的地方会产生验 的赋值x=E只改变x的值,不会改变Q中出现的 证条件,例如对程序员提供的每个循环不变式会产V! K@ 6S56$ûü!LK@LD ÎÏ V/319ÎÏSÑu~1%56 G§Ùm$¥YÖz.SqV56ÐÑÀ¤# )K #@N*!L)K #@L* )K #@*!)K #@L* !!L$@N"A,%.(./0+,-%.07,7!K$!$@"$ AaTP^3(456SVÓ¢£ÐÑD P¿rs´µS<£$¶8; @ a nVÓ¼&S$è¨UV9:¨ò6 @ ¯ 56$+ïGH¹q®À¤D [;&@K9:<£SÀ¤TìÐÊÀ¤S K V/319ÎÏálÀ¤Sm[H ¯ærsÕS¿Àz$Ùm V/319ÎÏS Ñô<£S8;@ ûüæ8;@LG$ ¨mhb@ nJ1@$'@' SD#n¯rs ÕS¿Àz$K$'K' É=álVÓ¸Si a$¹qPÏà5JK$+ï¹qYÖm à¿ÀÀ¤# )K$ #@$*!)KL$ #@L$*)K' #@'*!)KL' #@L'* )K$ #@$ 'K' #@'*!)KL$ #@L$ 'KL' #@L'*D üSc«X«÷K$#@$'K'#@'', 'K/#@/ Sm¿ÀÃIÊAn/¿®À¤D =<> 12KL6def4g aÑ?qÝ'H'ÑÖº(S V/319ÎÏ P -/G2891*<;S±²<nabS!;/02>"H ¯dKS#ÞÍ$mçi¢ÖÍà ¯dÍS1KKLòÅSi= A¦tVÓ Smi= H®i= SVÓF 5¿MSnq
n$îçrsSýþ¨ Æe$#Ïíáf&JnÆeS$+ïaTÑ
1îçrsmçõöH/¿¯®ÜõöÍ S±²<$bp'$B(Ýuz.çpqc«# $"i8;Sä"À¤nabS% '"iÎÏ6iSrs±²<£ SVÓÐÑÀ¤nabSH u®çc«$¤'H'ÑSVÓÐÑÀ¤6$ æ8;6SK KKLnabSD ¯ærsÕS¿Àz$V/319ÎÏSÐÑ À¤PMS±²<ab!nfg6SD+ï z.¡"ÝóçVìº(Sc«D $"P¿"rs±²<£$V/319ÎÏS ѯæ56S¿ÀzÙmnabSD ¯%56S¿Àz$Ñ)@'F"G(*GZF)@* SGZF àòG S$¨Jò @ 6"ÈS èj¶WòÅS$+ïabcÝK%56<; S V/319ÎÏSÑSabcÝæF5D '"P¿rs±²<£$¯@ 6æ56S¿À z$®éÀ¤P@ SDnabSD TÀ¤)K#@**Z6)KL#@'*L"*(*1D}m 3(4SR\ó$¤\óæS3(4 rÄFmç´µ¨|D}nm81S3(4 \ó$A2ÙmS8;<;Ã$*àa²1ã ´"ȯÆ==ZÉ´%,/3+#!*$¶¦þSrs A6"6!òBÑ$S8;"$máfSrs*L ÃÉó$¤+Ïr¯FmçѸͨò%,/3+# SD ("É´,%.(./0+,-0%.07,7ûüS!LK! F ÜS<$@LK@ HFÜS^HÕÿ'"$qV5 6æS3(4rÄFÜS´µ¨|$+ï< K^¨òH B"qV56SÐÑÀ¤nabSHn("SÐÊH A"à¿ÀÀ¤SabcH¯bp'$B(6!x ÝH u®ó¸¤aTmSVÓÎÏnabSH > hijklmnjkfo634WC +¤VÓDÞSD?«¿mS+¤ ~ÑÝÞS?$&VÓ¼ÁÂÉ´æ8;K 9:¨òmS8;<;HnµïÃj!SHm S+¤~ÑÝÞmhæsP³ò´µ¶¦Sc «ÝSßà$aÑcdèj¹ÝSc«i @1I(aTESH ³ò´µ¶¦Í´µc«SÁÂ$èÆ=´ µSÓcaT¾®Ã= $HaT ÙmBÄÅ®Ã= $abj!SDÞÒmæX$ è$aTmz.S8;ÃÁÂ#,01rÒSZW 1 ( S¨Æ=SÓc# (.#$DD(C$D!#,01!C$/,G+".C$ C$10+0) #,01!C$/,G+".C$10+0"D ¯ -/G2891*SKLÕ=>S/iÍ$YÖ ªÍ¹ÃSj=>Kç~Sm¿hÆ=S É´%,/3+#$¥Y֪ŮS8;$A¦tab DÞ&S8;<;D1»¿kl$abÁÂ8; mSÎÏêë¥êmôj!S8;<;D abDÞÒmºÓæ@ä"S
ÃåN D@DM¯VÓ¼&8;S
JåND @$èPVÓ¼&Sîç9:¨òJå ËÌÍf#mçVÓDÞSj!KCÈ $%B)