一种提升静态分析精度的中间表示方法技术

技术编号:38243676 阅读:29 留言:0更新日期:2023-07-25 18:05
本发明专利技术公开了一种提升静态分析精度的中间表示方法,包括以下步骤:步骤一,生成抽象语法树;步骤二,构造控制流图;步骤三,执行指针分析;步骤四,插入mu、chi语句;步骤五,构造支配关系;步骤六,构造控制依赖图;步骤七,替换phi函数;步骤八,SSA构造;步骤九,组合控制依赖图;步骤十,完成中间表示的构建;本发明专利技术相较于现有的静态分析用中间表示方法,它能够精确的编码程序执行的所有语义;同时它是能够应用于传统的数据流分析、污点分析算法,提升分析效率;另外由于该IR图编码了所有的执行语义,所以能够很简洁地通过遍历图的方式,完成路径敏感的数据流分析和污点分析,或者符号执行。或者符号执行。或者符号执行。

【技术实现步骤摘要】
一种提升静态分析精度的中间表示方法


[0001]本专利技术涉及静态程序分析
,具体为一种提升静态分析精度的中间表示方法。

技术介绍

[0002]目前,静态分析被广泛应用于编译优化与程序的静态缺陷检测,而静态分析技术一般实现在某种特定的中间表示(IR)上,常见的中间表示有抽象语法树(AST),类三地址码,控制流图(CFG),程序依赖图(PDG)等,然而传统的中间表示仍然存在表达程序语义的能力不够强等问题,进而导致上层的静态分析精度低,分析能力不够强,具体而言,传统的中间表示仍然存在如下2个问题:一是层次太高或者太低,导致难以实现高精度的静态分析,层次太高的中间表示,例如抽象语法树(AST),表达的程序语义非常丰富,但是由于语法结构非常复杂,静态分析算法在实现时需要考虑几乎所有的语法结构特性,导致实现精确的静态分析非常困难,层次太低的中间表示,例如LLVM IR,在损失源代码详细信息的同时,LLVM IR的静态单赋值(SSA)形式只考虑最简单变量(未被取地址的局部变量),不考虑指针解引用,函数调用等语法特性,在真实的程序分析工具中,会导致分析本文档来自技高网...

【技术保护点】

【技术特征摘要】
1.一种提升静态分析精度的中间表示方法,包括以下步骤:步骤一,生成抽象语法树;步骤二,构造控制流图;步骤三,执行指针分析;步骤四,插入mu、chi语句;步骤五,构造支配关系;步骤六,构造控制依赖图;步骤七,替换phi函数;步骤八,SSA构造;步骤九,组合控制依赖图;步骤十,完成中间表示的构建;其特征在于:其中在上述步骤一中,输入被分析工程代码,将其解析成抽象语法树(AST),并将其规范化;其中在上述步骤二中,先构造控制流图(CFG),在标准化后的程序中,为每个函数构造CFG,然后构造调用图,根据函数名字匹配被调用函数,针对函数指针,查看是否该函数指针被赋值特定的函数,如果存在,则连接对应的调用边;其中在上述步骤三中,沿着调用图的逆拓扑序列,对每个函数执行符号化流敏感指针分析;其中在上述步骤四中,对程序中的load语句(a=*b)和store语句(*a=b)进行标记;其中在上述步骤五中,在被标记后的程序上进行SSA构造,构造CFG节点间的支配关系、支配边界,具体而言,在SSA构造的时候,明确所有语句的定义和使用关系,以明确phi函数的插入与变量的重命名;其中在上述步骤六中,通过已经构造的支配关系,构造CFG的控制依赖图;其中在上述步骤七中,替换phi函数为gamma函数,针对SSA构造的phi语句p=phi(p1,p2,...,p
n
),由于在SSA构造算法中,知道phi函数中的第i个参数一定是phi函数的第i个入边,修改SSA构造算法的重命名(Rename)算法:在对phi函数的第i个参数进行重命名时,由于知道当前正在处理的是哪条分支,所以通过控制依赖关系,能够知道当前分支的控制依赖,记为c
i
,于是phi语句可以改写成p=phi(<c1,p1>,<c2,p2>,...,<c
n
,p
n
>),将这种改写后的phi函数记为gamma函数:p=gamma(<c1,p1>,<c2,p2>,...,<c
n
,p
n
>);其中在上述步骤八中,针对函数调用语句的SSA构造,沿着调用图,自底向上对每个函数进行局部的SSA构造,在SSA构造完之后,可以知道当前分析函数的定义和使用关系;其中在上述步骤九中,组合带条件数据依赖与控制依赖图,此时,在两个图完成组合后,可抛弃更上层源代码级别的AST和CFG结构,因为构造完成的中间表示,能够完整地表达程序执行的所有语义;其中在上述步骤十中,此时中间表示完成,可以在该中间表示上进行高精度路径敏感的静态分析。2.根据权利要求1所述的一种提升静态分析精度的中间表示方法,其特征在于:所述步骤一中,规范化后的程序中,每条语句最多只有一个副作用(函数调用、赋值操作),使得语法结构相对简洁。3.根据权利要求1所述的一种提升静态分析精度的中间表示方法,其特征在于:所述步骤三中,指针分析可划分符号化的内存区域,使得每个表达式所访问的内存区域是可知的。4.根据权利要求1所述的一种提升静态分析精度的中间表示方法,其特征在于:所述步骤四中,具体标记规则如下:1)对于load语句a=*b,查询b的指向集合为Pts(b)={b1,b2,...,b
i
},对a=*b语句标记一个语句的集合:{mu(b1);mu(b2);...mu(b
i
);},被标记后的load语句表示变量a依赖所有的b
i
,i∈[1,i];
2)对于store语句*a=b,查询a的指向集合为Pts(a)={a
i
,a2,...,a
j
},对*a=b语句标记一个语句的集合:{a1=chi(a1);a2=chi(a2);...;aj=chi(aj);},于是*a=b被标记后表示变量a
i
(i∈[1,j])在该语句处既...

【专利技术属性】
技术研发人员:陈睿贾春鹏王峥杨帆丁戈肖志恒王博祥于婷婷高栋栋
申请(专利权)人:北京轩宇信息技术有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1