CN110308932B - 一种基于源代码的aadl功能行为模型逆向重构方法 - Google Patents
一种基于源代码的aadl功能行为模型逆向重构方法 Download PDFInfo
- Publication number
- CN110308932B CN110308932B CN201910475582.1A CN201910475582A CN110308932B CN 110308932 B CN110308932 B CN 110308932B CN 201910475582 A CN201910475582 A CN 201910475582A CN 110308932 B CN110308932 B CN 110308932B
- Authority
- CN
- China
- Prior art keywords
- function
- aadl
- model
- node
- language
- 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.)
- Active
Links
- 238000000034 method Methods 0.000 title claims abstract description 57
- 238000013461 design Methods 0.000 title claims abstract description 23
- 230000006870 function Effects 0.000 claims abstract description 162
- 238000000605 extraction Methods 0.000 claims abstract description 22
- 230000007704 transition Effects 0.000 claims description 41
- 230000008569 process Effects 0.000 claims description 22
- 238000013499 data model Methods 0.000 claims description 16
- 238000012545 processing Methods 0.000 claims description 15
- 238000006243 chemical reaction Methods 0.000 claims description 13
- 230000009471 action Effects 0.000 claims description 6
- 230000009467 reduction Effects 0.000 claims description 3
- 238000012546 transfer Methods 0.000 claims description 3
- 239000000047 product Substances 0.000 description 10
- 238000005516 engineering process Methods 0.000 description 4
- 238000011161 development Methods 0.000 description 3
- 230000003542 behavioural effect Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 241001269238 Data Species 0.000 description 1
- 108091029480 NONCODE Proteins 0.000 description 1
- 238000012356 Product development Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000012407 engineering method Methods 0.000 description 1
- 239000012634 fragment Substances 0.000 description 1
- 230000010354 integration Effects 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000013507 mapping Methods 0.000 description 1
- 238000013508 migration Methods 0.000 description 1
- 230000005012 migration Effects 0.000 description 1
- 230000000737 periodic effect Effects 0.000 description 1
- 238000004904 shortening Methods 0.000 description 1
- 239000013589 supplement Substances 0.000 description 1
- 230000009466 transformation Effects 0.000 description 1
- 238000000844 transformation Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/74—Reverse engineering; Extracting design information from source code
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明公开了一种基于源代码的AADL功能行为模型逆向重构方法,包括:步骤1:根据预设的抽取规则,获取C语言相关内容,所述C语言相关内容包括C语言到AADL功能行为模型抽取所需的数据信息和结构内容;步骤2:将C语言相关内容对应存入事先设计的中间模型中;步骤3:基于中间模型,实现AADL功能行为模型逆向重构。
Description
技术领域
本发明数据安全关键系统技术领域,具体涉及到一种基于源代码的AADL模型逆向重构方法。
背景技术
大多数公司,无论其规模和方向如何,都面临着管理,维护和/或替换(部分)现有软件系统的问题。这些遗留系统通常是在公司的信息系统中发挥着关键作用的大型应用程序,对日常运营产生不可忽视的影响。在对软件系统进行升级/更接近现代化时,提高代码的可理解性是一个关键点。获得原有系统的有用的更高层级的表示过程称为逆向工程(RE),但是这是一个复杂的实现目标。现在已经提出了一种模型驱动逆向工程(MDRE)来增强传统的逆向 (RE)过程。
模型驱动逆向工程(MDRE)通常被定义为模型驱动工程(MDE)原理和技术在逆向工程中的应用。MDE指出,通过从通常的以代码为中心的方法转换更多基于模型的方法或模型驱动方法。这种范式很大程度上基于“一切都是模型”的假设。因此,MDE基本上依赖于三个主要概念:元模型,模型和模型转换。
模型驱动逆向工程的意义如下:改善文档,当原有的文档有不充分处,又当系统被更新而原设计人员不在时,逆向工程被用来获取所需数据,以补充说明或了解系统的最新状态;软件升级或更新。出于功能、合规、安全等需求更改,逆向工程被用来了解现有或遗留软件系统,以评估更新或移植系统所需的工作;文件丢失采取逆向工程的情况往往是在某一个特殊设备的文件已经丢失了(或者根本就没有),同时又找不到工程的负责人。完整的系统时常需要基于陈旧的系统上进行再设计,这就意味着想要集成原有的功能进行项目的唯一方法,便是采用逆向工程的方法,分析已有的碎片进行再设计。
因此逆向工程被广泛的应用到新产品开发和产品改型设计、产品仿制、质量分析检测等领域,它的作用也有很多:缩短产品的设计、开发周期,加快产品的更新换代速度;降低企业开发新产品的成本与风险;加快产品的造型和系列化的设计。
针对安全关键领域常用的C代码,通过模型驱动逆向抽取其AADL功能行为模型,将功能行为模型和AADL模型结构相结合,就可以对遗留系统进行更准确的描述,进而更好地定义文档。运用此技术,可以分析C代码遗留系统的详细内容,抽取其中的功能描述部分转换为AADL 功能行为附件。
MDE在逆向工程中的应用(即MDRE)是一个相对较新的领域。最初,模型主要用于实现指定系统之前(正向工程)。相反,MDRE建议从系统实现中构建和使用模型,从而得到系统或其域的更高级别的视图,以便于维护和升级系统工作的进行。MDRE被认为是MDE的基本应用。正向工程和逆向工程之间自然存在固有的互补性,特别是在使用模型进行均匀处理和组合时。这种集成显着地实现了系统的连续重新设计。
对MDRE越来越感兴趣促使OMG启动架构驱动的现代化任务组,其主要目标是提出一套对现代化项目有用的标准元模型,即从旧技术或过时技术到最近技术的技术迁移。在此基础上,提出了各种建议,例如在方法框架中将这些标准结合起来。MDRE对于软件分析也很有用。一般来说,在处理模型驱动软件升级时需要MDRE,即全局场景,包括对遗留系统的任何可能的修改而不仅仅是纯粹的现代化。在所有情况下,首先需要MDRE阶段,从所考虑的系统中获得所需的模型,以便随后对其进行分析,修改或升级。
发明内容
发明目的:在缺少相关描述性文档的情况下对系统进行理解或改造的情况下,本发明提供了一种基于源代码的AADL模型逆向重构方法,从源代码得到AADL模型。
本发明公开了一种基于源代码的AADL功能行为模型逆向重构方法,包括以下步骤:
步骤1:根据预设的抽取规则,获取C语言相关内容,所述C语言相关内容包括C语言到AADL功能行为模型抽取所需的数据信息和结构内容;
步骤2:将C语言相关内容对应存入事先设计的中间模型中;
步骤3:基于中间模型,实现AADL功能行为模型逆向重构。
进一步的,所述抽取规则包括:C语言基本数据类型到AADL功能行为模型基本数据类型的抽取规则、C语言主函数到AADL功能行为模型进程的转换规则、C语言线程到AADL 功能行为模型线程的转换规则、C语言函数到AADL功能行为模型行为附件的转换规则、C 语言全局变量到AADL共享数据构件的转换规则。
进一步的,在进行步骤2之前还包括中间模型的设计步骤,具体为:
设计用于存放C语言到AADL功能行为模型转换的数据信息的类,包括用于存储每个文件的数据和函数的类、用于存储全局变量的类和用于存储函数名和被调用的函数列表的类;
设计用于存放C语言到AADL功能行为模型转换的结构内容的类,包括用于存储整个C 语言工程的结构的类、用于存储一个文件的结构的类、用于存储函数内容的类和用于存储被定义的数据类型的类。
进一步的,所述步骤2具体为:
对C语言相关内容进行遍历,得到每个.c和.h的文件路径,把这些文件路径存放在链表中;
循环解析链表中含有的文件,得到每个文件包含的数据名称和函数名称,得到结构索引;
循环解析链表中含有的文件,得到每个文件里的节点内容;
将每个文件的节点内容,存储在中间模型中:当节点类型为数据定义类型时,根据节点的属性,将其存储至中间模型对应的类的成员变量中;当节点类型为函数定义类型时,获取该节点内容并将其存储至中间模型对应的类中,在该类中对节点内容进行处理,该节点内容包括函数的名称、参数、返回值类型和函数体。
进一步的,所述根据节点的属性将其存储至中间模型对应的类的成员变量中的步骤包括:
若节点为结构体,则获取该节点的名称存入中间模型的DataModel类的成员变量name 里,将中间模型的DataModel类的成员变量type设置为“struct”,对该节点的内容进行解析;
若节点为变量定义,将其添加在中间模型的DataModel类里的成员变量vars里;
若节点为嵌套的结构体,则递归解析结构体的函数;
若节点为函数的引用,则添加在中间模型的DataModel类的成员变量subs里,在结构索引里找到函数的来源;
所述DataModel类为在中间模型中用于存储被定义的数据类型的类。
进一步的,所述当节点类型为函数定义类型时,获取该节点内容并将其存储至中间模型对应的类中,在该类中对节点内容进行处理的步骤,具体为:
将节点内容中的参数作为出入参数传入中间模型的FunctionModel类里,在中间模型的 FunctionModel类里对节点内容进行处理;所述FunctionModel类为在中间模型中用于存储函数内容的类;
获得节点内容中的函数体内容里的所有节点,并对每个节点进行分析,得到函数体内容,并将其相应的语句转换到AADL功能行为模型的行为附件里的状态转移;基于合并规则,对所有的状态转移进行合并,完成状态约简;所述合并规则为:对所有的状态转移从头开始遍历,若C语言第i个语句对应的状态转移条件为空,则从开始遍历到第i个语句,对所有以 start为结束状态的状态转移和此状态转移合并,使此状态转移的结束状态变为end,状态转移的action内容进行添加。
进一步的,所述步骤3具体为:将中间模型中存储的每个文件的内容对应写入model.name.aadl文件里。
进一步的,将每个文件的内容对应写入model.name.aadl文件里的步骤具体包括:
将C语言的主函数向model.name.aadl文件里写入process,将C语言的主函数作为进程调用的函数;
遍历文件内容里的data链表,按照data链表内容写入model.name.aadl文件里相应的data 组件里;
将文件内容里的funs链表、function.name对应于AADL功能行为模型子程序的名字、 function.para对应AADL功能行为模型子程序的输入参数链表、function.subprogramcall对应 AADL功能行为模型子程序调用的其他子程序链表、function.dataAccess对应AADL功能行为模型子程序引用的全局变量链表、function.returnValue是AADL功能行为模型子程序的返回值,均写入AADL功能行为模型子程序的feature属性里的内容;
文件内容里的函数的局部变量,对应写入行为附件里的variables属性里;
文件内容里的所有的状态数量,对应写入行为附件里的states属性里;
文件内容里的所有的状态转移,包括起始和终止状态、转移条件和动作内容,对应写入行为附件的transitions属性里。
进一步的,采用Eclipse CDT插件获取C语言相关内容
有益效果:采用本发明的方法能够缩短产品的设计、开发周期,加快产品的更新换代速度,降低企业开发新产品的成本与风险,加快产品的造型和系列化的设计。
附图说明
图1:C2AADL C工程项目结构存储设计;
图2:C2AADL中间模型设计。
具体实施方式
下面结合附图进一步阐述该发明方法。
本发明提供了一种基于源代码的AADL功能行为模型模型逆向重构方法,用于在缺少相关描述性文档的情况下对系统进行理解或改造,具体步骤为:
步骤一:定义C语言基本数据类型到AADL功能行为模型基本数据类型的抽取规则、C语言主函数到AADL功能行为模型进程构件的抽取规则、C语言线程到AADL功能行为模型线程构件的抽取规则、C语言函数内容到AADL功能行为模型行为附件的抽取规则、C语言全局变量到AADL功能行为模型数据构件的抽取规则;
以下对上述抽取规则举例进行说明;
C语言基本数据类型到AADL功能行为模型基本数据类型的抽取规则:
AADL功能行为模型基本数据类型与C语言基本数据类型相似,以最常见的几种类型进行抽取;
表1.1.C语言AADL功能行为模型基本数据类型抽取规则
C语言 | AADL |
boolean | Boolean |
char | Character |
int | Integer_32 |
short | Integer_8 |
long | Integer_64 |
C语言主函数到AADL功能行为模型进程的抽取规则:
C语言工程中首先重要的就是主函数,C语言主函数描述如下:
C语言主函数映射到AADL功能行为模型构件就是进程构件,对应生成一个.aadl文件,相应的AADL进程构件的如下显示:
C语言线程到AADL功能行为模型线程的抽取规则:
因为AADL功能行为模型构件里,线程不能在子函数里,所以为了方便转换,只考虑在主函数创建线程的情况,以下是C语言内容:
因为AADL的线程构件里有属性(properties),周期性(periodic),零星(sporadic),非周期性(aperiodic),后台(background)。为了方便转换,本发明关心非周期性转换。对应的AADL 线程构件如下:
C语言函数到AADL功能行为模型行为附件的抽取规则:
函数的内容是一个对函数处理效果的描述,可以提高代码的利用率。C语言函数的内容可以转换到AADL子程序的行为附件里。以下分情况进行规定:
函数里局部变量的定义(有初始值/没有初始值)
局部变量对应行为附件的variables
函数里的各种的语句,
函数的各种语句对应AADL行为附件里的状态跃迁。
先定义:开始状态(state1),结束状态(state2)
函数里需要特殊注意的地方
C语言全局变量到AADL共享数据构件的抽取规则:
C语言的全局变量映射到AADL的数据构件(data)。
当全局变量为基本数据类型时:
单个data无法显示出是基本类型,因此在data的subcomponents里加入一个value用来显示基本数据类型,如下所示:
当全局变量为结构体时:
对于结构体的定义来说,可以直接转换为data组件;对于用结构体声明的全局变量则可套用基本变量规则,如下所示:
注意AADL功能行为模型的关键字与C语言关键字会有差异,在与AADL关键字重名的的变量名后统一加上_t用来解决关键字冲突。
步骤2:根据上述抽取规则需要的元素设计中间模型:
由于一般用到的C语言工程往往都是一个进程,整个C语言工程只会得到一个对应的 AADL功能行为模型中的进程组件(process),主函数对应进程组件调用的函数。而且,一个大型的C语言工程包含了一些非代码层面的层次信息:同名的.c和.h文件对应一个.aadl文件,文件的内部功能是通过函数和全局变量来体现。对于这样的文件,使用AADL建模时,每个函数用AADL功能行为模型中的子程序组件(subprogram)来表示,每个全局变量用AADL功能行为模型中的数据组件(data)来表示。在AADL功能行为模型中,一个子程序组件(subprogram)表示一个可调用的单元,这与C语言的函数性质吻合。并且,子程序组件还有表示子程序调用的和全局变量引用的分组件(features),函数中的局部变量对应写入子程序组件内变量组件(variables)中。
在C语言工程中,参数的传递,调度的信息隐藏在扁平化的代码中,不能通过观察直接得知。因此,AADL功能行为模型中表示数据端口连接的connection和子程序组件调用的 requires subprogram access需要对代码进行进一步分析提取。这样的数据传递较多的发生在C 语言中的函数调用处,对一个函数调用另一个函数的关系进行建模,这样的调用关系一般是调用函数的内部数据作为被调用函数的数据输入端口,被调用的函数的返回值通过另一组数据连接输出到输出端口。
C语言工程直接通过引用include“xxx.h”,就可以直接使用该头文件所定义的数据和函数,这一点直接对应AADL功能行为模型的with xxx,C语言工程在使用头文件定义的数据和函数时并不用标明数据和函数的来源,AADL功能行为模型对于引用的数据和函数会要求标明来源(data文件名::数据),对于此问题在建模时,先对C语言工程遍历,找到每个.c和.h 文件的数据和函数,在引用时在保存此信息的结构中进行查找。
针对以上分析,本发明设计了中间模型用于存放C语言代码到AADL模型转换的数据信息和结构内容。
对于一个C语言工程,他首先有工程的名称和若干文件(x.c,x.h)。然后,每个文件又含有自己的名称、函数和自己的全局变量。每个函数包含函数名称,输入输出参数,局部变量,引用的全局变量,调用的函数和自己的函数内容;每个数据(如果是结构体)又包含数据名称和数据内容。以下图1(存储项目结构路径)和图2(中间模型)所示。
每个类的设计含义:
以上是用来存储整个项目结构的数据类型,用这些数据类型来为后面的数据引用和函数调用做准备。
类名 | 意义 |
CProjectModel | 用来存储整个项目的结构 |
SingleCModel | 用来存储一个文件的结构 |
FunctionModel | 用来存储函数内容 |
DataModel | 用来存储被定义的数据类型 |
以上是整个中间结构的数据类型,每个类都有各个节点的相应内容。
每个类的参数含义:
CProjectModel类:
参数 | 含义 |
Name | 项目名称 |
cMdules | 所有.c和.h文件结构的列表 |
SingleCModel类:
参数 | 含义 |
name | .c或.h文件的文件名 |
includes | 引用了那些文件的文件名 |
functions | 文件里的函数 |
connections | 文件里的数据连接 |
datas | 文件里定义的全局变量 |
FunctionModel类
DataModel类
参数 | 意义 |
Name | 数据名 |
type | 数据类型 |
from | 数据来源 |
vars | 数据中包含的数据(例如结构体) |
subs | 数据中引用的函数(例如结构体) |
步骤3:基于Eclipse平台插件开发技术,根据提出的转换规则和中间模型,利用CDT 插件获取C语言相关内容,进而生成AADL模型。
1)C语言到中间模型转换的实现:
首先对于整个C语言工程的文件进行遍历,得到每个.c和.h的文件路径,并把这些文件路径存放在数组中。然后循环解析数组中含有的文件,得到每个文件包含的数据名称和函数名称,得到整个项目的结构索引。
再次对文件路径数组循环解析,这一次对于文件里节点的遍历就不再是简单的名称获取了,而是要得到节点的内容。
当节点的类型为IASTSimpleDeclaration时,说明此节点为数据定义类型。如果获取节点的属性为IASTCompositeTypeSpecifier,说明此节点为结构体。首先获取结构体的名称存入 DataModel的成员变量name里,然后将DataModel的成员变量type设置为“struct”,接着对结构体的内容进行解析,如果是普通的变量定义,添加在DataModel里的vars变量里;如果是嵌套的结构体类型,则递归解析结构体的函数adddata(),因为内部结构体可能存在重名,因此在内部结构体名字前加上外部结构体名称和下划线;如果是函数的引用,则添加在 DataModel的subs的成员变量里,在项目结构索引里找到函数的来源。
当节点的类型为IASTFunctionDefinition时,说明此节点为函数定义类型。首先在外部获取函数的名称,参数,返回值类型和函数体,并将这些参数作为出入参数传入FunctionModel 里,在FunctionModel类里对函数内容进行处理。
首先获得函数体内容里的所有节点IASTNode,并对每个IASTNode进行分析。以下举几个比较常见的节点类型来说。
如果节点是IASTDeclarationStatement类型,说明此节点是数据定义类型,进入添加局部变量的函数里对此节点进行解析。如果是没有初始化的定义,那么只添加到localVars里(例如int x;),
如果有初始化的定义,则不仅是在localVars里添加,还要在状态转移里添加上这一句初始化的语句(例如int x=num+2)。
如果节点是IASTIfStatement类型,说明此类型的if条件语句,直接跳转到对于if条件语句处理的函数doIfStatement()里,首先将此时的状态节点数存入栈ifstartID里(因为了能有多层嵌套),此数据为了记录if条件句开始时的节点数字。然后获取if条件句的条件,存入 ifstatecondition里,用作状态转移条件。然后对if里的内容和else里的内容进行解析,次解析跳回最外层的函数,嵌套使用。用id1和id2记录在if和else每个解析完毕后的stateID。在所有内容都解析完毕后,创建两个空的状态转移,将if和else结尾指向同一个状态,最后将 ifstateID出栈。
如果节点是IASTForStatement类型,说明此节点是for循环语句。直接跳转到
FunctionModel里对for语句进行处理的doForStatement()函数。因为for循环有循环因子的初始化过程,所以有一个单独的statement用来存储初始化的语句,起始状态就是for语句开始时的stateID,因此不需要像if一样将stateID入栈。将for循环的循环条件作为状态转移条件,然后将for循环内容像if一样放入最外层的函数循环解析。处理结束后需要添加两个额外的 statement,一个用于循环体尾部状态指向头部,一个用与开始时循环条件不满足的状态转移过程。
如果此节点是IASTWhileStatement类型,说明此节点为while循环语句。对于循环语句的处理,在FunctionModel类的doWhileStatement()函数里。因为while语句与for语句一样,不存在多个状态转移需要同一个开始状态,所以不要有用栈来保存起始状态数字,只需要用一个局部变量保存即可。首先得到while循环语句的循环条件,需要对循环条件进行进行一步处理,因为AADL模型不支持1代表true的表示。然后将while循环体内容上层的遍历解析函数进行嵌套,循环解析各种语句的嵌套使用。结束后创建两个statement,一个用来将循环尾部指向头部,一个用来当条件不成立的时候的状态转换。
如果此节点类型为IASTSwitchStatement类型,说明此节点为switch分支语句。对于switch 分支语句的处理在doSwitchStatement()函数里,因为每个分支的起始点都是switch语句开始时的stateID,因此在处理前将stateID加入到栈switchstartID中。将switch(key)中的key获取出来,每次状态转换的条件都是key=case语句的内容,对于每个case处理完毕后,都要将此时的stateID入栈,因为每个case处理完后都会进入后续的语句,所以需要对所有结尾进行合并。
以上的所有操作都只是为了获取函数的内容,将相应的语句转换到AADL模型的行为附件里的状态转移。但是上述操作会生成很多空的转移,例如,if语句如果没有else,则会有一个空语句表示if条件不满足时的状态转移情况;while语句有一个有结尾状态转入初始状态的空语句等等。所以,接下来就是对所有的statement列表进行合并。
合并的规则:statement列表从头开始遍历,如果第i个语句的状态转移条件为空(start-[]->end{…}),则从开始遍历到i,对所有以start为结束状态的状态转移和此状态转移合并,即此状态转移的结束状态变为end,状态转移的action内容进行添加。这样完成了状态约简。
2)中间模型到AADL模型转换的实现
第二阶段中间模型到AADL模型的转换。因为中间模型是为了更好地转换到AADL而设计的,所以中间模型到AADL模型的转换就更加快捷。
首先在GenerateAADL类的run()函数里获取上述生成的C语言工程的中间模型树ParseCProject.parsedProjectModel。因为每个文件都有一个自己的SingleCModel类来存储文件内容,所以对parsedProjectModel的SingleCModel链表进行遍历,得到每个文件的内容结构 model。
然后在调用GenerateCode.createheadFromSingleCModel函数将每个model的内容写入相应model.name.aadl文件里。在写入时首先对model进行判断,调用model的isProcess()函数来判断此model是否是进程组件,如果是进程组件则向文件里写入process,并将主函数作为进程调用的函数。对于model变量里的data链表,遍历按data的内容写入相应的data组件里;但对于model里的funs链表,function.name对于子程序的名字,function.para对应子程序的输入参数链表,function.subprogramcall对应子程序调用的其他子程序链表,function.dataAccess 对应子程序引用的全局变量链表,function.returnValue是子程序构件的返回值,以上是写入 subprogram构件的feature属性里的内容,下述则是写入行为附件里的:
·function.localVars是函数里的局部变量,对应写入行为附件里的variables属性里;
·function.stateID是所有的状态数量,对应写入行为附件里的states属性里;
·function.stateList是所有的状态转移,包含起始和终止状态,转移条件和动作内容,对应写入行为附件的transitions属性里。
函数写完后就是对线程的生成,AADL子程序是对线程功能的描述。所以线程的生成就比较简单,直接生成线程组件,在线程组件里调用线程功能的函数。
Claims (8)
1.一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:包括以下步骤:
步骤1:根据预设的抽取规则,获取C语言相关内容,所述C语言相关内容包括C语言到AADL功能行为模型抽取所需的数据信息和结构内容;
步骤2:将C语言相关内容对应存入事先设计的中间模型中;
步骤3:基于中间模型,实现AADL功能行为模型逆向重构;
所述抽取规则包括:C语言基本数据类型到AADL功能行为模型基本数据类型的抽取规则、C语言主函数到AADL功能行为模型进程的转换规则、C语言线程到AADL功能行为模型线程的转换规则、C语言函数到AADL功能行为模型行为附件的转换规则、C语言全局变量到AADL共享数据构件的转换规则;
其中,所述的C语言线程到AADL功能行为模型线程的转换规则包括:在主函数创建线程、以及声明C语言线程到AADL功能行为模型线程的转换为非周期性转换。
2.根据权利要求1所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:在进行步骤2之前还包括中间模型的设计步骤,具体为:
设计用于存放C语言到AADL功能行为模型转换的数据信息的类,包括用于存储每个文件的数据和函数的类、用于存储全局变量的类和用于存储函数名和被调用的函数列表的类;
设计用于存放C语言到AADL功能行为模型转换的结构内容的类,包括用于存储整个C语言工程的结构的类、用于存储一个文件的结构的类、用于存储函数内容的类和用于存储被定义的数据类型的类。
3.根据权利要求1所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:所述步骤2具体为:
对C语言相关内容进行遍历,得到每个.c和.h的文件路径,把这些文件路径存放在链表中;
循环解析链表中含有的文件,得到每个文件包含的数据名称和函数名称,得到结构索引;
循环解析链表中含有的文件,得到每个文件里的节点内容;
将每个文件的节点内容,存储在中间模型中:当节点类型为数据定义类型时,根据节点的属性,将其存储至中间模型对应的类的成员变量中;当节点类型为函数定义类型时,获取该节点内容并将其存储至中间模型对应的类中,在该类中对节点内容进行处理,该节点内容包括函数的名称、参数、返回值类型和函数体。
4.根据权利要求3所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:所述根据节点的属性将其存储至中间模型对应的类的成员变量中的步骤包括:
若节点为结构体,则获取该节点的名称存入中间模型的DataModel类的成员变量name里,将中间模型的DataModel类的成员变量type设置为“struct”,对该节点的内容进行解析;
若节点为变量定义,将其添加在中间模型的DataModel类里的成员变量vars里;
若节点为嵌套的结构体,则递归解析结构体的函数;
若节点为函数的引用,则添加在中间模型的DataModel类的成员变量subs里,在结构索引里找到函数的来源;
所述DataModel类为在中间模型中用于存储被定义的数据类型的类。
5.根据权利要求4所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:所述当节点类型为函数定义类型时,获取该节点内容并将其存储至中间模型对应的类中,在该类中对节点内容进行处理的步骤,具体为:
将节点内容中的参数作为出入参数传入中间模型的FunctionModel类里,在中间模型的FunctionModel类里对节点内容进行处理;所述FunctionModel类为在中间模型中用于存储函数内容的类;
获得节点内容中的函数体内容里的所有节点,并对每个节点进行分析,得到函数体内容,并将其相应的语句转换到AADL功能行为模型的行为附件里的状态转移;基于合并规则,对所有的状态转移进行合并,完成状态约简;所述合并规则为:对所有的状态转移从头开始遍历,若C语言第i个语句对应的状态转移条件为空,则从开始遍历到第i个语句,对所有以start为结束状态的状态转移和此状态转移合并,使此状态转移的结束状态变为end,状态转移的action内容进行添加。
6.根据权利要求3所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:所述步骤3具体为:将中间模型中存储的每个文件的内容对应写入model.name.aadl文件里。
7.根据权利要求6所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:将每个文件的内容对应写入model.name.aadl文件里的步骤具体包括:
将C语言的主函数向model.name.aadl文件里写入process,将C语言的主函数作为进程调用的函数;
遍历文件内容里的data链表,按照data链表内容写入model.name.aadl文件里相应的data组件里;
将文件内容里的funs链表、function.name对应于AADL功能行为模型子程序的名字、function.para对应AADL功能行为模型子程序的输入参数链表、function.subprogramcall对应AADL功能行为模型子程序调用的其他子程序链表、function.dataAccess对应AADL功能行为模型子程序引用的全局变量链表、function.returnValue是AADL功能行为模型子程序的返回值,均写入AADL功能行为模型子程序的feature属性里的内容;
文件内容里的函数的局部变量,对应写入行为附件里的variables属性里;
文件内容里的所有的状态数量,对应写入行为附件里的states属性里;
文件内容里的所有的状态转移,包括起始和终止状态、转移条件和动作内容,对应写入行为附件的transitions属性里。
8.根据权利要求1所述的一种基于源代码的AADL功能行为模型逆向重构方法,其特征在于:采用Eclipse CDT插件获取C语言相关内容。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910475582.1A CN110308932B (zh) | 2019-06-03 | 2019-06-03 | 一种基于源代码的aadl功能行为模型逆向重构方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910475582.1A CN110308932B (zh) | 2019-06-03 | 2019-06-03 | 一种基于源代码的aadl功能行为模型逆向重构方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110308932A CN110308932A (zh) | 2019-10-08 |
CN110308932B true CN110308932B (zh) | 2021-06-15 |
Family
ID=68074985
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910475582.1A Active CN110308932B (zh) | 2019-06-03 | 2019-06-03 | 一种基于源代码的aadl功能行为模型逆向重构方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110308932B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112463628B (zh) * | 2020-12-11 | 2022-03-29 | 北京航空航天大学 | 一种基于模型基框架的自主无人系统软件自适应演化方法 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101446895A (zh) * | 2008-12-18 | 2009-06-03 | 浙江大学 | 基于语法重构的代码级构件组装方法 |
CN101853159A (zh) * | 2010-05-20 | 2010-10-06 | 西北工业大学 | 一种对嵌入式软件架构进行重构的方法 |
CN108491196A (zh) * | 2018-02-07 | 2018-09-04 | 南京航空航天大学 | 一种aadl图形化功能行为建模方法 |
CN108563439A (zh) * | 2018-04-27 | 2018-09-21 | 南京航空航天大学 | 一种基于中间模型的aadl生成嵌入式系统代码方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8910113B2 (en) * | 2009-09-22 | 2014-12-09 | Adobe Systems Incorporated | Methods and systems for visual code refactoring |
-
2019
- 2019-06-03 CN CN201910475582.1A patent/CN110308932B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101446895A (zh) * | 2008-12-18 | 2009-06-03 | 浙江大学 | 基于语法重构的代码级构件组装方法 |
CN101853159A (zh) * | 2010-05-20 | 2010-10-06 | 西北工业大学 | 一种对嵌入式软件架构进行重构的方法 |
CN108491196A (zh) * | 2018-02-07 | 2018-09-04 | 南京航空航天大学 | 一种aadl图形化功能行为建模方法 |
CN108563439A (zh) * | 2018-04-27 | 2018-09-21 | 南京航空航天大学 | 一种基于中间模型的aadl生成嵌入式系统代码方法 |
Non-Patent Citations (2)
Title |
---|
基于AADL的软件重构工具设计与实现;李龙等;《计算机科学》;20110731;第38卷(第7期);全文 * |
复杂嵌入式实时系统体系结构设计与分析语言_AADL;杨志斌等;《软件学报》;20100531;第21卷(第5期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN110308932A (zh) | 2019-10-08 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
McKinney | Python for data analysis | |
US10970474B2 (en) | Method and system for editing text with a find and replace function leveraging derivations of the find and replace input | |
Kolovos et al. | The epsilon object language (EOL) | |
Schäling | The boost C++ libraries | |
Estublier et al. | Impact of software engineering research on the practice of software configuration management | |
Krahn et al. | Monticore: Modular development of textual domain specific languages | |
US7251777B1 (en) | Method and system for automated structuring of textual documents | |
KR101224813B1 (ko) | 관계 모델링 | |
US9600243B2 (en) | Sharing of first class objects across multiple interpreted programming languages | |
US7937694B2 (en) | Fast flattening of nested streams | |
Langer et al. | From UML profiles to EMF profiles and beyond | |
Cukic | Functional programming in C++ | |
CN110308932B (zh) | 一种基于源代码的aadl功能行为模型逆向重构方法 | |
Christiansen | Functional programming in Lean | |
JP4724387B2 (ja) | プログラム変換プログラム、プログラム変換装置およびプログラム変換方法 | |
Werner et al. | Role-based runtime model synchronization | |
CN114611714B (zh) | 模型处理方法、装置、系统、电子设备及存储介质 | |
Garlan et al. | Transformgen: automating the maintenance of structure-oriented environments | |
Jouault et al. | An amma/atl solution for the grabats 2009 reverse engineering case study | |
Knublauch | Case Study: Using Protege to Convert the Travel Ontology to UML and OWL. | |
Silva et al. | The ProjectIT-Studio, an integrated environment for the development of information systems | |
Kraas | Realizing Model Simplifications with QVT Operational Mappings. | |
Kozlovics et al. | The transformation-driven architecture for interactive systems | |
US20070192367A1 (en) | Generic expression framework for computer implementable expressions | |
Bandat | On the formal definition of PL/I |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |