Page 16 - 《软件学报》2021年第6期
P. 16

1590                                     Journal of Software  软件学报 Vol.32, No.6,  June 2021

         其中,
                                            Ctype::=int|float|char|….
             全局变量的抽象方式:
                                             free〈varname〉:〈type〉.
             局部变量的抽象方式:
                                             new〈varname〉:〈type〉,
         其中,type 是依照前文所述的变量类型转换方法进行替换:
                                             〈type〉=abs(〈Ctype〉).
             对于含有初始化部分〈Initial〉的变量定义语句,采用和 ExprStatement 中的赋值表达式相同抽象方法处理.
             •   ExprStatement
             一个表达式作为独立的 C 语言语句,表达式语句是 C 语言中最基础的语句类型.严格意义上,函数调用语句
         也属于表达式语句的一种,但这里的 ExprStatement 不包含函数调用的表达式语句,因为函数调用表达式语句的
         抽象过程中已被处理过.在 C 语言中的表达式语句的作用是对表达式进行求值,然后丢弃求值结果,像 a+3.这种
         表达式作为单独语句是没有意义的,有用的是执行表达式之后会对参与的变量(一个或多个)的值进行修改的表
         达式语句,最常见是赋值语句和自增减语句.自增减其本质也是一种赋值操作,若作为单独语句,是可以和赋值
         语句等价转换.
             赋值语句的语法如下:
                                            〈Lvarname〉=〈subExpr〉.
             对应的 Pi 演算抽象:
                                        let 〈Lvarname〉=abs(〈subExpr〉) in
             对于〈subExpr〉抽象 abs(〈subExpr〉),我们会进行基于表达式上下文化简,具体参考第 3.3.3 节.
             •   IfStatement/SwitchStatement
             C 语言语法中存在两类条件分支语句:If-Else 和 Switch-Case.Switch case 结构可以转化为 If-Else 结构,所以
         我们重点讨论 IfStatement.SwitchStatement 的抽象可以先将其转换为 IfStatement,再对其进行抽象转换为 Pi 演算
         模型.Pi 演算中支持 if-else 条件判断,因此仅需要将相应的部分条件表达式 condition,if 分支代码块 If_block,else
         分支代码块 Else_block 等,利用本方案中的对应类型进行抽象即可.对于没有 else 的分支,自动补充 else 部分抽
         象:else 0.具体的抽象规则描述如图 5 所示,abs(〈c_code〉)表示对〈c_code〉进行抽象后的结果.

                                                               Pi演算
                                    C代码                   IfStatement::=
                                                           If abs( condition ) then
                                  IfStatement::=          (
                                    if ( condition )
                                                             abs( If_block)
                                     If_block         抽   )
                                  else                象
                                                          else
                                     Else_block           (
                                                           abs( Else_block )
                                                          )

                                         Fig.5   IfStatement abstraction
                                             图 5   条件语句抽象
             •   ForStatement/WhileStatement
             考虑到循环控制结构在 Pi 演算抽象模型中无合适的模型对应,因此和现有的一些方案类似,本文方案对循
         环结构无确定的自动化抽象转换规则.在自动化分析阶段采用保留循环,仅对其中代码块中的子表达式和子语
   11   12   13   14   15   16   17   18   19   20   21