当前位置: 首页 > 专利查询>浙江大学专利>正文

一种基于LLVM的变量类型信息修复与比较方法及系统技术方案

技术编号:33786971 阅读:16 留言:0更新日期:2022-06-12 14:42
本发明专利技术公开了一种基于LLVM的变量类型信息修复与比较方法和系统,包括变量类型信息修复分析和变量类型比较分析;其中变量类型信息修复分析包括将目标程序源代码编译到LLVM IR、目标变量提取、LLVM IR变量类型与源代码信息匹配、类型分析结果存储。变量类型信息修复分析和变量类型比较分析通过两个的LLVM分析流实现,且变量类型比较分析结果应用了变量类型信息修复分析结果。该方法和系统可以解决前LLVM IR中存在类型信息缺失和/或联合体类型相关类型导致无法进行类型比较分析以及比较分析不准确的问题。分析不准确的问题。分析不准确的问题。

【技术实现步骤摘要】
一种基于LLVM的变量类型信息修复与比较方法及系统


[0001]本专利技术属于软件程序分析
,具体涉及一种基于LLVM的变量类型信息修复与比较方法及系统。

技术介绍

[0002]随着计算机软件的快速发展,软件的代码规模和功能复杂度不断提升,针对计算机软件进行分析的需求也与日俱增,如程序漏洞检测、程序编译优化等。LLVM是目前最流行的程序分析框架之一,其可以将多种编程语言的源代码转换为具有丰富语义信息,并且格式统一的LLVM中间表示(intermediate representation IR),并支持开发人员在IR上设计实现自定义的程序分析流,其被广泛应用于编译优化、自动化漏洞挖掘、自动化漏洞修复、补丁分析、克隆检测等诸多领域。
[0003]LLVM在3.0版本对其LLVM IR的类型系统进行了一次重构,其类型系统主体框架一直沿用至今。在当前LLVM的类型系统中,所有变量的类型被划分为了void类型、函数类型和一级类型;其中一级类型又包括单值类型、标签类型、令牌类型、元数据类型和聚合类型;聚合类型中又包括数组类型、结构体类型和不透明结构体类型。在这套类型系统中,相同上下文(LLVMContext)内的变量类型之间的比较可以通过指针比较来完成,大大提升了程序分析的效率。变量类型比较任务是大量上层程序分析的基础,如全局调用图构建、控制流完整性保护、指针别名分析等,因而构建一套完备的类型比较方法具有重要意义。
[0004]然而,在源代码被编译为LLVM IR的过程中,存在类型信息丢失的情况,如:部分结构体类型和函数类型在编译为LLVM IR后,结构体内函数指针域,或者函数的部分参数被编译为空指针类型;而部分结构体类型还存在结构体名丢失情况。除此之外,LLVM IR的类型系统并没有为C/C++语言中的联合体(union)类型设计单独的类型,在编译联合体类型变量时,会将其视为结构体类型变量,之后在使用时通过类型转换将变量切换为所需的类型。当结构体类型包含联合体类型的域时,会导致不同上下文使用的相同结构体类型变量可能具有不同类型的域成员变量。上述问题会明显影响类型比较任务,导致本应识别为等价类型实际识别为不等价类型,进而进一步使基于类型分析的上层任务出现误报、漏报或分析错误的情况(如基于类型分析的指针别名分析、基于类型分析的间接调用目标分析等)。而如果上层任务为安全相关任务(如控制流完整性),则此类问题还会严重威胁程序安全性和稳定性。
[0005]针对上述问题,目前已有的实现方案并不完备。LLVM内部实现的类型比较方法针对不同的类型设计了不同的比较策略,但对于类型信息缺失和联合体类型相关的类型比较没有进行额外的检查和处理;基于多层类型分析的间接调用目标识别工具TypeDive通过比较类型表示的字符串信息来比较不同上下文之间的类型,对于单值类型、标签类型等简单类型有较高的比较效率,但同样无法应对类型信息缺失和联合体类型相关的类型比较。

技术实现思路

