1052 计算机研究与发展2013,50(5) next)i-->datahead(-next)i-data. 数组类型.下标表达式的使用也会引起别名,例如在 在该程序点产生的验证条件是Q蕴涵循环不 i=j时,a[门和a[j门就互为别名.下标变量的别名 变式,该验证条件的证明必须在从形状图(如图3 问题比较容易解决,本系统采用的办法是每次对数 (a)所示)获得ptr1==head,ptr==pr1->next和 组a的一个下标变量赋值就引入一个大小一样的虚 m一1≥0(该表这时至少有1个节点),还有r== 拟新数组a'(即它仅在验证中使用).例如,若数组a NULLV ptr!=NULL之后才能完成.其他验证条 大小是n,在赋值a[]=e(0≤j≤n一1)之后,该赋值的 件的证明也需要形状图的支持. 后断言包括其前断言以及Vi:0.j一1.a'[]==a[]N 例2.本例是快速排序的完整程序和断言,如图 a'[j]==e∧Hi:j+1.n-1.a'[i]==a[i]. 5所示.该程序虽不涉及指针型数据,但使用了一维 该方法使得生成验证条件的演算比较简单,但 int [10]arr; 增加了自动定理证明器的负担.本例虽然没有给数 int low.up: 组置初值,但它不影响对该程序的验证. int partition(int lowl.int up1) 另一个特点是本例包括了递归函数的验证,以 assertion 0==low Aup==9 A low<lowl 体现所实现的系统已经有较好的适应能力. A lowl≤up1Aupl≤up int k.m.j.temp.ret: k=arr[upl]:m=lowl-1;j=lowl; 5 相关工作比较 while(j!=up1) loop_invariant 0==low Aup==9 A low<low1A lowl≤up1Aupl≤up∧lowl一1≤nA 程序验证技术的各种应用体现出它们对程序性 m≤npl-1 A lowl≤Aj≤4plA 质的保证程度,高端是证明程序满足它的功能规范, Vi:low1..m.arr[i]i:m+1..j-1.arri 低端是仅仅发现一些可能的程序缺陷.通常所说的 arr[upl]==k if(arr[Uj门≤k){ 程序验证器处于高端,它需要自动定理证明器的 m =m+1:temp=arr[m];arr[m]=arr[j]:arr[j]=temp: 支持 自Reynolds提出分离逻辑)后,指针程序验 j=j+1: 证的研究进入一个活跃阶段.Smallfoot!]是一个典 temp=arr[up1]:arr[upl]=arr[m+1]:arr[m+1]=temp: 型的使用分离逻辑进行符号执行的程序验证工具, ret=m+1:return ret: 其他还有Verifast2o等.我们在先前的研究中也提 assertion 0==low A up==9 A lowlowl A lowlupl A 出一种指针逻辑[2)来用于指针程序的验证.除了引 upl≤ap∧lool≤ret A rets≤wp1A Vi:low1..ret-1.arrtilk Aarr[ret]==kA 言已经指出的本文克服访问路径别名方法与分离逻 Yi:ret+1..upl.arr[i]>k 辑方法相比的优点外,本文方法的另一个优点是,不 需要程序员提供有关数据结构形状的函数前后条件 void quick_sort(int low2,int up2){ assertion0==low Aup==9Alom≤lore2A4p2≤wp 和循环不变式,无论是用分离逻辑还是指针逻辑,让 int i: 普通程序员来写这些断言是一件十分困难的事情. if(low2<up2) 另外,分离逻辑用分离合取连接词来分隔不同 i=partition(low2.up2): quick_sort(low2.i-1):quick_sort(i+1.up2); 堆块的断言的方式,使得一般需要引入归纳定义的 谓词来描述数据结构的节点之间的关系.而与归纳 return: 定义相适应的是用递归方式而不是循环方式来编 assertion0==low Aup==9∧lor≤loe2A lomw2≤up2A"p2≤upA Yi:lo2..up2-1.a[门≤a[i+1] 程,例如文献[22]给出的研究程序验证的源语言连 循环语句也没有.对于各种链表的插入和删除等函 main() 数,程序员可能更习惯用循环来编程,本文给出的带 assertion true low=0:up=9:quick_sork(low.up): 上角标的访问路径以及使用全称量词的方式,便于 assertion 0==low Aup==9A Yi:low..up-1.a[i]a[i+1] 描述各种链表的节点之间的数据关系。 分离逻辑的优势是其适用性较强,它不需要像 Fig.5 Program and assertions of the Quicksort function. 本文这样禁止编程语言使用指针算术运算和取地址 图5快速排序完整的程序和断言 运算等.分离逻辑技术的众多研究使得它在提高自/,G+".C$C$10+0)#,01!C$/,G+".C$10+0D ¯IVÓ¸åNSD@n @ op9:¨ ò$ID@Sݦ¯ôi!èi ( !3" "û)+-$ZZ#,01$)+-ZZ)+-$C$/,G+K (C$*%!I=®Go5$çѸ"$ñ)+-ZZ #[KK')+-+ Z#[KK íæ§8tD¶WD @SÝH¹qiS\wD z=<anUÓS81VÓK8;$èi A DIVÓÿ¨Vìrs´µ$#Ùmum{ G28'$%(0--% G28%$9$*)% G28)0-+.+.$/!G28%$9$$G28*)$") 3;;918G/2%ZZ%$9#*)ZZ)#%$9)%$9$ #%$9$)*)$#*)$)*) G28J$($Q$ +,()$-,+% JZ0--'*)$(%(Z%$9$C$%QZ%$9$% R=G49!Q+ Z*)$") 4//7-G2@31G328%ZZ%$9#*)ZZ)#%$9)%$9$# %$9$)*)$#*)$)*)#%$9$C$)(# ()*)$C$#%$9$)Q#Q)*)$# (.#%$9$DD(D0--'.()J#(.#(_$DDQC$D0--'.($J# 0--'*)$(ZZJ G5!0--'Q()J") ( Z(_$%+,()Z0--'((%0--'((Z0--'Q(%0--'Q(Z+,()% * QZQ_$% * +,()Z0--'*)$(%0--'*)$(Z0--'(_$(%0--'(_$(Z+,()% -,+Z(_$%198012-,+% 3;;918G/2%ZZ%$9#*)ZZ)#%$9)%$9$#%$9$)*)$# *)$)*)#%$9$)-,+#-,+)*)$# (.#%$9$DD-,+C$D0--'.()J#0--'-,+(ZZJ# (.#-,+_$DD*)$D0--'.($J * @/G>B*."J-7$-+!G28%$9'$G28*)'") 3;;918G/2%ZZ%$9#*)ZZ)#%$9)%$9'#*)')*) G28.% G5!%$9'0*)'") .Z)0-+.+.$/!%$9'$*)'"% B*."J-7$-+!%$9'$ .C$"%B*."J-7$-+!._$$*)'"% * 198012% 3;;918G/2%ZZ%$9#*)ZZ)#%$9)%$9'# %$9')*)'#*)')*)#(.#%$9'DD*)'C$D0'.()0'._$( * (0./!") 3;;918G/28109 %$9Z%%*)Z)%B*."J-7$-J!%$9$*)"% 3;;918G/2%ZZ%$9#*)ZZ)#(.#%$9DD*)C$D0'.()0'._$( * OGJHA -1/J13632>3;;918G/2;/58=9`0G<W;/18502<8G/2H iA UÓ81SVÓK8; ´ÐÕDzÃ=>SÙmHJg56$è¯ .ZQG$0'.(K0'Q(A¾156DzÃòÅS56 (©³´`³
$aQRÒmSnî½P´ Ð0SmçzÃòÅAmç9»mÜSþ O´Ð0L!w¡¯D6Ùm"Dè$}´Ð0 9»n/$¯0'Q(Z,!%)Q)/C$"íæ$IS æ8;_`¶8;Tì(.#%DDQC$D0L'.(ZZ0'.(# 0L'Q(ZZ,#(.#Q_$DD/C$D0L'.(ZZ0'.(D I
ÙûNtD@Sä"³´?¨$# YÖu+¤~ÑÝÞS_`Haÿ,æô´ Ð$#¨ÔÕPIVÓSDH m祸na_`uõÉ´SD$T þÈCÈSQR!x´Sl?H @ |>}-~ VÓD78ShlmþÈ"ÏPVÓc «SdVW$rnÝVÓ©ªSéÀ÷$ Nn¡¡'ÈméaSVÓHMS VÓD Þ ] ¿ r $ ¹ q + ¤ ~ Ñ Ý Þ S \wH + :9M2/4>;"àÎÏ'$$(æ$rsVÓD S$%¢mçO°H"63445//8'E(nmç SÙmàÎÏ¢£êë
£SVÓD°ý$ ¶Wñ a91G53;8''%(fHÎϯS$%6H "mrsÎÏ''$(Ãm¿rsVÓSDHVu ;!xr"Sabrs3(456
&àÎ Ï
á³S·¸-$ab
Smç·¸n$¨ ¹qVÓ¼&h´µ¶¦SÉ´æ@ K9:¨òH%ÊnmàÎÏñnrsÎÏ$> ·VÓ¼Ã<®é8;nm@à/0S ¿H -$àÎÏmà;«¬®ÃࡨF S8;S
$Ùûmh¹qõö~S ¾®ÃÁ´µ¶¦SѸíShQH&õö ~álSnmõ
¨n9:
ÃP V$èbp'''(ô"S$%VÓDS-<;¬ 9:<£HæHP¿hÆ=SKUVfÉ ´$VÓ¼aY¢£m9:ÃPV$abô"Sª ͹ÃS3(4TìÙmBÄÅ®S
$»¿ ÁÂhÆ=SѸíS´µhQH àÎÏS·¤n¶mc´Ó$¨¹qÚ ab®ÜäåPV<;Ùmrs"8â"K« â"fHàÎÏ78SfH$%Ùû¯r+ $%A' !"#$%&'( '%$($A%!A"