CN106874058A - 一种基于源代码的程序自动插桩方法 - Google Patents

一种基于源代码的程序自动插桩方法 Download PDF

Info

Publication number
CN106874058A
CN106874058A CN201611245682.8A CN201611245682A CN106874058A CN 106874058 A CN106874058 A CN 106874058A CN 201611245682 A CN201611245682 A CN 201611245682A CN 106874058 A CN106874058 A CN 106874058A
Authority
CN
China
Prior art keywords
pitching pile
source code
program
penetration
pitching
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
CN201611245682.8A
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.)
China Academy Of Aerospace Systems Science And Engineering
Original Assignee
China Academy Of Aerospace Systems Science And Engineering
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 China Academy Of Aerospace Systems Science And Engineering filed Critical China Academy Of Aerospace Systems Science And Engineering
Priority to CN201611245682.8A priority Critical patent/CN106874058A/zh
Publication of CN106874058A publication Critical patent/CN106874058A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/31Programming languages or programming paradigms

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Computing Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

本发明公开了一种基于源代码的程序自动插桩方法,首先将被插桩C源代码进行宏展开,然后根据插桩需求明确插桩点,为每个插桩点编写插桩语法规则,最后根据插桩语法规则生成插桩程序,运行插桩程序对源代码进行自动插桩,完成源代码的程序自动插桩。本发明在对源代码文件进行完整的词法分析和语法分析的基础上进行自动插桩,保证了对源码插桩的准确度和针对性,同时采用基于语法制导翻译技术,可以在短时间内实现源程序的插桩,不破坏源程序,能够解决人工插桩工作量大,效率低下,插桩不完全的问题。

Description