[0006]鉴于上述,本专利技术的目的是提供一种基于LLVM的变量类型信息修复与比较方法及系统,以解决目前LLVM IR中存在类型信息缺失和/或联合体类型相关类型导致无法进行类型比较分析以及比较分析不准确的问题。
[0007]为实现上述专利技术目的,实施例提供了一种基于LLVM的变量类型信息修复与比较方法,包括以下步骤:
[0008]步骤1,获取并编译目标程序源代码为带有调试信息的LLVM中间表示;
[0009]步骤2,从LLVM中间表示中提取目标变量,其中,目标变量包括与分析任务相关,且涉及类型信息缺失的结构体或类型为联合体类型的结构体;
[0010]步骤3,依据调试信息获取目标变量包含的结构体及其中间表示类型在目标程序源代码中对应的源码结构体及其源码定义类型,比较分析结构体的中间表示类型与对应源码结构体的源码定义类型,输出比较结果为不一致的结构体与对应的源码结构体,组成的结构体对;
[0011]步骤4,针对每个结构体对,利用源码结构体的源码定义类型进行变量类型信息修复并存储于修复数据库;
[0012]步骤5,在对待比较分析的两个变量进行中间表示类型比较分析时,调用修复数据库中存储的结构体信息对结构体进行缺失类型信息修复后,再进行变量中间表示类型比较分析。
[0013]在一个是实施例的步骤1,包括:
[0014]配置编译环境,并按实际需求准备编译器和目标程序源代码;
[0015]配置目标程序源代码的编译选项,包括启用保留调试信息选项;
[0016]执行编译流程,编译结束后检查LLVM中间表示的正确性和完整性,检查无误后,输出带有调试信息的LLVM中间表示并存储。
[0017]在一个是实施例的步骤2,包括:
[0018]步骤2

1,依据分析任务从LLVM中间表示中提取需要分析的LLVM变量;
[0019]步骤2

2,提取LLVM变量在LLVM中间表示中的中间表示类型,从中间表示类型中筛选包含结构体的指针类型、包含结构体的数组类型、结构体类型对应的LLVM变量作为候选LLVM变量;
[0020]步骤2

3,从候选LLVM变量中筛选结构体类型信息缺失或者包含联合体类型的变量作为目标变量并输出。
[0021]在一个实施例中,从LLVM中间表示中提取目标变量前,还包括:检查读入的LLVM中间表示的版本信息和调试信息,在版本信息与当前分析框架匹配和存在调试信息时进行目标变量提取,否则进行终止目标变量提取且发出警报以请求人工处理。
[0022]在一个实施例的步骤3,包括:
[0023]步骤3

1,获取目标变量以及目标变量对应的调试信息和中间表示类型;
[0024]步骤3

2,判定中间表示类型为指针类型、数组类型或结构体类型时,执行步骤3

2~步骤3

6;否则视为超出比较范围,并将类型比较结果认定为类型一致;
[0025]步骤3

3,当中间表示类型为指针类型时,获取指针指向变量的类型,依据调试信息从目标程序源代码中提取指向变量对应的对应变量及对应变量的源码定义类型,将指向
变量的类型作为中间表示类型,跳转执行步骤3

2;
[0026]步骤3

4,当中间表示类型为数组类型时,获取数组成员变量的类型,依据调试信息从目标程序源代码中提取数组成员变量对应的对应变量及对应变量的源码定义类型,将数组成员变量的类型作为中间表示类型,跳转执行步骤3

2;
[0027]步骤3

5,当中间表示类型为结构体类型时,获取目标变量包含的结构体及其类型、依据调试信息从目标程序源代码中提取与结构体对应的对源码结构体及其源码定义类型,并进入步骤3

6;然后,获取结构体的子成员变量的类型,依据调试信息从本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种基于LLVM的变量类型信息修复与比较方法,其特征在于,包括以下步骤:步骤1,获取并编译目标程序源代码为带有调试信息的LLVM中间表示;步骤2,从LLVM中间表示中提取目标变量,其中,目标变量包括与分析任务相关,且涉及类型信息缺失的结构体或类型为联合体类型的结构体;步骤3,依据调试信息获取目标变量包含的结构体及其中间表示类型在目标程序源代码中对应的源码结构体及其源码定义类型,比较分析结构体的中间表示类型与对应源码结构体的源码定义类型,输出比较结果为不一致的结构体与对应的源码结构体,组成的结构体对;步骤4,针对每个结构体对,利用源码结构体的源码定义类型进行变量类型信息修复并存储于修复数据库;步骤5,在对待比较分析的两个变量进行中间表示类型比较分析时,调用修复数据库中存储的结构体信息对结构体进行缺失类型信息修复后,再进行变量中间表示类型比较分析。2.根据权利要求1所述的基于LLVM的变量类型信息修复与比较方法,其特征在于,步骤1,包括:配置编译环境,并按实际需求准备编译器和目标程序源代码;配置目标程序源代码的编译选项,包括启用保留调试信息选项;执行编译流程,编译结束后检查LLVM中间表示的正确性和完整性,检查无误后,输出带有调试信息的LLVM中间表示并存储。3.根据权利要求1所述的基于LLVM的变量类型信息修复与比较方法,其特征在于,步骤2,包括:步骤2

