一种检测C代码空指针引用的方法及系统技术方案

技术编号:10265294 阅读:164 留言:0更新日期:2014-07-30 12:49
本发明专利技术公开了一种检测C代码空指针引用的方法及系统,本发明专利技术涉及计算机信息安全领域中的程序代码检测领域。该方法包括简化该C代码,得到目标代码,根据该目标代码通过语义分析获取该目标代码的语法树结构;获取待检测的函数,遍历该语法树结构,查找与该函数相对应的语法树结构,遍历该函数的语法树结构,在判断语句或循环语句的节点之前插入动态检测过程的语法树结构,得到新语法树结构;根据该新语法树结构,得到最终代码,编译并执行该最终代码,若该最终代码执行异常,则输出该空指针的位置。本发明专利技术可以达到方便、快速检测C代码中可能存在的空指针引用缺陷。

【技术实现步骤摘要】
一种检测C代码空指针引用的方法及系统
本专利技术属于计算机信息安全领域中的程序代码检测领域,尤其涉及一种检测C代码中空指针引用的方法。
技术介绍
C语言是大量计算机程序所采用的编程语言,在操作系统内核、嵌入式系统、基础程序、大型应用软件等领域都有大量采用C语言编写的软件,作为一门传统的底层系统编程语言,C语言的历史已超过40年,是当前计算机系统中最重要的基础语言之一,但由于C语言本身的特性,一方面允许程序员操作各类底层内存对象(如指针等),另一方面也由此导致了大量与此相关的代码缺陷,空指针引用就是其中比较严重的一类代码缺陷,空指针引用是指程序中存在对值为NULL(空)的指针进行引用的代码,由于这类代码往往只会在部分情况下被执行,而且并非每次都会发生,因此具有很强的隐蔽性,而程序中一旦对空指针进行引用,由于该操作违反了操作系统的内存访问控制,将立即导致程序发生内存错误并被操作系统强行终止,进而导致用户数据丢失,关键部件失效等致命后果。当前解决空指针引用的方法主要有静态方法和动态方法两类。静态方法主要是模型检测技术,即通过对待检测代码进行建模规约后,针对相应的安全属性进行验证的技术,例如一种使用简单而不复杂的方法来侦测内存访问错误,对于工业代码和学生代码都有一定的效果,但由于需要对大量的状态进行建模,存在状态爆炸问题,其检测效率较低、耗时多的问题;定理证明技术,即通过对程序代码的逻辑语义进行形式化推理来验证相关属性的技术,例如一种基于证明技术对C程序进行验证以排除空指针引用等缺陷的方法,但该定理证明技术需要用户对目标代码具有相当程度的理解以便应用相关的定理策略,具有难以应用、复杂性较高等缺点,同时对于一些复杂的控制逻辑也无法做到完全自动化证明;代码分析技术,即首先获得源代码的抽象语法树,然后进行一定的控制流、数据流分析,结合预先制定的缺陷规则库进行匹配的方法,动态方法主要特点是通过代码插桩、运行时拦截、沙箱虚拟执行等方法,在程序执行的过程中动态检测可能存在的空指针引用缺陷,例如一种使用代码漏洞模式匹配的方法来侦测java中代码缺陷,虽然在一定程度上弥补了模型检测的低效率和定理证明的难应用问题,但仍然存在使用复杂耗时的缺点。专利技术专利“一种充分检测空指针引用缺陷的方法”公开了一种充分检测空指针引用缺陷的方法,包括:基于抽象语法树识别出被测应用的全部可寻址表达式;根据控制流图对被测应用进行保守的区间运算与指针分析并根据区间运算与指针分析的结果,生成函数摘要;根据所述函数摘要以及抽象语法树识别出全部的指针引用以及被引用的指针,并对每个被引用的指针创建空指针引用缺陷状态机实例;基于控制流图运行空指针引用缺陷状态机实例,在控制流图的每个节点上,根据区间运算、指针分析的结果对每个缺陷状态机实例进行状态迁移,进行空指针引用检测。采用该专利技术,能有效解决空指针引用缺陷的漏报问题,实现空指针引用缺陷检测零漏报及低误报。但是该专利技术通过基于区间运算和状态机建模分析的方法对源代码进行检测,这与本专利技术提出的插入动态监测代码的方法完全不同,同时本专利技术也不需要对源代码进行区间分析,也不需要对目标程序进行缺陷状态机建模等步骤。专利技术专利“一种检查源代码中空指针的方法和计算机系统”公开了一种检查源代码中空指针的方法,包括:计算机系统构造可引用变量类型字典,计算机系统接收扫描空指针的指令,格式化待检查的源代码;扫描待检查源代码的全局代码区域,获得与所述字典中变量声明类型对应的未初始化全局变量列表;扫描所述待检查源代码的方法区域,获得与所述字典中变量声明类型对应的未初始化局部变量列表;根据未初始化全局变量列表,获取方法下未初始化全局变量列表;扫描所述待检查源代码的方法区域,查找被调用的变量名,如果所述被调用的变量名在未初始化局部变量列表或方法下未初始化全局变量列表中,该查找到的被调用的变量名即为源代码中的空指针。但是该专利技术采用直接扫描源代码,通过一定的模式来分析源代码中可能存在的空指针问题,这与本方法的插入动态检测代码,同时编译后进行执行时判断执行返回的结果来确定空指针错误的方法完全不同,该专利技术只需要扫描源代码而不需要编译,本专利技术的检测阶段是在运行时自动完成,所采用技术方法存在明显差异。
技术实现思路
针对现有技术不足,本专利技术提出一种新的检测C代码中空指针引用缺陷的方法。为实现上述目的,本专利技术提供了一种检测C代码空指针引用的方法,该方法包括:步骤1,简化该C代码,得到目标代码,根据该目标代码通过语义分析获取该目标代码的语法树结构;步骤2,获取待检测的函数,遍历该语法树结构,查找与该函数相对应的语法树结构,遍历该函数的语法树结构,在判断语句或循环语句的节点之前插入动态检测过程的语法树结构,得到新语法树结构;步骤3,根据该新语法树结构,得到最终代码,编译并执行该最终代码,若该最终代码执行异常,则输出该空指针的位置。所述的检测C代码空指针引用的方法,该步骤1还包括,将该C代码中的判断语句统一为ifelse语句,将循环语句统一为while语句。所述的检测C代码空指针引用的方法,该动态检测过程包括生成未使用赋值集合,其中该赋值集合中的值使该判断语句或循环语句产生真、假两种赋值结果。所述的检测C代码空指针引用的方法,还包括,将该值赋予该判断语句或循环语句中条件语句的变量,将该值存入已使用赋值集合,同时将该未使用赋值集合中的该值删除。所述的检测C代码空指针引用的方法,还包括若该最终代码执行异常,则输出该值,并将该已使用赋值集合中的该值删除,遍历该未使用赋值结合。本专利技术还提供了一种检测C代码空指针引用的系统,包括:生成语法树结构模块,用于简化该C代码,得到目标代码,根据该目标代码通过语义分析获取该目标代码的语法树结构;检测模块,用于获取待检测的函数,遍历该语法树结构,查找与该函数相对应的语法树结构,遍历该函数的语法树结构,在判断语句或循环语句的节点之前插入动态检测过程的语法树结构,得到新语法树结构;输出模块,用于根据该新语法树结构,得到最终代码,编译并执行该最终代码,若该最终代码执行异常,则输出该空指针的位置。所述的检测C代码空指针引用的方法,简化代码模块,用于将该C代码中的判断语句统一为ifelse语句,将循环语句统一为while语句。所述的检测C代码空指针引用的方法,该动态检测过程包括生成未使用赋值集合,其中该赋值集合中的值使该判断语句或循环语句产生真、假两种赋值结果。所述的检测C代码空指针引用的方法,还包括,将该值赋予该判断语句或循环语句中条件语句的变量,将该值存入已使用赋值集合,同时将该未使用赋值集合中的该值删除。所述的检测C代码空指针引用的方法,还包括若该最终代码执行异常,则输出该值,并将该已使用赋值集合中的该值删除,遍历该未使用赋值结合。由以上方案可知,本专利技术的优点在于:通过应用本专利技术,可以达到方便、快速检测C代码中可能存在的空指针引用缺陷,优点是本专利技术直接编译生成嵌入了检测代码的可执行二进制文件,该二进制文件执行的同时就完成了检测,具有检测速度快,方便易用,能完美利用现有硬件平台的各项特性与程序内在特性,使用者能在完成代码编写后,立即对程序代码进行检测,并根据检测结果,确定程序代码中可能的空指针引用缺陷然后进行相关修改工作,通过在不需要先验知识本文档来自技高网
...
一种检测C代码空指针引用的方法及系统

