CN102012991A - 基于静态分析的c语言安全规则检查方法 - Google Patents

基于静态分析的c语言安全规则检查方法 Download PDF

Info

Publication number
CN102012991A
CN102012991A CN2010105398750A CN201010539875A CN102012991A CN 102012991 A CN102012991 A CN 102012991A CN 2010105398750 A CN2010105398750 A CN 2010105398750A CN 201010539875 A CN201010539875 A CN 201010539875A CN 102012991 A CN102012991 A CN 102012991A
Authority
CN
China
Prior art keywords
language
statement
variable
static analysis
analysis
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
Application number
CN2010105398750A
Other languages
English (en)
Inventor
程胜
于鹏珊
崔小磊
陆麒
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
BEIJING SHENZHOU AEROSPACE SOFTWARE TECHNOLOGY Co Ltd
Original Assignee
BEIJING SHENZHOU AEROSPACE SOFTWARE TECHNOLOGY Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by BEIJING SHENZHOU AEROSPACE SOFTWARE TECHNOLOGY Co Ltd filed Critical BEIJING SHENZHOU AEROSPACE SOFTWARE TECHNOLOGY Co Ltd
Priority to CN2010105398750A priority Critical patent/CN102012991A/zh
Publication of CN102012991A publication Critical patent/CN102012991A/zh
Pending legal-status Critical Current

Links

Images

Landscapes

  • Devices For Executing Special Programs (AREA)

Abstract

本发明涉及一种基于静态分析的C语言安全规则检查方法,其包括以下步骤:1)检查C语言的类型,避免强制类型转换的发生,禁止对通用指针类型的声明;2)规定全局变量和局部变量不可同名,全局变量与函数的形式参数不可重名;3)对控制流语句的循环变量做限制;4)强化C语言的声明和定义;5)对源代码作词法、语法、语义的分析,找出源代码中不符合上述规定的地方。本发明的优点是:1)在不需要执行代码的前提下找到可能的C语言编程上的漏洞;2)有效弥补C语言在软件工程中安全性不足的缺陷。

Description

