CN118113291A - 一种内存安全管理方法及设备 - Google Patents
一种内存安全管理方法及设备 Download PDFInfo
- Publication number
- CN118113291A CN118113291A CN202211535703.5A CN202211535703A CN118113291A CN 118113291 A CN118113291 A CN 118113291A CN 202211535703 A CN202211535703 A CN 202211535703A CN 118113291 A CN118113291 A CN 118113291A
- Authority
- CN
- China
- Prior art keywords
- statement
- program
- pointer
- risk
- inspection
- 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.)
- Pending
Links
- 238000007726 management method Methods 0.000 title claims abstract description 36
- 238000007689 inspection Methods 0.000 claims abstract description 131
- 238000000034 method Methods 0.000 claims abstract description 112
- 230000008569 process Effects 0.000 claims abstract description 90
- 230000008030 elimination Effects 0.000 claims abstract description 66
- 238000003379 elimination reaction Methods 0.000 claims abstract description 64
- 238000006243 chemical reaction Methods 0.000 claims abstract description 14
- 238000003860 storage Methods 0.000 claims description 111
- 230000036961 partial effect Effects 0.000 claims description 40
- 238000012545 processing Methods 0.000 claims description 37
- 238000002372 labelling Methods 0.000 claims description 7
- 238000004590 computer program Methods 0.000 claims description 6
- 238000005457 optimization Methods 0.000 abstract description 60
- 238000004422 calculation algorithm Methods 0.000 description 50
- 238000013507 mapping Methods 0.000 description 18
- 238000004458 analytical method Methods 0.000 description 16
- 238000010586 diagram Methods 0.000 description 15
- 238000013461 design Methods 0.000 description 13
- 230000000694 effects Effects 0.000 description 13
- 238000003780 insertion Methods 0.000 description 12
- 230000037431 insertion Effects 0.000 description 12
- 230000003068 static effect Effects 0.000 description 12
- 238000004364 calculation method Methods 0.000 description 11
- 230000006870 function Effects 0.000 description 9
- 238000005516 engineering process Methods 0.000 description 7
- 230000014509 gene expression Effects 0.000 description 7
- 238000004891 communication Methods 0.000 description 6
- 238000012986 modification Methods 0.000 description 6
- 230000004048 modification Effects 0.000 description 6
- 230000002829 reductive effect Effects 0.000 description 6
- 238000012423 maintenance Methods 0.000 description 5
- 230000008901 benefit Effects 0.000 description 4
- 230000006399 behavior Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 239000000284 extract Substances 0.000 description 2
- 239000000835 fiber Substances 0.000 description 2
- 230000003287 optical effect Effects 0.000 description 2
- 238000004088 simulation Methods 0.000 description 2
- 238000012360 testing method Methods 0.000 description 2
- 230000006978 adaptation Effects 0.000 description 1
- 230000008859 change Effects 0.000 description 1
- 125000004122 cyclic group Chemical group 0.000 description 1
- 238000013500 data storage Methods 0.000 description 1
- 230000007547 defect Effects 0.000 description 1
- 230000003111 delayed effect Effects 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 230000001419 dependent effect Effects 0.000 description 1
- 230000001066 destructive effect Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000005206 flow analysis Methods 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 230000003993 interaction Effects 0.000 description 1
- 230000002452 interceptive effect Effects 0.000 description 1
- 230000033001 locomotion Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000000750 progressive effect Effects 0.000 description 1
- 238000011160 research Methods 0.000 description 1
- 230000002441 reversible effect Effects 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
- 230000007480 spreading Effects 0.000 description 1
- 238000003892 spreading Methods 0.000 description 1
- 230000008961 swelling Effects 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000013519 translation Methods 0.000 description 1
- 230000001960 triggered effect Effects 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
-
- 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
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/455—Emulation; Interpretation; Software simulation, e.g. virtualisation or emulation of application or operating system execution engines
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Quality & Reliability (AREA)
- Computer Hardware Design (AREA)
- Debugging And Monitoring (AREA)
- Stored Programmes (AREA)
Abstract
公开了一种内存安全管理方法,包括:在第一程序中的风险语句之前插入检查指针属性的检查语句;风险语句是第一程序中调用指针进行内存访问的语句,指针属性是风险语句中指针的属性;对第一转换后程序和检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;第一转换后程序是对第一程序进行编译产生的中间表示;对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序;至少基于第二转换后程序、第一消除后程序,生成目标执行文件。该方法在编译过程中,在检查语句执行编译转换之前对第一程序进行冗余优化,能够提高编译过程中代码优化的性能。
Description
技术领域
本申请涉及内存管理技术领域,尤其涉及一种内存安全管理方法及设备。
背景技术
在C或类C语言编写的应用程序中,通常会运用指针来实现对内存资源的灵活访问。但如果开发人员对指针运用不当,也会给内存管理带来安全隐患。在应用程序中运用指针对内存访问的隐患主要体现在空间类内存安全问题上,比如空指针解引用、越界读、越界写等。
目前,对于空间类内存安全问题的解决,主要是通过对源程序改造,人工加入一些指针属性信息,利用这些信息进行程序编译时的检查语句插入,在程序运行时进行报错处理。然而,由于插入的这些检查语句在编译过程中,都是先转换成分支结构的机器指令,这些分支结构的引入将源程序的逻辑关系复杂化,极大的影响源程序在冗余代码消除时的优化效果,带来很大的应用程序运行时开销,对于一些开销敏感的领域,比如wifi芯片、路由器等,是难以接受的。
发明内容
本申请提供一种内存安全管理方法及设备,能提高源程序在编译过程中的优化效果,使目标执行文件运行时开销达到终端可控范围之内,提升用户使用终端应用的体验效果。
第一方面,本申请提供一种内存安全管理方法。该方法包括:在第一程序中的风险语句之前插入检查指针属性的检查语句;风险语句是第一程序中调用指针进行内存访问的语句,指针属性是风险语句中指针的属性;对第一转换后程序和检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对第一程序进行编译产生的中间表示;对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序;至少基于第二转换后程序、第一消除后程序,生成目标执行文件;其中,目标执行文件用于在运行时生成故障信息,故障信息包含第一风险语句中指针的指针属性,第一风险语句是第一程序中的风险语句中的一个。
由此,通过对检查语句的编译转换过程进行改变,先进行第一转换后程序冗余代码消除,再对检查语句实施编译过程中机器指令的转换,从而,在编译过程的冗余代码消除阶段,不改变第一转换后程序的逻辑关系结构,提升第一转换后程序在编译过程的优化效果。
在一种可能的实现方式中,对第一转换后程序和检查语句分别进行冗余代码消除,包括:通过对检查语句的检查对象和检查范围进行判断,将检查语句中的全相同冗余代码及全偏序冗余代码消除,得到第三消除后程序;检查语句的检查对象和检查范围至少基于风险语句得到;通过对第三消除后程序中检查语句的检查对象进行哈希,将第三消除后程序中的部分相同冗余代码及部分偏序冗余代码消除,得到第二消除后程序。
由此,在编译过程中,对检查语句也实施冗余代码消除,进一步提升目标执行文件整体的优化效果,有效降低应用程序运行时开销。
在一种可能的实现方式中,在第一程序中的风险语句之前插入检查指针属性的检查语句,包括:在第一程序的指针定义语句之后插入标注语句;标注语句用于获取风险语句中指针的指针属性;在标注语句之后插入指针属性存储语句;指针属性存储语句用于保存标注语句获取的指针属性,指针属性存储语句包含指针属性变量,指针属性变量是用于表示指针属性的变量;指针属性存储语句是编译过程可识别的第一自定义语句;基于风险语句和指针属性存储语句,确定对风险语句进行指针属性检查的检查语句;其中,风险语句用于确定检查语句的检查对象,指针属性存储语句包含的指针属性变量和指针属性存储语句保存的指针属性用于确定检查语句的检查范围;其中,检查语句是编译过程可识别的第二自定义语句;在风险语句之前插入检查指针属性的检查语句。
由此,通过对指针属性进行实时存储,以及建立指针属性存储语句和检查语句的联系,能够维护检查语句中所使用的指针属性的正确性,降低漏报,提供更完善的安全保障能力。
在一种可能的实现方式中,对第一转换后程序和检查语句分别进行冗余代码消除之后,还包括:将指针属性存储语句中的冗余代码进行消除,以及将指针属性存储语句中的冗余代码中包含的指针属性变量进行消除,得到第四消除后程序;其中,指针属性存储语句中的冗余代码保存的指针属性,以及指针属性存储语句中的冗余代码中包含的指针属性变量,用于确定检查语句中的冗余代码的检查范围;至少基于第二转换后程序、第一消除后程序,生成目标执行文件,包括:基于第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
由此,在编译过程中,对指针属性存储语句、指针属性存储语句中包含的指针属性变量也实施冗余代码消除,进一步提升目标执行文件整体的优化效果,有效降低应用程序运行时开销。
在一种可能的实现方式中,第一程序是使用C或类C语言编写的程序。
第二方面,本申请提供一种内存安全管理设备。该设备包括:处理模块,用于在第一程序中的风险语句之前插入检查指针属性的检查语句;风险语句是第一程序中调用指针进行内存访问的语句,指针属性是风险语句中指针的属性;处理模块,还用于对第一转换后程序和检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对第一程序进行编译产生的中间表示;处理模块,还用于对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序;处理模块,还用于至少基于第二转换后程序、第一消除后程序,生成目标执行文件;其中,目标执行文件用于在运行时生成故障信息,故障信息包含第一风险语句中指针的指针属性,第一风险语句是第一程序中的风险语句中的一个。
在一种可能的实现方式中,处理模块对第一转换后程序和检查语句分别进行冗余代码消除时,用于:通过对检查语句的检查对象和检查范围进行判断,将检查语句中的全相同冗余代码及全偏序冗余代码消除,得到第三消除后程序;检查语句的检查对象和检查范围至少基于风险语句得到;通过对第三消除后程序中检查语句的检查对象进行哈希,将第三消除后程序中的部分相同冗余代码及部分偏序冗余代码消除,得到第二消除后程序。
在一种可能的实现方式中,处理模块在第一程序中的风险语句之前插入检查指针属性的检查语句时,用于:在第一程序的指针定义语句之后插入标注语句;标注语句用于获取风险语句中指针的指针属性;在标注语句之后插入指针属性存储语句;指针属性存储语句用于保存标注语句获取的指针属性,指针属性存储语句包含指针属性变量,指针属性变量是用于表示指针属性的变量;指针属性存储语句是编译过程可识别的第一自定义语句;基于风险语句和指针属性存储语句,确定对风险语句进行指针属性检查的检查语句;其中,风险语句用于确定检查语句的检查对象,指针属性存储语句包含的指针属性变量和指针属性存储语句保存的指针属性用于确定检查语句的检查范围;其中,检查语句是编译过程可识别的第二自定义语句;在风险语句之前插入检查指针属性的检查语句。
在一种可能的实现方式中,处理模块对第一转换后程序和检查语句分别进行冗余代码消除之后,用于:将指针属性存储语句中的冗余代码进行消除,以及将指针属性存储语句中的冗余代码中包含的指针属性变量进行消除,得到第四消除后程序;其中,指针属性存储语句中的冗余代码保存的指针属性,以及指针属性存储语句中的冗余代码中包含的指针属性变量,用于确定检查语句中的冗余代码的检查范围;处理模块至少基于第二转换后程序、第一消除后程序生成目标执行文件时,用于:基于第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
在一种可能的实现方式中,第一程序是使用C或类C语言编写的程序。
第三方面,本申请提供一种电子设备,包括:至少一个存储器,用于存储程序;至少一个处理器,用于执行存储器存储的程序;其中,当存储器存储的程序被执行时,处理器用于执行上述第一方面或第一方面的任意一种可能的实现方式所描述的方法。
第四方面,本申请提供一种计算机可读存储介质,计算机可读存储介质内存储有计算机程序,当计算机程序在处理器上运行时,使得处理器执行上述第一方面或第一方面的任意一种可能的实现方式所描述的方法。
第五方面,本申请提供一种计算机程序产品,当计算机程序产品在处理器上运行时,使得处理器执行第一方面或第一方面的任一种可能的实现方式所描述的方法。
可以理解的是,上述第二方面至第五方面的有益效果可以参见上述第一方面中的相关描述,在此不再赘述。
附图说明
图1是一种利用分支结构形式检查语句进行代码编译和优化的过程示意图;
图2是一种检查语句结构转换后的控制流程图;
图3是本申请实施例提供的一种内存安全管理方法的系统架构图;
图4是本申请实施例提供的一种内存安全管理方法的流程图;
图5a是本申请实施例提供的一种常规VRAP算法处理的流程图;
图5b是本申请实施例提供的一种定制化VRAP算法处理的流程图;
图6a是本申请实施例提供的一种常规PRE算法处理的流程图;
图6b是本申请实施例提供的一种定制化PRE算法处理的流程图;
图7是本申请实施例提供的一种常规DCE算法处理的流程图;
图8是本申请实施例提供的一种源程序编译的流程图;
图9是本申请实施例提供的一种内存安全管理方法的实施架构图;
图10是本申请实施例提供的一种内存安全管理方法的流程图;
图11是本申请实施例提供的一种内存安全管理方法的实施架构图;
图12是本申请实施例提供的一种内存安全管理方法的实施架构图;
图13是本申请实施例提供的一种内存安全管理设备的硬件结构示意图;
图14是本申请实施例提供的一种内存安全管理设备的硬件结构示意图。
具体实施方式
为了使本申请实施例的目的、技术方案和优点更加清楚,下面将结合附图,对本申请实施例中的技术方案进行描述。
在本申请实施例的描述中,“示例性的”或者“例如”等词用于表示作例子或说明。本申请实施例中被描述为“示例性的”或者“例如”的任何实施例或设计方案不应被解释为比其它实施例或设计方案更优选或更具优势。确切而言,使用“示例性的”或者“例如”等词旨在以具体方式呈现相关概念。
在本申请实施例的描述中,术语“和/或”,仅仅是一种描述关联对象的关联关系,表示可以存在三种关系,例如,A和/或B,可以表示:单独存在A,单独存在B,同时存在A和B这三种情况。另外,除非另有说明,术语“多个”的含义是指两个或两个以上。例如,多个系统是指两个或两个以上的系统,多个屏幕终端是指两个或两个以上的屏幕终端。
此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征。由此,限定有“第一”、“第二”的特征可以明示或者隐含地包括一个或者更多该特征。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
为了解决在C或类C语言编写的应用程序中,通过指针及指针运算进行内存操作时,可能导致的空间类内存安全管理隐患,比如空指针解引用、越界读、越界写等,需要在程序编译和调试阶段尽可能的定位并优化可疑指针,以及在程序运行时输出报错指针的相关信息,包括报错指针在应用程序中所处的位置,报错指针的错误类型,报错指针的出错形态等,以方便开发人员和运维人员对应用程序进行调试、修改和维护。其中,类C语言就是指也像C语言一样,通过指针及指针运算进行内存操作的语言。
图1是一种利用分支结构形式检查语句进行代码编译和优化的过程示意图。如图1所示,开发人员基于应用方案的设计和实现原理,采用C或类C语言编写实现该应用方案的源程序,此源程序中大量应用指针实现对终端内存的访问和读写。为了尽可能消除指针和内存交互所可能产生的空间类内存安全管理隐患,在一种可选的技术方案中,需要执行以下步骤:
步骤S100,确定中间程序,中间程序包括在指针内存访问风险语句之前插入的检查语句和源程序。这些风险语句的执行可能带来指针空间类内存安全隐患,步骤S100具体可以包括以下子步骤S101-S103:
步骤S101,按照应用方案的要求编写源程序,对源程序中所有使用指针的语句进行指针属性标注,这些指针属性标注主要用于获取指针指向的内存块长度与边界信息。这种指针属性标注可以类似于一种定位指令,比如:where p:count(n),表示指针p指向的内存块长度为n。在随后的编译阶段,编译程序提供配套的词法、语义分析,将指针属性标注表示的信息提取出来,比如:p指向的内存块长度为5,边界为[p,p+5)。
步骤S102,在增加了指针属性标注的源程序中,查找利用指针进行内存访问的风险语句,并在这些风险语句之前插入检查语句。如上文,空间类内存安全主要包括空指针解引用、越界读和越界写三类,为了消除指针可能引起的隐患,需要在可能发生空指针解引用的内存访问风险语句之前插入判空检查语句,比如插入一种常见的判空检查语句,check(p!=null),表示对指针访问内存空间的检查,对于越界读和越界写两类问题需要在指针的内存访问风险语句之前插入越界检查,比如插入一种常见的越界检查语句,check(p>=p),表示对指针访问下界的检查,check(p<p+5),表示对指针访问上界的检查。如果一种指针既有解引用隐患,也有越界隐患,则需要先插入判空检查语句,再继续插入越界检查语句。由此,通过采取插入检查语句描述所判定的条件是否满足,对程序中所使用的指针可能引起的空间类内存问题进行检查,以上提到的这些检查语句在源程序中基于“伪码”形式出现,这些“伪码”是编译过程可识别的自定义语句格式。
步骤S103,编译过程将指针属性标注表示的信息提取出来后,去除指针属性标注,得到包括关于指针的检查语句和源程序,组成中间程序。
由此,确定了中间程序,中间程序包括在指针内存访问点插入的检查语句和源程序,接下来进入中间程序的编译阶段。
步骤S110,利用编译技术对插入检查语句的中间程序进行编译过程的中间转换,冗余代码优化,目标代码生成。对于常见的编译技术而言,为了使中间程序符合编译要求,需要在编译前期阶段按照语法、语义规则对插入检查语句后的中间程序进行代码转换,对检查语句而言,一种常见的转换方式是转换为常规比较指令和跳转指令的机器指令组合,这种转换将检查语句由无分支单指令结构展开成分支执行结构,从而对中间程序中源程序的逻辑结构造成了很大的改变。
图2是一种检查语句结构转换后的控制流程图,如图2所示,在控制流程图(control flow graph,CFG)中,对源程序用到的指针p[i]、p[j]分别插入“伪码”形式的检查语句check(i<upper)、check(j<upper),在编译初期阶段按照语法、语义将检查语句转换为常规比较指令cmp和跳转指令jump的组合,从而使检查语句呈现分支模式。
随后在编译中期阶段利用优化算法对冗余代码进行优化,以及在编译后期阶段进行目标代码生成,最终形成携带有检查语句的二进制目标执行文件,供技术人员进行代码的调试、修改和维护。比如在目标执行文件运行时环节,触发到check指令满足条件时,执行程序表现为jump exit操作导致的core dump问题,发生程序终止。开发人员可以借助程序终止输出的二进制文件中的debug信息还原出诊断信息进行调试,诊断信息包括诊断的程序行号、列号等。
其中,将编译中期阶段可能涉及到的几种代码优化算法介绍如下:
值域分析与传播算法(value range analysis and propagation,VRAP),借助变量的值范围信息,来删除冗余分支和冗余表达式的一种代码优化算法。当一条比较语句的比较结果可通过变量值范围的分析直接拿到,则可以根据该比较结果进行冗余分支删除,冗余分支上的表达式一起被删除,与此同时,更新比较语句中被比较对象的值域范围。
部分冗余消除算法(partial redundancy elimination,PRE),当代码中存在多条分支,对其中一条分支来说该表达式是冗余的,对另一条分支来说该表达式是不冗余的,则称该表达式是部分冗余的。部分冗余消除是一种针对这类部分冗余场景,借助表达式的哈希结果进行冗余表达式消除的代码优化算法。
死代码消除(dead code elimination,DCE),删除对程序运行结果没有任何影响的代码的一种代码优化算法。
但是,上述图1中展示的利用分支结构形式检查语句进行代码编译和优化的方法,在实际应用中存在很大的不足和纰漏,主要有以下原因:
首先,为了达到完善的内存安全,需要在所有利用指针进行内存访问的风险语句之前插入检查语句,插入量非常大,与代码中内存访问语句的占比正相关,将带来很大的程序运行时开销;并且,由于插入的这些检查语句在编译过程中,都是基于分支形式来进行冗余检查和代码优化,极大的影响了源程序的编译和优化效果,进一步带来更大的程序运行时开销。分支形式的检查语句带入使得控制流程图变得及其复杂,在编译过程中,原有的代码优化技术无法发挥作用。在步骤S110中,在编译的前期阶段,将插入检查语句后的中间程序统一按照语法、语义的要求进行了转换,包括对检查语句进行分支模式的转换,这样会使得控制流程图变得复杂。如图2所示,插入的每一条检查语句都会带来一个多余节点及一条多余路径,而诸如VRAP、PRE、DCE代码优化算法均依赖于CFG下的模式匹配,在复杂的CFG下,原本的代码优化模式不再成立,无法发挥原有的优化作用,导致优化效果大大降低,而使在编译后期阶段,最终生成的目标执行文件极其臃肿,在内存资源受限的终端系统中无法得到广泛应用。
鉴于此,本申请实施例提供一种内存安全管理方法。在该方法中,将检查语句和中间程序中的其他代码进行剥离,将在编译前期阶段基于语法、语义规则,对检查语句由单指令结构转换为分支结构机器指令的步骤,延后到进行代码生成的编译后期阶段执行。在编译中期阶段的冗余代码代化过程中,基于单指令方式插入的检查语句,采取定制的VRAP、PRE、DCE代码优化算法对CFG中的源程序和插入的检查语句,都进行冗余消除和代码优化,能够有效降低插入的检查语句对源程序冗余优化的影响,使最终生成的目标执行文件对内存资源的消耗控制在合理范围之内,显著降低运行时开销。
其次,未考虑对指针属性进行跨语句传播,检查语句与指针属性映射出错,导致漏报。虽然在步骤S101中对源程序中的指针属性进行了标注,从而获得了指针所指向内存区域的长度和边界的功能,但是没有对该边界进行实时存储和更新,使得后继检查语句进行检查时拿到的边界属性仍然是旧版的,旧版的边界信息被带入到检查语句,会导致无效检查,进而发生漏报。比如,在进行指针p声明时,标记了其长度为5,可以获知指针p所指向的内存块长度为[p,p+5)。当对p所指向的内存区域进行访问时,需要进行越界检查,越下界检查语句为:check(p>=p),越上界检查语句为:check(p<p+5),当检查指针p所指向的第一内存块的第0个元素时,可以检测出对上、下界的越界行为。可是,如果随后在程序中发生了指针p的自增运算,再次访问指针p所指向的内存区域时,指针p指向的已经是第一内存块的第1个元素,然而检查语句的目标依然是p>=p和p<p+5,显然这种检查是无效的,因为实际程序已经发生了越上界行为,但无法通过检查语句查找得到。
鉴于此,本申请实施例提供一种指针属性存储语句,对指针属性标注的结果进行实时存储,以及建立指针属性和检查语句的直接映射,能够维护检查语句中所使用的指针属性的正确性,降低漏报,提供更完善的安全保障能力。除此之外,还可以根据检查语句进行冗余消除的结果,对指针属性存储语句也进行冗余消除,进一步提升冗余代码消除效果。
图3是本申请实施例提供的一种内存安全管理方法的系统架构图,如图3所示,系统架构图包括语言定义模块300,指针属性标注模块310,检查语句插入模块320,代码优化模块330,目标代码生成模块340五个部分,每个模块的具体功能介绍如下:
语言定义模块300描述源程序、指针属性标注、指针属性存储语句、检查语句,以及编译过程中各种中间表示(intermediate representation,IR)的语法、语义规则。其中,中间表示指编译过程对于源程序进行扫描后生成的内部表示,代表源程序的语义和语法结构,编译过程的各个阶段都在IR上进行分析或优化变换。在实际编译过程中,从开始进入代码编译阶段,一直到生成目标执行文件之前,可以根据编译的流程推进,生成多次递进式的中间表示。
指针属性标注模块310补全源程序中所有指针定义语句的指针属性标注。
在一个示例中,当用于解决空间类内存安全以外的其他问题时,比如由于调用指针执行内存访问所导致的时间类内存安全问题,通常包括释放后再使用、内存泄漏、重复释放等,指针属性标注所产生的指针属性信息也可以用于解决这类问题所需要的必要信息。
检查语句插入模块320在编译过程中选择涉及内存操作的潜在风险语句,并在所有潜在风险语句之前插入指针检查语句,在插入的过程中,必要时,还可以通过指针属性存储语句建立指针属性的存储,以及实现指针属性存储语句和插入指针检查语句的直接映射,完成检查语句的插入后,需要将指针属性标注进行删除。
在一个示例中,需要在编译过程中针对判空、越上界、越下界三种检查需求,分别设计三种设计的检查语句,这些检查语句是单指令格式,按照无分支结构的方式进行执行,同时,要符合编译过程支持的语义、语法规则。在检查编译过程中检测利用指针进行内存访问的风险语句,并在各个风险语句之前插入设计的检查语句。
相比图1的代码编译和优化过程,检查语句插入模块在编译阶段增加了指针属性存储子模块321和指针属性映射子模块322。
在一个示例中,指针属性存储子模块321创建指针属性存储语句,形成编译过程的一种中间表示,对由指针属性标注识别到的指针属性信息进行存储。
在一个示例中,指针属性映射子模块322,将插入的检查语句和指针属性存储语句进行关联,实现指针检查语句与指针属性信息的正确映射。
代码优化模块330在保障功能等价的前提下,对源程序、插入的检查语句、插入的指针属性存储语句进行运行时间更短、占用空间更小等方面的代码优化,从而实现目标代码的功能提升。代码优化模块330包括常规代码优化子模块331、检查语句消除子模块332以及指针属性消除子模块333三个部分,其中,常规代码优化子模块331用于对C或类C语言编写的源程序进行编程过程中间表示的转换,以及冗余代码的优化。
相比图1的代码编译和优化过程,代码优化模块330在编译阶段增加了检查语句消除子模块332和指针属性消除子模块333。
在一个示例中,检查语句消除子模块332通过定制的值域分析与传播算法和定制的部分冗余算法的设计,实现对相关冗余检查语句的消除。
在一个示例中,指针属性消除子模块333通过定制的死代码消除算法的设计,实现对丧失引用关系的冗余指针属性存储语句和指针属性变量进行消除。指针属性存储语句用于存储指针属性信息,指针属性变量是指针属性存储语句定义的变量,用于表示指针的属性。指针属性存储语句将指针属性信息与该指针的检查语句进行关联,当该指针的某个检查语句因冗余被消除后,指针属性存储语句定义的一些指针属性变量没有了使用点,属于死代码,也是一种冗余,本申请方案在编译过程实现将该冗余做进一步消除。
目标代码生成模块340将优化后代码中保留的检查语句进行机器指令的转换,并结合进行冗余消除后的源程序、指针属性存储语句,最终生成终端可支持的目标代码。目标代码生成模块340包括检查语句展开子模块341和常规代码生成子模块342两个部分,其中,常规代码生成子模块342用于将进行冗余消除后源程序、指针属性存储语句最终转换成机器目标代码。
相比图1的代码编译和优化过程,目标代码生成模块340在编译阶段增加了检查语句展开子模块341,用于将冗余消除后保留的检查语句进行展开,展开过程将检查语句由单指令格式转换为分支指令格式,其中,单指令格式是无分支结构执行的设计语句,分支指令格式是以分支结构执行的机器指令,包括比较语句和跳转语句的组合。
结合检查语句展开子模块341和常规代码生成子模块342的输出结果,得到符合应用要求的目标执行文件。
接下来,基于图3中的内容对本申请实施例提供的一种内存安全管理方案进行介绍。
图4是本申请实施例提供的一种内存安全管理方法的流程图。如图4所示,该方法包括以下的步骤S401-S404,具体分析如下:
步骤S401,在第一程序中的风险语句之前插入检查指针属性的检查语句;风险语句是第一程序中调用指针进行内存访问的语句,指针属性是风险语句中指针的属性。
在本实施例中,首先需要根据用户需求,在硬件平台上基于C或类C语言编辑,获取根据应用方案编写的第一程序,第一程序也就是图3中所述的源程序,该硬件平台可以是一台独立的PC机,接入网络的服务器,或者任何可以进行C或类C语言编辑的用户可输入终端平台。在编辑得到的第一程序中,由于使用了大量的指针操作,在使用指针进行内存访问时,有可能因为指针操作不当造成内存空间的破坏性访问,从而严重影响程序的安全性和可靠性。
基于该第一程序,需要使该第一程序进入编译环节。为了实现对第一程序的编译,可以使用一种集中开发环境,将第一程序的编辑和编译过程在同一平台集中实现,也可以在一个平台实现第一程序的编辑,在另一个平台将编辑得到的第一程序接入编译环境。
在一个示例中,在第一程序的基础上,通过人工或编译环境在指针定义语句的后面添加指针属性标注语句。首先通过与指针属性标注语句相配套的语法、词法分析技术对指针属性进行提取,然后指针属性存储语句进行指针属性存储,指针属性指的是指针所指向内存块的长度、边界、内存空间上界地址、内存空间下界地址等用于空间类内存安全检查所需要的必要信息,通过对第一程序中隐含信息的词法、语法分析获得,如图3所示,指针属性信息的存储由指针属性存储子模块321完成。
一般而言,需要在第一程序中的每一个指针的每一个指针定义语句后,插入获取指针属性的指针标注语句,以及存储每一个指针信息的指针属性存储语句,插入的指针属性存储语句是编译过程可识别的第一自定义语句。
在一个示例中,为了内存访问的保障安全性,需要在实现插入指针属性存储语句后,通过编译环境在第一程序中寻找利用指针进行内存访问产生的风险语句,并在风险语句之前的位置插入关于指针的检查语句,检查语句的检查对象就是风险语句中所使用的指针,插入的检查语句是编译过程可识别的第二自定义语句,为了便于执行冗余代码的优化,检查语句通常设计成单指令格式,按照顺序执行的方式进行执行。单指令格式表现在,设计一条自定义检查语句用于表示一条检查规则,与图1的代码编译和优化过程方案中用一条比较指令加一条跳转指令表示一条检查规则的方式相比,单指令格式的检查语句具有不改变CFG、不影响代码优化技术、进而可大幅降低目标执行文件性能开销的显著优势。另外,风险语句表示那些可能存在空间类内存安全的执行语句,为了保障内存访问安全性,需要在这些风险语句执行之前插入检查语句。可以理解的是,风险语句可以表示内存访问语句,可以表示涉及指针运算的内存访问语句,还可以表示指针运算语句。
在插入检查语句的过程中,采用检查语句和指针属性存储语句的直接映射,直接映射表现在,所创建的检查语句中使用的检查范围由指针属性存储语句中定义的用于表示指针属性信息的变量和指针属性存储语句中保存的指针属性确定。这种直接映射相比于现有技术中通常采用的建表、查表方式,具有内存开销极小的显著优势。如图3所示,检查语句和指针属性存储语句的直接映射,由指针属性映射子模块322完成,在实现映射时,对一个具体的指针,比如指针P,找到一个执行指针P进行内存访问的风险语句,在该风险语句插入判空检查语句,check(p!=null),寻找执行该风险语句之前指针P的指针属性,将存储该指针属性的指针属性存储语句包含的关于指针P的相关空间信息,映射为该检查语句的调用参数。
在编译过程中,在插入检查语句完成后,将代码中加入的指针属性标注语句进行删除。
步骤S402,对第一转换后程序和检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对第一程序进行编译产生的中间表示。
在一个示例中,加入指针属性存储语句、自定义类型单指令格式的检查语句后的程序,被带入到本环节,在一个常规的代码优化过程中,将检查语句视为“伪码”,在不改变第一程序原有逻辑的情况下,采用常规的代码优化方案,对第一程序根据编译过程定义的语法、语义分析规则进行编译,生成编译过程中的一种中间表示,得到第一转换后程序,并将该第一转换后程序进行冗余优化,得到第一转换后程序的第一消除后程序。如图3所示,该常规的代码优化过程由常规代码优化子模块331完成。该常规的代码优化过程和图1中的代码编译和优化过程方案对源程序的处理过程和处理效果类似,在此不做详细描述。
进一步的,也可以结合图3中的检查语句插入模块320,将检查语句视为第一程序的辅助语句,加入与检查语句相关联的逻辑关系,对常规的代码优化技术进行适配性改造,以达到更加深度消除的目的,此研究方向不是本申请阐述的重点,在此不再赘述。
在一个示例中,指针属性存储语句是在编译过程中插入的一种自定义语句,这种自定义语句的语法格式可以与C或类C等语言一致,由于这种自定义语句只是一类变量定义语句,比如,定义指针属性变量p_lower、p_upper,在标注语句后加入指针属性存储语句,p_lower=p,p_upper=p+100,因此不会影响第一程序的常规优化过程。另外,这种自定义语句的语法格式也可以与C或类C等语言不一致,那么在第一程序的常规代码优化过程中,可以和检查语句一样视为“伪码”。在本实施例中,为了方便描述,将这种自定义语句的语法格式视为与C或类C等语言一致,在常规代码优化阶段,不影响对第一程序进行代码优化,可以理解的是,对于这种自定义语句的语法格式与C或类C等语言不一致的情况,则在常规代码优化阶段对第一程序进行代码优化时,将其视为“伪码”,无论哪种情况,都不会影响第一程序的常规代码优化结果。
在本实施例中,根据定制的值域分析与传播算法将检查语句中的冗余代码进行消除,得到第三消除后程序。根据定制的部分冗余消除算法,将第三消除后程序中检查语句的冗余代码进行进一步消除,得到第二消除后程序。根据定制的死代码消除算法,将与消除的检查语句有直接映射的指针属性存储语句和指针属性变量进行消除,得到第四消除后程序,具体介绍如下:
一般而言,冗余代码根据控制流关系可分为全冗余和部分冗余,根据包含关系可分为相同冗余和偏序冗余,在检查语句消除过程中,针对这些冗余代码进行冗余优化算法的定制化设计。
针对检查程序中可能存在的全冗余、部分冗余、相同冗余和偏序冗余四种冗余检查语句,分别设计定制的优化算法进行深度消除。
首先,设计与实现定制的VRAP算法来消除全相同冗余和全偏序冗余,通过对每个被检查语句的值域范围进行求解与传播,确认检查语句的满足条件。若一定会满足,则此检查语句是全相同冗余或全偏序冗余的,进行删除;若一定不满足,则一定会有安全问题发生,进行静态检查报错,提供调试信息给开发人员,辅助其进行调试修改;若无法确认是否满足,则将该检查语句保留到运行时环节再进行实时动态监测,同时可根据检查范围更新值域信息。
下面将结合图5a-5b对本申请实施例提供的定制化VRAP算法进行描述,其中,
图5a是本申请实施例提供的一种常规VRAP算法处理的流程图,图5b是本申请实施例提供的一种定制化VRAP算法处理的流程图。
在一个示例中,针对一份插入有检查语句的程序代码,如图5a所示,利用常规VRAP算法的冗余检查过程:获知变量i的值域,进行条件判断,删除冗余分支,如图5b所示,利用定制的VRAP算法的冗余检查过程:确认是否满足要求,若一定满足,删除冗余检查,若一定不满足进行静态报错,若不一定满足,根据检查语句更新值域范围。
总之,本申请中提供一种定制的值域分析与传播算法实现对检查语句的消除,定制化主要表现在:“对检查语句的检查对象和检查范围进行判断”取代“对比较语句的比较结果进行判断”,“删除检查语句同时更新检查对象的值域范围”取代“删除比较语句同时更新比较对象的值域范围”。
其次,设计与实现设计PRE算法来消除部分相同冗余和部分偏序冗余:将检查指针对象视为哈希的关键字,对所有检查语句进行哈希,遇到具有相同关键字的两条检查语句时,判断两者的检查范围以确认是否是相同关系、偏序关系或不满足关系,再结合正确性、安全性、计算最优性、生命周期最优的原则判断是否是部分冗余。若是部分冗余下的相同关系或偏序关系,则此检查语句是冗余的,通过检查语句上提对其进行部分路径的删除;若是部分冗余下的不满足关系,则一定会有安全问题发生,进行静态检查报错,提供调试信息给开发人员,辅助其进行调试修改;若是其他情况,则将该检查语句保留到运行时环节再进行实时监测。
下面将结合图6a-6b对本申请实施例提供的定制化PRE算法进行描述,其中,
图6a是本申请实施例提供的一种常规PRE算法处理的流程图,图6b是本申请实施例提供的一种定制化PRE算法处理的流程图。
在一个示例中,如图6a所示,对于常规PRE算法面向的冗余场景:图6a中(a)属于全部冗余计算,删掉左分支的a+b运算不会有任何影响,用之前的运算结果c来代替a+b;图6a中(b)属于部分冗余计算,左分支只执行了一次a+b操作,不存在冗余,右分支存在冗余计算,由于功能上需要每个分支都执行一次a+b操作,消除的核心思想在于让每个分支都只出现一次a+b操作;图6a中(c)为常见的循环冗余,可归属于部分冗余计算的特殊情况,即由于循环次数不同,不同路径上a+b的执行次数不同,当执行一次a+b就退出循环时,不存在冗余计算,但是进入循环后,会产生冗余计算。
从图6a中可以看出,部分冗余a+b消除需要涉及重命名、插入、删除、移动等各项操作。若变量c和d存在某种联系、各个分支对c或d的赋值不同、分支与循环叠加等场景的出现,会使得计算会变得非常复杂。
为了保障计算正确性和执行优化的正向效果,在部分冗余消除过程中,必须同时满足如下四项基本原则:
(1)正确性:只在a+b冗余的路径上删除a+b,保障不会删错;
(2)安全性:只在原本执行a+b的路径上插入a+b,保障不会多插;
(3)计算优化性:无论真实输入数据采用什么样的执行路径,都不会有更少的a+b计算次数;
(4)生命周期最优(寄存器压力最小):在图6a中(b)和图6a中(c)的基础上,最小化a+b
存储的寄存器周期,越晚存储越好。
遵循上述四项原则来实现a+b的重命名、插入、删除、移动等操作:设计了向下安全(DownSafe,ds)、可被使用(CanBeAvail,cba)、置后(Later,later)三个标志位,沿着代码顺序对三个标志位进行计算,根据计算结果进行相对应的操作。下表中列举了常规PRE算法的核心标志位:
如图6b所示,对于定制化PRE算法面向的冗余场景是图6b中的(b)、(c)、(d)三种,将check(i)作为哈希的关键字,check(i<len1)和check(i<len2)将被视为相同的哈希对象;获取到相同哈希关系后,确认两者之间检查范围的包含关系:若len1==len2,为相同关系;若len1<len2,则check(i<len1)满足的情况下check(i<len2)一定被满足,为偏序关系;若len1>len2,则check(i<len1)满足的情况下check(i<len2)不一定被满足,为非冗余关系;再结合正确性、安全性、计算最优性、生命周期最优的原则判断是否是部分冗余。
在一个示例中,对上述图6a中的四项基本原则的含义做如下修改:
(1)正确性:只在check(i<len)冗余的路径上删除check(i<len),保障不会删错;
(2)安全性:只在原本执行check(i<len)的路径上插入check(i<len),保障不会多插;
(3)计算优化性:无论真实输入数据采用什么样的执行路径,都不会有更少的check次数;
(4)生命周期最优(寄存器压力最小):因为不涉及寄存器存储,删除该原则。
相应的,对标志位求解方式进行修改,实现检查语句,即check指令的重命名、插入、删除、移动等操作,下表中列举了定制化PRE算法的核心标志位:
总之,本申请中提供一种定制的部分冗余消除算法实现对检查语句的消除,定制化主要表现在:“对检查语句中的检查对象进行哈希”取代“对整个表达式进行哈希”,“对相同检查对象的不同检查范围进行比较,可消除相同冗余和偏序冗余”取代“对相同语句进行比较,仅可消除相同冗余”。
最后,设计与实现定制的DCE算法来消除冗余的指针属性,冗余的指针属性指的是那些不再有价值的指针属性存储语句和指针属性变量。指针属性变量在指针属性存储语句中被定义(称为定义点),在检查语句中被使用(称为使用点)。在冗余检查语句被大量消除后,很多指针属性存储语句和指针属性变量不再有使用点,因而没有了价值,成为了死代码,需要进一步进行冗余消除。
图7是本申请实施例提供的一种常规DCE算法处理的流程图,下面将结合图7对本申请实施例提供的定制化DCE算法进行描述,如图7所示,在常规DCE算法中,进行反向数据流分析,判断一个变量不再有使用点,就是没用的。在定制化DCE算法中,虽然实现原理和常规DCE算法是一样的,但面向的对象不同,面向的对象是冗余的指针属性存储语句和指针属性变量。本申请中提供设计的检查语句和指针属性存储语句来支持这种DCE算法的定制化。
如上,如图3所示,对于冗余检查语句的消除由检查语句消除子模块332完成,之后,对于冗余指针属性存储语句的消除由指针属性消除子模块333完成。在以上执行过程中,对于检查语句消除子模块332,可以在常规代码优化子模块331执行完成后执行,也可以和常规代码优化子模块331同步执行,在此不做设定。
在一个示例中,可以将执行代码优化模块330期间产生的静态调试文件反馈给程序开发人员,并接收程序开发人员对源程序、检查语句、指针属性赋值语句、指针属性变量等的修改。一般而言,静态调试文件可以是通过常规代码优化子模块331,对第一程序进行语法、语义转换和冗余代码优化所产生的编译错误,包括语法错误,内存存取错误,命令行错误等,也可以是设计冗余消除子模块332进行检查语句冗余消除,和指针属性消除子模块333进行指针属性存储语句冗余消除过程中所产生的优化逻辑错误、语法错误等。
步骤S403,对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序。
步骤S404,至少基于第二转换后程序、第一消除后程序,生成目标执行文件;其中,目标执行文件用于在运行时生成故障信息,故障信息包含第一风险语句中指针的指针属性,第一风险语句是第一程序中的风险语句中的一个。
在对第一转换后程序和检查语句的冗余代码进行消除后,如图3所示,通过检查语句展开子模块341将每条检查语句展开成一条比较与一条跳转的组合形式,得到第二转换后程序,
由于对指针属性存储语句和指针属性变量进行冗余消除后生成的第四消除程序,也是生成目标执行文件的一部分,所以在生成目标执行文件之前,还需要加入第四消除程序,然后,基于第二转换后程序、第二消除后程序和第四消除后程序,生成一种含有指针检查功能的二进制代码。
在一个示例中,可以将目标执行文件在运行时产生的动态调试文件反馈给程序开发人员,并接收程序开发人员对源程序、检查语句、指针属性赋值语句、指针属性变量等的修改。动态调试文件中包含因为调用指针进行内存访问所导致的故障信息,包括风险语句位置、产生故障的指针执行代码、指针属性、指针越界类型等。
图8是本申请实施例提供的一种源程序编译的流程图,将源程序中的代码按照步骤S401-S404的执行过程进行描述,具体介绍如下:
基于源程序得到中间程序;源程序是根据应用方案编写的程序;中间程序包括源程序,对源程序中的指针进行指针属性存储的指针属性存储语句,指针属性存储语句中定义的指针属性变量,以及对风险语句中的指针进行指针属性检查的检查语句;其中,指针属性包括指针所指向内存块的长度、边界信息,风险语句是源程序中利用指针进行内存访问的语句。
将源程序转换为编译过程产生的中间表示,得到第一转换后程序。
对第一转换后程序进行冗余代码消除,得到第一消除后程序。
根据定制的值域分析与传播算法将检查语句中的冗余代码消除,得到第三消除后程序,根据定制的部分冗余消除算法将第三消除后程序中存在的冗余代码进一步消除,得到第二消除后程序。
根据定制的死代码消除算法将指针属性存储语句和指针属性变量中丧失引用关系的冗余代码进行消除,得到第四消除后程序。其中,丧失引用关系的冗余代码是与检查语句中的冗余代码存在直接映射的指针属性存储语句和指针属性变量,直接映射将丧失引用关系的冗余代码包含的指针属性变量以及存储的指针属性映射为检查语句中的冗余代码的检查范围。
对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序。
在一个示例中,中间程序在编译过程中,除了要求指针属性存储语句和指针属性变量的冗余消除在检查语句冗余消除之后进行,其他执行动作的执行顺序均无特殊要求,比如,对源程序进行编译转换及常规代码优化、对检查语句进行冗余消除及执行顺序转换,这两个步骤可以同时执行,也可以先后执行,两者执行顺序的改变不会对最终的编译效果产生影响。
基于第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
图9是本申请实施例提供的一种内存安全管理方法的实施架构图,如图9所示,设计了一种改造的集成开发环节,由编译器900及图形用户界面910进行源程序的优化设计。在开发人员在编辑器920的源码编写子模块921中完成源程序撰写与改造后,通过指针属性存储子模块901以及指针属性映射子模块902两个子模块,在风险语句之前进行检查语句插入;经过常规代码优化子模块903、检查语句消除子模块904以及指针属性消除子模块905三个子模块后,通过检查语句展开子模块806以及常规代码生成子模块907得到含有检查功能的二进制代码;同时,得到一些静态检查报错信息,通过图形用户界面910中的交互式报错与调试子模块911传递给开发人员,辅助其进行调试修改;二进制代码输入到真实执行环境中可以根据实时输入信息对安全问题进行实时检查,得到的调试信息传递给运维人员,辅助其进行代码调试。
为了实现低开销高安全的空间类内存安全问题检测,参照图4的内存安全管理方法,图10是本申请实施例提供的一种内存安全管理方法的流程图,如图10所示,实施步骤S1000-S1008,各步骤具体介绍如下:
步骤S1000,通过词法、语法分析提取源程序中的指针属性信息。
步骤S1001,创建指针属性变量和指针属性存储语句对指针属性信息进行存储。
步骤S1002,利用指针属性变量设计单指令格式的检查语句,在内存访问等风险语句之前插入检查语句。
步骤S1003,调用常规代码优化技术进行性能调优。
步骤S1004,利用定制化VRAP算法消除全相同冗余和全偏序冗余的检查语句,同时进行静态检查报错。
步骤S1005,利用定制化PRE算法消除部分相同冗余和部分偏序冗余的检查语句,同时进行静态检查报错。
步骤S1006,利用定制化DCE算法消除没有使用点的冗余指针属性存储语句。
步骤S1007,将每一条检查语句展开成一条比较指令和一条跳转指令的组合。
步骤S1008,结合对源程序进行常规代码优化处理得到的代码,生成目标执行代码。
图11是本申请实施例提供的一种内存安全管理方法的实施架构图,如图11所示,是一种改造的编译器,对其前端、中端、后端三部分分别进行了优化设计。首先,在前端模块1100中,包含指针属性存储子模块1101,指针属性映射子模块1102,用于存储指针属性并建立指针属性和检查语句的正确映射;在中端模块1110中,包含常规代码优化子模块1111,检查语句消除子模块1112、指针属性消除子模块1113,在中端模块1110中,将静态报错结果以调试信息的形式输出给开发人员,辅助其对代码进行调试修改;在后端模块1120中,包含检查语句展开子模块1121,常规代码生成子模块1122,用以将设计的单指令格式的检查语句展开成比较指令和跳转指令的组合。由此,可得到一种含有检查功能的二进制代码,当该二进制代码在真实执行环境中运行时,可给运维人员提供调试信息,辅助其进行调试修改。除模块划分和连接方式与图9所示实时架构图中不同,每个步骤的具体操作都和图10所示流程图中的介绍一致,此处不再赘述。
图12是本申请实施例提供的一种内存安全管理方法的实施架构图,如图12所示,是一种改造的程序分析工具,包含了静态分析和动态分析两部分。在静态分析模块1200中,包含指针属性存储子模块1201,指针属性映射子模块1202,常规代码优化子模块1203,检查语句消除子模块1204,指针属性消除子模块1205五个模块,实现了指针属性和检查语句的正确映射,在消除冗余检查语句的同时还可以将静态报错结果以调试信息的形式输出给开发人员,辅助其对代码进行调试修改;在动态分析模块1210中,包含检查语句展开子模块1211,常规代码生成子模块1212,可以生成含有检查功能的二进制代码,随后和模拟用例一起输入给模拟执行环境,得到一些报错信息输出给开发人员,辅助其对代码进行调试修改。除模块划分和连接方式与图9所示实时架构图中不同,每个步骤的具体操作都和图10所示流程图中的介绍一致,此处不再赘述。
基于上述实施例中的方法,本申请实施例还提供一种内存安全管理设备。
图13是本申请实施例提供的一种内存安全管理设备的硬件结构示意图。如图13所示,该内存安全管理设备1300包括:处理模块1301,具体模块功能介绍如下:
处理模块1301在第一程序中的风险语句之前插入检查指针属性的检查语句,风险语句是第一程序中调用指针进行内存访问的语句,指针属性是风险语句中指针的属性。
处理模块1301还对第一转换后程序和检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对第一程序进行编译产生的中间表示。
处理模块1301还对第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序。
处理模块1301还至少基于第二转换后程序、第一消除后程序,生成目标执行文件;其中,目标执行文件用于在运行时生成故障信息,故障信息包含第一风险语句中指针的指针属性,第一风险语句是第一程序中的风险语句中的一个。
在一些实施例中,处理模块1301对第一转换后程序和检查语句分别进行冗余代码消除时,通过对检查语句的检查对象和检查范围进行判断,将检查语句中的全相同冗余代码及全偏序冗余代码消除,得到第三消除后程序;检查语句的检查对象和检查范围至少基于风险语句得到。通过对第三消除后程序中检查语句的检查对象进行哈希,将第三消除后程序中的部分相同冗余代码及部分偏序冗余代码消除,得到第二消除后程序。
在一些实施例中,处理模块1301在第一程序中的风险语句之前插入检查指针属性的检查语句时,在第一程序的指针定义语句之后插入标注语句;标注语句用于获取风险语句中指针的指针属性;在标注语句之后插入指针属性存储语句;指针属性存储语句用于保存标注语句获取的指针属性,指针属性存储语句包含指针属性变量,指针属性变量是用于表示指针属性的变量;指针属性存储语句是编译过程可识别的第一自定义语句;基于风险语句和指针属性存储语句,确定对风险语句进行指针属性检查的检查语句;其中,风险语句用于确定检查语句的检查对象,指针属性存储语句包含的指针属性变量和指针属性存储语句保存的指针属性用于确定检查语句的检查范围;其中,检查语句是编译过程可识别的第二自定义语句;在风险语句之前插入检查指针属性的检查语句。
在一些实施例中,处理模块1301对第一转换后程序和检查语句分别进行冗余代码消除之后,将指针属性存储语句中的冗余代码进行消除,以及将指针属性存储语句中的冗余代码中包含的指针属性变量进行消除,得到第四消除后程序;其中,指针属性存储语句中的冗余代码保存的指针属性,以及指针属性存储语句中的冗余代码中包含的指针属性变量,用于确定检查语句中的冗余代码的检查范围;处理模块1301至少基于第二转换后程序、第一消除后程序生成目标执行文件时,用于:基于第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
在一些实施例中,第一程序是使用C或类C语言编写的程序。
图14是本申请实施例提供的一种内存安全管理设备的硬件结构示意图。该网络设备1400可以为上述内存安全管理设备。如图14所示,该网络设备1400包括处理器1410、存储器1420、通信接口1430和总线1440,处理器1410、存储器1420和通信接口1430通过总线1440彼此连接。处理器1410、存储器1420和通信接口1430也可以采用除了总线1440之外的其他连接方式连接。
其中,存储器1420可以是各种类型的存储介质,例如随机存取存储器(randomaccess memory,RAM)、只读存储器(read-only memory,ROM)、非易失性RAM(non-volatileRAM,NVRAM)、可编程ROM(programmable ROM,PROM)、可擦除PROM(erasable PROM,EPROM)、电可擦除PROM(electrically erasable PROM,EEPROM)、闪存、光存储器、硬盘等。
其中,处理器1410可以是通用处理器,通用处理器可以是通过读取并执行存储器(例如存储器1420)中存储的内容来执行特定步骤和/或操作的处理器。例如,通用处理器可以是中央处理器(central processing unit,CPU)。处理器1410可以包括至少一个电路,以执行图4或者图9所示实施例提供的内存安全管理方法的全部或部分步骤。
其中,通信接口1430包括输入/输出(input/output,I/O)接口、物理接口和逻辑接口等用于实现网络设备1400内部的器件互连的接口,以及用于实现网络设备1400与其他设备(例如其他网络设备或用户设备)互连的接口。物理接口可以是以太网接口,光纤接口,ATM接口等。
其中,总线1440可以是任何类型的,用于实现处理器1410、存储器1420和通信接口1430互连的通信总线,例如系统总线。
上述器件可以分别设置在彼此独立的芯片上,也可以至少部分的或者全部的设置在同一块芯片上。将各个器件独立设置在不同的芯片上,还是整合设置在一个或者多个芯片上,往往取决于产品设计的需要。本申请实施例对上述器件的具体实现形式不做限定。
图14所示的网络设备1400仅仅是示例性的,在实现过程中,网络1400还可以包括其他组件,本文不再一一列举。
在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。计算机程序产品包括一个或多个计算机指令。在计算机上加载和执行计算机程序指令时,全部或部分地产生按照本发明实施例的流程或功能。计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。可用介质可以是磁性介质(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如,固态硬盘(solid state disk,SSD))等。
可以理解的是,在本申请的实施例中涉及的各种数字编号仅为描述方便进行的区分,并不用来限制本申请的实施例的范围。应理解,在本申请实施例中,上述各过程的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,不应对本申请实施例的实施过程构成任何限定。
以上的具体实施方式,对本申请的目的、技术方案和有益效果进行了进一步详细说明,所应理解的是,以上仅为本发明的具体实施方式而已,并不用于限定本申请的保护范围,凡在本申请的技术方案的基础之上,所做的任何修改、等同替换、改进等,均应包括在本申请的保护范围之内。
Claims (13)
1.一种内存安全管理方法,其特征在于,所述方法包括:
在第一程序中的风险语句之前插入检查指针属性的检查语句;所述风险语句是所述第一程序中调用指针进行内存访问的语句,所述指针属性是所述风险语句中指针的属性;
对第一转换后程序和所述检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对所述第一程序进行编译产生的中间表示;
对所述第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序;
至少基于所述第二转换后程序、第一消除后程序,生成目标执行文件;其中,所述目标执行文件用于在运行时生成故障信息,所述故障信息包含第一风险语句中指针的指针属性,所述第一风险语句是所述第一程序中的风险语句中的一个。
2.根据权利要求1所述的方法,其特征在于,所述对第一转换后程序和所述检查语句分别进行冗余代码消除,包括:
通过对所述检查语句的检查对象和检查范围进行判断,将所述检查语句中的全相同冗余代码及全偏序冗余代码消除,得到第三消除后程序;所述检查语句的检查对象和检查范围至少基于所述风险语句得到;
通过对所述第三消除后程序中检查语句的检查对象进行哈希,将所述第三消除后程序中的部分相同冗余代码及部分偏序冗余代码消除,得到第二消除后程序。
3.根据权利要求1所述的方法,其特征在于,所述在第一程序中的风险语句之前插入检查指针属性的检查语句,包括:
在所述第一程序的指针定义语句之后插入标注语句;所述标注语句用于获取风险语句中指针的指针属性;
在标注语句之后插入指针属性存储语句;所述指针属性存储语句用于保存所述标注语句获取的指针属性,所述指针属性存储语句包含指针属性变量,所述指针属性变量是用于表示指针属性的变量;所述指针属性存储语句是编译过程可识别的第一自定义语句;
基于风险语句和所述指针属性存储语句,确定对风险语句进行指针属性检查的检查语句;其中,所述风险语句用于确定检查语句的检查对象,所述指针属性存储语句包含的指针属性变量和所述指针属性存储语句保存的指针属性用于确定检查语句的检查范围;其中,所述检查语句是编译过程可识别的第二自定义语句;
在风险语句之前插入检查指针属性的检查语句。
4.根据权利要求3所述的方法,其特征在于,所述对第一转换后程序和所述检查语句分别进行冗余代码消除之后,还包括:
将所述指针属性存储语句中的冗余代码进行消除,以及将所述指针属性存储语句中的冗余代码中包含的指针属性变量进行消除,得到第四消除后程序;其中,所述指针属性存储语句中的冗余代码保存的指针属性,以及所述指针属性存储语句中的冗余代码中包含的指针属性变量,用于确定所述检查语句中的冗余代码的检查范围;
所述至少基于所述第二转换后程序、第一消除后程序,生成目标执行文件,包括:
基于所述第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
5.根据权利要求1-4任一所述的方法,其特征在于,所述第一程序是使用C或类C语言编写的程序。
6.一种内存安全管理设备,其特征在于,所述设备包括:
处理模块,用于在第一程序中的风险语句之前插入检查指针属性的检查语句;所述风险语句是所述第一程序中调用指针进行内存访问的语句,所述指针属性是所述风险语句中指针的属性;
所述处理模块,还用于对第一转换后程序和所述检查语句分别进行冗余代码消除,得到第一消除后程序和第二消除后程序;其中,第一转换后程序是对所述第一程序进行编译产生的中间表示;
所述处理模块,还用于对所述第二消除后程序实施编译过程中机器指令的转换,得到第二转换后程序;
所述处理模块,还用于至少基于所述第二转换后程序、第一消除后程序,生成目标执行文件;其中,所述目标执行文件用于在运行时生成故障信息,所述故障信息包含第一风险语句中指针的指针属性,所述第一风险语句是所述第一程序中的风险语句中的一个。
7.根据权利要求6所述的设备,其特征在于,所述处理模块对第一转换后程序和所述检查语句分别进行冗余代码消除时,用于:
通过对所述检查语句的检查对象和检查范围进行判断,将所述检查语句中的全相同冗余代码及全偏序冗余代码消除,得到第三消除后程序;所述检查语句的检查对象和检查范围至少基于所述风险语句得到;
通过对所述第三消除后程序中检查语句的检查对象进行哈希,将所述第三消除后程序中的部分相同冗余代码及部分偏序冗余代码消除,得到第二消除后程序。
8.根据权利要求6所述的设备,其特征在于,所述处理模块在第一程序中的风险语句之前插入检查指针属性的检查语句时,用于:
在所述第一程序的指针定义语句之后插入标注语句;所述标注语句用于获取风险语句中指针的指针属性;
在标注语句之后插入指针属性存储语句;所述指针属性存储语句用于保存所述标注语句获取的指针属性,所述指针属性存储语句包含指针属性变量,所述指针属性变量是用于表示指针属性的变量;所述指针属性存储语句是编译过程可识别的第一自定义语句;
基于风险语句和所述指针属性存储语句,确定对风险语句进行指针属性检查的检查语句;其中,所述风险语句用于确定检查语句的检查对象,所述指针属性存储语句包含的指针属性变量和所述指针属性存储语句保存的指针属性用于确定检查语句的检查范围;其中,所述检查语句是编译过程可识别的第二自定义语句;
在风险语句之前插入检查指针属性的检查语句。
9.根据权利要求8所述的设备,其特征在于,所述处理模块对第一转换后程序和所述检查语句分别进行冗余代码消除之后,用于:
将所述指针属性存储语句中的冗余代码进行消除,以及将所述指针属性存储语句中的冗余代码中包含的指针属性变量进行消除,得到第四消除后程序;其中,所述指针属性存储语句中的冗余代码保存的指针属性,以及所述指针属性存储语句中的冗余代码中包含的指针属性变量,用于确定所述检查语句中的冗余代码的检查范围;
所述处理模块至少基于所述第二转换后程序、第一消除后程序生成目标执行文件时,用于:基于所述第二转换后程序、第一消除后程序和第四消除后程序,生成目标执行文件。
10.根据权利要求6-9任一所述的设备,其特征在于,所述第一程序是使用C或类C语言编写的程序。
11.一种电子设备,其特征在于,包括:至少一个存储器,用于存储程序;至少一个处理器,用于执行存储器存储的程序;其中,当存储器存储的程序被执行时,处理器用于执行如实现权利要求1-5任一所述的方法。
12.一种计算机可读存储介质,其特征在于,包括指令,当所述指令在计算机上运行时,使得所述计算机执行如实现权利要求1-5任一所述的方法。
13.一种计算机程序产品,其特征在于,包括程序代码,当计算机运行所述计算机程序产品时,使得所述计算机执行如实现权利要求1-5任一所述的方法。
Priority Applications (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211535703.5A CN118113291A (zh) | 2022-11-30 | 2022-11-30 | 一种内存安全管理方法及设备 |
PCT/CN2023/103819 WO2024113831A1 (zh) | 2022-11-30 | 2023-06-29 | 一种内存安全管理方法及设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211535703.5A CN118113291A (zh) | 2022-11-30 | 2022-11-30 | 一种内存安全管理方法及设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118113291A true CN118113291A (zh) | 2024-05-31 |
Family
ID=91207521
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211535703.5A Pending CN118113291A (zh) | 2022-11-30 | 2022-11-30 | 一种内存安全管理方法及设备 |
Country Status (2)
Country | Link |
---|---|
CN (1) | CN118113291A (zh) |
WO (1) | WO2024113831A1 (zh) |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1129070C (zh) * | 1998-02-06 | 2003-11-26 | 华为技术有限公司 | 程序设计中内存操作错误的识别方法 |
US7752613B2 (en) * | 2006-12-05 | 2010-07-06 | Intel Corporation | Disambiguation in dynamic binary translation |
US8060869B1 (en) * | 2007-06-08 | 2011-11-15 | Oracle America, Inc. | Method and system for detecting memory problems in user programs |
CN102243609A (zh) * | 2011-06-15 | 2011-11-16 | 惠州运通信息技术有限公司 | 一种基于嵌入式软件的测试分析方法及系统 |
CN106940654B (zh) * | 2017-02-15 | 2020-08-14 | 南京航空航天大学 | 源代码中内存错误的自动检测和定位方法 |
-
2022
- 2022-11-30 CN CN202211535703.5A patent/CN118113291A/zh active Pending
-
2023
- 2023-06-29 WO PCT/CN2023/103819 patent/WO2024113831A1/zh unknown
Also Published As
Publication number | Publication date |
---|---|
WO2024113831A1 (zh) | 2024-06-06 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US8875110B2 (en) | Code inspection executing system for performing a code inspection of ABAP source codes | |
US8954939B2 (en) | Extending a development environment | |
US5581696A (en) | Method using a computer for automatically instrumenting a computer program for dynamic debugging | |
US8099721B2 (en) | Parsing of declarations in all branches of preprocessor conditionals | |
US6901579B1 (en) | Generation of source code from classes and maintaining the comment that indicates the role of the class in the generated source code | |
US8458681B1 (en) | Method and system for optimizing the object code of a program | |
CN107704382B (zh) | 面向Python的函数调用路径生成方法和系统 | |
US8122440B1 (en) | Method and apparatus for enumerating external program code dependencies | |
CN101751281A (zh) | 编译器生成系统和方法 | |
US9311077B2 (en) | Identification of code changes using language syntax and changeset data | |
US8898649B2 (en) | Application program analysis method, analysis system and recording medium for identifying a contributing factor for an invalid operation of an application program | |
US10839124B1 (en) | Interactive compilation of software to a hardware language to satisfy formal verification constraints | |
CN111813675A (zh) | Ssa结构解析方法、装置、电子设备和存储介质 | |
CN110096264A (zh) | 一种代码运行方法及装置 | |
CN113901083A (zh) | 基于多解析器的异构数据源操作资源解析定位方法和设备 | |
CN112286784B (zh) | 一种测试用例生成方法、装置、服务器及存储介质 | |
EP4113284A1 (en) | Cross-platform code conversion method and device | |
CN111966578A (zh) | 一种安卓兼容性缺陷修复效果的自动化评估方法 | |
CN113176999A (zh) | 基于分布式应用程序的软件测试方法及系统 | |
CN111240728A (zh) | 应用程序更新方法、装置、设备和存储介质 | |
CN118113291A (zh) | 一种内存安全管理方法及设备 | |
CN110737431B (zh) | 软件开发方法、开发平台、终端设备及存储介质 | |
US7506287B2 (en) | Method, system, and program product for pre-compile processing of hardware design language (HDL) source files | |
US8769517B2 (en) | Generating a common symbol table for symbols of independent applications | |
Grigorev et al. | String-embedded language support in integrated development environment |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication |