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

张协力  等:C2P:基于 Pi 演算的协议 C 代码形式化抽象方法和工具                                            1591


         句进行抽象,最后采用人工分析进行抽象转换,这其中或引入执行语义的损失.
             •   NullStatement
             空语句不执行任何操作但也符合 C 语言的语法规范,我们将其等价转换为 Pi 演算中的空过程 0.
         3.3.3    表达式约简
             表达式是 C 语言语句中的核心组件,对表达式的抽象逻辑处于整个抽象方案的最底层环节.变量和常量是
         最基本的表达式:对于变量,我们直接在抽象逻辑中将其作为相应抽象类型的变量;常量将其视为不解义符号.
         对于由变量和代数运算符等构成的表达式,先按照代数运算规则对其进行相应的计算约简,再将约简后的表达
         式中的代数运算符抽象为 Pi 演算中的构建操作(constructor).
             所谓约简,即在当前函数中,对表达式根据表达式的求值运算规则进行求值运算.
             基于函数上下文关系的表达式约简算法见算法 2.
             算法 2.  基于函数上下文关系的表达式约简算法.
             输入:单个函数定义中的表达式序列 E;
             输出:约简后的表达式序列 E′.
             1.   Context=[⋅];
             2.   E′=[⋅];
             3.   Foreach e in E then
             4.      Context.append{e};
             5.      e′=Simplify(Context,e);  //据表达式上下文 Context 对表达式 e 进行化简
             6.      E′.append(e′);
             7.   EndFor
             8.   Return E′
             在一个函数的上下文中,维护一个表达式的上下文内容,根据表达式的上下文内容逐行对当前的表达式进
         行约简.最后,函数中出现的局部变量都会被函数的参数变量、全局变量以及常量的代数表达式所替代.经过约
         简后的表达式,基本的代数运算和逻辑运算已经完成,无法根据当前信息进一步对表达式进行运算.无法进一步
         运算的表达式中的代数运算符视为透明操作,用 Pi 演算中的 Constructor 来表示.以最基本的二元运算符+为例
         进行说明.对于二元操作符+,抽象为 constructor add: fun add(num,num):num.其他操作符类似,n 元操作符抽象为
         n 元函数即可.
             基于函数表达式上下文关系代码约简示例如图 6.



                                   ...                       ...
                                    x=a+1;                   x=a+1;
                                    y=x+2*x+3+5;             y=3*a+11;
                                    result=x+y;              result=4*a+12;
                                   ...                       ...

                                    Fig.6    Sample code for expression reduction
                                            图 6   表达式约简示例

         4    C2P 实现与评估

         4.1   实   现
             本节介绍关于依照上文方案开发的 C2P 工具的实现.
             C2P 工具以人工预处理后的源码为输入,将其依照上文所述的抽象方法转换为对应的 Pi 演算模型.在实现
         时,我们利用 C 编译器前端开源项目 clang 及 llvm 库,采用 C++编程语言开发了 C2P 工具代码,约 1.5KLoC.
   12   13   14   15   16   17   18   19   20   21   22