基于静态分析的C语言安全规则检查方法
技术领域
本发明涉及一种基于静态分析的C语言安全规则检查方法,属于静态代码分析技术领域。
背景技术
C语言在提供给程序员简洁和灵活的同时,也带给我们诸多的容易造成漏洞的副作用。通过静态代码分析,我们可以在不执行代码的前提下检测到多种容易导致程序漏洞的代码。这样的静态分析工具上世纪八十年代就已经产生。目前,像PC-Lint,Coverity Prevent,LDRA Testbed等商业工具广泛地应用于软件开发过程中,还有像Splint这样的开源工具也在不断的演变和完善中。静态代码分析工具极大的提高了软件工程中代码检查的效率,降低了人工代码复查的工作量。当前市场上的这些分析工具,其中有的工具功能非常强大,能够对程序进行全局分析和对运行时的程序状态进行预判。例如,对空指针引用的预判,堆栈溢出的检查,运算操作中损失精度的检查,等等。然而,C语言中可能导致漏洞的隐患是多方面的,在一些关键的应用领域中,比如国防和航天,即便是潜在的漏洞也是不能容忍的。为了防患于未然,对C语言的语法和语义做出严格的规范是有必要的。
发明内容
为了解决这些问题,本发明提供了一种全新的方法,可以加强对C代码安全性的验证。这个验证是在编译的早期阶段完成的,所以并不涉及到目标代码的生成。因此可以高效率地对大规模C代码进行检查,无论是运行时间还是内存占有方面。
本发明采用的技术方案如下:
一种基于静态分析的C语言安全规则检查方法,其特征在于包括以下步骤:
1)检查C语言的类型,避免强制类型转换的发生,禁止对通用指针类型的声明;
2)规定全局变量和局部变量不可同名,全局变量与函数的形式参数不可重名;
3)对控制流语句的循环变量做限制;
4)强化C语言的声明和定义;
5)对源代码作词法、语法、语义的分析,找出源代码中不符合上述规定的地方。
进一步地:
在所述步骤3)中,对if-else语句和switch语句的组成结构加以限制,对循环语句中循环控制表达式的组成元素的存储类严格限制。
在所述步骤4)中,对没有使用的声明和定义进行识别,禁止定义带有可变参数的函数。
本发明的优点是:1)在不需要执行代码的前提下找到可能的C语言编程上的漏洞2)有效弥补C语言在软件工程中安全性不足的缺陷。
附图说明
图1表示强制类型转换的隐患;
图2表示通用指针的隐患;
图3表示规则检查工具的工作原理;
图4为模块间的数据流程图。
具体实施方式
本发明提供了一种基于静态分析的C语言安全规则检查方法,包括以下步骤:
1)检查C语言的类型,避免强制类型转换的发生,禁止对通用指针类型的声明;
2)规定全局变量和局部变量不可同名,全局变量与函数的形式参数不可重名;
3)对控制流语句的循环变量做限制;
4)强化C语言的声明和定义;
5)对源代码作词法、语法、语义的分析,找出源代码中不符合上述规定的地方。
下面详细说明。
本发明提出了安全C语言准则的概念,  目的在于规范C语言编程,同时,帮助C程序员养成良好的C语言编程风格和习惯。它是基于代码分析工具基础上的代码规范性检测工具。对比当前已有的静态检查工具,在遵从C99标准的前提下,它对C语言的语义和语法进行了更加严格的限定。这些限定比较集中的体现在以下几个方面:
·类型检查
尽可能的让C语言向纯粹的静态类型语言靠近。C语言中的类型强制转换允许不同类型间的混合运算,如图1所示,其中类型转换是编译器“自动”完成的。这种隐性的类型转换很大程度上削弱了C语言的类型安全性,因此要尽量避免强制类型转换的发生。
如图2所示,C语言中通用指针(void*)的存在,也是类型安全的巨大隐患。本发明禁止对通用指针类型的声明。
·符号名使用的限制
为了增强代码的可读性和可维护性,本发明对C语言中的符号命名做了严格的限制。比如,在一个文件里,全局变量和局部变量不可以同名,全局变量与函数的形式参数不可以重名,尽管这样的重名在C语言中是合法的并且C的编译器可以根据作用域的差别来解析这些重名的符号。
·控制流中的限制
控制流语句因为可能涉及到复杂的条件分支,最容易造成程序的漏洞。我们对if-else和switch语句的组成结构加以限制,从而降低使用这两种语句时漏掉判定条件的风险。  对循环语句,我们对循环控制表达式的组成元素的存储类(即:auto,extern,static)做了限制(比如:只允许特定的存储类的变量出现在循环控制表达式中),同样是为了降低因使用全局变量的副作用造成的风险。
·声明和定义
强化C语言的声明和定义的规则,可以帮助我们减少编程中遇到的歧义,增强代码的可读性。比如,对没有使用的声明和定义进行识别并且以分析报告的形式反馈给用户,禁止定义带有可变参数的函数,等等。
本发明的实现原理与编译器前端的原理一致,都是对文本形式的源代码作词法、语法和语义分析,从而找出源代码中不符合相关词法、语法、语义的定义的地方。由于提出的安全C语言准则主要针对C语言的语义进行规范,规则检查工具的大部分的工作都是围绕在语义分析进行的,这其中包括了重要的一环-类型检查。
如图3所示,在这一过程中,源代码被分析并且保存在一个语法树中,另外各种符号的属性信息(比如:类型,存储类,名字)将会保存在一个符号表中。本发明依赖于语法树和符号表的信息来完成对源代码的静态分析。对代码的静态分析包括语法和语义分析两部分。其过程是通过将字符流转换成token流,对token流进行语法分析和部分语义分析后形成语法树,然后再对语法树进行语义分析。
如图4所示,本发明的内部构造主要由CPP和CCOM两个模块组成。CPP模块对源代码进行预处理,并且负责检查预处理阶段的规则。CPP模块的输出是一个中间文本文件,而这个中间文件随即由CCOM模块处理。CCOM模块对代码的语法和语义进行检查,所以,绝大部分的规则检测是由这个模块完成的。
本发明可以在Windows操作系统的命令行下使用,也可作为集成开发环境的插件部分来使用。例如,它现在已经作为SZIDE(神舟IDE嵌入式软件集成开发环境)中的一个有效的安全编程辅助工具,应用于我国航空,航天,军工等领域的关键的嵌入式软件的研发中。

