CN111552465B - 一种p2020机器码程序到c语言源程序的溯源方法 - Google Patents
一种p2020机器码程序到c语言源程序的溯源方法 Download PDFInfo
- Publication number
- CN111552465B CN111552465B CN202010397904.8A CN202010397904A CN111552465B CN 111552465 B CN111552465 B CN 111552465B CN 202010397904 A CN202010397904 A CN 202010397904A CN 111552465 B CN111552465 B CN 111552465B
- Authority
- CN
- China
- Prior art keywords
- program
- language
- function
- source program
- statement
- 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 19
- 230000006870 function Effects 0.000 claims abstract description 196
- 238000013507 mapping Methods 0.000 claims abstract description 39
- 230000009191 jumping Effects 0.000 claims description 20
- 230000000052 comparative effect Effects 0.000 claims 1
- 238000012360 testing method Methods 0.000 abstract description 56
- 238000004458 analytical method Methods 0.000 abstract description 9
- 238000012795 verification Methods 0.000 abstract description 3
- 150000001875 compounds Chemical class 0.000 description 4
- 230000002159 abnormal effect Effects 0.000 description 3
- 238000007373 indentation Methods 0.000 description 3
- 101000699762 Homo sapiens RNA 3'-terminal phosphate cyclase Proteins 0.000 description 2
- 102100029143 RNA 3'-terminal phosphate cyclase Human genes 0.000 description 2
- IWUCXVSUMQZMFG-AFCXAGJDSA-N Ribavirin Chemical compound N1=C(C(=O)N)N=CN1[C@H]1[C@H](O)[C@H](O)[C@@H](CO)O1 IWUCXVSUMQZMFG-AFCXAGJDSA-N 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000001514 detection method Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 230000006855 networking Effects 0.000 description 1
- 238000011158 quantitative evaluation Methods 0.000 description 1
- 239000007787 solid Substances 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
- G06F8/31—Programming languages or programming paradigms
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F21/00—Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
- G06F21/10—Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
- G06F21/16—Program or content traceability, e.g. by watermarking
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/49—Partial evaluation
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明公开了一种P2020机器码程序到C语言源程序的溯源方法。通过本方法,用户可以从文件、函数定义、函数体等三层次实现P2020处理器机器码程序和其编译之前的C语言源程序之间的映射和溯源,包括P2020机器码程序文件、函数、函数内的每条语句到C语言源程序的映射和溯源。以达到在机器码程序层次上识别任务关键安全嵌入式软件编译期间是否插入非相关危害性代码的目的,同时根据溯源关系,还可以在机器码程序层次上实施测试覆盖的分析验证,保证嵌入式安全关键软件产品的安全性和可靠性,降低软件审核的成本。本方法可运用于高可靠、高安全领域,例如,航空领域、航天领域、交通运输领域、核电领域等。
Description
技术领域
本发明涉及PowerPC P2020处理器平台的机器码程序到C语言源程序的映射和溯源技术,尤其是涉及一种P2020机器码程序到C语言源程序的溯源方法。
背景技术
PowerPCP2020处理器在嵌入式领域已有广泛应用。P2020处理器是FreeScale公司推出的新一代QorIQTM通信处理器,该处理器在45nm技术低功耗平台上,最高可实现1.2GHz双核以及单核频率,具有高性能低功耗的特点,广泛应用于联网、电信、军事以及工业嵌入式系统应用领域。
PowerPCP2020处理器上可执行机器码程序的生成。用户采用C语言撰写的应用程序,需要在PC平台X86处理器上通过C语言编译器进行编译,生成可以在PowerPCP2020处理器上执行的机器码程序。目前,针对PowerPCP2020处理器上可执行机器码程序的生成,成熟和广泛应用的C语言编译器是国外开源网站提供的gcc(GNUCompiler Collection)编译套件,以及全球领先的智能互连系统软件供应商风河公司提供的diab编译器。
电信、军事以及工业嵌入式应用领域要求确保PowerPCP2020机器码程序和C语言源程序的功能一致性,以及时报告编译过程中非C语言源程序中要求的例外功能插入机器码程序,从而消除影响嵌入式系统可靠性和安全性的危险因素。例如,面向民用飞机的适航取证,机载软件一般采用RTCA发布的DO-178B标准来表明其适航符合性。在RTCA/DO-178B文档中软件的审核与分析相关部分,源程序的审核与分析是量化评估一个重要方面。目前,对于源程序的审核与分析,尤其是机器码程序和C语言源程序的功能可追溯性,需要程序员手工分析并建立映射关系,分析难度较高、效率较低。
C语言源程序和PowerPCP2020机器码程序之间的功能追溯性,也是机载软件结构测试覆盖率分析必须要关注的问题之一。例如,机载软件在编译C语言源程序的过程中会生成额外的PowerPCP2020机器码程序,包括初始化机器码程序、内置错误探测机器码程序、异常处理机器码程序等等。因此,对于任务关键安全软件,如果要在C语言源程序层级完成结构覆盖率分析,还应该分析C语言源程序和PowerPCP2020机器码程序之间的追溯性,并对不能追溯到C语言源程序的PowerPCP2020机器码程序进行分析和验证。
发明内容
为了解决以上技术问题,本发明提供一种P2020机器码程序到C语言源程序的溯源方法。即通过分析P2020处理器平台的机器码程序的编译过程,提出了一种由P2020处理器平台的机器码程序到C语言源程序的追溯性分析方法。
通过本发明,用户可以从文件、函数定义、函数体等三层次实现P2020处理器平台的机器码程序和其编译之前的C语言源程序之间的映射和溯源,包括P2020处理器平台的机器码文件、机器码函数、函数内的每条机器码指令到C语言源程序的映射和溯源,以防止编译期间插入非相关危害性代码带来的隐患。
本发明采取的技术方案是:一种P2020机器码程序到C语言源程序的溯源方法,其特征在于,有以下步骤:
步骤一:生成待追溯C语言源程序的抽象语法树
将C语言程序作为开源工具Pycparser的输入,采用该工具生成C语言源程序文件的抽象语法树,每个抽象语法树的节点包含语法结构的名称、孩子节点信息及该节点对应的C语言源程序中的行号信息;
步骤二:构建与C语言源程序抽象语法树节点对应的汇编语言指令序列的规则
识别C语言源程序的节点类型,根据每类节点的语法结构和实现功能的含义,分别建立与其对应的汇编语言指令集规则,针对各类C语言抽象语法树的所有节点类型进行整理,剔除未对应汇编语言指令的节点类型,给出以下十三类节点的汇编语言指令集规则,具体规则描述如下:
1)、C语言源程序中赋值语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Assignment节点,生成的汇编语言指令序列为:
(1-1)、1条数值读取指令;
(1-2)、1条存储指令。
2)、C语言源程序中二元操作表达式生成汇编语言指令序列的规则对于C语言源程序的抽象语法树BinaryOp节点,分下述三种情况生成相应的汇编语言指令:
(2-1)、如果BinaryOp表示的操作类型为“==”、“<”或“!=”,生成1条比较的汇编语言指令;
(2-2)、如果BinaryOp表示的操作类型为“-”或“+”,生成1条用于求和的汇编语言指令;
(2-3)、如果BinaryOp表示的操作类型为“||”或“&&”,生成1条条件跳转的汇编语言指令。
3)、C语言源程序中一元操作表达式生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的UnaryOp节点,其表示“++”或“--”操作符,生成的汇编语言指令序列为:
(3-1)、1条增加指令;
(3-2)、1条存储指令。
4)、C语言源程序中数组引用生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的ArrayRef节点,生成的汇编语言指令序列为:
(4-1)、以ArrayRef为根,识别数组下标表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(4-2)、1条数值读取指令;
(4-3)、1条计算数组引用元素偏移地址的求和指令。
5)、C语言程序中指针引用生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的PtrDecl节点,生成的汇编语言指令序列为:
(5-1)、以PtrDecl为根,识别指针引用表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(5-2)、1条数值读取指令。
6)、C语言源程序中if语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的If节点,生成的汇编语言指令序列为:
(6-1)、以If为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(6-2)、1条比较指令;
(6-3)、1条条件跳转指令,跳转至步骤(6-5);
(6-4)、如果if语句存在else部分的程序语句,生成1条无条件跳转指令,跳转至(6-6)中的第一条指令的位置;
(6-5)、以If为根,识别true情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(6-6)、如果if语句存在else部分的程序语句,以PtrDecl为根,识别false情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列。
7)、C语言源程序中For循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的For节点,生成的汇编语言指令序列为:
(7-1)、以For为根,识别初始化语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-2)、1条无条件跳转指令,跳转至(7-6)中的指令位置;
(7-3)、以For为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-4)、以For为根,识别控制条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-5)、以For为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-6)、1条比较指令;
(7-7)、1条条件跳转指令,跳转至(7-3)中的第一条指令的位置。
8)、C语言源程序中while循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的While节点,生成的汇编语言指令序列为:
(8-1)、无条件跳转指令,跳转至(8-4)中的指令位置;
(8-2)、以While为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(8-3)、以While为根,识别循环判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(8-4)、1条比较指令;
(8-5)、1条条件跳转指令,如果满足条件,则跳转至(8-2)中的第一条指令的位置。
9)、C语言源程序中do-while循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的DoWhile节点,生成的汇编语言指令序列为:
(9-1)、以DoWhile为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(9-2)、识别C语言源程序中do-while循环判断条件语句对应的抽象语法树,遍历该抽象语法树的各个节点类型,生成相应的汇编语言指令序列;
(9-3)、1条比较指令;
(9-4)、1条条件跳转指令,如果满足条件,跳转至(9-1)中的第一条指令的位置。
10)、C语言源程序中函数调用循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的FunCal函数调用节点,生成的汇编语言指令序列为:
(10-1)、以FunCal为根,识别各实际参数表达式对应的子树,遍历相应子树并根据各个节点类型,生成相应的汇编语言指令序列;
(10-2)、生成一条函数调用指令。
11)、C语言源程序中函数声明生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的FuncDecl函数声明节点,生成的汇编语言指令序列为:
(11-1)、函数体入口指令序列;
(11-2)、以FuncDecl为根,识别函数体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(11-3)、函数体出口指令序列。
12)、C语言源程序中返回语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Return节点,生成的汇编语言指令序列为:
(12-1)、1条存储指令;
(12-2)、1条无条件跳转指令,跳转至(11-3)中的第一条指令位置;
13)、C语言源程序中选择判断语句switch生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Switch节点,生成的汇编语言指令序列为:
(13-1)、以Switch为根,识别表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(13-2)、针对switch语句中的每个case语句,分别生成的汇编语言指令序列为:
a)、1条比较指令;
b)、1条条件跳转指令,跳转至下一个case语句对应的第一条指令的位置;
c)、以Switch为根,识别该case情况下的语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的指令序列;
d)、如果该case情况下包含break语句,则生成1条无条件跳转指令,跳转至该Switch语句之后的指令位置。
步骤三:建立PowerPC P2020机器码程序文件名到C语言源程序文件名的追溯关系
1)、针对PowerPC P2020机器码程序,解析其所有机器码程序文件的目标文件名,去掉目标文件名的后缀,生成机器码目标文件名列表,标记为objFileList。
2)、针对C语言源程序,解析其所有源文件的文件名,去掉文件名后缀,生成源文件名列表,标记为srcFileList。
3)、建立objFileList中文件名到C语言源程序文件名的追溯关系表格,标记为obj-srcFlieMapTable;obj-srcFlieMapTable包含三列,即PowerPC P2020机器码程序目标文件名所在的目录、C语言源程序文件名所在的目录、文件名。
4)、分析机器码文件名列表objFileList和源文件列表srcFileList中的文件名是否相等,如果相等,则匹配成功,将匹配成功的文件名对应的文件目录和文件名存储在obj-srcFlieMapTable中,obj-srcFlieMapTable中第三列文件名,存储的是机器码程序文件和与之匹配成功的源文件的共同文件名。
5)、根据PowerPC P2020机器码程序文件名到C语言源程序文件名的映射关系,执行步骤四。
步骤四:建立PowerPC P2020机器码程序函数名到C语言源程序函数名的追溯关系
1)、针对PowerPC P2020机器码程序生成其所有函数名列表
PowerPC P2020机器码程序文件遵循ELF格式,解析ELF格式中的符号表段,即symtab段,识别函数名、函数名所在的行号,以及该函数名所在的目标文件名,构造PowerPCP2020机器码程序所有函数定义的列表,命名为objFunList,列表中的每个元素包括三个属性信息:函数名、行号、目标文件名;其中,目标文件名是机器码程序和C语言源程序映射成功的共同的文件名。
2)、针对C语言源程序生成其所有函数名列表
(1)、根据步骤一中生成的抽象语法树,搜索抽象语法树中所有的FuncDef节点,每个以节点FuncDef为根的子树,对应C语言源程序的函数定义;
(2)、针对C语言源程序,根据每个FuncDef节点的属性信息,识别该节点对应的函数名、函数名所在的行号以及该函数所在的源文件名;
(3)、构造C语言源程序所有函数定义的列表,命名为srcFunList,列表中的每个元素包括三个属性信息:函数名、行号、源文件名;其中,源文件名是机器码程序和C语言源程序映射成功的共同的文件名。
3)、建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系
分析PowerPC P2020机器码程序函数列表objFunList和C语言源程序列表srcFunList,根据步骤三实现的文件追溯关系表obj-srcFlieMapTable,针对PowerPCP2020机器码程序所有函数名列表objFunList和C语言源程序所有函数名列表srcFunList中目标文件名和源文件名一致的两个元素,比较这两个元素的函数名是否相等,如果相等,则匹配成功,建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系表格,标记为obj-srcFunNameMapTable,将匹配成功的函数名信息存入该表格中,表格包含两列,即objFunList列表中的每个元素、srcFunList列表中的每个元素。
4)、根据PowerPC P2020机器码程序函数名到C语言源程序函数名的映射关系,执行步骤五至步骤7,继续生成函数体内的程序语句的映射关系。
步骤五:生成PowerPC P2020机器码程序对应的汇编语言程序,并建立机器码程序函数模块与汇编语言程序函数模块之间的映射关系
1)、针对PowerPC P2020机器码程序文件ELF格式中的可执行代码段,即text段,采用反汇编命令,将text段的可执行代码反汇编,生成其对应的汇编语言程序,标记为Ass。
2)、根据Ass中的函数名标签,将Ass中的语句序列划分为函数模块的形式,每个函数模块包含函数名及函数体的语句序列。
3)、针对Ass中每个函数模块中的语句序列建立机器码程序语句与汇编语言程序语句之间的映射关系,存储在表格中,将该表格标记为obj-assFunMapTable;表格包括三列:第一列是文件名,第二列是函数名,第三列是机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表,该子列表包含三列,即语句行号、机器语言程序语句,汇编语言程序语句;obj-assFunMapTable中的文件名是步骤三中映射成功的机器码程序文件名,函数名是基于步骤四中映射成功的机器码程序函数名。
步骤六:生成C语言源程序中各个函数体对应的汇编语言指令序列,建立汇编语言指令序列与C语言源程序各函数体中语句之间的追溯关系
1)、根据步骤一生成的抽象语法树,识别C语言源程序所有函数定义节点FuncDecl,针对每个节点FuncDecl,遍历以该节点为根的子树,根据步骤二中的规则,分别生成对应的汇编语言指令序列,同时,将各节点生成的汇编语言指令序列与FuncDecl所在的C语言源程序函数体中语句行号进行关联。
2)、最后,建立汇编语言指令序列与C语言源程序函数体中的语句之间的追溯关系列表,标记为ass-srcFunBodyMapTable,列表中第一列存储C语言源程序的函数名,第二列为该函数体内C语言源程序的语句行号,第三列为汇编语言指令序列,该指令序列与第二列C语言源程序的语句行号进行关联。
步骤七:建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系
1)、针对步骤五生成的obj-assFunMapTable表格,将其第二列中的每个PowerPCP2020机器码程序函数名取出,标记为assFunc,同时,将表obj-assFunMapTable第三列内容机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表标记为obj-assFunBodyMapTable。
2)、查找ass-srcFunBodyMapTable中与assFunc匹配的行,将ass-srcFunBodyMapTable中的第三列汇编语言指令序列标记为assCommanList。
3)、建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系表格,标记为obj-srcFunBodyMapTable。
4)、顺次取出obj-assFunBodyMapTable列表中第三列的每条汇编语言程序语句,将其标记为assCodeLine,然后分别执行以下步骤:
(1)、取出该汇编语言程序语句中的指令,标记为command;
(2)、将command与assCommanList中的汇编指令顺次进行匹配;
(3)、如果两条指令相等,则匹配成功,将匹配成功的信息存入obj-srcFunBodyMapTable,该表格包括四列,每列的详细信息为:
第一列为函数名assFunc;
第二列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句行号;
第三列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句;
第四列为表格ass-srcFunBodyMapTable中C语言源程序的相应函数体内语句行号;
(4)、将assCommanList中匹配成功的指令从assCommanList中删除。
本发明为达到从PowerPC P2020机器码程序自动化追溯到其C语言源程序的目的,首先通过步骤一和步骤二生成C语言源程序的抽象语法树,并构建与C语言源程序抽象语法树节点对应的汇编语言指令序列的规则;然后,分析PowerPC P2020机器码程序文件名和C语言源程序文件名,建立二者的映射关系,详见步骤三;其次,本发明分析PowerPC P2020机器码程序的函数名与C语言源程序抽象语法树的函数名节点,建立PowerPC P2020机器码程序的函数名与C语言源程序函数名之间的映射关系,详见步骤四;最后,本发明分析PowerPCP2020机器码程序函数体内的语句序列及其与C语言源程序函数体抽象语法树节点的对应关系,从而建立PowerPC P2020机器码程序函数体语句序列和C语言源程序函数体语句之间的映射关系,详见步骤五至步骤七,最终实现PowerPC P2020机器码程序自动化追溯到其C语言源程序的目的。
通过本发明,用户可以分别从文件层次、函数定义层次、函数体语句层次上,实现从PowerPC P2020机器码程序到C语言源程序的自动化追溯。其中,文件层次上的映射用于对生成的PowerPC P2020机器码程序目标文件进行追溯,搜索到生成该目标文件的C程序源文件;函数定义层次上的映射,用于对PowerPC P2020机器码程序目标文件中某个函数定义进行追溯,搜索到其对应的C语言程序源文件中的某个函数定义;函数体层次上的映射,用于对PowerPC P2020机器码程序目标文件函数体中的语句序列进行追溯,搜索到其对应的C语言程序源文件函数体中的语句。根据以上三个层次的映射,用户可以在对基于PowerPCP2020平台的软件项目的代码审核中,对软件项目的PowerPC P2020机器码目标程序,进行自动化的C语言源程序追溯,及时报告PowerPC P2020机器码目标码程序插入的例外异常代码,并报告面向C语言源程序设计的测试用例,从PowerPC P2020机器码目标码程序看,测试是否充分,以保证软件产品的质量,减轻软件审核的成本。
综上,步骤一至步骤七构成了本发明的技术方案,从PowerPC P2020机器码文件和C语言源程序文件名之间的映射技术、PowerPC P2020机器码程序函数名和C语言源程序函数名之间的映射技术,以及PowerPC P2020机器码程序函数体语句序列和C语言源程序函数体语句之间的映射技术等三方面出发,分别通过步骤三建立的obj-srcFlieMapTable、步骤四建立的obj-srcFunNameMapTable以及步骤七建立的obj-srcFunBodyMapTable,实现了一种P2020机器码到C语言源程序的溯源方法。
本发明产生的有益效果:
1、本发明实现了由PowerPC P2020机器码程序到C语言源程序的映射和溯源,使任务关键安全软件项目在机器码程序层次上能够进行溯源,及时报告PowerPC P2020机器码目标码程序插入的例外异常代码,防止其带来的安全隐患,保证嵌入式安全关键软件产品的安全性和可靠性。
2、本发明也可以在对软件项目进行代码层次的审核和分析时,辅助测试人员进行机器码程序追溯验证,实现在机器码级别的机载软件结构测试覆盖率分析,减轻软件审核的成本。
3、本发明在保证采用P2020处理器的嵌入式应用系统高可靠、高安全等目标方面,为超高可靠嵌入式系统的最终研制提供坚实的技术基础之一。本发明可运用于高可靠、高安全领域,例如,航空领域、航天领域、交通运输领域、核电领域等。
具体实施方式
以下结合应用实例对本发明做进一步描述。
一、C语言源程序文件目录结构和test.c文件中函数query的源代码实例
C语言源程序目录结构如下:
根目录为/Users/admin/workspace/src,在该根目录下,包含4个.c为后缀的文件,文件名分别为:
grid.c;
main.c;
test.c;
tree.c。
二、test.c文件中函数query的源代码实例
test.c文件中函数query的源代码如下所示,其在文件test.c中的语句行号为第63行-90行:
63 int trie_query(Trie*trie,char*c){;
64 if(trie==NULL);
65{;
66 return 0;
67};
68 char*p=c;
69 Trie*temp=trie;
70 int ret=0;
71 if(temp->subtries==NULL);
72{;
73 return 0;
74};
75 while(*p!='\0');
76{;
77 if(temp->subtries[*p-'a']!=NULL&&temp->subtries[*p-'a']->value==*p);
78{;
79 temp=temp->subtries[*p-'a'];
80 p++;
81 continue;
82};
83 break;
84};
85 if(*p=='\0');
86{;
87 ret=1;
88};
89 return ret;
90}。
三、PowerPC P2020机器码程序目录结构
将上述目录为/Users/admin/workspace/src中的4个.c文件,采用风河公司提供的gcc编译器,将文件编译为PowerPCP2020处理器上可以执行的机器码程序,对应的目标码文件所在的目录为/Users/admin/workspace/obj,目录文件名分别为:
grid.o;
main.o;
test.o;
tree.o。
四、根据技术方案中的步骤一,以trie_query函数为例,生成C语言源程序的抽象语法树
根据技术方案中的步骤一,将上述C语言源程序文件grid.c、main.c、test.c、tree.c,作为开源工具Pycparser的输入,生成相应的抽象语法树。现以trie_query函数为例,给出其对应的下述部分抽象语法树,用不同的空格个数表示不同的缩进格式,缩进层次代表了抽象语法树的结构层次,例如,FuncDef为根节点,根据第一层缩进,其直接的孩子节点包括:Decl和Compound。每个节点的信息包括语法结构的名称、孩子节点信息及该节点对应的C语言源程序中的行号信息,例如,FuncDef节点是该节点语法结构的名称、第一个孩子指向Decl,第二个孩子指向Compound,该节点的行号是字符串“at test.c:63:6”中的63。
FuncDef:(at test.c:63:6)
Decl:trie_query,[],[],[](at test.c:63:6)
FuncDecl:(at test.c:63:6)
ParamList:(at test.c:63:22)
Decl:trie,[],[],[](at test.c:63:22)
PtrDecl:[](at test.c:63:22)
TypeDecl:trie,[](at test.c:63:23)
IdentifierType:['Trie'](at test.c:63:17)
Decl:c,[],[],[](at test.c:63:33)
PtrDecl:[](at test.c:63:33)
TypeDecl:c,[](at test.c:63:34)
IdentifierType:['char'](at test.c:63:28)
TypeDecl:trie_query,[](at test.c:63:6)
IdentifierType:['bool'](at test.c:63:1)
Compound:(at test.c:63:1)
If:(at test.c:64:2)
BinaryOp:==(at test.c:64:6)
ID:trie(at test.c:64:6)
ID:NULL(at test.c:64:12)
Compound:(at test.c:65:1)
Return:(at test.c:66:3)
Constant:int,0(at test.c:66:10)。
五、根据技术方案中的步骤二,C语言源程序抽象语法树节点对应的汇编语言指令序列举例
现以抽象语法树节点Assignment、Return、If、BinaryOp和UnaryOp为例,对步骤二中的规则进行示例。
(1)针对抽象语法树中的节点Assignment,与其对应的汇编语言指令序列为2条:
数值读取指令:li;
存储指令:st。
(2)针对抽象语法树中的节点BinaryOp,与其对应的汇编语言指令序列为1条
比较指令:cmp。
(3)针对抽象语法树中的节点UnaryOp,与其对应的汇编语言指令序列为2条:
增加指令addi;
存储指令st。
六、根据技术方案中的步骤三,生成的PowerPC P2020机器码程序文件名到C语言源程序文件名的追溯关系表格obj-srcFlieMapTable,如表1所示。
表1 obj-srcFlieMapTable
七、根据技术方案中的步骤四,建立PowerPC P2020机器码程序test.o的函数名和C语言源程序test.c的函数名之间的追溯关系表格。
以PowerPC P2020机器码程序文件test.o为例,生成其所有函数名列表根据步骤四中的子步骤1),对于上述PowerPC P2020机器码程序文件test.o,采用gcc编译器提供的“objdump-t”命令,根据解析test.o文件ELF格式中symtab段,得到test.o文件的符号表信息,每条信息都包含了test.o文件中的函数名以及函数名所在的语句行号。
八、分析上述符号表实例,将test.o文件的函数定义存储在列表objFunList中,如表2所示。
表2 objFunList
函数名 | 行号 | 目标文件名 |
trie_create | 0 | test |
trie_insert | c0 | test |
trie_query | 258 | test |
trie_remove | 3b4 | test |
testMain | 3d0 | test |
九、以C语言源程序文件test.c为例,生成其所有函数名列表
根据步骤四中的子步骤2),识别test.c的抽象语法树,搜索抽象语法树中所有的FuncDef节点,根据每个FuncDef节点的属性信息,识别该节点对应的函数名、函数名所在的行号,以及该函数所在的源文件名,构造的C语言源程序所有函数定义的列表srcFunList,如表3所示。
表3 srcFunList
函数名 | 行号 | 源文件名 |
trie_create | 12 | test |
trie_insert | 28 | test |
trie_query | 63 | test |
trie_remove | 91 | test |
testMain | 96 | test |
十、建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系表obj-srcFunNameMapTable。
根据步骤四的子步骤3),分析PowerPC P2020机器码程序函数列表objFunList和C语言源程序列表srcFunList,建立的PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系表obj-srcFunNameMapTable,如表4所示。
表4 obj-srcFunNameMapTable
十一、根据技术方案中的步骤五,生成PowerPC P2020机器码程序test.o对应的汇编语言程序,并建立机器码程序函数模块与test.o函数模块之间的映射关系。
按照步骤五中的子步骤1),使用“objdump–d”命令提取test.o,将其.text段的可执行代码反汇编,以函数trie_query为例,生成其对应的汇编语言程序Ass,其中,每条反汇编语句包括3部分,例如,Ass中一条汇编语句为“258:94 21ff c0 stwu r1,-64(r1)”,该语句的第1部分“258”表示机器码语句行号、第2部分“94 21ff c0”表示机器码语句,第3部分“r1,-64(r1)”表示汇编语言程序语句。
十二、按照步骤五中的子步骤3),将机器码程序语句与汇编语言程序语句之间的映射关系存储在obj-assFunMapTable中,如表5所示。
表5 obj-assFunMapTable
十三、根据技术方案中的步骤六,建立汇编语言指令序列与C语言源程序test.c各函数体中语句之间的追溯关系
以test.c文件中的trie_query函数为例,识别test.c中函数trie_query对应的节点FuncDecl,遍历以该节点为根的子树,根据步骤二中的规则,生成与该子树对应的汇编语言指令序列,同时,将该子树中各节点生成的汇编语言指令序列,建立汇编语言指令序列与C语言源程序函数体中的语句之间的追溯关系列表ass-srcFunBodyMapTable,如表6所示。
表6 ass-srcFunBodyMapTable
十四、根据技术方案中的步骤七,建立PowerPC P2020机器码程序函数trie_query的语句序列与C语言源程序函数trie_query的语句之间的追溯关系。
根据步骤七的子步骤1),以函数trie_query为例,将表5所示obj-assFunMapTable表格第3列,标记为obj-assFunBodyMapTable。
查找表6所示ass-srcFunBodyMapTable中第3列汇编语言指令序列,标记为assCommanList。
建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系表格obj-srcFunBodyMapTable,如表7所示。
针对obj-assFunBodyMapTable列表中第3列的每条汇编语言程序语句,例如,第一条汇编语言程序语句为stwu r1,-64(r1),取出该汇编语言程序语句对应的汇编语言指令为stwu。
顺次将其与汇编语言指令序列assCommanList中的一条汇编指令进行匹配,例如,assCommanList中第一条指令为stwu。
如果两条指令相等,则匹配成功,将匹配成功的相关信息存入obj-srcFunBodyMapTable,例如,将匹配成功的“stwu指令”的相关信息作为一行存入该表格。
第1列为函数名trie_query。
第2列为匹配成功的为obj-assFunBodyMapTable中assCodeLine所在行的第1列内容,例如,表5中stwu所在的行号为258。
第3列为obj-assFunBodyMapTable中assCodeLine所在行的第2列内容,即相应PowerPC P2020机器码程序语句,即“94 21ff c0”。
第4列为ass-srcFunBodyMapTable中与“指令stwu”匹配行的第2列内容,例如,表6中stwu所在的行号为63。
表7 obj-srcFunBodyMapTable
至此,PowerPC P2020机器码程序到C语言源程序的可追溯性结果可以通过表1,表4,表7进行展示,其中,表1是PowerPC P2020机器码程序文件名和C语言源程序文件名之间的映射关系;表4是PowerPC P2020机器码程序函数名和C语言源程序函数名之间的映射关系,表7是PowerPC P2020机器码程序函数体语句序列和C语言源程序函数体语句之间的映射关系。
Claims (1)
1.一种P2020机器码程序到C语言源程序的溯源方法,其特征在于,有以下步骤:
步骤一:生成待追溯C语言源程序的抽象语法树
将C语言程序作为开源工具Pycparser的输入,采用该工具生成C语言源程序文件的抽象语法树,每个抽象语法树的节点包含语法结构的名称、孩子节点信息及该节点对应的C语言源程序中的行号信息;
步骤二:构建与C语言源程序抽象语法树节点对应的汇编语言指令序列的规则
识别C语言源程序的节点类型,根据每类节点的语法结构和实现功能的含义,分别建立与其对应的汇编语言指令集规则,针对各类C语言抽象语法树的所有节点类型进行整理,剔除未对应汇编语言指令的节点类型,给出以下十三类节点的汇编语言指令集规则,具体规则描述如下:
1)、C语言源程序中赋值语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Assignment节点,生成的汇编语言指令序列为:
(1-1)、1条数值读取指令;
(1-2)、1条存储指令;
2)、C语言源程序中二元操作表达式生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树BinaryOp节点,分下述三种情况生成相应的汇编语言指令:
(2-1)、如果BinaryOp表示的操作类型为“==”、“<”或“!=”,生成1条比较的汇编语言指令;
(2-2)、如果BinaryOp表示的操作类型为“-”或“+”,生成1条用于求和的汇编语言指令;
(2-3)、如果BinaryOp表示的操作类型为“||”或“&&”,生成1条条件跳转的汇编语言指令;
3)、C语言源程序中一元操作表达式生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的UnaryOp节点,其表示“++”或“- -”操作符,生成的汇编语言指令序列为:
(3-1)、1条增加指令;
(3-2)、1条存储指令;
4)、C语言源程序中数组引用生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的ArrayRef节点,生成的汇编语言指令序列为:
(4-1)、以ArrayRef为根,识别数组下标表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(4-2)、1条数值读取指令;
(4-3)、1条计算数组引用元素偏移地址的求和指令;
5)、C语言程序中指针引用生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的PtrDecl节点,生成的汇编语言指令序列为:
(5-1)、以PtrDecl为根,识别指针引用表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(5-2)、1条数值读取指令;
6)、C语言源程序中if语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的If节点,生成的汇编语言指令序列为:
(6-1)、以If为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(6-2)、1条比较指令;
(6-3)、1条条件跳转指令,跳转至步骤(6-5);
(6-4)、如果if语句存在else部分的程序语句,生成1条无条件跳转指令,跳转至(6-6)中的第一条指令的位置;
(6-5)、以If为根,识别true情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(6-6)、如果if语句存在else部分的程序语句,以PtrDecl为根,识别false情况下语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
7)、C语言源程序中For循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的For节点,生成的汇编语言指令序列为:
(7-1)、以For为根,识别初始化语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-2)、1条无条件跳转指令,跳转至(7-6)中的指令位置;
(7-3)、以For为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-4)、以For为根,识别控制条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-5)、以For为根,识别判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(7-6)、1条比较指令;
(7-7)、1条条件跳转指令,跳转至(7-3)中的第一条指令的位置;
8)、C语言源程序中while循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的While节点,生成的汇编语言指令序列为:
(8-1)、无条件跳转指令,跳转至(8-4)中的指令位置;
(8-2)、以While为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(8-3)、以While为根,识别循环判断条件语句对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(8-4)、1条比较指令;
(8-5)、1条条件跳转指令,如果满足条件,则跳转至(8-2)中的第一条指令的位置;
9)、C语言源程序中do-while循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的DoWhile节点,生成的汇编语言指令序列为:
(9-1)、以DoWhile为根,识别循环体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(9-2)、识别C语言源程序中do-while循环判断条件语句对应的抽象语法树,遍历该抽象语法树的各个节点类型,生成相应的汇编语言指令序列;
(9-3)、1条比较指令;
(9-4)、1条条件跳转指令,如果满足条件,跳转至(9-1)中的第一条指令的位置;
10)、C语言源程序中函数调用循环生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的FunCal函数调用节点,生成的汇编语言指令序列为:
(10-1)、以FunCal为根,识别各实际参数表达式对应的子树,遍历相应子树并根据各个节点类型,生成相应的汇编语言指令序列;
(10-2)、生成一条函数调用指令;
11)、C语言源程序中函数声明生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的FuncDecl函数声明节点,生成的汇编语言指令序列为:
(11-1)、函数体入口指令序列;
(11-2)、以FuncDecl为根,识别函数体中语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(11-3)、函数体出口指令序列;
12)、C语言源程序中返回语句生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Return节点,生成的汇编语言指令序列为:
(12-1)、1条存储指令;
(12-2)、1条无条件跳转指令,跳转至(11-3)中的第一条指令位置;
13)、C语言源程序中选择判断语句switch生成汇编语言指令序列的规则
对于C语言源程序的抽象语法树的Switch节点,生成的汇编语言指令序列为:
(13-1)、以Switch为根,识别表达式对应的子树,遍历该子树并根据各个节点类型,生成相应的汇编语言指令序列;
(13-2)、针对switch语句中的每个case语句,分别生成的汇编语言指令序列为:
a)、1条比较指令;
b)、1条条件跳转指令,跳转至下一个case语句对应的第一条指令的位置;
c)、以Switch为根,识别该case情况下的语句序列对应的子树,遍历该子树并根据各个节点类型,生成相应的指令序列;
d)、如果该case情况下包含break语句,则生成1条无条件跳转指令,跳转至该Switch语句之后的指令位置;
步骤三:建立PowerPC P2020机器码程序文件名到C语言源程序文件名的追溯关系
1)、针对PowerPC P2020机器码程序,解析其所有机器码程序文件的目标文件名,去掉目标文件名的后缀,生成机器码目标文件名列表,标记为objFileList;
2)、针对C语言源程序,解析其所有源文件的文件名,去掉文件名后缀,生成源文件名列表,标记为srcFileList;
3)、建立objFileList中文件名到C语言源程序文件名的追溯关系表格,标记为obj-srcFlieMapTable;obj-srcFlieMapTable包含三列,即PowerPC P2020机器码程序目标文件名所在的目录、C语言源程序文件名所在的目录、文件名;
4)、分析机器码文件名列表objFileList和源文件列表srcFileList中的文件名是否相等,如果相等,则匹配成功,将匹配成功的文件名对应的文件目录和文件名存储在obj-srcFlieMapTable中,obj-srcFlieMapTable中第三列文件名,存储的是机器码程序文件和与之匹配成功的源文件的共同文件名;
5)、根据PowerPC P2020机器码程序文件名到C语言源程序文件名的映射关系,执行步骤四;
步骤四:建立PowerPC P2020机器码程序函数名到C语言源程序函数名的追溯关系
1)、针对PowerPC P2020机器码程序生成其所有函数名列表
PowerPC P2020机器码程序文件遵循ELF格式,解析ELF格式中的符号表段,即symtab段,识别函数名、函数名所在的行号,以及该函数名所在的目标文件名,构造PowerPC P2020机器码程序所有函数定义的列表,命名为objFunList,列表中的每个元素包括三个属性信息:函数名、行号、目标文件名;其中,目标文件名是机器码程序和C语言源程序映射成功的共同的文件名;
2)、针对C语言源程序生成其所有函数名列表
(1)、根据步骤一中生成的抽象语法树,搜索抽象语法树中所有的FuncDef节点,每个以节点FuncDef为根的子树,对应C语言源程序的函数定义;
(2)、针对C语言源程序,根据每个FuncDef节点的属性信息,识别该节点对应的函数名、函数名所在的行号以及该函数所在的源文件名;
(3)、构造C语言源程序所有函数定义的列表,命名为srcFunList,列表中的每个元素包括三个属性信息:函数名、行号、源文件名;其中,源文件名是机器码程序和C语言源程序映射成功的共同的文件名;
3)、建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系
分析PowerPC P2020机器码程序函数列表objFunList和C语言源程序列表srcFunList,根据步骤三实现的文件追溯关系表obj-srcFlieMapTable,针对PowerPC P2020机器码程序所有函数名列表objFunList和C语言源程序所有函数名列表srcFunList中目标文件名和源文件名一致的两个元素,比较这两个元素的函数名是否相等,如果相等,则匹配成功,建立PowerPC P2020机器码程序函数名和C语言源程序函数名之间的追溯关系表格,标记为obj-srcFunNameMapTable,将匹配成功的函数名信息存入该表格中,表格包含两列,即objFunList列表中的每个元素、srcFunList列表中的每个元素;
4)、根据PowerPC P2020机器码程序函数名到C语言源程序函数名的映射关系,执行步骤五至步骤7,继续生成函数体内的程序语句的映射关系;
步骤五:生成PowerPC P2020机器码程序对应的汇编语言程序,并建立机器码程序函数模块与汇编语言程序函数模块之间的映射关系
1)、针对PowerPC P2020机器码程序文件ELF格式中的可执行代码段,即text段,采用反汇编命令,将text段的可执行代码反汇编,生成其对应的汇编语言程序,标记为Ass;
2)、根据Ass中的函数名标签,将Ass中的语句序列划分为函数模块的形式,每个函数模块包含函数名及函数体的语句序列;
3)、针对Ass中每个函数模块中的语句序列建立机器码程序语句与汇编语言程序语句之间的映射关系,存储在表格中,将该表格标记为obj-assFunMapTable;表格包括三列:第一列是文件名,第二列是函数名,第三列是机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表,该子列表包含三列,即语句行号、机器语言程序语句,汇编语言程序语句;obj-assFunMapTable中的文件名是步骤三中映射成功的机器码程序文件名,函数名是基于步骤四中映射成功的机器码程序函数名;
步骤六:生成C语言源程序中各个函数体对应的汇编语言指令序列,建立汇编语言指令序列与C语言源程序各函数体中语句之间的追溯关系
1)、根据步骤一生成的抽象语法树,识别C语言源程序所有函数定义节点FuncDecl,针对每个节点FuncDecl,遍历以该节点为根的子树,根据步骤二中的规则,分别生成对应的汇编语言指令序列,同时,将各节点生成的汇编语言指令序列与FuncDecl所在的C语言源程序函数体中语句行号进行关联;
2)、最后,建立汇编语言指令序列与C语言源程序函数体中的语句之间的追溯关系列表,标记为ass-srcFunBodyMapTable,列表中第一列存储C语言源程序的函数名,第二列为该函数体内C语言源程序的语句行号,第三列为汇编语言指令序列,该指令序列与第二列C语言源程序的语句行号进行关联;
步骤七:建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系
1)、针对步骤五生成的obj-assFunMapTable表格,将其第二列中的每个PowerPC P2020机器码程序函数名取出,标记为assFunc,同时,将表obj-assFunMapTable第三列内容机器码程序函数模块中语句与汇编语言程序函数模块中语句之间的映射关系子列表标记为obj-assFunBodyMapTable;
2)、查找ass-srcFunBodyMapTable中与assFunc匹配的行,将ass-srcFunBodyMapTable中的第三列汇编语言指令序列标记为assCommanList;
3)、建立PowerPC P2020机器码程序函数体语句序列与C语言源程序函数体语句之间的追溯关系表格,标记为obj-srcFunBodyMapTable;
4)、顺次取出obj-assFunBodyMapTable列表中第三列的每条汇编语言程序语句,将其标记为assCodeLine,然后分别执行以下步骤:
(1)、取出该汇编语言程序语句中的指令,标记为command;
(2)、将command与assCommanList中的汇编指令顺次进行匹配;
(3)、如果两条指令相等,则匹配成功,将匹配成功的信息存入obj-srcFunBodyMapTable,该表格包括四列,每列的详细信息为:
第一列为函数名assFunc;
第二列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句行号;
第三列为表格obj-assFunBodyMapTable中相应PowerPC P2020机器码程序语句;
第四列为表格ass-srcFunBodyMapTable中C语言源程序的相应函数体内语句行号;
(4)、将assCommanList中匹配成功的指令从assCommanList中删除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010397904.8A CN111552465B (zh) | 2020-05-12 | 2020-05-12 | 一种p2020机器码程序到c语言源程序的溯源方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010397904.8A CN111552465B (zh) | 2020-05-12 | 2020-05-12 | 一种p2020机器码程序到c语言源程序的溯源方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111552465A CN111552465A (zh) | 2020-08-18 |
CN111552465B true CN111552465B (zh) | 2022-07-05 |
Family
ID=72003597
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010397904.8A Active CN111552465B (zh) | 2020-05-12 | 2020-05-12 | 一种p2020机器码程序到c语言源程序的溯源方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111552465B (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5946484A (en) * | 1997-05-08 | 1999-08-31 | The Source Recovery Company, Llc | Method of recovering source code from object code |
FR2942559A1 (fr) * | 2009-02-24 | 2010-08-27 | Eads Europ Aeronautic Defence | Procede de protection du code source d'un programme d'ordinateur. |
CN107391368A (zh) * | 2017-07-13 | 2017-11-24 | 中国航发控制系统研究所 | 一种航空机载软件中源代码与目标代码一致性的分析方法 |
CN107943481A (zh) * | 2017-05-23 | 2018-04-20 | 清华大学 | 基于多模型的c语言程序代码规范构造方法 |
CN110659200A (zh) * | 2018-06-29 | 2020-01-07 | 中国航发商用航空发动机有限责任公司 | 航空机载软件的源码和目标码对比分析方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9767004B2 (en) * | 2014-06-16 | 2017-09-19 | Symantec Corporation | Dynamic call tracking method based on CPU interrupt instructions to improve disassembly quality of indirect calls |
-
2020
- 2020-05-12 CN CN202010397904.8A patent/CN111552465B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5946484A (en) * | 1997-05-08 | 1999-08-31 | The Source Recovery Company, Llc | Method of recovering source code from object code |
FR2942559A1 (fr) * | 2009-02-24 | 2010-08-27 | Eads Europ Aeronautic Defence | Procede de protection du code source d'un programme d'ordinateur. |
CN107943481A (zh) * | 2017-05-23 | 2018-04-20 | 清华大学 | 基于多模型的c语言程序代码规范构造方法 |
CN107391368A (zh) * | 2017-07-13 | 2017-11-24 | 中国航发控制系统研究所 | 一种航空机载软件中源代码与目标代码一致性的分析方法 |
CN110659200A (zh) * | 2018-06-29 | 2020-01-07 | 中国航发商用航空发动机有限责任公司 | 航空机载软件的源码和目标码对比分析方法及系统 |
Non-Patent Citations (1)
Title |
---|
"民用飞机 A 级别机载软件项目源代码到";童岳威等;《科技视界》;20161231;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111552465A (zh) | 2020-08-18 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7730448B2 (en) | Layered type systems | |
CN100385399C (zh) | 用于多个异常处理模型的中间表示的方法和系统 | |
CN103559449B (zh) | 一种代码改动的检测方法及装置 | |
CN102955697B (zh) | 基于面向方面的构件库构建方法 | |
CN102880452A (zh) | 一种可跨语言重用的编程语言 | |
US9311077B2 (en) | Identification of code changes using language syntax and changeset data | |
CN103885770A (zh) | 单片机从可执行文件找回汇编文件的实现方法 | |
Mossakowski et al. | Hets user guide-version 0.99 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
CN103514027A (zh) | 一种增强软件保护易用性的方法 | |
CN109542942B (zh) | 函数调用的查询方法及装置、电子设备 | |
Juričić | Detecting source code similarity using low-level languages | |
CN107562429A (zh) | 一种基于编译规则的Android系统静态划分方法 | |
Csuvik et al. | Fixjs: A dataset of bug-fixing javascript commits | |
Rosen | A compiler-building system developed by Brooker and Morris: including a comprehensive discussion of the major features of the system | |
CN111552465B (zh) | 一种p2020机器码程序到c语言源程序的溯源方法 | |
KR100834676B1 (ko) | 소프트웨어 프로젝트 빌드 방법 | |
CN112052039A (zh) | 一种多项目同步构建的方法、装置及电子设备 | |
Romanov et al. | Representing programs with dependency and function call graphs for learning hierarchical embeddings | |
Lengyel et al. | Implementing an OCL Compiler for .NET | |
Fraternali et al. | Almost rerere: An approach for automating conflict resolution from similar resolved conflicts | |
Maliavko et al. | The functionally-imperative programming language El and its translator | |
Hwang et al. | System for extracting domain topic using link analysis and searching for relevant features | |
CN114675831B (zh) | 一种编程语言的编译系统及方法 | |
Jordan et al. | The Development of Lexer and Parser as parts of compiler for GAMA32 processor’s instruction-set using Python |
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 |