一种基于源代码的程序自动插桩方法
技术领域
本发明涉及一种基于源代码的程序自动插桩方法,属于计算机软件应用领域。
背景技术
军工软件、航天航空软件、工业控制软件等具有高可靠性要求的软件领域都需要使用白盒测试的方法对软件进行详细的测试,覆盖率是衡量软件质量的重要指标。程序插桩是实现覆盖率测试的一种重要方法。程序插桩的基本测试原理就是在不破坏原有程序逻辑完整性的前提下,在程序的相应位置上插入一些探针,实质上就是进行信息采集的代码段,可以是赋值语句或采集覆盖信息的函数调用。通过探针的执行并输出程序的运行特征数据。基于对这些特征数据的分析,以达到揭示程序内部行为和特性的目的。
基于源代码插桩的动态覆盖测试主要是通过手动方式进行插桩,用户手动在源程序需要获取程序运行信息的地方写入信息采集代码段(代码段可以是覆盖信息采集函数调用,也可以是简单的赋值语句)完成代码插装工作,然后编译链接程序时需将包含覆盖信息采集功能函数的库链接进来,采用手工方式的缺点在于破坏源程序,在不进行测试时,需要删除插入的代码或使用宏定义方式屏蔽插入的代码,尤其在程序规模较大时,手动插桩方式比较繁琐和低效,更容易发生覆盖不全的情况。
发明内容
本发明的技术解决问题是:克服现有手动插桩的不足,提出一种基于源代码的程序自动插桩方法,不破坏源程序,插桩准确度和针对性高,能够有效减少工作量,提高效率。
本发明的技术解决方案:一种基于源代码的程序自动插桩方法,步骤如下:
步骤一:将待插桩C源代码进行宏展开;
步骤二:根据插桩需求明确插桩切入点,为每个插桩切入点编写插桩语法规则;
步骤三:利用语法分析生成器将插桩语法规则转化为插桩程序,运行插桩程序对源代码进行自动插桩,完成源代码的程序自动插桩。
所述步骤一的实现方法为:
(2.1)编写宏展开词法分析规则,生成词法分析器;
(2.2)使用词法分析器,把头文件中定义的宏在源文件中展开。
所述步骤二的实现方法为:
(3.1)根据插桩需求选择覆盖准则,所述覆盖准则为判定覆盖、跳转覆盖或例程覆盖;
(3.2)根据覆盖准则确定插桩切入点位置,具体确定方法如下:
a)如果覆盖准则为判定覆盖,则选择if语句、else if语句、else语句以及case语句开始或结束处作为插桩切入点;
b)如果覆盖准则为跳转覆盖,则插桩切入点在goto语句、continue语句、break语句之前;
c)如果覆盖准则为例程覆盖,则插桩切入点在每个函数的入口和出口处;
(3.3)为每个插桩切入点编写插桩语法规则。
所述步骤(3.3)的实现方法如下:
(4.1)为每行代码编写解析规则,对待插桩C源代码进行解析,所述解析规则如下:
<产生式头>:<产生式体>
(4.2)利用语法制导翻译方法对产生式进行解析,为每个产生式增加插桩语义动作,得到每个插桩切入点的插桩语法规则如下:
<产生式头>:<产生式体>{语义动作}。
所述步骤(4.2)中,增加插桩语义动作时要保证插装前后的语法结构等价,插装前后的语义相同。
本发明与现有技术相比具有如下有益效果:
(1)本发明在对源代码文件进行完整的词法分析和语法分析的基础上进行自动插桩,保证了对源码插桩的准确度和针对性,能够解决手动插桩工作量大,效率低下,插桩不完全的问题。
(2)本发明采用语法制导翻译方案来描述插装的行为,具有简洁、清晰、容易实现和容易验证正确性等特点,同时不破坏源程序,不进行测试时,不需要删除插入的代码或使用宏定义方式屏蔽插入的代码,能够有效减少工作量,提高效率。
附图说明
图1为本发明方法流程图。
具体实施方式
本发明提出一种基于源代码的程序自动插桩方法,如图1所示,具体步骤如下:
步骤一、对被插桩C源代码文件进行预处理
(1)编写宏展开词法分析规则,生成词法分析器;
(2)使用词法分析器进行宏扩展,把头文件中定义的宏在源文件中展开;
例如:源文件中包含宏定义,特别是一些具有分支路径的宏定义,需要将宏在源文件中展开,如果不进行宏展开可能导致覆盖统计不全。
步骤二、插桩切入点确定及编写插桩语法规则
(1)根据插桩需求明确插桩切入点
为了统计C源码覆盖,根据插桩需求选择覆盖准则,其中覆盖准则为判定覆盖、跳转覆盖或例程覆盖。
根据覆盖准则明确插桩切入点位置,如果是判定覆盖:要求被测程序中的每个判定的每个分支少执行一次,选择在if语句、else if语句、else语句、case语句的入口和出口处进行插桩;如果是跳转覆盖:根据跳转逻辑,选择在goto语句、continue语句、break语句前进行插桩;如果是例程覆盖:在每个函数(包括中断处理函数)的入口和出口处插桩。
(2)对插桩点编写对应的插桩语法规则;
(2.1)为每行代码编写解析规则,对待插桩C源代码进行解析,所述解析规则如下:
<产生式头>:<产生式体>
(2.2)利用语法制导翻译方法对产生式进行解析,为每个产生式增加插桩语义动作,语法制导翻译方法如下:如果A:α是产生式,那么翻译为A:α{β},其中A是非终结符,α、β分别是产生式体和输出的翻译语句。据此得到每个插桩切入点的插桩语法规则如下:
<产生式头>:<产生式体>{语义动作}
如果包含嵌套语句,则,插桩语法规则可以写成如下形式:
<产生式头>:<产生式体1>{语义动作1}
|<产生式体2>{语义动作2}
。。。
|<产生式体n>{语义动作n}
一个语义动作是一个C语句的序列,当按照一个产生式进行归约的时候,就会执行和该产生式相关联的语义动作。
语法制导翻译方案就是将程序片段附加到一个文法的各个产生式上的表示方法。当语法分析过程中使用一个产生式时,相应的程序片段就会执行。这些程序片段的执行效果按照语法分析过程的顺序组合起来,得到的结果就是处理源程序的翻译结果。
下面给出判定语句、跳转语句和循环语句的插桩语法规则:
判定语句插桩语法规则:
判定语句覆盖插装的思想是:使用一个计数器varNub来记录判定语句的覆盖情况,在判定语句体内插入记录函数,根据记录结果的值判定分支是否被执行。判定语句的插桩语法规则是:
跳转语句jump语句插桩语法规则:
jump_statement
:RETURN';' {format($$,"Jump Log(varNub);return;\n");}
|RETURN expression';' {format($$,"Jump Log(varNub);return%s;\n",$2);}
goto,continue,break语句类似。
循环语句while语句插桩语法规则:
完成插桩后,要对插桩语法规则正确性判断:
插装程序插入的代码仅仅收集结构覆盖信息,不能改变被测程序的语义。对此根据翻译方案从两方面加以验证:语法等价:插装前后的语法结构是等价的,对于语句插装,插装后的语句应该是复合语句,在语法上与原语句等价,因此插装后的语句前后必须补充一对花括号,否则在语法上出现错误,导致插桩前后语句不等价。语义相同:由于插桩后的语句只是增加覆盖信息记录,从翻译方案可知,插入的语句没有改变原程序的流程。
另外,在插桩语法规则中,语义动作可以在产生式的任何位置,实际插桩时有些语义动作需要插入产生体内。但是有些情况下为了插装方便的需要,在保持与原规则等价的前提下,对原规则作了一定的变换。需要构造出一个后缀语法制导翻译方案,其中每个语义动作都放在产生式的最后,并且在按照这个产生式将产生体归约为产生式头的时候执行插桩动作。为此,我们引入新的产生式,该产生式所有的动作都在产生式最右端。利用新的产生式归约来执行某些语义动作是比较方便的。
例如:
selection_statement
:IF'('expression')'statement ELSE statement
|IF'('expression')'statement
在判定覆盖语句插装中,要求对以上产生式中的statement进行插装,而对其它产生式中的statement不作插装。本发明引入一个新的非终结符statement_IF,将以上规则替换为:
statement_IF
:labeled_statement
|compound_statement
……
selection_statement
:IF'('expression')'statement_IF ELSE statement_IF
|IF'('expression')'statement_IF
……
对于替换后的规则,在判定覆盖语句插装时只需在第一个产生式的动作中执行对statement_IF产生体中的规则进行插装。
步骤三、生成插桩程序并完成源代码插桩
(1)将插桩语法规则翻译为执行插桩的源代码;
插桩语法规则不能直接进行源代码插桩动作,使用语法分析生成器将插桩语法规则翻译为执行插桩的源代码,编译该源代码为可执行插桩动作的插桩程序,插装程序是一个翻译器,它在推导出每个产生式的同时,相应地以插装后的语句作为输出,因此本发明使用语法制导翻译方案来描述插装器的插装行为。
(2)运行插桩程序完成插桩;
运行插桩程序,得到插桩后的C源代码文件。
本发明方法在对源代码文件进行完整的词法分析和语法分析的基础上进行自动插桩,这保证了对源码插桩的准确度和针对性,能够解决手动插桩工作量大,效率低下,插桩不完全的问题,不破坏源程序,不进行测试时,也不需要删除或屏蔽插入的代码,能够有效减少工作量,提高效率。同时采用了基于语法制导翻译技术,根据程序结构特征对语言文法的产生式进行改写,有效地简化了程序插桩实现,可以在短时间内实现源程序的插桩。
本发明未详细描述内容为本领域技术人员公知技术。