Claims (3)

1.一种基于静态分析的C语言安全规则检查方法,其特征在于包括以下步骤:
1)检查C语言的类型,避免强制类型转换的发生,禁止对通用指针类型的声明;
2)规定全局变量和局部变量不可同名,全局变量与函数的形式参数不可重名;
3)对控制流语句的循环变量做限制;
4)强化C语言的声明和定义;
5)对源代码作词法、语法、语义的分析,找出源代码中不符合上述规定的地方。
2.如权利要求1所述的基于静态分析的C语言安全规则检查方法,其特征在于:
在所述步骤3)中,对if-else语句和switch语句的组成结构加以限制,对循环语句中循环控制表达式的组成元素的存储类严格限制。
3.如权利要求1所述的基于静态分析的C语言安全规则检查方法,其特征在于:
在所述步骤4)中,对没有使用的声明和定义进行识别,禁止定义带有可变参数的函数。
CN2010105398750A 2010-11-09 2010-11-09 基于静态分析的c语言安全规则检查方法 Pending CN102012991A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN2010105398750A CN102012991A (zh) 2010-11-09 2010-11-09 基于静态分析的c语言安全规则检查方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN2010105398750A CN102012991A (zh) 2010-11-09 2010-11-09 基于静态分析的c语言安全规则检查方法

Publications (1)

Publication Number Publication Date
CN102012991A true CN102012991A (zh) 2011-04-13

Family

ID=43843164

Family Applications (1)

Application Number Title Priority Date Filing Date
CN2010105398750A Pending CN102012991A (zh) 2010-11-09 2010-11-09 基于静态分析的c语言安全规则检查方法

Country Status (1)

Country Link
CN (1) CN102012991A (zh)

Cited By (17)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103150200A (zh) * 2013-04-08 2013-06-12 西安电子科技大学 一种计算机语言转换系统及c语言到msvl语言的转换方法
CN104317969A (zh) * 2014-11-18 2015-01-28 合肥康捷信息科技有限公司 一种基于cfg文件的类型转换的处理方法及其应用
CN104615540A (zh) * 2015-02-10 2015-05-13 上海创景计算机系统有限公司 代码规范管理系统
US9952884B1 (en) 2016-10-24 2018-04-24 International Business Machines Corporation Executing optimized local entry points and function call sites
US10108407B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Loading optimized local entry points for local-use-only function pointers
US10108404B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Compiling optimized entry points for local-use-only function pointers
US10108406B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Linking optimized entry points for local-use-only function pointers
CN108733432A (zh) * 2017-04-14 2018-11-02 阿里巴巴集团控股有限公司 编程环境下私有方法的实现方法、调用方法及其装置
CN109032934A (zh) * 2018-07-10 2018-12-18 北京计算机技术及应用研究所 一种fpga/ip核逻辑代码安全规则检测方法
US10169016B2 (en) 2016-10-24 2019-01-01 International Business Machines Corporation Executing optimized local entry points
US10169011B2 (en) 2016-10-24 2019-01-01 International Business Machines Corporation Comparisons in function pointer localization
US10268465B2 (en) 2016-10-24 2019-04-23 International Business Machines Corporation Executing local function call site optimization
US10360005B2 (en) 2016-10-24 2019-07-23 International Business Machines Corporation Local function call tailoring for function pointer calls
US10534593B2 (en) 2016-10-24 2020-01-14 International Business Machines Corporation Optimized entry points and local function call tailoring for function pointers
CN112100059A (zh) * 2020-08-20 2020-12-18 浙江大学 一种c语言的指针类型分析方法
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN117688564A (zh) * 2024-02-01 2024-03-12 山东大学 一种用于智能合约事件日志的检测方法、装置和存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101589380A (zh) * 2006-01-30 2009-11-25 微软公司 基于上下文的代码分析
CN101833504A (zh) * 2010-04-19 2010-09-15 张翀斌 一种基于模型检验的时序软件质量缺陷检测方法及系统

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN101589380A (zh) * 2006-01-30 2009-11-25 微软公司 基于上下文的代码分析
CN101017458A (zh) * 2007-03-02 2007-08-15 北京邮电大学 基于源代码静态分析的软件安全代码分析器及其检测方法
CN101833504A (zh) * 2010-04-19 2010-09-15 张翀斌 一种基于模型检验的时序软件质量缺陷检测方法及系统

