CN102298552A - 基于代码查询进行源代码插桩的方法 - Google Patents
基于代码查询进行源代码插桩的方法 Download PDFInfo
- Publication number
- CN102298552A CN102298552A CN2011102758975A CN201110275897A CN102298552A CN 102298552 A CN102298552 A CN 102298552A CN 2011102758975 A CN2011102758975 A CN 2011102758975A CN 201110275897 A CN201110275897 A CN 201110275897A CN 102298552 A CN102298552 A CN 102298552A
- Authority
- CN
- China
- Prior art keywords
- pitching pile
- jump procedure
- jsearch
- stack
- source code
- 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
一种使用基于代码查询进行源代码插桩的方法,包括步骤:步骤10:打开一个工程;步骤11:通过在JSearch编辑器里输入相应的插桩命令;步骤12:工具运行JSearch命令,得到所有的插桩点定义步骤13:审查所有插桩点的定义:若发现带有错误的插桩点,则进入步骤14对其进行修改;没有发现带有错误的插桩点,则直接进入步骤15;步骤14:修改插桩的定义至正确;步骤15:将插桩点与原源文件合并生成新源文件;本发明为明确定义的代码查询和插桩命令,参数化的插桩语句模板,插桩代码可视化,自动插桩高效性等。
Description
技术领域
本发明涉及计算机程序动态分析,主要涉及一种基于代码查询的插桩方法。
背景技术
程序分析通常利用静态程序分析和动态程序分析对程序行为进行自动分析,进而提高软件质量。动态程序分析常借助于插桩方法来收集程序动态运行行为,某些与运行环境相关的程序行为只能通过插桩来收集,而静态程序分析无法进行分析。软件开发过程中,代码审查者在代码编写阶段完成后使用源代码插桩方法对代码进行审查,通常审查者拥有阅读源代码权限但不便对代码进行修改。通过对程序运行行为的分析尽早发现代码中的错误,进而提高软件质量。源代码插桩能够充分地利用程序语义、可视化地显示插桩代码、并且不会提高代码逻辑复杂性。
程序插桩技术,是在保证被测程序原有逻辑完整性的基础上在程序中插入一些探针,通过探针的执行并抛出程序运行的特征数据,通过对这些数据的分析,可以获得程序的控制流和数据流信息,进而得到逻辑覆盖等动态信息,从而实现测试目的的方法。由于程序插桩技术是在被测程序中插入探针,然后通过探针的执行来获得程序的控制流和数据流信息,以此来实现测试的目的。因此,根据探针插入的时间可以分为目标代码插桩和源代码插桩。
现有插桩方法主要包括断言机制、字节码插桩、面向方面插桩等三类方法。断言机制直接在写源文件中添加插桩代码,将会降低代码阅读性。字节码插桩则直接对字节码文件进行修改,被插字节码的源代码无法可视化,且无法保证代码插入过程的正确性。面向方面插桩在程序纵向继承关系的基础上增加了横向方面关系,增加了程序的逻辑复杂性。
目前插桩技术主要存在的瓶颈主要有:插桩点及其代码非可视化、插桩点自动定位困难、难以做到插桩语句上下文敏感、自动插桩性能较低的问题。
代码查询技术在软件设计有着十分重要的地位。一些查询工具被设计用于帮助程序员理解程序中大量经常变化和复杂的关系。目前,代码查询技术已经被广泛的用于软件代码查询技术在软件分析和测试工作中发挥着重要的作用,在软件架构分析,逆向工程,一致性验证,代码审查等方面都有广泛的应用。从另一方面看,代码查询已经延伸至系统框架错误检测,识别重构可能,定位项目缺陷,查询横切关注点,监测开发过程,评估设计适量,跟踪冗余依赖条件等等。通常插桩过程分两步进行:(1)定位插桩语句将要插入的位置(2)构建插桩语句。
目前插桩技术主要存在的瓶颈主要有:插桩点及其代码非可视化、插桩点自动定位困难、难以做到插桩语句上下文敏感、自动插桩性能较低的问题。
发明内容
本发明目的是,鉴于上述问题,本发明旨在提供一个源代码插桩方法,该方法结合代码查询技术,有效的将代码查询得到的插桩位置以及上下文内容与插桩机制相结合在一起。
本发明是通过以下的技术方案实现的:无痕可管理的源代码手动定义标志插桩方法:
步骤10:打开一个工程(程序);
步骤11:通过在JSearch编辑器里输入相应的插桩命令;
步骤12:工具运行JSearch命令,得到所有的插桩点定义
步骤13:审查所有插桩点的定义:若发现带有错误的插桩点,则进入步骤14对其进行修改;没有发现带有错误的插桩点,则直接进入步骤15;
步骤14:修改插桩的定义至正确;
步骤15:将插桩点与原源文件合并生成新源文件;
其中步骤11和步骤12所使用的JSearch命令符合下面的语法规范:
S∶= find Id:T satisfying CS IS
T∶= object
| statement
| method
| class
|interface
CS∶= {exist Id:T}{all Id:T} where CE
CE∶= CE && CE
| CE || CE
| !CE
| (CE)
| Id.Att=’value’
| Id Rel Id
Att∶= name
| dataType
| specificType
| returnType
| paramsType
Rel∶= extend
| use
| change
| isIn
| call
IS := insert before Id IN
| insert after Id IN
| IS
IN := "STR"
STR := STR String STR
| STR %Att% STR
| NULL
查询命令S以关键字find开始,后跟一个Id:T的声明格式,再接satisfying关键字,最后以条件语句CS结尾。它的含义是要查询满足查询条件CS的T类型的程序元素。
语法规则中的T是指程序元素的类型,它可以是object、statement、function、interface和class的其中之一,分别对应于变量、语句、方法、接口和类。Id:T声明了一个类型为T,别名为Id的元素。Id作为它声明元素的别名在之后的查询条件表达式CE中被使用。在条件表达式中出现的Id必须先被声明,并且同名的Id不能被重复声明,以免混淆。紧跟在关键字find之后声明的Id就对应于查询目标元素。
条件语句CS描述的是目标元素需要满足的查询条件。它的语法规则在形式上符合带量词的一阶谓词的公式,具体含义是:存在T11类型的元素Id11、T12类型的元素Id12……,且对任一T21类型的元素Id21、T22类型的元素Id22……,使得条件表达式CE成立。其中,Id1i (i=1,2…)是紧跟关键字exist之后的元素的别名,并且它声明的类型为T1i:Id2j (j=1,2…)是紧跟关键字all之后的元素别名,并且它声明的类型为T2j。
条件表达式CE是一个布尔逻辑表达式,支持与(‘&&’)、或(‘||’)、非(‘!’)的逻辑运算符。用户还可以通过在条件表达式中添加括号’ (‘和’)’,来改变运算符的运算先后次序。
可以看到,在有关CE的语法规则中有两个条件表达式Id.Att=’value’和Id Rel Id,它们是结构最简单的条件表达式,本文把这两个表达式称作原子表达式。任何一个条件表达式都是在一个或多个原子表达式的基础上添加与&&、或||、非!以及括号(和)等运算符拼接而成的。其中,Id.Att=’value’称为属性条件表达式,本文规定:如果元素Id的Att属性的属性值等于value,则表达式的值为True;否则表达式的值为False。Id1 Rel Id2称为关系条件表达式,规定:如果元素Id1与Id2间存在关系Rel,则表达式的值为True,否则表达式的值为False。
下表定义了针对不同的程序元素定义了一系列的属性(表1),同时也定义了元素间的一系列关系(表2)。
表格 程序元素的属性
类型 | 属性 | 意义 |
object | name | 对象的标识符 |
dataType | 对象的数据类型,例如“int”, “String” | |
specificType | 声明方式,例如:“field”,“local”和“parameter” | |
statement | specificType | 语句形式,例如简单语句是“single”,for语句是“for” |
method | name | 方法的名称 |
returnType | 方法的返回类型 | |
paramsType | 方法的参数列表 | |
specificType | 方法声明方式,例如“public”,“static” | |
class | name | 类的标识符 |
interface | name | 接口的标识符 |
表格 元素之间的关系
左操作数 | 关系 | 右操作数 | 意义 |
c1(class) | extend | c2(class) | 类C1继承自类C2 |
s1(statement) | isIn | s2(statement) | 语句S1是复杂语句S2的子语句 |
s(statement) | isIn | m(method) | 语句S1是方法m的子语句 |
s(statement) | isIn | c(class) | 语句S1是类c的子语句 |
o(object) | isIn | c(class) | 对象o定义在类c中 |
m(method) | isIn | c(class) | 方法m定义在类c中 |
s(statement) | use | o(object) | 语句s使用了对象o |
m(method) | use | o(object) | 方法m使用了对象o |
c(class) | use | o(object) | 类c使用了对象o |
s(statement) | change | o(object) | 语句s改变了对象o的值 |
m(method) | change | o(object) | 方法m改变了对象o的值 |
c(class) | change | o(object) | 类c改变了对象o的值 |
s(statement) | call | m(method) | 语句s调用了方法m |
m1(method) | call | m2(method) | 方法m1调用了方法m2 |
c(class) | call | m(method) | 类c调用了方法m |
所述步骤11)中包括:通过在JSearch编辑器里输入相应的插桩命令;
步骤30:打开JSearch命令编辑器;
步骤31:判断是否需要在工程中的源程序上定义插桩点,如果是,则跳转到步骤32,如果不是,则跳转到步骤35;
步骤32:按照JSearch命令语法规则(参见)给出目标插桩点位置的JSearch命令描述;
步骤33:按照JSearch命令语法规则给出目标插桩点插桩语句的模板描述;
步骤34:将步骤32和步骤33得到的字符串输入到JSearch命令编辑器中;
步骤35:结束本次插桩定义;
所述步骤12)中包括:步骤12:插桩工具运行JSearch命令,得到所有的插桩点定义
步骤40:从JSearch命令编辑器中获得JSearch命令字符串;
步骤41:从已经打开工程中的Java源文件中生成相应的代码信息;
步骤42:对步骤40中得到的JSearch命令字符串进行语法检测和预处理得到检索指令;
步骤43:按照检索指令在步骤41中得到的代码信息中进行目标元素检索,得到相应的目标元素集合和相应的辅助元素集合;
步骤44:将JSearch命令中插桩模板的参数替换成步骤43中的元素属性值,得到相应的插桩语句集合;
步骤45:将步骤44中得到的插桩语句集合生成相应的插桩点;
所述步骤41)中,从源代码生成与JSearch命令字符串相应的代码信息的方式是:首先生成源代码相应的抽象语法树,在将语法树中的类、接口、方法、对象和语句信息依次从语法树中抽取出来,形成表的数据结构,如图3所示。
所述步骤42)中,其中检查和检索准备工作的过程包括:
步骤601:匹配关键字find;
步骤602:匹配Target元素,并将其存放到Query.target中;
步骤603:匹配关键satisfying;
步骤604:当匹配关键字exist成功或者匹配关键字all成功,则跳转步骤605,,否则跳转步骤608;
步骤605:构造相应的predicate;
步骤606:将predicate存放到list Query.predicates中;
步骤607:跳转步骤604;
步骤608:匹配关键字where;
步骤609:当扫描完整个字符串,则跳转618;
步骤610:如果匹配Att表达式成功,则跳转步骤611,否则跳转步骤612;
步骤611:生成AttrCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤612:如果匹配Rel表达式成功,则跳转步骤613,否则跳转步骤614;
步骤613:生成RelCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤614:如果匹配运算符成功,则跳转步骤615,否则跳转步骤616
步骤615:生成Operator对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤616:返回出错状态;
步骤617:跳转步骤609;
步骤618:返回Query单次查询结构;
该过程对查询命令S的字符串(从步骤40得到)从头开始扫描,检查S是否满足语法规则的描述。在这个过程中,过程记录下S中所有的元素声明信息(形如:“Id:T”)。对于每个这样的声明,需要保存它的别名Id、类型T等信息。并将条件表达式CE转换成一个包含有Rel,Att和运算符的list。每个单次查询将会把这些数据封装成一个Query结构的实例中。其中Query结构中包含有几个重要的信息,target元素表示找到的查询的代码集合,predicates则保存了所有的谓词元素,conditionLex则是保存了条件表达式的列表。
所述步骤43)中,其中检索过程包括:
步骤701:初始化运算符栈op_stack;
步骤702:初始化操作数栈r_stack;
步骤703:当conditionLex列表中的所有对象已经处理完,则跳转步骤714;
步骤704:从conditionLex列表中取出一个Lex对象l
步骤705:如果l的类型是Attr或者Rel,则跳转步骤706,否者跳转步骤707;
步骤706:将l压入操作数栈,跳转步骤703;
步骤707:如果l的类型是Operator,则跳转步骤708,否则跳转步骤703;
步骤708:如果l的优先级比top(op_stack)大,则跳转步骤709,否则跳转步骤710;
步骤709:将l压入op_stack中,跳转步骤703;
步骤710:如果l的优先级与top(op_stack)相等,则跳转步骤711,否则跳转步骤712;
步骤711:弹出op_stack元素,跳转步骤703;
步骤712:弹出r_stack的元素,计算相应的集合;
步骤713:跳转步骤703;
步骤714:返回r_stack弹出元素;
在完成步骤42中的处理工作,并且在扫描过程中没有发现语法错误,则进入查询目标的检索过程。它按照查询命令S中的查询条件(从步骤42得到)在程序元素信息集EC(从步骤41得到)中检索出满足条件的目标元素集合。步骤41中,EC收集了5种类型的元素信息。在EC中,每种类型的元素都对应这一个索引表。检索过程就是形成一个集合,按照运算符的进行集合的交集,并集,取反等运算。
在语法分析和检索准备工作中(步骤42)得到了一个条件表达式列表,本工作利用算符优先文法来解析这个列表并进行相应的集合运算。各个算符的优先级如附图2。
工具在完成与语法解析后,为每个target和predicates初始化一个程序元素集合S0、S1...Sn,每个集合即是EC中获得集合副本。接着按照算符优先顺序计算每个条件表达式的集合,例如target元素是clazz:class,其中一个predicates是obj:object如果当前的运算是clazz.name='Main' && obj.type='int',那么在集合Sclazz中我们移除所有名称不是"Main"的class,并且在Sobj中移除所有类型不是int的变量,接着计算Sclazz和Sobj的并集,得到新的集合Si。类似的,紧接着计算Si || C,在计算C的集合后,取Si和Sc的并集。按照这个步骤,将会会得到最终结果。
所述插桩点(其特征在所述步骤12、步骤13、步骤14、步骤15和步骤45)定义,其实现在源文件编辑器标尺上增加相应的标记,该标记指定了插桩语句应该插入的字符位置、文件行数和插入内容。
所述的插桩点定义方式,其特征是所有插桩标志均随工程进行:插桩标志在工程关闭后自动进行保存,在下次打开工程时插桩标志依旧能够在源代码编辑器的标尺上进行还原。
本发明的有益效果是:本发明方法结合代码查询技术,有效的将代码查询得到的插桩位置以及上下文内容与插桩机制相结合在一起;明确定义的代码查询和插桩命令,参数化的插桩语句模板,插桩代码可视化,自动插桩高效性等。
附图内容
图1为基于代码查询进行源代码插桩的完整流程图,
图2为步骤42中所用到的运算符优先级表,
图3为总体处理过程图,
图4为检查和检索工作的算法示意图,
图5为算符优先文法处理算法示意图,
图6为生成代码信息即所述步骤41流程图。
具体实施方式
下面通过附图对本发明的技术方案做进一步的详细描述。
本发明主要的方法是利用代码查询技术来辅助进行源代码的插桩,其主要的过程如附图3所示:
1.获得Java源文件
2.从源文件中生成相应的代码信息
3.从代码信息中进行代码查询
4.按照插桩语句模板进行插桩语句定制,生成相应的插桩点
5.将插桩点和源文件合并
6.输出带有插桩语句的Java源代码
其中具体的过程如附图1所示,主要的步骤如下所示:
步骤10:打开一个工程;
步骤11:通过在JSearch编辑器里输入相应的插桩命令;
步骤12:工具运行JSearch命令,得到所有的插桩点定义
步骤13:审查所有插桩点的定义:若发现带有错误的插桩点,则进入步骤14对其进行修改;没有发现带有错误的插桩点,则直接进入步骤15;
步骤14:修改插桩的定义至正确;
步骤15:将插桩点与原源文件合并生成新源文件;
步骤11中输入相应的JSearch插桩命令过程包括:
步骤30:打开JSearch命令编辑器;
步骤31:判断是否需要在工程中的源文件上定义插桩点,如果是,则跳转到步骤32,如果不是,则跳转到步骤35;
步骤32:按照JSearch命令语法规则(参见)给出目标插桩点位置的JSearch命令描述;
步骤33:按照JSearch命令语法规则给出目标插桩点插桩语句的模板描述;
步骤34:将步骤32和步骤33得到的字符串输入到JSearch命令编辑器中;
步骤35:结束本次插桩定义;
附图4即步骤13:审查所有插桩点的定义给出了检查和检索工作的算法示意图,其中过程包括:步骤13:审查所有插桩点的定义:若发现带有错误的插桩点,则进入步骤14对其进行修改;没有发现带有错误的插桩点,则直接进入步骤15;
步骤601:匹配关键字find;
步骤602:匹配Target元素,并将其存放到Query.target中;
步骤603:匹配关键satisfying;
步骤604:当匹配关键字exist成功或者匹配关键字all成功,则跳转步骤605,,否则跳转步骤608;
步骤605:构造相应的predicate;
步骤606:将predicate存放到list Query.predicates中;
步骤607:跳转步骤604;
步骤608:匹配关键字where;
步骤609:当扫描完整个字符串,则跳转618;
步骤610:如果匹配Att表达式成功,则跳转步骤611,否则跳转步骤612;
步骤611:生成AttrCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤612:如果匹配Rel表达式成功,则跳转步骤613,否则跳转步骤614;
步骤613:生成RelCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤614:如果匹配运算符成功,则跳转步骤615,否则跳转步骤616
步骤615:生成Operator对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤616:返回出错状态;
步骤617:跳转步骤609;
步骤618:返回Query单次查询结构;
附图5给出了算符优先文法处理算法示意图,其中过程包括:
步骤701:初始化运算符栈op_stack;
步骤702:初始化操作数栈r_stack;
步骤703:当conditionLex列表中的所有对象已经处理完,则跳转步骤714;
步骤704:从conditionLex列表中取出一个Lex对象l
步骤705:如果l的类型是Attr或者Rel,则跳转步骤706,否者跳转步骤707;
步骤706:将l压入操作数栈,跳转步骤703;
步骤707:如果l的类型是Operator,则跳转步骤708,否则跳转步骤703;
步骤708:如果l的优先级比top(op_stack)大,则跳转步骤709,否则跳转步骤710;
步骤709:将l压入op_stack中,跳转步骤703;
步骤710:如果l的优先级与top(op_stack)相等,则跳转步骤711,否则跳转步骤712;
步骤711:弹出op_stack元素,跳转步骤703;
步骤712:弹出r_stack的元素,计算相应的集合;
步骤713:跳转步骤703;
步骤714:返回r_stack弹出元素;
JSearch是指插桩的工具程序申请人已经进行了软件著作权登记(登记号为2010R11L097853) ,名称为Java源代码插桩工具软件,还包括配套使用的工具软件;并可以提供开源程序,该工具软件的初版也已经在试用。
最后应当说明的是:以上步骤仅用于说明本发明的技术方案而非对其限制。尽管上述步骤对本发明进行了详细的说明,相关领域的技术人员应当理解,依然可以对本发明的具体技术进行修改或者对部分技术进行等同替换;而不脱离本发明技术方案的精神,其均应涵盖在本发明请求保护的技术方案范围当中。
Claims (8)
1.一种基于代码查询进行源代码插桩的方法,其特征是包括步骤:
步骤10:打开一个或多个工程(程序);
步骤11:通过在JSearch命令编辑器里输入相应的JSearch插桩命令;
步骤12:工具运行JSearch命令,得到所有的插桩点定义;
步骤13:审查所有插桩点的定义:若发现带有错误的插桩点,则进入步骤14对其进行修改;没有发现带有错误的插桩点,则直接进入步骤15;
步骤14:修改插桩的定义至正确;
步骤15:将插桩点与原源文件合并生成新源文件。
2.根据权利要求1所述的基于代码查询进行源代码插桩的方法,其特征是所述的输入JSearch插桩命令即步骤11中,其中输入相应的JSearch插桩命令过程包括:
步骤30:打开JSearch命令编辑器;
步骤31:判断是否需要在工程中的源文件上定义插桩点,如果是,则跳转到步骤32,如果不是,则跳转到步骤35;
步骤32:按照JSearch命令语法规则给出目标插桩点位置的JSearch命令描述;
步骤33:按照JSearch命令语法规则给出目标插桩点插桩语句的模板描述;
步骤34:将步骤32和步骤33得到的命令描述和模板描述的字符串输入到JSearch命令编辑器中;
步骤35:结束本次插桩定义。
3.根据权利要求1所述的基于代码查询进行源代码插桩的方法,其特征是运行JSearch插桩命令即步骤12,其中运行相应的JSearch插桩命令、得到所有的插桩点定义过程包括:
步骤40:从JSearch命令编辑器中获得JSearch命令字符串,即命令描述和模板描述的字符串;
步骤41:从已经打开工程中的Java源代码中生成相应的代码信息,这些代码信息包括类、接口、方法、对象和语句信息;
步骤42:对步骤40中得到的JSearch命令字符串进行语法检测和预处理得到检索指令;
步骤43:按照检索指令在步骤41中得到的代码信息中进行目标元素检索,得到相应的目标元素集合和相应的辅助元素集合构成的元素属性值;
步骤44:将JSearch命令中插桩模板的参数替换成步骤43中的元素属性值,得到相应的插桩语句集合;
步骤45:将步骤44中得到的插桩语句集合生成相应的插桩点。
4.根据权利要求3所述的基于代码查询进行源代码插桩的方法,其特征是生成代码信息即所述步骤41中,从源代码生成与JSearch命令字符串相应的代码信息的方式是:首先生成源代码相应的抽象语法树,在将语法树中的类、接口、方法、对象和语句信息依次从语法树中抽取出来,形成表的数据结构。
5.根据权利要求3所述的基于代码查询进行源代码插桩的方法,其特征是语法检查及检索准备工作即步骤42中,其中检测和预处理即检查和检索准备工作的过程包括:
步骤601:匹配关键字find;
步骤602:匹配Target元素,并将其存放到Query.target中;
步骤603:匹配关键satisfying;
步骤604:当匹配关键字exist成功或者匹配关键字all成功,则跳转步骤605,,否则跳转步骤608;
步骤605:构造相应的predicate;
步骤606:将predicate存放到list Query.predicates中;
步骤607:跳转步骤604;
步骤608:匹配关键字where;
步骤609:当扫描完整个字符串,则跳转618;
步骤610:如果匹配Att表达式成功,则跳转步骤611,否则跳转步骤612;
步骤611:生成AttrCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤612:如果匹配Rel表达式成功,则跳转步骤613,否则跳转步骤614;
步骤613:生成RelCondition对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤614:如果匹配运算符成功,则跳转步骤615,否则跳转步骤616
步骤615:生成Operator对象,存放到Query.conditionLex队列中,跳转步骤617;
步骤616:返回出错状态;
步骤617:跳转步骤609;
步骤618:返回Query单次查询结构。
6.根据权利要求3所述的基于代码查询进行源代码插桩的方法,其特征是目标元素检索即步骤43中,其中检索过程包括:
步骤701:初始化运算符栈op_stack;
步骤702:初始化操作数栈r_stack;
步骤703:当conditionLex列表中的所有对象已经处理完,则跳转步骤714;
步骤704:从conditionLex列表中取出一个Lex对象l
步骤705:如果l的类型是Attr或者Rel,则跳转步骤706,否者跳转步骤707;
步骤706:将l压入操作数栈,跳转步骤703;
步骤707:如果l的类型是Operator,则跳转步骤708,否则跳转步骤703;
步骤708:如果l的优先级比top(op_stack)大,则跳转步骤709,否则跳转步骤710;
步骤709:将l压入op_stack中,跳转步骤703;
步骤710:如果l的优先级与top(op_stack)相等,则跳转步骤711,否则跳转步骤712;
步骤711:弹出op_stack元素,跳转步骤703;
步骤712:弹出r_stack的元素,计算相应的集合;
步骤713:跳转步骤703;
步骤714:返回r_stack弹出元素。
7.根据权利要求1或3所述的基于代码查询进行源代码插桩的方法,其特征是插桩点即步骤12、步骤13、步骤14、步骤15和步骤45中,其实现在源文件编辑器标尺上增加相应的标记,该标记指定了插桩语句应该插入的字符位置、文件行数和插入内容。
8.根据权利要求7所述的基于代码查询进行源代码插桩的方法,其特征是所述的插桩点定义方式,所有插桩标志均随程序(工程)进行:插桩标志在程序(工程)关闭后自动进行保存,在下次打开工程时插桩标志依旧能够在源代码编辑器的标尺上进行还原。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011102758975A CN102298552A (zh) | 2011-09-19 | 2011-09-19 | 基于代码查询进行源代码插桩的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN2011102758975A CN102298552A (zh) | 2011-09-19 | 2011-09-19 | 基于代码查询进行源代码插桩的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN102298552A true CN102298552A (zh) | 2011-12-28 |
Family
ID=45358983
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN2011102758975A Pending CN102298552A (zh) | 2011-09-19 | 2011-09-19 | 基于代码查询进行源代码插桩的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102298552A (zh) |
Cited By (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103049504A (zh) * | 2012-12-11 | 2013-04-17 | 南京大学 | 基于源代码查询的半自动插桩方法 |
CN104487939A (zh) * | 2012-07-31 | 2015-04-01 | 惠普发展公司,有限责任合伙企业 | 插桩文件的部署 |
CN104598274A (zh) * | 2015-01-13 | 2015-05-06 | 北京京东尚科信息技术有限公司 | 一种自动插桩编译安装方法及系统 |
CN106874058A (zh) * | 2016-12-29 | 2017-06-20 | 中国航天系统科学与工程研究院 | 一种基于源代码的程序自动插桩方法 |
CN106933642A (zh) * | 2015-12-29 | 2017-07-07 | 阿里巴巴集团控股有限公司 | 应用程序的处理方法及处理装置 |
CN110018954A (zh) * | 2018-12-25 | 2019-07-16 | 阿里巴巴集团控股有限公司 | 代码质量检测、代码检测质量的评估方法、装置及设备 |
CN110874216A (zh) * | 2018-08-31 | 2020-03-10 | 广州虎牙信息科技有限公司 | 一种完备代码生成方法、装置、设备和存储介质 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7240335B2 (en) * | 1996-08-27 | 2007-07-03 | Compuware Corporation | Byte code instrumentation |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
-
2011
- 2011-09-19 CN CN2011102758975A patent/CN102298552A/zh active Pending
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7240335B2 (en) * | 1996-08-27 | 2007-07-03 | Compuware Corporation | Byte code instrumentation |
CN101706750A (zh) * | 2009-11-16 | 2010-05-12 | 西安邮电学院 | 一种基于嵌入式模拟器的测试桩获取方法 |
CN101833500A (zh) * | 2010-04-07 | 2010-09-15 | 南京航空航天大学 | 一种基于Agent的嵌入式软件智能测试方法 |
Non-Patent Citations (1)
Title |
---|
CHEN HUAJIE等: "An Instrumentation Tool for Program Dynamic Analysis in Java", 《2011 FIFTH INTERNATIONAL CONFERENCE ON SECURE SOFTWARE INTEGRATION AND RELIABILITY IMPROVEMENT-COMPANION》, 29 June 2011 (2011-06-29), pages 61 - 65 * |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104487939A (zh) * | 2012-07-31 | 2015-04-01 | 惠普发展公司,有限责任合伙企业 | 插桩文件的部署 |
CN104487939B (zh) * | 2012-07-31 | 2018-03-13 | 慧与发展有限责任合伙企业 | 插桩文件的部署 |
CN103049504A (zh) * | 2012-12-11 | 2013-04-17 | 南京大学 | 基于源代码查询的半自动插桩方法 |
CN104598274A (zh) * | 2015-01-13 | 2015-05-06 | 北京京东尚科信息技术有限公司 | 一种自动插桩编译安装方法及系统 |
CN104598274B (zh) * | 2015-01-13 | 2017-07-18 | 北京京东尚科信息技术有限公司 | 一种自动插桩编译安装方法及系统 |
CN106933642A (zh) * | 2015-12-29 | 2017-07-07 | 阿里巴巴集团控股有限公司 | 应用程序的处理方法及处理装置 |
CN106874058A (zh) * | 2016-12-29 | 2017-06-20 | 中国航天系统科学与工程研究院 | 一种基于源代码的程序自动插桩方法 |
CN110874216A (zh) * | 2018-08-31 | 2020-03-10 | 广州虎牙信息科技有限公司 | 一种完备代码生成方法、装置、设备和存储介质 |
CN110874216B (zh) * | 2018-08-31 | 2023-07-28 | 广州虎牙信息科技有限公司 | 一种完备代码生成方法、装置、设备和存储介质 |
CN110018954A (zh) * | 2018-12-25 | 2019-07-16 | 阿里巴巴集团控股有限公司 | 代码质量检测、代码检测质量的评估方法、装置及设备 |
CN110018954B (zh) * | 2018-12-25 | 2023-03-31 | 创新先进技术有限公司 | 代码质量检测、代码检测质量的评估方法、装置及设备 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108959433B (zh) | 一种从软件项目数据中提取知识图谱并问答的方法与系统 | |
Lucassen et al. | Forging high-quality user stories: towards a discipline for agile requirements | |
US9122540B2 (en) | Transformation of computer programs and eliminating errors | |
Wahler et al. | Clone detection in source code by frequent itemset techniques | |
JP5791698B2 (ja) | アバップソースコードのコード検査遂行システム | |
CN102298552A (zh) | 基于代码查询进行源代码插桩的方法 | |
Zhai et al. | Automatic model generation from documentation for Java API functions | |
Sumner et al. | Memory indexing: Canonicalizing addresses across executions | |
CN113127339B (zh) | 一种Github开源平台数据的获取方法及源代码缺陷修复系统 | |
Thomas et al. | Mining unstructured software repositories | |
Sridhara | Automatic generation of descriptive summary comments for methods in object-oriented programs | |
CN115309451A (zh) | 代码克隆检测方法、装置、设备、存储介质及程序产品 | |
Alsuhaibani et al. | Heuristic-based part-of-speech tagging of source code identifiers and comments | |
Mahbub et al. | Explaining software bugs leveraging code structures in neural machine translation | |
Ge et al. | Keywords guided method name generation | |
CN113778852B (zh) | 一种基于正则表达式的代码分析方法 | |
CN103049504A (zh) | 基于源代码查询的半自动插桩方法 | |
CN113238937B (zh) | 一种基于代码精简与误报过滤的编译器模糊测试方法 | |
CN111966578A (zh) | 一种安卓兼容性缺陷修复效果的自动化评估方法 | |
CN110580170B (zh) | 软件性能风险的识别方法及装置 | |
CN116541286A (zh) | 一种基于插桩和符号执行的高覆盖率测试数据生成方法 | |
CN115080448B (zh) | 一种软件代码不可达路径自动检测的方法和装置 | |
Shao et al. | Combining lexical and structural information for static bug localisation | |
US7844627B2 (en) | Program analysis method and apparatus | |
Tukaram | Design and development of software tool for code clone search, detection, and analysis |
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: 20111228 |