Claims (5)

1.一种基于源代码的程序自动插桩方法,其特征在于步骤如下:
步骤一:将待插桩C源代码进行宏展开;
步骤二:根据插桩需求明确插桩切入点,为每个插桩切入点编写插桩语法规则;
步骤三:利用语法分析生成器将插桩语法规则转化为插桩程序,运行插桩程序对源代码进行自动插桩,完成源代码的程序自动插桩。
2.根据权利要求1所述的一种基于源代码的程序自动插桩方法,其特征在于:所述步骤一的实现方法为:
(2.1)编写宏展开词法分析规则,生成词法分析器;
(2.2)使用词法分析器,把头文件中定义的宏在源文件中展开。
3.根据权利要求1所述的一种基于源代码的程序自动插桩方法,其特征在于:所述步骤二的实现方法为:
(3.1)根据插桩需求选择覆盖准则,所述覆盖准则为判定覆盖、跳转覆盖或例程覆盖;
(3.2)根据覆盖准则确定插桩切入点位置,具体确定方法如下:
a)如果覆盖准则为判定覆盖,则选择if语句、else if语句、else语句以及case语句开始或结束处作为插桩切入点;
b)如果覆盖准则为跳转覆盖,则插桩切入点在goto语句、continue语句、break语句之前;
c)如果覆盖准则为例程覆盖,则插桩切入点在每个函数的入口和出口处;
(3.3)为每个插桩切入点编写插桩语法规则。
4.根据权利要求3所述的一种基于源代码的程序自动插桩方法,其特征在于:所述步骤(3.3)的实现方法如下:
(4.1)为每行代码编写解析规则,对待插桩C源代码进行解析,所述解析规则如下:
<产生式头>:<产生式体>
(4.2)利用语法制导翻译方法对产生式进行解析,为每个产生式增加插桩语义动作,得到每个插桩切入点的插桩语法规则如下:
<产生式头>:<产生式体>{语义动作}。
5.根据权利要求4所述的一种基于源代码的程序自动插桩方法,其特征在于:所述步骤(4.2)中,增加插桩语义动作时要保证插装前后的语法结构等价,插装前后的语义相同。
CN201611245682.8A 2016-12-29 2016-12-29 一种基于源代码的程序自动插桩方法 Pending CN106874058A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201611245682.8A CN106874058A (zh) 2016-12-29 2016-12-29 一种基于源代码的程序自动插桩方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201611245682.8A CN106874058A (zh) 2016-12-29 2016-12-29 一种基于源代码的程序自动插桩方法