Non-Patent Citations (2)

* Cited by examiner, † Cited by third party
Title
《中华人民共和国国家军用标准》 20050630 宋晓秋 GJB5369-2005 航天型号软件C语言安全子集 , *
《中国优秀硕士学位论文全文数据库 信息科技辑》 20090215 马文姣 航天型号软件的安全性测试技术研究 , *

Cited By (34)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN103150200A (zh) * 2013-04-08 2013-06-12 西安电子科技大学 一种计算机语言转换系统及c语言到msvl语言的转换方法
CN103150200B (zh) * 2013-04-08 2016-08-03 西安电子科技大学 一种c语言到msvl语言的转换方法
CN104317969A (zh) * 2014-11-18 2015-01-28 合肥康捷信息科技有限公司 一种基于cfg文件的类型转换的处理方法及其应用
CN104317969B (zh) * 2014-11-18 2017-06-16 合肥康捷信息科技有限公司 一种基于cfg文件的类型转换的处理方法及其应用
CN104615540A (zh) * 2015-02-10 2015-05-13 上海创景计算机系统有限公司 代码规范管理系统
US10268465B2 (en) 2016-10-24 2019-04-23 International Business Machines Corporation Executing local function call site optimization
US10360007B2 (en) 2016-10-24 2019-07-23 International Business Machines Corporation Linking optimized entry points for local-use-only function pointers
US10108407B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Loading optimized local entry points for local-use-only function pointers
US10108404B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Compiling optimized entry points for local-use-only function pointers
US10108406B2 (en) 2016-10-24 2018-10-23 International Business Machines Corporation Linking optimized entry points for local-use-only function pointers
US10620926B2 (en) 2016-10-24 2020-04-14 International Business Machines Corporation Linking optimized entry points for local-use-only function pointers
US10606574B2 (en) 2016-10-24 2020-03-31 International Business Machines Corporation Executing optimized local entry points and function call sites
US10169016B2 (en) 2016-10-24 2019-01-01 International Business Machines Corporation Executing optimized local entry points
US10169011B2 (en) 2016-10-24 2019-01-01 International Business Machines Corporation Comparisons in function pointer localization
US10209972B2 (en) 2016-10-24 2019-02-19 International Business Machines Corporation Executing optimized local entry points
US10223087B2 (en) 2016-10-24 2019-03-05 International Business Machines Corporation Comparisons in function pointer localization
US9952884B1 (en) 2016-10-24 2018-04-24 International Business Machines Corporation Executing optimized local entry points and function call sites
US10310829B2 (en) 2016-10-24 2019-06-04 International Business Machines Corporation Compiling optimized entry points for local-use-only function pointers
US10346146B2 (en) 2016-10-24 2019-07-09 International Business Machines Corporation Loading optimized local entry points for local-use-only function pointers
US10360005B2 (en) 2016-10-24 2019-07-23 International Business Machines Corporation Local function call tailoring for function pointer calls
US9952844B1 (en) 2016-10-24 2018-04-24 International Business Machines Corporation Executing optimized local entry points and function call sites
US10534593B2 (en) 2016-10-24 2020-01-14 International Business Machines Corporation Optimized entry points and local function call tailoring for function pointers
US10534594B2 (en) 2016-10-24 2020-01-14 International Business Machines Corporation Optimized entry points and local function call tailoring for function pointers
US10579353B2 (en) 2016-10-24 2020-03-03 International Business Machines Corporation Loading optimized local entry points for local-use-only function pointers
US10585652B2 (en) 2016-10-24 2020-03-10 International Business Machines Corporation Compiling optimized entry points for local-use-only function pointers
CN108733432A (zh) * 2017-04-14 2018-11-02 阿里巴巴集团控股有限公司 编程环境下私有方法的实现方法、调用方法及其装置
CN109032934A (zh) * 2018-07-10 2018-12-18 北京计算机技术及应用研究所 一种fpga/ip核逻辑代码安全规则检测方法
CN109032934B (zh) * 2018-07-10 2021-07-02 北京计算机技术及应用研究所 一种fpga/ip核逻辑代码安全规则检测方法
CN112100059A (zh) * 2020-08-20 2020-12-18 浙江大学 一种c语言的指针类型分析方法
CN112100059B (zh) * 2020-08-20 2021-09-14 浙江大学 一种c语言的指针类型分析方法
CN115617352A (zh) * 2022-12-02 2023-01-17 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN115617352B (zh) * 2022-12-02 2023-03-28 中汽研软件测评(天津)有限公司 基于安全编码标准的c代码检测方法、设备和存储介质
CN117688564A (zh) * 2024-02-01 2024-03-12 山东大学 一种用于智能合约事件日志的检测方法、装置和存储介质
CN117688564B (zh) * 2024-02-01 2024-05-03 山东大学 一种用于智能合约事件日志的检测方法、装置和存储介质

