基于控制流图的函数调用路径提取方法与流程

文档序号:13760230阅读:238来源:国知局
本发明涉及计算机软件
技术领域
,尤其是指一种基于控制流图的函数调用路径提取方法。
背景技术
:一个程序会因为含有判定条件的选择语句和控制语句而产生多条函数调用路径[1]。在程序设计中,源代码一般有顺序、选择、循环三种语句结构。顺序语句不增加函数调用路径的条数,只有选择语句和循环语句才可能产生更多的程序分支。以C语言为例,关键字if,for,while,switch将会产生多条执行语句。所以,这些可能产生分支的语句是提取函数调用关系图的重点。提取函数调用路径的方法主要分为两种,一种是通过静态分析工具[3-5]分析源代码,提取程序中的方法调用和模块之间的交互信息,确定模块之间的控制流的转向,使用自动机或者其他手段建立函数调用关系图,进而提取函数调用路径。静态分析是指在不需要执行源代码的条件下对源代码进行分析,与动态分析是相对的,动态分析是在执行源代码的条件下对源代码进行分析。另一种更直观地提取函数调用路径的方法是程序插装法[12]。通过在源代码或汇编代码中插入设计好的探针函数,在程序再次执行时,即可收集到进入函数以及退出函数的插装信息,基于这些插装信息,可以获得程序的控制流等信息,进而提取函数调用路径[13-15]。其中,可以使用装点流拆分算法[15]或其他算法实现函数调用路径的提取工作。目前,在自动化测试领域中,目标代码插装和源代码插装是主流的插装研究技术[16]。但是动态插装方法的完整性依赖于测试用例的选取,如果测试用例选取不全,会导致测试过程不充分。技术实现要素:针对现有技术中存在的问题,本发明要解决的技术问题是提供一种基于控制流图提取函数调用路径的方法,能够简单准确的进行函数调用路径的提取。为了解决上述问题,本发明实施例提出了一种基于控制流图的函数调用路径提取方法,包括:步骤1、获取源代码的中间代码,并对中间代码进行分析以对中间代码内的代码块进行识别,并以此生成控制流图;所述控制流图中的节点为代码块,且节点之间的连接线为代码块之间的连接关系;步骤2、对控制流图中的节点所包含的函数调用个数进行分析,以将控制流图转换为函数的调用关系图。其中,所述步骤1具体包括:步骤11、利用gcc编译器获取源代码的GCC-CFG格式中间代码;步骤12、获取中间代码中的代码块,并通过以下的预设规则对函数体进行识别并获取函数调用信息:规则P1:([;][;][]Function)[][_a-zA-Z]*[a-zA-Z0-9];规则P2:\<bb[][0-9]+\>;规则P3:\<L[0-9]+\>规则P4:((goto)[]\<bb[][0-9]+\>)规则P5:((goto)[]\<bb[][0-9]+\>)[]\(\<L[0-9]+\>\)规则P6:([_a-zA-Z]*[a-zA-Z0-9][][\()];当代码块与规则P1匹配时则该代码块为函数声明;对匹配规则P1的代码块执行初始化操作,然后更新与代码块相关的参数值,其中所述参数值为以下的至少一种:函数个数、节点个数、边个数;当代码块与规则P2匹配时则该代码块为bb代码块起始位置;当代码块与规则P3匹配时则该代码块为L代码块;对匹配规则P2和规则P3的代码块需要处理其上一层代码块的信息,并输出函数调用信息,然后更新与代码块相关的参数值;其中所述参数值为以下的至少一种:函数个数、节点个数、边个数;当代码块与规则P4匹配时则该代码块为goto语句;当代码块与规则P5匹配时则该代码块为特殊格式goto语句;对匹配规则P4和规则P5的代码块标识为是否含有跳转,然后根据跳转信息生成连接本节点与goto所指向的节点的边;当代码块与规则P6匹配时则该代码块为函数调用;获取其函数调用信息;步骤13、根据识别出代码块生成控制流图;其中所述控制流图中的每一节点为一个代码段,通过连接线将节点之间根据控制流信息进行连接。其中,所述步骤1还包括:采用三个计数器来记录函数的个数、节点个数、边个数;并使用三个计数器来记录代码块是否包含goto语句、代码块是否包含函数调用、代码块包含的函数调用明细。其中,所述步骤2具体包括:如果代码块中没有函数调用,将该代码块对应的节点合并到其上层或下层节点中;如果代码块中有且只有一个函数调用,将该代码块作为函数调用关系图中的一个节点并根据函数调用关系连接其他节点;如果代码块中有多个函数调用,则将控制流图中每一函数对应一个节点并将这些节点之间根据函数调用关系连接在一起,然后根据与其他代码块的节点之间的函数调用关系连接其他节点。其中,所述步骤2中代码块中有多个函数调用时的方法具体包括:代码块N1包含函数调用Funs(f1,f2,…,fn),且节点N1具有一个或一个以上的上层节点为N0s,以及一个或一个以上的下层节点为N2s;使函数调用Funs(f1,f2,…,fn)中的每一个函数对应一个节点,并按照函数调用的顺序将这些节点按顺序连接;删除上层节点N0s指向代码块N1的连接线,并将上层节点N0s连接代码块N1中的顺序第一的函数f1,并将顺序最后的函数fn连接下层节点N2s,以生成一条从上层节点N0s~代码块N1的所有函数调用~下层节点N2的一条由节点和连接线组成的控制流。其中,所述步骤2中代码块中没有函数调用时的方法具体包括:如果控制流图中的代码块没有函数调用,则判断该代码块对应的节点是否只连接一个上层节点和/或只连接一个下层节点,如果是则将该节点合并到上层节点或合并到下层节点;如果否,则将该节点同时合并到上层节点和下层节点,或是将该节点标识为非函数。其中,所述步骤2中还包括:采用json格式存储分析得到的控制流图信息;其中所述json格式的数据中至少包括:用于表示函数控制流图信息的函数数组,该数组中包括用于记录函数名称和控制流图信息的参数,其中用于记录控制流图信息的参数又分为记录节点间连接线的参数和记录节点名称的参数,在记录节点名称的参数中包含了函数调用数组;以控制流图中的单个函数为基本单位,根据代码块中包含的函数调用信息进行处理。本发明的上述技术方案的有益效果如下:函数调用路径是一个由程序入口点到出口点的函数名序列,将控制逻辑与函数调用相结合,把代码分析粒度从语句扩展到函数。针对如何准确地提取函数调用路径,本发明实施例提出了基于控制流图的函数调用路径提取方法:首先,借助gcc编译器获取包含控制流消息的中间代码,分析中间代码提取函数的控制流图;然后,根据控制流图和函数调用关系图的关联关系,按特定的算法对控制流图进行处理,得到函数调用关系图,提取所有的函数调用路径。实验结果表明,本发明实施例提出的方法可以准确地获取函数调用路径。附图说明图1为本发明实施例的if_test-控制流图的提取与解析原理示意图;图2为本发明实施例的if_test2-控制流图的提取与解析原理示意图;图3为本发明实施例的for_test-控制流图的提取与解析原理示意图;图4为本发明实施例的while_test-控制流图的提取与解析原理示意图;图5为本发明实施例的节点没有包含函数调用的原理图;图6为本发明实施例的控制流图存储方式示意图;图7为选择循环嵌套函数的代码分析过程示意图;图8为控制流图与函数调用关系图;图9为含三目运算符递归函数示例代码分析过程图;图10为含三目运算符递归函数示例控制流图与函数调用图。具体实施方式为使本发明要解决的技术问题、技术方案和优点更加清楚,下面将结合附图及具体实施例进行详细描述。步骤1、控制流图提取步骤:为了保证函数调用关系图的准确性,需要准确的提取函数的控制流图。本发明实施例中采用gcc编译器对源代码进行预处理,获取包含控制流消息的中间代码,进而完成控制流图的提取工作。gcc是一款强大的C语言编译器,包含了大量的功能选项用于控制编译链接的过程,其中“-fdump-tree”选项可以获取gcc对源代码的预处理信息,选择其中合适的子选项,gcc可以生成格式合适、准确的中间调试信息。“cfg”子选项可以生成类控制流图的中间代码。现在对一些简单代码进行示例分析,其中包含if语句的分析示例,其分析可以如图1所示。图2为if条件语句执行完成后直接return的分析示例。从图1中可以看出中间代码分为两部分:函数声明和函数体,将此格式代码称为GCC-CFG中间代码。函数声明部分包含了gcc内部的函数索引号信息,对于函数控制流图的获取无太大帮助。函数体部分是对源代码进行预处理后的结果,是对源代码的分块表示,将整个代码分为简单的代码块,代码块内部代码顺序执行,或者根据goto语句跳到另外一个代码块。其中<bb>模块表示基本代码块basicblock,同时gcc在分析代码的过程中可能会合并一部分代码,导致一部分代码块存在两个或更多的名字。基本代码块中的goto语句可以反映代码块之间的执行顺序。通过对GCC-CFG中间代码进行静态分析,分别匹配代码块、goto语句即可以得到图1、图2中右侧的控制流图。包含for语句的分析示例如图3所示,另外使用while循环实现与图3相同功能的示例代码如图4所示。两个循环示例代码分别使用for和while实现了完全相同的功能,通过gcc得到的GCC-CFG中间代码也是完全相同的,将其绘制成控制流图显示结果一致。由于GCC-CFG中间代码有明显标志性语句,本发明实施例中采用一种pattern-action的方式对其进行静态分析。其中,pattern是一种模式匹配或者规则匹配,action是当匹配到指定规则的代码串(或称为token)后,执行的相关动作。对于GCC-CFG格式的中间代码而言,主要匹配的pattern部分为函数声明、基本代码块<bb*>以及跳转语句goto。规则pattern列表如下:表1数字特征序号规则说明P1([;][;][]Function)[][_a-zA-Z]*[a-zA-Z0-9]匹配函数声明P2\<bb[][0-9]+\>匹配bb代码块开始P3\<L[0-9]+\>匹配L代码块P4((goto)[]\<bb[][0-9]+\>)匹配goto语句,连接语句P5((goto)[]\<bb[][0-9]+\>)[]\(\<L[0-9]+\>\)匹配特殊格式goto语句P6([_a-zA-Z]*[a-zA-Z0-9][][\(])匹配函数调用表1中共有6种规则,左侧为规则编号,中间为该规则的类正则表达式,右侧为规则说明。控制流图的提取需要寻找3个关键内容:函数声明,基本代码块,跳转语句。控制流图是以函数为处理单元进行提取。根据规则P1-P5提取函数控制流图的步骤如下:分别采用规则P1-P6对GCC-CFG中间代码进行匹配:在匹配到P1规则时,则代表匹配到点了函数声明,其为GCC-CFG中间代码中的函数定义。在匹配到P2和P3规则时,说明其为bb函数代码块的开始或是L代码块。在一个函数内部,控制流图的每一个节点代表一个基本代码段,基本代码段在GCC-CFG中间代码中是以<bb*>或者<L*>形式表示的,规则P2和P3用于找出函数内部的每一个中间代码。在匹配到P4和P5规则时,说明函数内部有goto语句。在函数内部,控制流图的每一条边表示了一条跳转语句。在GCC-CFG中间代码中,产生跳转有两种情况:一种是在一个代码块内没有任何跳转语句,所以按照执行顺序进入下一个紧挨的代码块或者结束,此时产生一条顺序执行的边(edge);另一种是在代码块内有跳转语句,也就是goto语句,每条goto语句都会产生一条跳转,生成一条新的边(edge)。通过以上三步可以获取控制流图的全部内容,然而为了生成函数调用关系图,控制流图中的每一个节点需要更多的辅助信息。控制流图和函数调用关系图的一点区别在于节点所表示的内容不同,控制流图节点表示一个代码段,函数调用关系图节点表示一个函数。为了能够将控制流图转换为函数调用关系图,需要在提取控制流图时,将每一个基本代码块中的函数调用信息保留在每一个节点中。从图1-图4中可以看出,在代码块内部,函数调用是非常简单的顺序调用,没有复杂的跳转。所以在获取控制流图的时候需要根据P6来匹配函数调用,并且按照顺序将函数调用信息保留在控制流图的节点中。在匹配到不同的规则后需要执行不同的动作(action),具体包括:在匹配到P1后,需要执行初始化操作,更新函数个数、节点个数、边个数等计数器值;在匹配到P2或者P3后,需要处理上一个代码块的信息,按照需要的格式输出节点信息包括该节点内的函数调用信息,最后更新与代码块相关的值;在匹配到P4或者P5后,需要设置is_bb_with_goto,即本节点是否包含跳转,用于辅助主程序判断是否连接当前节点与下一个节点。如果包含跳转信息,则生成连接本节点与goto所指向的节点的边;在匹配到P6后,需要存储相应的函数调用信息。因此本发明实施例中的控制流图的提取算法如下:在以上算法中,针对函数和代码块使用fun_num、node_num、edge_num这三个计数器,来分别记录函数的个数、某一个函数中节点的个数、边的个数;还是使用了is_bb_with_goto、is_bb_with_function、called_functions这三个计数器来记录代码块是否包含goto语句、代码块是否包含函数调用、包含了那些函数调用;其中yytext是指根据规则匹配到的名称。并且根据需要定义print_node和print_edge用于生成或者输出指定格式的控制流图,如在内存中生成邻接表或者生成结构化文档(XML,JSON格式)存储到硬盘上。步骤2、函数调用关系图提取步骤:根据控制流图生成函数调用关系图。在存放控制流图信息的文件中,针对每个基本代码块(basicblack),或是L代码块,根据其内部包含函数调用的个数可以分为三类:没有函数调用、只有一个函数调用、函数调用个数大于一个。分类不同,其处理方式也不同,根据不同的分类,对其进行不同的处理,即可将控制流图转换为函数调用关系图。(1)对于没有函数调用的代码块:在控制流图转为函数调用关系图的过程中,如果代码块中没有函数调用,一般可以采取删除该节点的方式。比如在图1中,代码块<bb2>中没有包含任何的函数调用,同时只有一个节点指向该代码块,所以此时删除该节点或者称为将该节点“向上合并”是正确的。然而在一种特殊的情况下,一个控制流图节点指向多个节点,同时存在多个节点指向该节点,此时该节点是不能删除的。为了更细化的分析无函数调用情况,根据控制流图节点入度和出度的不同,将无函数调用节点分为如图5所示的4种情况。对于图5中第1-3种情况,可以采用“合并”的策略。合并操作分为“向上合并”和“向下合并”两种。向上合并是指该节点的相关信息与该节点的上层信息合并,向下合并与之相反。向上合并操作:被合并节点为N1,上层节点为N0,下层节点为一个或多个表示为N2s,合并操作为删除N0指向N1的边,同时N0指向所有的N2s,最后删除节点N1。向下合并操作:被合并节点为N1,上层节点为一个或者多个表示为N0s,下层节点为N2,合并操作为删除N1指向N2的边,同时所有的N0s指向N2,最后删除节点N1。对于第1种情况可以采用任意一种合并操作,最终结果是一样的;对于第2种情况,只能执行向上合并操作,对于第3种情况只能执行向下合并操作。对于图5中第4种情况,该节点可以采用两种方法处理,选择1:删除该节点,然后执行向上合并和向下合并两个操作;选择2:如果保留该节点,那么需要对该节点指定一个特殊的名称,表示该节点不是一个函数。第一种方法适合获取函数调用路径,第二种方法适合程序员分析阅读,使调用关系图更简洁清晰。(2)对于一个代码块中恰好有一个函数调用的情况,直接替换节点名称即可,也就是重命名,将原来的<bb*>或者<L*>节点名称重命名为函数名称。(3)对于一个代码块中包含多个函数调用的情况,可以采用“分裂”操作。比如控制流图中的一个节点N1包含函数调用Funs(f1,f2,…,fn),节点N1的上层节点(一个或多个)表示为N0s,下层节点(一个或多个)表示为N2s。分裂操作为:首先,为Funs中的每一个函数创建一个节点(如果该函数节点已经存在,则无需重新创建),并按顺序连接这些节点;然后,删除N0s指向N1的边,同时N0s指向f1;最后,将fn指向节点N2s。这样就可以生成一条从N0s---N1的所有函数调用---下层节点N2的一条边。控制流图到函数调用关系图转换算法的核心思想为根据控制流图的节点类型做相应的处理,而详细的转换算法是基于一种具体的数据结构。本发明实施例中采用json格式存储分析得到的控制流图信息。json是一种轻量级的数据交换格式,其数据的书写格式是key:value对,其中value可以是数值、字符串或者数组。本发明实施例中需要多个单独的工具配合使用,所以使用json持久化数据,方便不同程序对分析结果的处理。如图6所示的,左侧代码为一个C语言版本的mysql数据库调用程序中的初始化程序,中间为其GCC-CFG格式的中间代码,右侧为json格式的CFG数据。在本发明实施例中,json的数据格式为:functions对应函数数组,数组中的每一个成员表示一个函数的控制流图信息,包括funciton_name和tokens;function_name表示函数的名字;tokens表示该函数对应的控制流图信息,类型分为node节点和edge边;node中包含节点名称node_name,且该节点包含的函数调用数组called_functions,edge中包括控制流图中一条边的起点节点begin与终点节点end。针对以上数据结构,本发明实施例提出了一种由控制流图转为函数调用关系图的算法,该算法如表2所示的,其输入为包含控制流图信息的数据文件,输出为包含函数调用关系图信息的数据文件。在本发明实施例的算法中,以控制流图数据文件中单个函数为基本单位,对tokens中的每一项进行分析,按照转换规则执行合并、重命名或者拆分操作。与上述分析有一点不同,在算法中分析了在节点不包含任何函数调用的情况下,如果其入度或者出度为零时,则不做任何处理。因为当以上条件成立时,该节点为开始节点或者是结束节点,所以可以不做任何处理。本发明实施例中的函数调用路径的提取以函数调用关系图为基础提取,发明人基于对从函数调用图到函数调用路径的转换的多年研究,提出了本发明实施例的方法,可以以简单的方法去计算从开始节点到结束节点之间的可达路径,得到的每一条路径即为函数调用路径。为了证明本发明实施例方法的有效性,在此通过一个实验来进行说明:在实验中,通过包含有判断语句以及循环语句相嵌套的程序以及包含三目运算符的递归函数,对论文提出基于控制流图的函数调用路径提取方法进行验证。实例1:选择循环嵌套函数图7中的左侧部分为选择语句和循环语句嵌套使用的实验源代码,程序定义了两个变量作为程序中不同分支的判断条件,在获取到这两个变量后,根据变量的值进入while循环,然后确定要执行的函数,在一次循环中只有一个函数会执行,并且一旦执行f2就会跳出循环。该程序代码因为变量值的不同会执行不同的函数,因此会对应多条函数调用路径。源代码在经过gcc处理后,生成如图7所示的GCC-CFG中间代码。gcc对源代码进行了优化,声明了多个变量优化代码的执行效率,并且没有影响程序的控制逻辑。然后对该中间代码进行静态分析,通过2.2节的控制流图提取算法,将中间代码转换为图7中右侧部分的json格式的控制流图信息,共11个节点,12条边。然后通过graphviz画出控制流图,如图8左侧所示。使用CFG2FCG算法将图8左侧的控制流图转化为右侧的函数调用关系图。在9个节点中,只有<bb4>和<bb5>包含函数调用,并且只包含一个函数调用,所以执行了rename操作(<bb2>包含的函数调用scanf是库函数,没有在实验代码中声明实现,在CFG2FCG过程中忽略该函数调用);其他节点不包含函数调用,在做完合并操作后删除。最后,计算从main到end的可达路径为6条,详细情况见表2。表2函数调用路径实验结果通过分析5条函数调用路径,可以得到上表右侧变量的取值情况。不进入循环时执行第1条路径;进入循环后执行else语句,生成第2条路径;进入循环执行后,if判断为真后调用f1,然后再次进入循环体执行f2,生成第3条路径;进入循环后多次执行f1,然后执行f2,生成第4条路径;进入循环后,只执行了一次f1,然后退出循环,生成第5条路径。进入循环后,多次执行f1,然后退出循环,生成第6条路径。实验结果表明,提取出的函数调用路径与人工分析的预期一致,表明基于控制流图的函数调用路径提取方法,在本例中可以正确提取函数的调用路径获取程序的结构信息。实例2:含三目运算符的递归函数图9(a)为使用三目运算符实现的FibonacciSequence函数源代码,主函数通过循环多次调用fib函数。源代码在经过gcc处理后,生成GCC-CFG中间代码,其中图9(b)为main函数的中间部分,图9(c)为fib函数的中间部分。同样,gcc对源代码进行了优化,声明了多个变量优化代码的执行效率,并且不影响程序的控制逻辑。main函数在循环体内调用fib函数,其函数调用关系应该是fib指向自己,执行多次。fib函数在函数内部递归调用自己,其函数调用关系同样应为fib指向自己。静态分析中间代码获取json格式的控制流图信息,如图9(d)所示。通过graphviz画出函数的控制流图,main函数的控制流图如图10(a)所示,fib函数的控制流图如图10(b)所示。使用CFG2FCG算法将控制流图转化为函数调用图,同样main函数中的<bb3>的scanf是库函数,没有在实验代码中声明实现,在CFG2FCG过程中忽略该函数调用。main函数与fib函数有相同的函数调用路径图如图10(c)所示,与之前的人工分析一致。生成的全局函数调用图10(d)所示,此函数调用关系图比较简单,不再列表分析。从main到end的函数调用路径一共是三条:该实例可以提取通过静态分析得到的不可达路径。在该示例中,由于i值的取值是事先确定的,其函数调用路径也是确定的,即上述分析中的第三条路径。根据静态分析的特点,可以发现函数执行过程中所有可能的函数调用路径。该特点可以应用到安全领域,发现可能会被黑客利用的不可达路径。在动态分析中将不会产生这样的问题,动态分析只会发现在设计好的测试用例中一定会执行的函数调用路径。本发明实施例中提出了一种新的提取函数调用路径的方法:首先,借助gcc编译器获取源代码的GCC-CFG格式中间代码,通过使用pattern-action的模式,静态分析该代码提取函数的控制流图;然后,根据控制流图,对控制流图中的每一个节点包含函数调用的个数进行分类,完成控制流图到函数的调用关系图的转换;最后,合并所有函数的函数调用关系图,提取函数调用路径。函数调用路径可以通过分析函数调用关系图的起点到终点的可达路径得到。通过实验证明,基于控制流图的函数调用路径提取方法是有效的,可以简化函数调用路径的分析过程,且更容易获取准确的函数调用路径。本发明实施例中引用的参考文献如下,本发明实施例中将这些参考文献全文引用于此:牟永敏,李慧丽.基于函数调用路径的测试用例优先级排序[J].计算机工程,2014,40(7):242-246牟永敏,杨志嘉.基于函数调用路径的软件实现与设计一致性验证[J].中国科学:信息科学,2014,10:1290-1304FosterJS,TerauchiT,AikenA.Flow-SensitiveTypeQualifiers[J].Proc.acmConf.programmingLanguageDesign&ImplementationAcmPress,2002,37(5):1-12.AdamsS,BallT,DasM,etal.SpeedingUpDataflowAnalysisUsingFlow-InsensitivePointerAnalysis[J].SasLncs,2002:117--132.EvansD,GuttagJ,HorningJ,etal.LCLint:AToolforUsingSpecificationstoCheckCode[J].Fse,2002,19(5):87--96.ZhengYH,MuYM,ZhangZH.Researchonthestaticfunctioncallpathgeneratingautomatically.In:ProceedingsofInformationManagementandEngineering,Chengdu,2010.405–409MuYM,ZhengYH,ZhangZH,etal.Thealgorithmofinfeasiblepathsextractionorientedthefunctioncallingrelationship.ChineseJElectron,2012,21:236–240牟永敏,刘梦婷.基于有限状态机的C++重载唯一性确定[J].计算机应用研究,2014,31(4):1059-1062LiuDF,MuYM,HeYJ,etal.GenerationofStaticFunctionCallingPathsinC++BasedonFinite-StateMachine[C].AppliedMechanicsandMaterials.2014,568:1497-1504张志华,牟永敏.基于函数调用的路径覆盖生成技术研究[J].电子学报,2010,138:1808-1811YanMM,MuYM,HeYJ,etal.TheAnalysisofFunctionCallingPathinJavaBasedonSoot[C].AppliedMechanicsandMaterials.2014,568:1479-1487HuangJC.ProgramInstrumentationandSoftwareTesting[J].Computer,1978,11(4):25-32.牟永敏,姜智荧,张志华.面向C程序插装的路径提取[J].计算机工程与应用,2011,47(1):67-69MuYM,LiHL,JiangB,etal.TheSplittingandMatchingAlgorithmofDynamicPathOrientedtheFunctionCallingRelationship[C].IntelligentHuman-MachineSystemsandCybernetics(IHMSC),20135thInternationalConferenceon.IEEE,2013,2:343-346XuAP,MuYM,ZhangZH,etal.TheDynamicFunctionCallingPathGenerationBasedonInstrumentation[C].AppliedMechanicsandMaterials.2014,568:1469-1478钟芳挺,刘超,金茂钟.程序动态分析系统中插装方式的改进[J].计算机工程与设计,2007(28),4585-4588以上所述是本发明的优选实施方式,应当指出,对于本
技术领域
的普通技术人员来说,在不脱离本发明所述原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。当前第1页1 2 3 
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1