Publications (1)

Publication Number Publication Date
CN106874058A true CN106874058A (zh) 2017-06-20

Family

ID=59165075

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201611245682.8A Pending CN106874058A (zh) 2016-12-29 2016-12-29 一种基于源代码的程序自动插桩方法

Country Status (1)

Country Link
CN (1) CN106874058A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109002713A (zh) * 2018-06-26 2018-12-14 中国科学院计算技术研究所 安全规则检测方法和系统
CN114253862A (zh) * 2021-12-29 2022-03-29 湖南泛联新安信息科技有限公司 一种hdl代码仿真覆盖率异步事件驱动自动分析方法

Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6044197A (en) * 1994-03-14 2000-03-28 Grass Valley (U.S.) Inc. Recording of time code in a database
CN102231109A (zh) * 2011-07-15 2011-11-02 南京大学 无痕可管理的源代码自动插桩方法
CN102298552A (zh) * 2011-09-19 2011-12-28 南京大学 基于代码查询进行源代码插桩的方法
CN103049504A (zh) * 2012-12-11 2013-04-17 南京大学 基于源代码查询的半自动插桩方法
CN104657266A (zh) * 2015-02-10 2015-05-27 上海创景计算机系统有限公司 基于脚本的源代码插桩系统及方法

Patent Citations (5)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6044197A (en) * 1994-03-14 2000-03-28 Grass Valley (U.S.) Inc. Recording of time code in a database
CN102231109A (zh) * 2011-07-15 2011-11-02 南京大学 无痕可管理的源代码自动插桩方法
CN102298552A (zh) * 2011-09-19 2011-12-28 南京大学 基于代码查询进行源代码插桩的方法
CN103049504A (zh) * 2012-12-11 2013-04-17 南京大学 基于源代码查询的半自动插桩方法
CN104657266A (zh) * 2015-02-10 2015-05-27 上海创景计算机系统有限公司 基于脚本的源代码插桩系统及方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
乔文军 等: "嵌入式软件覆盖测试工具的研究", 《计算机测量与控制》 *
梁应宏 等: "用YACC实现程序插装器", 《北京邮电大学学报》 *
王怀伯 等: "OMG IDL编译器的构造", 《上海交通大学学报》 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109002713A (zh) * 2018-06-26 2018-12-14 中国科学院计算技术研究所 安全规则检测方法和系统
CN114253862A (zh) * 2021-12-29 2022-03-29 湖南泛联新安信息科技有限公司 一种hdl代码仿真覆盖率异步事件驱动自动分析方法