Similar Documents

Publication Publication Date Title
CN102012991A (zh) 基于静态分析的c语言安全规则检查方法
CN100385399C (zh) 用于多个异常处理模型的中间表示的方法和系统
US9418230B2 (en) Automated tools for building secure software programs
CN103577168A (zh) 测试用例创建系统及方法
CN101398758A (zh) 一种代码抄袭的检测方法
CN104899147A (zh) 一种面向安全检查的代码静态分析方法
CN103150200A (zh) 一种计算机语言转换系统及c语言到msvl语言的转换方法
CN103294596A (zh) 一种基于程序不变量的合约式软件故障预警方法
Garis et al. Translating Alloy specifications to UML class diagrams annotated with OCL
CN102279792A (zh) 基于xml中间模型安全检测规则库的建立方法
Cao et al. Design and implementation for SQL parser based on ANTLR
Rilling et al. A hybrid program slicing framework
Roux et al. SMT-AI: an abstract interpreter as oracle for k-induction
Kaur et al. Identification of crosscutting concerns: A Survey
Hu et al. MeMo-Methods of Model Quality.
Justice Natural language specifications for safety-critical systems
KR101731629B1 (ko) Circus로부터 go 코드를 자동으로 생성하는 방법 및 장치
Schöpp et al. Requirements-based code model checking
Gerogiannis et al. A general framework for applying safety analysis to safety critical real-time applications using fault trees
Dausend et al. Introducing Aspect–Oriented Specification for Abstract State Machines
Bangare et al. Code parser for object Oriented software Modularization
Chen et al. A GCC-based checker for compliance with MISRA-C's single-translation-unit rules
Yu et al. A Points-to-Sensitive Model Checker for C Programs in IoT Firmware
Lai et al. A method of software defects mining based on static analysis
Ngô Formal verification of a synchronous data-flow compiler: from signal to c

Legal Events

Date Code Title Description
C06 Publication
PB01 Publication
C10 Entry into substantive examination
SE01 Entry into force of request for substantive examination
C12 Rejection of a patent application after its publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20110413