1,依据分析任务从LLVM中间表示中提取需要分析的LLVM变量;步骤2

2,提取LLVM变量在LLVM中间表示中的中间表示类型,从中间表示类型中筛选包含结构体的指针类型、包含结构体的数组类型、结构体类型对应的LLVM变量作为候选LLVM变量;步骤2

3,从候选LLVM变量中筛选结构体类型信息缺失或者包含联合体类型的变量作为目标变量并输出。4.根据权利要求3所述的基于LLVM的变量类型信息修复与比较方法,其特征在于,步骤2

2,包括:步骤2
‑2‑
1,判定中间表示类型为指针类型、数组类型或结构体类型时,执行步骤2
‑2‑
2~步骤2
‑2‑
4;否则终止判断;步骤2
‑2‑
2,当中间表示类型为结构体类型时,将结构体类型对应的输入LLVM变量作为候选LLVM变量;步骤2
‑2‑
3,当中间表示类型为指针类型时,获取指针指向变量的类型,判定指向变量的类型为结构体类型时,则认为原始指针类型为包含结构体的指针类型,将包含结构体的指针类型对应的输入LLVM变量作为候选LLVM变量;否则,将指向变量的类型作为中间表示类型,跳转执行步骤2
‑2‑
1;步骤2
‑2‑
4,当中间表示类型为数组类型时,获取数组成员变量的类型,判定数组成员变量的类型为结构体类型时,则认为原始数组类型为包含结构体的数组类型,将包含结构
体的指针类型对应的输入LLVM变量作为候选LLVM变量;否则,将数组成员变量的类型作为中间表示类型,跳转执行步骤2
‑2‑
1。5.根据权利要求3所述的基于LLVM的变量类型信息修复与比较方法,其特征在于,步骤2

3,包括:步骤2
‑3‑
1,当中间表示类型为结构体类型时,检查结构体类型名是否为空,如果为空,则认为结构体类型信息缺失,并将输入的候选LLVM变量作为目标变量;如果不为空且结构体类型名包括.union,则认为是联合体类型,同样将输入的候选LLVM变量作为目标变量;否则,获取结构体的全部子成员变量的类型,将子成员变量的类型作为中间表示类型,跳转执行步骤2

3;步骤2
‑3‑
2,当中间表示类型为指针类型时,检查指针指向结构体的类型名称是否为空,如果为空,则结构体类型缺失,并将输入的候选LLVM变量作为目标变量;如果不为空且指针指向结构体的类型名包含.union,则认为是联合体类型,同样输入的候选LLVM变量作为目标变量;否则,获取指针指向变量的类型,将指针指向变量的类型作为中间表示类型,跳转执行步骤2

3;步骤2
‑3‑
3,当中间表示类型为数组类型时,检查数组包含结构体的类型名称是否为空,如果为空,则结构体类型缺失,并将输入的候选LLVM变量作为目标变量;如果不为空且数组包含结构体的类型名包含.union,则认为是联合体类型,同样将输入的候选LLVM变量作为目标变量,否则,获取数组成员变量的类型,将数组成员变量的类型作为中间表示类型,跳转执行步骤2

3;其中,候选LLVM变量包括结构体类型变量、数组类型变量、指针类型变量。6.根据权利要求1所述的基于LLVM的变量类型信息修复与比较方法,其特征在于,从LLVM中间表示中提取目标变量前,还包括:检查读入的LLVM中间表示的版本信息和调试信息,在版本信息与当前分析框架匹配和存...

【专利技术属性】
技术研发人员:纪守领刘丁豪何钦铭陈建海刘二腾许端清王文海
申请(专利权)人:浙江大学
类型:发明
国别省市:

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

1