Similar Documents

Publication Publication Date Title
US9038026B2 (en) System and method for automating test automation
KR102013230B1 (ko) 구문 전처리 기반의 구문 분석 장치 및 그 방법
US20050171757A1 (en) Machine translation
US8954940B2 (en) Integrating preprocessor behavior into parsing
CN104134039B (zh) 病毒查杀方法、客户端、服务器以及病毒查杀系统
Guerrouj et al. Leveraging informal documentation to summarize classes and methods in context
WO2003083707A2 (en) Machine translation
JP2017199363A (ja) 機械翻訳装置及び機械翻訳のためのコンピュータプログラム
CN106055343B (zh) 一种基于程序演进模型的目标代码逆向工程系统
Uryupina et al. BART goes multilingual: the UniTN/Essex submission to the CoNLL-2012 shared task
Goyal et al. A joint model of rhetorical discourse structure and summarization
JP6952967B2 (ja) 自動翻訳装置
CN106874058A (zh) 一种基于源代码的程序自动插桩方法
Wax Automated grammar engineering for verbal morphology
Sharma et al. A survey on machine learning techniques applied to source code
KR20200071413A (ko) 학습용 데이터 생성 장치, 소스 코드 오류 분석 장치 및 방법
CN106126225B (zh) 一种基于程序演进模型的目标代码逆向工程方法
Pettersson et al. Parsing the past-identification of verb constructions in historical text
Shafiq et al. NCL-Crawl: A large scale language-specific Web crawling system
KR100910895B1 (ko) 법률의 개정내용 심사 및 제/개정 작업을 위한 자동화시스템 및 그 방법
Wu et al. Improving neural machine translation with neural sentence rewriting
KR20140147438A (ko) 마크업 파싱 장치, 방법 및 기록 매체
Sánchez-Cartagena et al. Enriching a statistical machine translation system trained on small parallel corpora with rule-based bilingual phrases
KR20160050652A (ko) 신규 언어의 트리뱅크를 구축하는 방법
KR101670995B1 (ko) 어순 조정 및 형태소 차이에 기반한 통계 기반 기계 번역 시스템 및 그 방법

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
CB03 Change of inventor or designer information
CB03 Change of inventor or designer information

Inventor after: Xue Huifeng

Inventor after: Yang Lei

Inventor after: Fu Zhiwei

Inventor after: Liu Zhicheng

Inventor after: Sun Fengli

Inventor after: Zheng Minghui

Inventor after: Chen Xianglong

Inventor after: Yang Juan

Inventor after: Guo Dong

Inventor after: Lu Lu

Inventor after: Dong Guantao

Inventor before: Liu Zhicheng

Inventor before: Fu Zhiwei

Inventor before: Sun Fengli

Inventor before: Zheng Minghui

Inventor before: Chen Xianglong

Inventor before: Yang Juan

Inventor before: Guo Dong

Inventor before: Lu Lu

Inventor before: Dong Guantao

Inventor before: Yang Lei

RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20170620