【技术保护点】
一种检测C代码空指针引用的方法,其特征在于,包括:步骤1,简化该C代码,得到目标代码,根据该目标代码通过语义分析获取该目标代码的语法树结构;步骤2,获取待检测的函数,遍历该语法树结构,查找与该函数相对应的语法树结构,遍历该函数的语法树结构,在判断语句或循环语句的节点之前插入动态检测过程的语法树结构,得到新语法树结构;步骤3,根据该新语法树结构,得到最终代码,编译并执行该最终代码,若该最终代码执行异常,则输出该空指针的位置。

【技术特征摘要】
1.一种检测C代码空指针引用的方法,其特征在于,包括:步骤1,简化该C代码,得到目标代码,根据该目标代码通过语义分析获取该目标代码的语法树结构,其中该步骤1还包括,将该C代码中的判断语句统一为ifelse语句,将循环语句统一为while语句;步骤2,获取待检测的函数,遍历该语法树结构,查找与该函数相对应的语法树结构,遍历该函数的语法树结构,在判断语句或循环语句的节点之前插入动态检测过程的语法树结构,得到新语法树结构;步骤3,根据该新语法树结构,得到最终代码,编译并执行该最终代码,若该最终代码执行异常,则输出该空指针的位置;步骤4,根据步骤1-3生成检测代码,并将该检测代码嵌入待检测的C代码中;其中步骤2中该动态检测过程的语法树结构,用于使后续该判断语句或该循环语句中的条件表达式产生真、假两种约束条件,并具体采用穷举法或调用Z3定理证明器分别为该两种约束条件赋值,生成相应真、假两种赋值。2.如权利要求1所述的检测C代码空指针引用的方法,其特征在于,该动态检测过程包括生成未使用赋值集合,其中该赋值集合中的值使该判断语句或循环语句产生真、假两种赋值结果。3.如权利要求2所述的检测C代码空指针引用的方法,其特征在于,还包括,将该值赋予该判断语句或循环语句中条件语句的变量,将该值存入已使用赋值集合,同时将该未使用赋值集合中的该值删除。4.如权利要求3所述的检测C代码空指针引用的方法,其特征在于,还包括若该最终代码执行异常,则输出该值,并将该已使用赋值集合中的该值删除,遍历该未使用赋值结合。5.一种检测C代码空指针引用的系统,其...

【专利技术属性】
技术研发人员:孙毓忠陈英超朱洋民
申请(专利权)人:中国科学院计算技术研究所
类型:发明
国别省市:北京;11

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

1