【技术实现步骤摘要】
一种基于LLVM的变量类型信息修复与比较方法及系统
[0001]本专利技术属于软件程序分析
,具体涉及一种基于LLVM的变量类型信息修复与比较方法及系统。
技术介绍
[0002]随着计算机软件的快速发展,软件的代码规模和功能复杂度不断提升,针对计算机软件进行分析的需求也与日俱增,如程序漏洞检测、程序编译优化等。LLVM是目前最流行的程序分析框架之一,其可以将多种编程语言的源代码转换为具有丰富语义信息,并且格式统一的LLVM中间表示(intermediate representation IR),并支持开发人员在IR上设计实现自定义的程序分析流,其被广泛应用于编译优化、自动化漏洞挖掘、自动化漏洞修复、补丁分析、克隆检测等诸多领域。
[0003]LLVM在3.0版本对其LLVM IR的类型系统进行了一次重构,其类型系统主体框架一直沿用至今。在当前LLVM的类型系统中,所有变量的类型被划分为了void类型、函数类型和一级类型;其中一级类型又包括单值类型、标签类型、令牌类型、元数据类型和聚合类型;聚合类型中又包括数组类型、结构体类型和不透明结构体类型。在这套类型系统中,相同上下文(LLVMContext)内的变量类型之间的比较可以通过指针比较来完成,大大提升了程序分析的效率。变量类型比较任务是大量上层程序分析的基础,如全局调用图构建、控制流完整性保护、指针别名分析等,因而构建一套完备的类型比较方法具有重要意义。
[0004]然而,在源代码被编译为LLVM IR的过程中,存在类型信息丢失的情况,如:部分结 ...
【技术保护点】
【技术特征摘要】
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中间表示的版本信息和调试信息,在版本信息与当前分析框架匹配和存...
【专利技术属性】
技术研发人员:纪守领,刘丁豪,何钦铭,陈建海,刘二腾,许端清,王文海,
申请(专利权)人:浙江大学,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。