CN112100059B - 一种c语言的指针类型分析方法 - Google Patents
一种c语言的指针类型分析方法 Download PDFInfo
- Publication number
- CN112100059B CN112100059B CN202010842855.4A CN202010842855A CN112100059B CN 112100059 B CN112100059 B CN 112100059B CN 202010842855 A CN202010842855 A CN 202010842855A CN 112100059 B CN112100059 B CN 112100059B
- Authority
- CN
- China
- Prior art keywords
- pointer
- type
- domain
- init
- mapping
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开了一种C语言的指针类型分析方法,能快速分析大规模C代码中指针变量所有可能指向的类型。本方法先将输入程序的所有C语言源代码转换并整合为LLVM IR比特码,并根据比特码中包含的类型信息初始化目标状态函数;随后遍历IR比特码中的每一条指令,根据不同的指令类型对当前的目标状态函数进行更新;本方法反复分析IR比特码中的指令直到目标状态函数不再变化为止;分析完成后,即得到完整的目标状态。
Description
技术领域
本发明涉及计算机程序分析领域,尤其涉及一种C语言的指针类型分析方法。
背景技术
C语言因其较快的运行速度和丰富的程序库而得到广泛的使用。众多高性能的软件均由C语言编写,如Linux/Windows操作系统内核、编译器、数据库以及嵌入式系统应用等。这些软件为其他应用提供了基础环境以及基础功能,构成了计算机系统的基础设施,因而具有极广的部署范围和极高的重要性。单以Linux内核的应用之一Android操作系统为例,截至2019年5月,谷歌发布声明称Android系统的全球用户数量已高达25亿。在如此广泛的部署数量下,确保C语言程序的正确性和稳定性显得愈发重要。
然而越来越大的代码规模对传统软件测试提出了挑战。传统的软件测试一般使用动态测试,即运行程序后输入测试样例观察程序的运行状态。测试样例需要人工编写或是由程序动态生成。对于小型应用人工编写的测试样例往往足够覆盖程序所有的执行路径,然而对操作系统级规模的代码进行手工测试则会消耗大量的人力和时间。Linux 5.6版本的内核已包含了超过3千万行代码,通过手工编写的样例来覆盖所有执行路径不具备可行性。另一方面,采用模糊测试(fuzzing)技术自动化生成的样例不具备针对性,生成的测试样例往往无法通过输入合法性判断,或是无法组成有效的语义,使其无法测试到程序内部大量的条件分支。
程序的静态分析技术能够有效的弥补动态测试的不足之处。静态分析技术读取程序代码作为输入并自动化地分析程序代码语义。由于静态分析无需运行程序或是提供合法输入,因此它的速度更快且能覆盖程序的所有条件分支。不同静态分析方法的结果也不同,其结果可以是程序的正确性和稳定性,也可以是关于程序的针对性信息,为插桩或是动态测试提供参考。
已有的静态分析技术默认指针声明的类型(简称声明类型)和指针所指向实例的指针类型(简称实际类型)是一致的。然而这一假设在C语言中不完全成立,主要有两点原因:(1)C语言中存在char*或是void*等类型的通用指针,其声明类型无法反映实际类型。(2)C语言中存在的强制类型转换可能将指针变量转换为另一指针类型,或是整型,造成声明类型和实际类型不一致。这种不一致导致声明类型不能完全反映指针的实际类型,使得静态分析不再具备健全性(soundness),严重影响静态分析的精确性甚至导致错误的结果。
发明内容
本发明实施例的目的是提供一种C语言的指针类型分析方法,以解决现有类型分析技术不完整、不准确的问题。
为了达到上述目的,本发明实施例所采用的技术方案如下:
本发明实施例提供一种C语言的指针类型分析方法,包括:
将输入程序的所有C语言源代码转换并整合为LLVM IR比特码;
根据LLVM IR比特码,分析其包含的结构体类型信息,所述结构体类型信息包含结构体指针域的类型信息,根据结构体指针域的类型信息,对结构体指针域集合到类型集合的映射μ(·)进行初始化,得到初始映射μinit(·),其中映射μ(·)以结构体的指针域作为输入,输出该域所有指向的实际类型;
根据μinit(·),对指针变量到类型集合的映射ε(·)进行初始化,得到εinit(·),对目标状态σ=(ε,μ)进行初始化,得到σinit=(εinit,μinit),其中ε为指针变量到类型集合的映射,μ为结构体指针域集合到类型集合的映射;
从初始化的目标状态σinit出发,遍历程序中的所有函数,对每一个函数,遍历函数中的每一条指令,其中每种不同的指令定义了一个不同的状态转移函数TransInst(·),遍历过程中访问一条指令后,目标状态发生相应的状态转移:σ′=TransInst(σ);重复这一步骤直到σ不再变化为止;
输出ε,即程序中所有指针变量可能的实际类型。
进一步地,将输入程序的所有C语言源代码转换并整合为LLVM IR比特码,包括:
使用LLVM提供的LTO编译模式对目标程序的C语言源代码进行编译,得到该程序完整的LLVM IR比特码,其中目标程序的C语言源代码包含一个或多个C语言源文件。
进一步地,初始化结构体指针域集合到类型集合的映射μinit(·),包括:
对于每个结构体类型,递归地遍历它的所有域;在此过程中,若访问的域是指针域,则初始化该域的实际类型为它的声明类型,即μinit(fd)=typeof(fd),其中结构体的域到类型集合的映射记为μ(·),域记为fd,typeof(·)表示指针域或者指针变量的声明类型。
进一步地,初始化指针变量到类型集合的映射εinit(·),包括:
对于程序中的每一个指针变量v,初始化映射ε(·)为εinit(v)=μinit(field(v))∪typeof(v),其中变量到结构体域的映射记为field(·)。
进一步地,每种不同的指令定义了一个不同的状态转移函数TransInst(·),包括:
根据以上技术方案,本发明的有益效果是,本发明能根据程序语义识别通用指针的实际类型,也能正确地处理强制转换语义,弥补了现有类型分析技术的不足;本发明对函数的形参也进行了分析,实现了跨过程的静态分析,确保了分析结果的健全性。
附图说明
此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1为本发明实施例提供的一种C语言的指针类型分析方法的流程图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请具体实施例及相应的附图对本申请技术方案进行清楚、完整地描述。显然,所描述的实施例仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
图1为本发明实施例提供的一种C语言的指针类型分析方法的流程图;本实施例提供一种C语言的指针类型分析方法,本实施例以Android Linux操作系统内核中的指针类型分析为例来进行说明,该方法包括以下步骤:
步骤S101,将输入程序的所有C语言源代码转换并整合为LLVM IR比特码;
具体地,开启Android Linux操作系统内核编译的LTO选项,使用LLVM提供的LTO模式编译内核,得到Android Linux操作系统完整的LLVM IR比特码;IR比特码包含了整个程序完整的类型信息和语义信息,且提供了完整简洁的分析接口,便于后续的跨过程静态分析。
步骤S102,根据LLVM IR比特码,分析其包含的结构体类型信息,所述结构体类型信息包含结构体指针域的类型信息,根据结构体指针域的类型信息,对结构体指针域集合到类型集合的映射μ(·)进行初始化,得到初始映射μinit(·),其中映射μ(·)以结构体的指针域作为输入,输出该域所有指向的实际类型;
具体地,对于Android Linux操作系统内核IR比特码中包含的每个结构体类型,遍历它的所有域,对于嵌套的结构体则采用深度优先搜索策略(Depth-first search,DFS);在此过程中,若访问的域是指针域,则初始化该域的实际类型为它的声明类型,即μinit(fd)=typeof(fd),其中结构体的域到类型集合的映射记为μ(·),域记为fd,typeof(·)表示指针域或者指针变量的声明类型。
步骤S103,对指针变量到类型集合的映射ε(·)进行初始化,得到εinit(·),对目标状态σ=(ε,μ)进行初始化,得到σinit=(εinit,μinit),其中ε为指针变量到类型集合的映射,μ为结构体指针域集合到类型集合的映射;
具体地,对于Android Linux操作系统内核IR比特码中的每一个指针类型的变量v,初始化映射ε(·)为εinit(v)=μinit(field(v))∪typeof(v),其中变量到结构体域的映射记为field(·)。目标状态σ包括映射ε和映射μ,是本发明对程序进行分析的目标。
步骤S104,从初始化的目标状态σinit出发,遍历程序中的所有函数;对每一个函数,遍历函数中的每一条指令;每种不同的指令定义了一个不同的状态转移函数TransInst(·),遍历过程中访问一条指令后,目标状态发生相应的状态转移:σ′=TransInst(σ);重复这一步骤直到σ不再变化为止;具体地,其中状态转移函数TransInst(·),包含如下子步骤:
每种状态转移函数为每种不同的指令进行了精确的建模,在保留精确性的同时确保了静态分析的健全性,也即覆盖了所有的可能出现的情况。以Android Linux内核中的一段代码为例:
其中第516行中的container_of其实是一个强制类型转换指令,即timer指针同时指向了struct timerqueue_node类型和struct hrtimer类型,仅仅根据timer指针的声明类型只能得到该指针指向struct hrtimer类型;本方法则通过对强制类型转换指令的语义进行建模,能成功分析得到该指针同时指向两种类型。
步骤S105,输出ε,即程序中所有指针变量可能的实际类型。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (5)
1.一种C语言的指针类型分析方法,其特征在于,包括:
将输入程序的所有C语言源代码转换并整合为LLVM IR比特码;
根据LLVM IR比特码,分析其包含的结构体类型信息,所述结构体类型信息包含结构体指针域的类型信息,根据结构体指针域的类型信息,对结构体指针域集合到类型集合的映射μ(·)进行初始化,得到初始映射μinit(·),其中映射μ(·)以结构体的指针域作为输入,输出该域所有指向的实际类型;
根据μinit(·),对指针变量到类型集合的映射ε(·)进行初始化,得到εinit(·),对目标状态σ=(ε,μ)进行初始化,得到σinit=(εinit,μinit),其中ε为指针变量到类型集合的映射,μ为结构体指针域集合到类型集合的映射;
从初始化的目标状态σinit出发,遍历程序中的所有函数,对每一个函数,遍历函数中的每一条指令,其中每种不同的指令定义了一个不同的状态转移函数TransInst(·),遍历过程中访问一条指令后,目标状态发生相应的状态转移:σ′=TransInst(σ);重复这一步骤直到σ不再变化为止;
输出ε,即程序中所有指针变量可能的实际类型。
2.根据权利要求1所述一种C语言的指针类型分析方法,其特征在于,将输入程序的所有C语言源代码转换并整合为LLVM IR比特码,包括:
使用LLVM提供的LTO编译模式对目标程序的C语言源代码进行编译,得到该程序完整的LLVM IR比特码,其中目标程序的C语言源代码包含一个或多个C语言源文件。
3.根据权利要求1所述一种C语言的指针类型分析方法,其特征在于,初始化结构体指针域集合到类型集合的映射μinit(·),包括:
对于每个结构体类型,递归地遍历它的所有域;在此过程中,若访问的域是指针域,则初始化该域的实际类型为它的声明类型,即μinit(fd)=typeof(fd),其中结构体的域到类型集合的映射记为μ(·),域记为fd,typeof(·)表示指针域或者指针变量的声明类型。
4.根据权利要求1所述一种C语言的指针类型分析方法,其特征在于,初始化指针变量到类型集合的映射εinit(·),包括:
对于程序中的每一个指针变量v,初始化映射ε(·)为εinit(v)=μinit(field(v))∪typeof(v),其中变量到结构体域的映射记为field(·)。
5.根据权利要求1所述一种C语言的指针类型分析方法,其特征在于,每种不同的指令定义了一个不同的状态转移函数TransInst(·),包括:
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010842855.4A CN112100059B (zh) | 2020-08-20 | 2020-08-20 | 一种c语言的指针类型分析方法 |
PCT/CN2020/114972 WO2022036783A1 (zh) | 2020-08-20 | 2020-09-14 | 一种c语言的指针类型分析方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010842855.4A CN112100059B (zh) | 2020-08-20 | 2020-08-20 | 一种c语言的指针类型分析方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112100059A CN112100059A (zh) | 2020-12-18 |
CN112100059B true CN112100059B (zh) | 2021-09-14 |
Family
ID=73753082
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010842855.4A Active CN112100059B (zh) | 2020-08-20 | 2020-08-20 | 一种c语言的指针类型分析方法 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN112100059B (zh) |
WO (1) | WO2022036783A1 (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114816355B (zh) * | 2022-06-24 | 2022-09-20 | 基石酷联微电子技术(北京)有限公司 | 基于端口结构体的软件架构系统 |
Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101937390A (zh) * | 2010-02-01 | 2011-01-05 | 许中兴 | 源代码缺陷分析中一种基于区域的内存建模方法 |
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN102662829A (zh) * | 2012-03-16 | 2012-09-12 | 北京邮电大学 | 一种复杂数据结构在代码静态测试中的处理方法和装置 |
CN103914382A (zh) * | 2014-03-25 | 2014-07-09 | 北京邮电大学 | 一种充分识别指针引用检测对象的方法 |
CN104331368A (zh) * | 2014-11-18 | 2015-02-04 | 合肥康捷信息科技有限公司 | 一种基于cfg文件静态分析C++虚函数调用的方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN108132799A (zh) * | 2017-12-25 | 2018-06-08 | 首都师范大学 | 过程间静态程序分析信息提取方法、装置及设备 |
CN108897572A (zh) * | 2018-07-19 | 2018-11-27 | 北京理工大学 | 一种基于变量关联树的复杂类型重构方法 |
Family Cites Families (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9329845B2 (en) * | 2009-06-04 | 2016-05-03 | Microsoft Technology Licensing, Llc | Determining target types for generic pointers in source code |
US9201757B2 (en) * | 2012-11-07 | 2015-12-01 | Facebook, Inc. | Offline type checking in programming languages |
GB201405755D0 (en) * | 2014-03-31 | 2014-05-14 | Irdeto Bv | Optimizing and protecting software |
US20160306847A1 (en) * | 2015-04-15 | 2016-10-20 | Futurewei Technologies, Inc. | Apparatus and Method for Using Parameterized Intermediate Representation for Just-In-Time Compilation in Database Query Execution Engine |
-
2020
- 2020-08-20 CN CN202010842855.4A patent/CN112100059B/zh active Active
- 2020-09-14 WO PCT/CN2020/114972 patent/WO2022036783A1/zh active Application Filing
Patent Citations (8)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101937390A (zh) * | 2010-02-01 | 2011-01-05 | 许中兴 | 源代码缺陷分析中一种基于区域的内存建模方法 |
CN102012991A (zh) * | 2010-11-09 | 2011-04-13 | 北京神舟航天软件技术有限公司 | 基于静态分析的c语言安全规则检查方法 |
CN102662829A (zh) * | 2012-03-16 | 2012-09-12 | 北京邮电大学 | 一种复杂数据结构在代码静态测试中的处理方法和装置 |
CN103914382A (zh) * | 2014-03-25 | 2014-07-09 | 北京邮电大学 | 一种充分识别指针引用检测对象的方法 |
CN104331368A (zh) * | 2014-11-18 | 2015-02-04 | 合肥康捷信息科技有限公司 | 一种基于cfg文件静态分析C++虚函数调用的方法 |
CN104965788A (zh) * | 2015-07-03 | 2015-10-07 | 电子科技大学 | 一种代码静态检测方法 |
CN108132799A (zh) * | 2017-12-25 | 2018-06-08 | 首都师范大学 | 过程间静态程序分析信息提取方法、装置及设备 |
CN108897572A (zh) * | 2018-07-19 | 2018-11-27 | 北京理工大学 | 一种基于变量关联树的复杂类型重构方法 |
Non-Patent Citations (5)
Title |
---|
Automatic Generation of Assertions to Detect Potential Security Vulnerabilities in C Programs That Use Union and Pointer Types;S. K. A. Khalid 等;《2010 Fourth International Conference on Network and System Security》;20100903;351-356 * |
Improving software security with a C pointer analysis;D. Avots 等;《 Proceedings. 27th International Conference on Software Engineering, 2005. ICSE 2005》;20050521;332-341 * |
Test Data Generation for Derived Types in C Program;Zheng Wang 等;《2009 Third IEEE International Symposium on Theoretical Aspects of Software Engineering》;20090731;155-162 * |
一种用于指针程序验证的指针逻辑;陈意云 等;《软件学报》;20100315;第21卷(第03期);415-426 * |
基于CEGAR的C程序空指针解引用检测;段钊;《中国优秀博硕士学位论文全文数据库(硕士)信息科技辑》;20160315(第03期);I138-4144 * |
Also Published As
Publication number | Publication date |
---|---|
WO2022036783A1 (zh) | 2022-02-24 |
CN112100059A (zh) | 2020-12-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Horgan et al. | A data flow coverage testing tool for C | |
US7937692B2 (en) | Methods and systems for complete static analysis of software for building a system | |
US10354069B2 (en) | Automated reverse engineering | |
EP3465428B1 (en) | Sample driven profile guided optimization with precise correlation | |
CN110245467B (zh) | 基于Dex2C与LLVM的Android应用程序保护方法 | |
US9311111B2 (en) | Programming environment with support for handle and non-handle user-created classes | |
US20240103821A1 (en) | Optimising computer program code | |
CN112100059B (zh) | 一种c语言的指针类型分析方法 | |
Williams et al. | Dyninst and mrnet: Foundational infrastructure for parallel tools | |
Blackham et al. | Sequoll: a framework for model checking binaries | |
Bouraqadi et al. | Test-driven development for generated portable Javascript apps | |
US10983771B1 (en) | Quality checking inferred types in a set of code | |
Ortin et al. | Cnerator: A Python application for the controlled stochastic generation of standard C source code | |
Campbell et al. | Extracting behaviour from an executable instruction set model | |
Chen et al. | Hopper: Interpretative fuzzing for libraries | |
CN111966578A (zh) | 一种安卓兼容性缺陷修复效果的自动化评估方法 | |
Caceffo et al. | An Antipattern documentation about misconceptions related to an introductory programming course in C | |
Souza et al. | An antipattern documentation about possible misconceptions related to introductory programming courses (cs1) in java | |
Gabrijelčič | Mastering Delphi Programming: A Complete Reference Guide: Learn all about building fast, scalable, and high performing applications with Delphi | |
WO2021208867A1 (zh) | 一种跨平台的代码转换方法及设备 | |
CN113434430A (zh) | 一种sql查询语句性能检测方法和装置 | |
Chen et al. | The essence of Verilog: A tractable and tested operational semantics for Verilog | |
Gabrijelčič | Delphi High Performance: Build fast Delphi applications using concurrency, parallel programming and memory management | |
Abdelaziz et al. | Large scale generation of labeled type data for python | |
Mihaylov | Optimized Processor Simulation with VADL |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |