您好、欢迎来到现金彩票网!
当前位置:2019欢乐棋牌 > 指称语义 >

形式化方法--程序的正确性验证-14doc

发布时间:2019-08-11 11:37 来源:未知 编辑:admin

  第十四讲形式化方法--程序的正确性验证一、概述 计算机的程序是一种静态的对象,但它所描述的问题(问题的解)却是一个动态的对象。 态行为。这是不自然的,程序所描述的动态行为也无法直接用程序本身的静态结构进行正确性 证明。 形式化规约(formal specification)是需求阶段的形式化说明,是用户需求的严格描述, 一般形式用Hoare逻辑描述[11 如下: W分别表示初始和结朿断言条件,其含义是:“假如初始状态山满足条件O,那么 值域。显然,由O和W断言条件所确定的合法初始和结束状态的集合是D的一个子集。执行函数E:中XP-*中定义如下: 无定义对合法的初始状态d 对合法的初始状态程序P结來程序的正确性即为: iff di))))总地来讲,验证一个程序的正确与否有两种办法,一种是程序的测试,另一种是程序的 程序的测试与程序的验证对给定的一个合法的初始状态当程序执行结朿时其终结状态为 )都应该被满足。这一点可用下式表示:{di}P{d },即验证程序对di的执行结果是否为d,、。由 一种尽量发现错误,但并不能保证程序中没有错误[2]的方法。对大数应川來讲,它是可满足 的;但对有些应用來讲,测试是一种不能满足的验证方法,例如:航空、航天等领域 的软件系 )对进行验证, 而各种测试方法只是选择(di,d )的策略不同而己。因此,验证程序是否完全正确要寻求另外的解决途径。那就是程序的正确性验证。 形式语义与程序的正确性验证程序的正确性验证应该具有严密的推量过程,以保证程序每步执行结果都是希望的结 而与程序执行的某个初始状态无关。程序的正确性证明现有三种方式:操作语义、指称语义和 公理语义。它们分别用不同的形式化方法,严格地证明一个程序是否正确。尽管这种 方法还不 够完善,还不为一般软件人员所掌握,但它确实是保证软件绝对正确的唯一途径。 操作语义(Operational Semantics) 操作语义的根据是,一种程序设计语言一但在某种计算机系统中实施,其语义的含义也 当然,这种实施应该在一种标准的、抽象的机器上进行。英国科学家din最早提 种类型的一个抽象机器,称为“栈-环境-控制-外存”。IBM公司提出了一种可描述程序设计语 言语义的元语言:VDL。后來,英国的爱丁堡大学提出了更一般的方法:在数据结 构上用数学 关系建立操作语义的解释系统。 这种方法的本质就是,用抽象机器的状态空间和最简单的基本指令来定义抽象语言的语 将抽象语言的程序转换为一系列抽象机器的基本指令序列。这种对应关是同定的,而且抽象机 器的基本指令的含义是固定的,这样一个程序设计语言的程序就有了一个明确的、无 本指令序列的一次执行只能验证一组输入、输出状态之间的关系。因此,用操作语义验证一个 程序的正确性实质上是一种测试型的验证方式。 指称语义(Denotational Semantics) 指称语义学认为,程序设计语言的语义是由其语言成份的语义决定的,而程序设计语言 份执行的最终结果,而不是其执行过程。这种执行结果是巾语言成份形式后而隐藏的所指物决 定的,故这种方式也称为指称语义。 指称语义是由牛津大学的C.Strachey教授创立,D.Scott 教授完善的,故指称语义也称 津语义。IBM公司也创立了基于指称语义的VDM软件开发方法。指称语义的指称物均为数学对象,如整数、集合和映射等。指称物的集合称为论域。一 语言的指称语义就是确定该语言的相关论域,并给岀语法成份到论域上的语义映射。一个抽象 的程序设计语言程序的语义就是指称语义所指的数学对象在论域上的数学运算,其正确 性证明 就是指称语义相应的数学运算公式的特性(递归类型语言成份的数学运算公式特征就 是其不动 点的特征),这些性质是可严格推理和证明的。 公理语义(Axiomatic Semantics) 公理语义是根据数学屮的公理化方法形式化程序设计语言相关语法的语义。赋以公理语 否具有某种性质。公理语义是最流行的程序证明方法。这种方法最早是由Floyd 在他的“Assigning Meanings Programs”一文中提出的,后经 C.A.Hoare AxiomaticBasis ComputerProgramming” 一文屮发展和完善的。 公理语义对程序设计语言中的每个成份(包括整个程序)定义了一对断言(assertoin): 前置断 言(Precondition)和;t;置断言(Postcondition)。前置断言是某个语言成份在执行前满 足的谓词, 而后置断言则是该语言成份执行后应该满足的谓词。 有两种使用公理语义的方式,一种是所谓的自顶向下的方法,用前置和后置断言描述用 的需求,然后,将前置断言14后貫断言转化的步骤逐步细化,直到每一步都能用计算机语 行实施为止。只要保证分解的步骤是正确的,那么最终的程序设计结果也是正确的。这种方法 的典型代表是唐稚松先生的 XYZ 系列语言[4]。另一种方法是自底向上的,根据每个 语言单 元定义的前置断言和该成份本身的特征,推导出其后置断言。一个语法单元的后置断 言可作为 下一个语法单元的前置断言,从而揄出整个程序的后置断言,以此可证明程序应满 足的性质和 程序的正确性。 二、公理系统:Hoare 逻辑和时态逻辑 公理系统是最流行的程序正确性证明和验证的方法,Hoare 系统是公理系统中的典型代 的语义:如果程序执行前满足断言则当程序执行终止后,它一定满足断言 叫。下面通过一个经典的例子说明Hoare 逻辑表述和其优缺点。 求n!的程序FAC (程序FAC的描述采用FLOW语言[2],以下其它程序的描述相同): 表示当n为任意自然数时,如果该程序执行终止,x 的值为n!,这一性质可用 {neN}FAC{x=n!} 命题表示。用命题还可表示程序FAC的其它性质,如: {tt}FAC{y=0} 命题表示无论初值如何,当程序终止时,y的值为0。 由于命{ 屯}不能保证程序P—定能终止,因此,这种命题也称为程序的部分正确 性证明的命题(因为证明程序是否结來是一个递归不可判定问题,即图灵机停机问题。本文 不深 入讨论,以下所说的程序正确性证明均指部分正确性证明,在文章的最后再给出正确性 证明的 补充)。这种程序正确性的命题如果为真,就称其为Hoare 系统中的定理。 那么,如何用公理的方法进行推理呢?设D= (A,I)是一个演绎系统,其屮,A= ,……,1„)表示规则的集合。公理是一个系统屮不用证明、预先 承认的事实。如果,S 是系统屮一条合法的语句,那么, 表示s 是系统中的•一个定理。l-Si HS HrHS ro演绎系统屮,一个定理的证明就是一个合法的语句序列(要用公理或规则说明为什么该 语句 是合法的)。下面举一个著名的、最简单的演绎系统及其推理的例子。 -如果P和Q是两个不同的点,那么经过P 和Q的线只有一条。 AB:卜假如L是一条线,那么存在一个不在L上的点。 下而是“I-最少有三个点”的证明步骤.• 卜最少由三个点1,2, 口的,所以,任何一个结构化的程序设计语言写的程序均可表示为以下的形式:Si; S2;…;S (di表示执行语句Si 后的状态)。为了证明<2〉, 对每一对(Si, Si+l )定义一个谓词断言Mi。显然,可按下而的逻辑推理步骤证明(2): Vd 卜中(do)HO(do)-M,(d,) ~Mi (di) -*M“d2) Hln-l(dn-l) 而证明卜队(山)->此+1(山41)就是证明:Vdj (假如 -Mi (di),执行语句 Si 后,-Mi 这样,程序的正确性证明就归结到每条语句的正确性证明。下面的Hoare逻辑为验证程 屮的语句提供了一般性的方法。Hoare 逻辑是这样的一个演绎系统D 是Hoare逻辑系统中的公理集(这里不 HR)skip Hl}while 要用Hoare 逻辑验证一个程序,即所谓的程序正确性证明(证明 Hoare 系统中的定理), 是用前貫条件、逻辑系统屮的公理、定理以及上述语言成份所规定的语义规则,按程序的执行 步骤推导出后賈条件。 下面是应用Hoare 逻辑,对归纳命题{neN}FAC{x=n!}的证明过程: neN前置条件 FAC 的第一条语句 2,3,规则(2) FAC的第二条语句 y=n-k)}7z

  8,令 10.{3keN(neN y=n-k)}8,9 11. 循环的第一条语句12. {3keN(neN 10,11,规则 13.{3keN(nEN y-l=n-(k+))}12, 12〕13 14. 循环的第二条语句15. {3keN(neN 13,14,规则 16.{3keN(neN y=n-k)}17. 10,11, 13, 14, 16,规则 18.(while#(y, FAC的第三条语句 19. {3keN(neN y=n-k)A-I 17,18,规则 19=)20可见,用Hoare 逻辑进行推理与一般的逻辑系统的推理是一样的。对FLOW语言写的程 用Hoare逻辑证明其正确性的难点是while 语句。证明while 诏句的办法就是寻找进当 的循环不 (证明某个循环语句时,它的循环不变S既要利用前而的推理结果和其它条件, 也要为后 续的证明提供必要的前置条件),其数学基础是不动点理论。注意:在证明循环语 句的正确性 时,并不要求循环不变量在循环体内的证明过程中的每一点上都满足,它只是要 求在循环体的 前和后保持不变即可;另外,不变量在每次循环前后的形式一样,但其“含义” 是不一样的, 是要发生变化的。一般情况下,循环不变:W:的设计足与该循环的循环变:W:相关 的、与循环体 中包含的语句的语义相关。 以Hoare 逻辑为代表的传统的公理证明方法的弱点是:程序本身描述的行为是动态的, 结状态的过程,因此,用这种逻辑进行描述程序的性质是不自然的,也是不直观的。另一个用Hoare 逻辑进行推理的弱点就是推理的方向性。用Hoare 逻辑验证程序的正确 序列。这就像从入口进入迷宫一样(已知MJ,要达到 出LI是很难的(寻找M )。由于有规则〈6〉,有人提出丫最弱前置条件(weaskestprecondition) 逆向推理的办法。其基本思想是:没一条语句S 和一个该语句执行后满足的 断言Q,那么,能使 {R}S{Q}成立的R很多,我们把其中最弱的一个R记为:wp(S,Q) 这样,我们就可以根据一 个给定的程序的最后一条语句和程序最终的断言倒着一步一步地推出 整个程序唯一的最弱前置 条件,记为wp(S,W)。设该程序P 的归纳命题的前置断言为0), 如果wp(P,叩),那么, 原命题成立,即它是Hoare 系统巾的一个定理。 按照这一思路,我们也可以设置相对应的最强后置条件(strongest postcondition): 对给定 的语句S 和一个该语句执行前满足的断言P,能使{P}S{Q}成立的Q很多,我们把其 中最强的一 Q记为sp(P,S)。对程序P Hoare逻辑的命题从给定程序的第 一条语句和程序的前置 断言O开始,一步一步地推出整个程序最后一条语句的最强后置条 件,记为:sp(O,P)。如 果sp(O,P)-^P,那么,命题{O}P{U]亦成立。还有一种办法就 是,从前向后推出该程序的前缀7的最强后置条件sp(o/ 同时,从后前推出该程序后缀P的最 弱前置条件wp(K 口)。当两个方向的推理交汇时,如果sp(o/ wp(r,屯),则命题得证。 寻求wp(P,屯)和sp(,P)在理论经上是可行的,但实际操作起来却是相当W难和费时 这就使得用Iloare逻辑的方法证明程序的正确性宥相当的难度,这主要是因为Hoare 逻辑采用的 元语句是命题逻辑,它本身是研究静态对象的,而程序变化的木质规律是变:W:空 间状态的变化, 程序的执行是一种动态现象,所以才产生了上述的困难。Hoare 逻辑只能描 述了某一吋刻(当前 的)状态,而与其它状态无关。 为了能直接描述程序状态变化的本质,我们耑要另一种逻辑体系來描述这种随时间变化 变化的状态信息。时态逻辑就是能描述变量随时间变化而变化的逻辑系统。显然,用时态逻辑 可描述程序的动态语义,而且比较直观。 时态逻辑是公理语义的程序正确性证明的一个分支。时态逻辑是由以色列科学家 manna等人创立的,由于布俾统的逻辑中增加了上一吋刻、下一吋刻等算子, 使它能描述 程序的历史和将來的状态,从而可描述程序的性质,并进行逻辑推导以验证程序 的正确性。 下而介绍时态逻辑,以及用时态逻辑证明程序正确性的方法。 设有穷变元集合V={xi, X2,…,x )为状态s,s(Xi)表示X,在状态S 的值,在一•定的上下文中s(Xi)可简写为Xi。同样,s(e)表示表达式e在状态 下的值(对表达式e(xn, Xi2,…,Xi.),定义 s(e(Xi i2,…,Xim) Ee(s(Xii), s(Xi2),…, (s。,Si,…,Sk,…)为模型,s。表示当前状态,Si 表示下一个状态,等等。 在时态逻辑屮,原子、公式和连接词1、A、V、O、=以及作用于非时态变元的3 般的逻辑系统相同[5]。时态连接词又分为将来(Riture)和过去(Past)两大类。将来时态连接词 及其含义为: Next Opiff (=OPiff Vk, (=Opiff PWiff 彐Vk,k HPUnless (=pcoqiff 3u:piff 3(/,cf Vu:piff Vcf,(/是

  -.p FX2: (Op-^Oq)EX3: FX4:Dp— OpFX5: (p=

  Op) (p=

  (qv (PAO (pcoq))) FX7: np^pcoq FX8: p=

  OOp 八条过去公理不再列出,详见[6]。 L表示时态逻辑演绎系统的规则(P表示程序,p 表示某个公式或性质): RX1 (GEN) HopRX2 (SPEC) RX3(INST):Pb RX4(MP) h(piA---Apn)Phpi, hp.. VP,Vp, 般规则,还有一类与程序有关的规则:RX6(INIT): hpRX7 (STEP): IHp}T(q) =(p=

  Oq)由以上两公式还可推出: RX8 (S-INV): he-p,Hp}T{p} Adili gent 时态语义,Te TeC则有如下语义公理: RX9 (T-SEM) hXp-pRX5 Hx„RX9 1,2,RX4也就是说,只要证明了 PhX 即只要论证了一个程序P的语义X ,其它的性质均可推出。程序的性质可分为若干层次类型,每种类型可用一个时态逻辑公式模或描述,该类型的 性质均 可用该模式说明,并有一套相关的证明方法。设S 为状态的集合,2 为所有可能的状态序列,那么,一个程序的性质P 就是的一个子集。一个时态公式

  q)表明,当p满足计算模型初态时,该计算模型具有不 变的性质q。保证 性(Guarantee Properties)所有等价于Op 形或的公A被称为保证公或, 它描述的性质被称为程序 的保证性。它所映了程序执行屮一定发生的性质,例如.• Otermial。 责任性(Obligation Properties) 所有等价于八V! (LlpiV^qi)形式的公式被称为责任公式, 它描述的性质被称力责任性。响应性 xeT (Response Properties)所有等价于 Op 形式的公式 被称为响应公式,它描述的性质被称为响应性。它描述了某些性质出现了无数次。持久性 (Persistence Properties)所有等价于p 形式的公式;被称为持久公式,它描述的性质 被称为持 久性。它描述了程序中某些最终变稳定的性质。反应性(Reactivity Properties) 所有等价于 pvOOp 形式的公式被称为反应公式,它描述的性质被称为反应性。这些性 质之间的关系如下 图所示(连线表示包含关系): Reactivity 将非安全性的性质称为进展性。进展性屮都包含^,它们之间的不同是初始条件和相应 质发生的频率不同。安全性强调某个要求在计算过程中一直满足,它可表达某些坏的性质不发 生;而进展性可表示某些好的性质一定会发生。 程序的部分正确性的时态逻辑公式为: —口(程序结束一叩)它等价于: (程序结束八 (first 的状态(P_acceSS ible states)中都是可满足的。由于程序的可访问状态均是执行一个程 序的语句而 得到的,因此,〈6〉的证明可归纳于程序的语句的证明。 FLOW语言屮各语句的时诚语义如下: Pi:move (1,1’)八Pres(Y) 其巾,Pl表示可能的程序状态转换关系,Y 表示程序中的所有变量,Pres(Y)表示集合 pi:move li:Si else I2: S2) move(1,11) move(IJ2) A-I pi:move( pi:move( 1J) A-I Pres(Y)即对一个程序的语句,按上述规定的语义,验证一个Dp 类型的安全性(程序的部分正 其它的一些规则也可用于证明程序的正确性,如:MON_I,CON_I规则等。 但值得一提的是,一个程序的部分正确性并非总是可归纳的。例如,[7]中图1.2 的例子。 为此,可采用一个更强的断言(INV),增量式(SV.PSV)证明等策略。 下面用时态逻辑验证 FAC Ay=n-k)),下面逐一验证FAC 的语句: 不成立,执行后x=l执行后y=n,存在k=n 成立3=>

  q)表明,当p满足计算模型初态时,该计算模型具有不 变的性质q。保证 性(Guarantee Properties)所有等价于Op 形或的公A被称为保证公或, 它描述的性质被称为程序 的保证性。它所映了程序执行屮一定发生的性质,例如.• Otermial。 责任性(Obligation Properties) 所有等价于八V! (LlpiV^qi)形式的公式被称为责任公式, 它描述的性质被称力责任性。响应性 xeT (Response Properties)所有等价于 Op 形式的公式 被称为响应公式,它描述的性质被称为响应性。它描述了某些性质出现了无数次。持久性 (Persistence Properties)所有等价于p 形式的公式;被称为持久公式,它描述的性质 被称为持 久性。它描述了程序中某些最终变稳定的性质。反应性(Reactivity Properties) 所有等价于 pvOOp 形式的公式被称为反应公式,它描述的性质被称为反应性。这些性 质之间的关系如下 图所示(连线表示包含关系): Reactivity 将非安全性的性质称为进展性。进展性屮都包含^,它们之间的不同是初始条件和相应 质发生的频率不同。安全性强调某个要求在计算过程中一直满足,它可表达某些坏的性质不发 生;而进展性可表示某些好的性质一定会发生。 程序的部分正确性的时态逻辑公式为: —口(程序结束一叩)它等价于: (程序结束八 (first 的状态(P_acceSS ible states)中都是可满足的。由于程序的可访问状态均是执行一个程 序的语句而 得到的,因此,〈6〉的证明可归纳于程序的语句的证明。 FLOW语言屮各语句的时诚语义如下: Pi:move (1,1’)八Pres(Y) 其巾,Pl表示可能的程序状态转换关系,Y 表示程序中的所有变量,Pres(Y)表示集合 pi:move li:Si else I2: S2) move(1,11) move(IJ2) A-I pi:move( pi:move( 1J) A-I Pres(Y)即对一个程序的语句,按上述规定的语义,验证一个Dp 类型的安全性(程序的部分正 其它的一些规则也可用于证明程序的正确性,如:MON_I,CON_I规则等。 但值得一提的是,一个程序的部分正确性并非总是可归纳的。例如,[7]中图1.2 的例子。 为此,可采用一个更强的断言(INV),增量式(SV.PSV)证明等策略。 下面用时态逻辑验证 FAC Ay=n-k)),下面逐一验证FAC 的语句: 不成立,执行后x=l执行后y=n,存在k=n 成立3=y^0,执行循环体的第一条语句,由于y=n-k *(n-(k-l))*y所以,执行该语句后 所以p成立。 执行该语句后y=y-l,由 p(while^(y,0)do Up由规则INV_B,此时,循环结束=(y,0),那么k=n,所 ;表示顺序算了,即控制自动转向下一个语句的句首。Ox=a:表法系统 x的值下一个时刻为a,而其仑变呈的值不变。LB=y:表示当前执行语句的标号为y 下面是FLOW语言翻译成时态逻辑公式的规则[参见4]: skipl’:LB=1 ->

  y^0,执行循环体的第一条语句,由于y=n-k *(n-(k-l))*y所以,执行该语句后 所以p成立。 执行该语句后y=y-l,由 p(while^(y,0)do Up由规则INV_B,此时,循环结束=(y,0),那么k=n,所 ;表示顺序算了,即控制自动转向下一个语句的句首。Ox=a:表法系统 x的值下一个时刻为a,而其仑变呈的值不变。LB=y:表示当前执行语句的标号为y 下面是FLOW语言翻译成时态逻辑公式的规则[参见4]: skipl’:LB=1 -OLB=1\ li:Si else -*Si)v((LB=1 A-IC) —S2); ((LB=1AC)->

  OLB=1\ li:Si else -*Si)v((LB=1 A-IC) —S2); ((LB=1AC)-SALB=1)V((LB=1A-,C) 语句变成了时态逻辑公式,因此可在逻辑系统中,验证该程序是否和其规范等价(用Hoare逻辑 只能验证一个性质,但不能证明该性质是否与其规范等,这是因为在 Hoare 逻辑系统中, 一条 语句和{P}s{Q}等价,{P}s{Q}不是逻辑公式,它不能参加逻辑推理〉,从而验证相应的 FLOW 程序的正确性。 设A表示一段程序P 的规范,TL表示P 相应的一组时态逻辑公式,现已有成形的、机 械的方法证明TL hA,但无证明A hTL的自动化方法[参见4],只能用手工的方法论证。这 种方式 总的来讲是先有程序,然后W根据它的规范来验证该程序的正确性。唐稚松先生将其 称为“马 车置于马的前方”。他认为应该先有软件的规范,然后根据规范得到软件的实现。他创立了一 套基于时态逻辑的XYZ/E系统,软件的规范(用抽象的XYZ/AE 表示)和软件 的实现(用可 执行的XYZ RR表示)都nJ在同一时态逻辑系统下表达,并且也可表达即含 XYZ/AE,也含 XYZ/EE 的屮间形式的混合描述。这样,从最初的规范到最后的可执行程序, 形成了一个逐步 细化的时态逻辑描述序列: Si,s 只要保证S,是正确的,且Si+1 hSi,那么,S,,就一定是对S,的正确实现。这种逐步求精 用时态逻辑还可证明更复杂的程序性质,如:并行程序的性质、死锁问题等等。下面对程序的完全正确性证明作补充说明,程序的完全正确性i 正明[2],即在证明程序 分正确性的同时,也要证明程序能正常结朿。由于结构化语言的特殊性,即它只由顺序语句、 分叉语句和循环语句等三种类型的语句组成,而顺序语句和分叉语句执行后一定结束, 所以,程 序能否结束就是要证明程序屮的所有循环语句能否正确结來。Dijkstra 为程序的 循环语句的完全 正确性证明定义了下面的规则: {1A-.B}其中,前提条件的第一条语句同Hoare 逻辑的第七条规则:第二条语句要求存在一个递减的、 界的良序集;第三条语句保证,当t递减到一个圾小数时,循环结束。一般地,t 与循环变量有关,所不同的是循环变量可以递增,也可以递减,但 永远被设计为递减的。例如,上 面用lloare 逻辑对FAC函数的证明中,令t(y)=y, FAC的完整性证明为(FAC的Hoare 逻辑证明续): 21. Hi-ygto+l=Ht 2123. H(Kto+l} 24.HIAB 25.-{I}while {TAIB}规则(79,17,23,24 26. l-FAC 结束 20,25,FAC 只有一个循环 三、结束语 程序验证是软件工种中一个非常重要的理论问题,Hoare 逻辑被认为是 工具之一。然而,Hoare逻辑对一段程序(语句、程序段)的描述{P}S {Q}不是逻辑公式, 能参加逻辑推理。另外,程序的本质是基于冯诺依曼计算机的状态转换,Hoare逻辑中采 传统逻辑系统却无法表达状态转换。这两点极大地限制了Hoare 逻辑在程序验证屮的地 用。由以色列学者Z.Maiwa和A.Pmieli 创立的时态逻辑,由于引入了下一时刻(口) 算子,可 表达程序中的状态转换,并且基于时态逻辑的{P)S{Q}描述也是一个时态逻辑公式, 它为程序的逻辑系统屮的推演奠定了坚实的某础。 参考文献 RobertV.Binder. Testing Object-Oriented System: models,pattern, tools.Addison Wesley Longman, 2000 周巢尘。形式语义学引论。计算机研究与发展,1985,22 H.K.Berg,W.E.Boebert, W.R.Franta, T.G.moher. Formal Methods Programverification Specification.Prentice-Hall, 1982 Z.MannaA.Pnueli TemporalLogic ConcurrentSystems: Specification. Springer-Verlag, 1992 Z.MannaA.Pnueli Temporal verification ReactiveSystems: Safety. Springer-Verlage, 1995

http://acetechpng.com/zhichenyuyi/502.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有