CN102012991A - 基于静态分析的c语言安全规则检查方法 - Google Patents
基于静态分析的c语言安全规则检查方法 Download PDFInfo
- 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
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语言在提供给程序员简洁和灵活的同时,也带给我们诸多的容易造成漏洞的副作用。通过静态代码分析,我们可以在不执行代码的前提下检测到多种容易导致程序漏洞的代码。这样的静态分析工具上世纪八十年代就已经产生。目前,像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)中,对没有使用的声明和定义进行识别,禁止定义带有可变参数的函数。
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)
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)
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 | 张翀斌 | 一种基于模型检验的时序软件质量缺陷检测方法及系统 |
-
2010
- 2010-11-09 CN CN2010105398750A patent/CN102012991A/zh active Pending
Patent Citations (3)
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)
Title |
---|
《中华人民共和国国家军用标准》 20050630 宋晓秋 GJB5369-2005 航天型号软件C语言安全子集 , * |
《中国优秀硕士学位论文全文数据库 信息科技辑》 20090215 马文姣 航天型号软件的安全性测试技术研究 , * |
Cited By (34)
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 |