CN111414632B - 基于ast自合成的嵌入式程序数据流安全验证方法 - Google Patents
基于ast自合成的嵌入式程序数据流安全验证方法 Download PDFInfo
- Publication number
- CN111414632B CN111414632B CN202010171039.5A CN202010171039A CN111414632B CN 111414632 B CN111414632 B CN 111414632B CN 202010171039 A CN202010171039 A CN 202010171039A CN 111414632 B CN111414632 B CN 111414632B
- Authority
- CN
- China
- Prior art keywords
- node
- attribute value
- function definition
- nodes
- value
- 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
Images
Classifications
-
- 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/60—Protecting data
- G06F21/604—Tools and structures for managing or administering access control systems
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3636—Software debugging by tracing the execution of the program
-
- 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/42—Syntactic analysis
- G06F8/425—Lexical analysis
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Computer Hardware Design (AREA)
- Software Systems (AREA)
- Quality & Reliability (AREA)
- Automation & Control Theory (AREA)
- Health & Medical Sciences (AREA)
- Bioethics (AREA)
- General Health & Medical Sciences (AREA)
- Computer Security & Cryptography (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
本发明公开一种基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,具体步骤包括:1、生成抽象语法树AST,2、对函数定义结点进行return归一化,3、对归一化后的函数定义结点进行自合成,4、配置安全级别,5、再函数定义结点中插入赋值结点与断言结点,6、验证数据流安全,7、结束验证。本发明克服了已有技术主要考虑功能属性,而忽略非功能属性的缺陷,以及在验证过程中需要用户输入安全规则的缺陷。通过自合成技术以及断言的插入使得本发明能验证出机密性无干扰与完整性无干扰,能自动化插入需要验证的安全断言,减少验证开销。
Description
技术领域
本发明属于计算机技术领域,更进一步涉及信息安全技术领域中的一种基于抽象语法树AST(Abstract syntax tree)自合成的嵌入式程序数据流安全验证方法。利用本发明的嵌入式程序的数据流安全验证方法,可对验证嵌入式程序中来自传感器数据的完整性以及传输中的数据的机密性进行验证。
背景技术
嵌入式程序被广泛应用于航空航天、核能、交通等安全攸关的领域的嵌入式系统中的一种系统软件。嵌入式程序与特定系统结合一起工作时,经常与硬件发生数据交互(如从传感器中获取数据)且通过网络传输一些机密性数据,这些数据经常会被恶意攻击者截获且篡改,从而导致系统瘫痪或用户数据泄露等安全问题。因而解决数据流安全是嵌入式程序需要考虑的重要问题。对嵌入式程序的验证主要采用形式化验证方法。之前的验证工作主要考虑程序的功能属性,而很少有工作考虑非功能属性;而且,之前的验证工作需要用户手动输入验证规则,工作量巨大,增加验证时开销。
中国航天技术研究所在其申请的专利文献“一种嵌入式软件安全性自动化验证系统及其验证方法”(申请号:201610908949.0,公开号:106528407B)中公开了一种自动化验证方法。该文献中验证方法的具体步骤是:首先对待验证软件运行的外部交联环境建立ICD(IED(Intelligent Electronic Device)Capability Description)模型,然后采用UML(Unified Modeling Language)和OCL(Operation Control Language)形式化语言描述需要验证软件的内部行为,包括状态迁移及功能逻辑并建立软件需求模型文件,之后将已有的软件失效原因,归纳形成安全验证规则,建立安全性规则数据库,根据安全规则对软件需求模型文件进行形式化验证并获取验证结果。该方法存在的不足之处是,该方法中验证的对象仅仅是失效数据,失效数据来源于型号软件安全性分析项目中发现的软件失效模式、软件自测试、第三方测试等中发现的软件问题。这些数据只涉及验证中的功能性安全问题,而忽略了数据流的机密性与完整性安全问题,从而导致程序运行过程中从硬件获取的低完整性数据影响高完整性数据以及数据传输过程中高机密性的数据影响低机密性的数据。
西安电子科技大学与中国航空工业集团公司第六三一研究所在其共同申请的专利文献“一种嵌入式软件可组合信息流验证系统及方法”中公开了一种单一组件内信息流验证方法。该方法中对单一组件信息流的具体步骤是:用户首先通过Promela语言编辑器输入待验证嵌入式系统的组件描述,然后调用Promala语言编译器对输入的组件描述进行编译,之后用户通过assert语言编辑器输入组件信息流安全断言,最后运用模型检测验证引擎进行验证。该方法存在的不足之处是,该方法需要用户在assert语言编辑框中输入信息流安全断言,在验证中,需要对每个使用到具有安全级别变量的函数都添加信息流断言,而大型软件中的函数数量通常是成百上千的,因此信息流断言数量庞大,这种情况都由用户来输入所有信息流断言工作量巨大,增加了验证开销。
发明内容
本发明的目的是针对上述现有技术的不足,提出了一种基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,用于解决已有技术只考虑功能属性,而忽略非功能属性,和验证过程中需要用户输入安全规则的问题。
实现本发明目的的具体思路是:首先生成嵌入式程序源代码对应的抽象语法树AST,在抽象语法树AST上对函数定义结点进行return归一化并对归一化之后的函数定义结点进行自合成,之后,生成与AST结点对应的xml格式元素存储到文件中并此文件进行安全级配置,根据配置文件对自合成后的函数定义结点插入赋值结点和断言结点,最后,将处理后的函数定义结点转换为程序源代码并用验证工具进行数据流安全验证,判断是否存在违反安全断言的路径。
本发明的具体步骤包括:
(1)生成抽象语法树AST:
利用解析工具解析嵌入式程序的源代码,生成抽象语法树AST;该抽象语法树AST至少有一个函数定义结点,每个函数定义结点拥有与函数体复合语句对应的至少一个子结点;
(2)对函数定义结点进行return归一化:
(2a)定义一个空的列表FuncAst;
(2b)从抽象语法树AST中提取所有函数定义结点;
(2c)从所提取的函数定义结点中随机选取一个未选过的函数定义结点,若所选结点的返回值类型为void,将所选结点添加到列表FuncAst中;
(2d)若所选函数定义结点的返回值类型为非void,在所选函数定义结点的第一个子结点之前插入表示声明变量语句“T ret;”所对应的AST声明变量结点,递归遍历所选函数定义结点下的所有子结点找到所有返回值结点,将每一个返回值结点替换为表示语句序列“ret=a;Goto Endlabel;”的AST结点,在所选函数定义结点的最后一个子结点之后插入表示语句“Endlabel:return ret;”的AST结点,将处理后的函数定义结点添加到列表FuncAst中,其中,声明变量语句中的T表示变量声明结点的类型值,其取值与所选函数定义结点的类型值相同,ret表示合法标识符中的一种;语句序列中的a表示返回值结点中的常量值或者表达式,Endlabel为合法标识符的一种;
(2e)判断是否选择完所有函数定义结点,若是,则完成函数定义结点的归一化后执行步骤(3),否则,执行步骤(2c);
(3)对归一化后的函数定义结点进行自合成:
(3a)定义一个空的列表self_com_list;
(3b)从列表FuncAst中提取所有函数定义结点;
(3c)从所提取的函数定义结点中随机选择一个未选过的函数定义结点,复制该结点得到函数定义结点副本;
(3d)判断所选函数定义结点的返回值类型是否为void,若是,则执行步骤(3f),否则,执行步骤(3e);
(3e)删除所选函数定义结点中最后一个子结点,将函数定义结点副本中所有子结点的标识符“EndLabel”修改为标识符“EndLabel’”;
(3f)从步骤(3d)或者步骤(3e)中的函数定义结点副本的所有子结点中找出所有变量声明结点;
(3g)选择一个未选过的变量声明结点,将该结点对应的变量声明语句“T a;”修改为“T a__1;”,递归遍历所选变量声明结点之后的所有结点,将结点中的标志符“a”修改为“a__1”;
(3h)判断是否选完所有变量声明结点,若是,则执行步骤(3i),否则,执行步骤(3g);
(3i)将修改后的函数定义结点副本的所有子结点依次添加到修改后的所选函数定义结点的最后一个子结点之后,得到一个更新后的函数定义结点,将更新后的函数定义结点添加到列表self_com_list中;
(3j)判断是否选择完所有函数定义结点,若是,则执行步骤(4),否则,执行步骤(3c);
(4)配置安全级别:
(4a)定义一个空的可扩展标记语言xml格式的Secu_Config.xml文件,再分别定义三个空的列表DeclList、GlobalList和FuncList;
(4b)生成对应AST结点的可扩展标记语言xml格式元素,将生成后的所有元素存储到Secu_Config.xml文件中;所述可扩展标记语言xml格式的元素以root为根元素,根元素下的子元素为自定义标签decl、global、function中的一种;标签为decl的元素有自定义标签variable的至少一个子元素,标签为function的元素有自定义标签params、ret、fglobal三种类型的子元素;为每个自定义标签的元素都定义name属性和type属性,除此而外,还为标签为function的元素定义returntype属性,还为标签为variable、param、ret、global的元素定义ptr、arr、level和ref属性;自定义的所有标签和属性都有其含义;
(4c)对Secu_Config.xml文件中的level属性配置安全级别,得到配置后的文件;从配置后的文件中提取标签为decl的所有元素放入列表DeclList中,提取标签为global的所有元素放入列表GlobalList中,提取标签为function的所有元素放入列表Funclist中;
(5)在函数定义结点中插入赋值结点与断言结点:
(5a)定义一个空的列表assert_list;
(5b)从列表self_com_list中提取所有函数定义结点;
(5c)选择一个未选过的函数定义结点,从列表Funclist中找到与所选函数定义结点对应的元素,提取该元素的returntype属性及其所有子元素;
(5d)选择一个未选过的子元素,若子元素的标签为param或ret,从所选子元素中提取name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;若子元素的标签为fglobal,从列表GlobalList中找出与子元素对应的元素,提取所找出的元素的name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;
(5e)若type属性值为基本类型,根据level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入断言结点;
(5f)若type属性值为结构体类型,根据ref属性值调用递归函数在所选函数定义结点中插入赋值结点与断言结点;
(5g)判断是否选择完所有子元素,若是,则执行步骤(5h),否则,执行步骤(5d);
(5h)将插入赋值结点和断言结点后的函数定义结点添加到列表assert_list中;
(5i)判断是否选择完所有函数定义结点,若是,则执行步骤(6),否则执行步骤(5c);
(6)验证数据流安全:
(6a)利用解析工具,将列表assert_list中的所有函数定义结点转换为嵌入式源代码,得到拥有赋值和断言的源代码;
(6b)利用python脚本,批量生成拥有交叉赋值和断言的源代码中与每个函数对应的验证命令,该验证命令同时与验证工具对应;
(6c)选择一个未选过的验证命令,利用验证工具执行所选验证命令验证嵌入式程序是否满足所插入的断言结点对应的语句,若满足,则验证通过,否则,生成违反断言语句的反例路径;
(6d)判断是否选择完所有验证命令,若是,执行步骤(7),否则,执行步骤(6c);
(7)结束验证。
本发明与现有技术相比具有以下优点:
第一,由于本发明对归一化后的函数定义结点进行自合成,克服了现有技术中主要考虑程序的功能属性而很少有考虑非功能属性的缺陷,使得本发明在数据流安全验证中能发现从硬件获取的低完整性数据影响高完整性数据以及数据传输过程中高机密性的数据影响低机密性的数据的数据流路径。
第二,由于本发明在函数定义结点中插入赋值结点和断言结点,克服了现有技术在验证过程中需要用户输入安全规则的缺陷,使得本发明自动化生成断言,减少了验证时开销。
附图说明
图1为本发明的流程图。
具体实施方式
下面结合附图对本发明做进一步的描述。
参照图1,对本发明的具体实施步骤做进一步的描述。
步骤1,生成抽象语法树AST。
利用解析工具解析嵌入式程序的源代码,生成抽象语法树AST;该抽象语法树AST至少有一个函数定义结点,每个函数定义结点拥有与函数体复合语句对应的至少一个子结点;子结点类型包括赋值结点、断言结点、声明变量结点和返回值结点。
步骤2,函数定义结点进行return归一化。
第1步,定义一个空的列表FuncAst。
第2步,从抽象语法树AST中提取所有函数定义结点。
第3步,从所提取的函数定义结点中随机选取一个未选过的函数定义结点,若所选结点的返回值类型为void,将所选结点添加到列表FuncAst中。
第4步,若所选函数定义结点的返回值类型为非void,在所选函数定义结点的第一个子结点之前插入表示声明变量语句“T ret;”所对应的AST声明变量结点,递归遍历所选函数定义结点下的所有子结点找到所有返回值结点,将每一个返回值结点替换为表示语句序列“ret=a;Goto Endlabel;”的AST结点,在所选函数定义结点的最后一个子结点之后插入表示语句“Endlabel:return ret;”的AST结点,将处理后的函数定义结点添加到列表FuncAst中,其中,声明变量语句中的T表示变量声明结点的类型值,其取值与所选函数定义结点的类型值相同,ret表示合法标识符中的一种;语句序列中的a表示返回值结点中的常量值或者表达式,Endlabel为合法标识符的一种。
第5步,判断是否选择完所有函数定义结点,若是,则完成函数定义结点的归一化后执行步骤3,否则,执行本步骤的第3步。
步骤3,对归一化后的函数定义结点进行自合成。
第1步,定义一个空的列表self_com_list。
第2步,从列表FuncAst中提取所有函数定义结点;
第3步,从所提取的函数定义结点中随机选择一个未选过的函数定义结点,复制该结点得到函数定义结点副本。
第4步,判断所选函数定义结点的返回值类型是否为void,若是,则执行本步骤的第6步,否则,执行本步骤的第5步。
第5步,删除所选函数定义结点中最后一个子结点,将函数定义结点副本中所有子结点的标识符“EndLabel”修改为标识符“EndLabel’”。
第6步,从本步骤的第4步或者本步骤的第5步中的函数定义结点副本的所有子结点中找出所有变量声明结点。
第7步,选择一个未选过的变量声明结点,将该结点对应的变量声明语句“T a;”修改为“T a__1;”,递归遍历所选变量声明结点之后的所有结点,将结点中的标志符“a”修改为“a__1”。
第8步,判断是否选完所有变量声明结点,若是,则执行本步骤的第9步,否则,执行本步骤的第7步。
第9步,将修改后的函数定义结点副本的所有子结点依次添加到修改后的所选函数定义结点的最后一个子结点之后,得到一个更新后的函数定义结点,将更新后的函数定义结点添加到列表self_com_list中。
第10步,判断是否选择完所有函数定义结点,若是,则执行步骤4,否则,执行本步骤的第3步。
步骤4,配置安全级别。
定义一个空的可扩展标记语言xml格式的Secu_Config.xml文件,再分别定义三个空的列表DeclList、GlobalList和FuncList。
生成对应AST结点的可扩展标记语言xml格式元素,将生成后的所有元素存储到Secu_Config.xml文件中;所述可扩展标记语言xml格式的元素以root为根元素,根元素下的子元素为自定义标签decl、global、function中的一种;标签为decl的元素有自定义标签variable的至少一个子元素,标签为function的元素有自定义标签params、ret、fglobal三种类型的子元素;为每个自定义标签的元素都定义name属性和type属性,除此而外,还为标签为function的元素定义returntype属性,还为标签为variable、param、ret、global的元素定义ptr、arr、level和ref属性;自定义的所有标签和属性都有其含义。
所述生成对应AST结点的可扩展标记语言xml格式元素的具体步骤为:
第一步,再一次利用解析工具解析嵌入式程序的源代码,生成抽象语法树AST,该抽象语法树AST有一个根结点;根结点下有函数定义结点、结构体定义结点和声明全局变量结点三种类型的结点;其中,函数定义结点至少有一个,结构体定义结点或声明全局变量结点为零个或至少一个;
第二步,提取抽象语法树AST根结点下的所有结点;
第三步,从所有结点中选择一个未选过的结点,判断所选结点的类型,利用工具生成与结点类型对应的具有可扩展标记语言xml格式的元素;
第四步,判断是否选择完所有的结点,若是,则执行第五步,否则,执行第三步;
第五步,将可扩展标记语言xml格式的所有元素存储到Secu_Config.xml文件中。
所述自定义的所有标签和属性都有其含义是指:标签decl表示结构体定义;标签variable表示结构体定义中的成员变量;标签global表示声明全局变量;标签function表示函数定义;标签param表示函数定义中的形参;标签fglobal表示函数定义中所使用的全局变量;标签ret表示函数定义中的返回值;name属性的值是结构体定义的类型名、结构体定义中的成员变量名、声明全局变量的全局变量名、函数定义的函数名中的一种;type属性的值为基本类型和结构体类型中的一种;returntype属性表示函数定义的返回值类型,其值为基本类型、结构体类型或void中的一种;ptr属性表示指针,其值为“*”或null;arr属性表示数组,其值为数组的长度或null;level属性表示元素对应的变量的安全级别,若type属性值为基本类型,其值由人工配置,若type属性值为结构体类型,其值为null;ref属性表示元素对应的变量的安全级别由ref属性值所指的结构体类型定义决定,若level属性值为null,其值为结构体类型中的一种,若level属性值不为null,其值为null。
对Secu_Config.xml文件中的level属性配置安全级别,得到配置后的文件;从配置后的文件中提取标签为decl的所有元素放入列表DeclList中,提取标签为global的所有元素放入列表GlobalList中,提取标签为function的所有元素放入列表Funclist中。
所述对Secu_Config.xml文件中的level属性配置安全级别是指:将嵌入式程序中的数据划分为两个级别:高安全级和低安全级,将Secu_Config.xml文件中的level属性配置为高安全级、低安全级中的一种。
步骤5,在函数定义结点中插入赋值结点与断言结点。
第1步,定义一个空的列表assert_list。
第2步,从列表self_com_list中提取所有函数定义结点。
第3步,选择一个未选过的函数定义结点,从列表Funclist中找到与所选函数定义结点对应的元素,提取该元素的returntype属性及其所有子元素。
第4步,选择一个未选过的子元素,若子元素的标签为param或ret,从所选子元素中提取name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;若子元素的标签为fglobal,从列表GlobalList中找出与子元素对应的元素,提取所找出的元素的name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值。
第5步,若type属性值为基本类型,根据level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入断言结点。
所述根据level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入断言结点的方法如下:
若ptr属性值和arr属性值都为null,则在所选函数定义结点的第一个子结点之前插入表示语句“T a__1;”的AST结点后,再插入表示语句“a__1=a;”的AST赋值结点;若ptr属性值和arr属性值都为null且returntype属性值为void,则在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(a__1==a);”的AST断言结点;若ptr属性值和arr属性值都为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(a__1==a);”的AST断言结点;其中,T为本步骤的第4步中所选提取的type属性值,a为本步骤的第4步中提取的name属性值,a__1为对应a的重命名标识符。
若ptr属性值为null但arr属性值不为null,则在所选函数定义结点的第一个子结点之前插入表示语句“T a__1[n];”的AST结点,再插入表示语句“for(int i=1;i<n;i++)a__1[i]=a[i];”的AST赋值结点;若ptr属性值为null但arr属性值不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<n;i++)assert(a[i]==a__1[i]);”的AST断言结点,若ptr属性值为null但arr属性值不为null且returntype属性值为非void,,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=1;i<n;i++)assert(a[i]==a__1[i]);”的AST断言结点;其中,T为本步骤的第4步中所选提取的type属性值,a为本步骤的第4步中提取的name属性值,a__1为对应a的重命名标识符,n为本步骤的第4步中提取的arr属性值。
若ptr属性值不为null但arr属性值为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“T*a__1;”的AST结点、表示语句“T a__2;”的AST结点、表示语句“a__2=*a;a__1=&a__2;”的AST赋值结点;若ptr属性值不为null但arr属性值为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(*a__1==*a);”的AST断言结点,若ptr属性值不为null但arr属性值为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(*a__1==*a);”的AST断言结点;其中,T为步骤本步骤的第4步中所选提取的type属性值,a为本步骤的第4步中提取的name属性值,a__1为对应a的重命名标识符。
若ptr属性值和arr属性值都不为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“T*a__1[n];”的AST结点、表示语句“T a__2[n];”的AST结点、表示语句“for(int i=0;i<n;i++){a__2[i]=*a[i];a__1[i]=&a__2[i];}”的AST赋值结点;若ptr属性值和arr属性值都不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<n;i++)assert(*a__1[i]==*a[i]);”的AST断言结点,若ptr属性值和arr属性值都不为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=0;i<n;i++){a__2[i]=*a[i];a__1[i]=&a__2[i];}”的AST断言结点;其中,T为本步骤的第4步中所选提取的type属性值,a为本步骤的第4步中提取的name属性值,a__1为对应a的重命名标识符,n为本步骤的第4步中提取的arr属性值。
第6步,若type属性值为结构体类型,根据ref属性值调用递归函数在所选函数定义结点中插入赋值结点与断言结点。
所述递归函数具有形参decllist、rawname,、newname、ptype、pptr、parr、pref、self_com_ast,其中,形参decllist对应的实参值为列表DeclList,形参rawname对应的实参值为name属性值,将name属性值对应的标识符“a”重命名为“a__1”,形参newname对应的实参值为重命名后的标识符“a__1”,形参ptype对应的实参值为type属性值,形参pptr对应的实参值为ptr属性值,形参parr对应的实参值为arr属性值,形参pref对应的实参值为ref属性值,形参self_com_ast对应的实参为本步骤的第2步中所选的函数定义结点。
所述根据ref属性值调用递归函数在所选函数定义结点中插入赋值结点与断言结点的方法如下:
若arr属性值和ptr属性值都为null,在所选函数定义结点的第一个结点之前插入表示语句“T a;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点。
若arr属性值为null但ptr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“T*a__1;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点。
若ptr属性值为null但arr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“T a__1[n];”的AST结点后,再根据ref属性值对每一个数组元素a__1[i]调用递归函数插入赋值结点和断言结点。
若ptr属性值和arr属性值都不为null,在所选函数定义结点的第一个子结点之前插入表示语句“T*a__1[n];”的AST结点后,再根据ref属性值对每一个数组元素a__1[i]调用递归函数插入赋值结点和断言结点。
所述的调用递归函数插入赋值结点和断言结点的步骤如下:
第一步,从形参decllist的值中找到name属性值与参数pref的值相同的元素,提取该元素之下标签为variable的所有子元素。
第二步,选择一个未选过的标签为variabel的子元素,从所选标签为variable的子元素中提取name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值。
第三步,若标签为variable的元素的type属性值为基本类型,根据该元素的level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在所选函数定义结点的最后一个子结点之后插入断言结点;若标签为variable的元素的type属性值为结构体类型,根据该元素的ref属性值调用递归函数插入赋值结点和断言结点;当形参pptr对应的实参值为null时,所插入的赋值结点和断言结点对应的语句中包含结构体运算符,当形参pptr对应的实参值不为null时,所插入的赋值结点和断言结点对应的语句中包含指针运算符。
若标签为variable的元素的type属性值为基本类型,则根据该元素的level属性值按下列方法在所选函数定义结点的第一个子结点之前插入赋值结点和断言结点:
若ptr属性值和arr属性值都为null,则在所选函数定义结点的第一个子结点之前插入表示语句“TT b__1;”的AST结点后,再插入表示语句“b__1=b;”的AST赋值结点;若ptr属性值和arr属性值都为null且returntype属性值为void,则在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(b__1==b);”的AST断言结点;若ptr属性值和arr属性值都为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(b__1==b);”的AST断言结点;其中,TT为本步骤的第二步中所选提取的type属性值,b为本步骤的第二步中提取的name属性值,b__1为对应b的重命名标识符。
若ptr属性值为null但arr属性值不为null,则在所选函数定义结点的第一个子结点之前插入表示语句“TT b__1[m];”的AST结点后,再插入表示语句“for(int i=1;i<m;i++)b__1[i]=b[i];”的AST赋值结点;若ptr属性值为null但arr属性值不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<m;i++)
assert(b[i]==b__1[i]);”的AST断言结点,若ptr属性值为null但arr属性值不为null且returntype属性值为非void,,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=1;i<m;i++)assert(b[i]==b__1[i]);”的AST断言结点;其中,TT为本步骤的第二步中所选提取的type属性值,b为本步骤的第二步中提取的name属性值,b__1为对应b的重命名标识符,m为本步骤的第二步中提取的arr属性值。
若ptr属性值不为null但arr属性值为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“TT*b__1;”的AST结点、表示语句“TT b__2;”的AST结点和表示语句“b__2=*b;b__1=&b__2;”的AST赋值结点;若ptr属性值不为null但arr属性值为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(*b__1==*b);”的AST断言结点,若ptr属性值不为null但arr属性值为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(*b__1==*b);”的AST断言结点;其中,T为本步骤的第二步中所选提取的type属性值,b为本步骤的第二步中提取的name属性值,b__1为对应b的重命名标识符。
若ptr属性值和arr属性值都不为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“TT*b__1[m];”的AST结点、表示语句“TT b__2[m];”的AST结点和表示语句“for(int i=0;i<m;i++){b__2[i]=*b[i];b__1[i]=&b__2[i];}”的AST赋值结点;若ptr属性值和arr属性值都不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<m;i++)assert(*b__1[i]==*b[i]);”的AST断言结点,若ptr属性值和arr属性值都不为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=0;i<m;i++){b__2[i]=*b[i];a__1[i]=&b__2[i];}”的AST断言结点;其中,TT为本步骤的第二步中所选提取的type属性值,b为本步骤的第二步中提取的name属性值,b__1为对应b的重命名标识符,m为本步骤的第二步中提取的arr属性值。
若标签为variable的元素的type属性值为结构体类型,则根据该元素的ref属性值按下列方法调用递归函数插入赋值结点和断言结点。
若arr属性值和ptr属性值都为null,在所选函数定义结点的第一个结点之前插入表示语句“TT b;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点。
若arr属性值为null但ptr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“TT*b__1;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点。
若ptr属性值为null但arr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“TT b__1[m];”的AST结点后,再根据ref属性值对每一个数组元素b__1[i]调用递归函数插入赋值结点和断言结点。
若ptr属性值和arr属性值都不为null,在所选函数定义结点的第一个子结点之前插入表示语句“TT*b__1[m];”的AST结点后,再根据ref属性值对每一个数组元素b__1[i]调用递归函数插入赋值结点和断言结点。
第四步,判断是否选完标签为variable的所有子元素,若是,则完成在所选函数定义结点中插入赋值结点与断言结点,否则,执行本步骤的第二步。
第7步,判断是否选择完所有子元素,若是,则执行本步骤的第8步,否则,执行本步骤的第4步。
第8步,将插入赋值结点和断言结点后的函数定义结点添加到列表assert_list中。
第9步,判断是否选择完所有函数定义结点,若是,则执行步骤6,否则执行本步骤的第3步。
步骤6,验证数据流安全。
第1步,利用解析工具,将列表assert_list中的所有函数定义结点转换为嵌入式源代码,得到拥有赋值和断言的源代码。
第2步,利用python脚本,批量生成拥有交叉赋值和断言的源代码中与每个函数对应的验证命令,该验证命令同时与验证工具对应。
第3步,选择一个未选过的验证命令,利用验证工具执行所选验证命令验证嵌入式程序是否满足所插入的断言结点对应的语句,若满足,则验证通过,否则,生成违反断言语句的反例路径。
第4步,判断是否选择完所有验证命令,若是,执行步骤7,否则,执行本步骤的第3步。
步骤7,结束验证。
Claims (8)
1.一种基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于,对函数定义结点进行return归一化,对归一化后的函数定义结点进行自合成,在自合成后的函数定义结点中插入赋值结点与断言结点,该方法的步骤包括如下:
(1)生成抽象语法树AST:
利用解析工具解析嵌入式程序的源代码,生成抽象语法树AST;该抽象语法树AST至少有一个函数定义结点,每个函数定义结点拥有与函数体复合语句对应的至少一个子结点;
(2)对函数定义结点进行return归一化:
(2a)定义一个空的列表FuncAst;
(2b)从抽象语法树AST中提取所有函数定义结点;
(2c)从所提取的函数定义结点中随机选取一个未选过的函数定义结点,若所选结点的返回值类型为void,将所选结点添加到列表FuncAst中;
(2d)若所选函数定义结点的返回值类型为非void,在所选函数定义结点的第一个子结点之前插入表示声明变量语句“T ret;”所对应的AST声明变量结点,递归遍历所选函数定义结点下的所有子结点找到所有返回值结点,将每一个返回值结点替换为表示语句序列“ret=a;Goto Endlabel;”的AST结点,在所选函数定义结点的最后一个子结点之后插入表示语句“Endlabel:return ret;”的AST结点,将处理后的函数定义结点添加到列表FuncAst中,其中,声明变量语句中的T表示变量声明结点的类型值,其取值与所选函数定义结点的类型值相同,ret表示合法标识符中的一种;语句序列中的a表示返回值结点中的常量值或者表达式,Endlabel为合法标识符的一种;
(2e)判断是否选择完所有函数定义结点,若是,则完成函数定义结点的归一化后执行步骤(3),否则,执行步骤(2c);
(3)对归一化后的函数定义结点进行自合成:
(3a)定义一个空的列表self_com_list;
(3b)从列表FuncAst中提取所有函数定义结点;
(3c)从所提取的函数定义结点中随机选择一个未选过的函数定义结点,复制该结点得到函数定义结点副本;
(3d)判断所选函数定义结点的返回值类型是否为void,若是,则执行步骤(3f),否则,执行步骤(3e);
(3e)删除所选函数定义结点中最后一个子结点,将函数定义结点副本中所有子结点的标识符“EndLabel”修改为标识符“EndLabel’”;
(3f)从步骤(3d)或者步骤(3e)中的函数定义结点副本的所有子结点中找出所有变量声明结点;
(3g)选择一个未选过的变量声明结点,将该结点对应的变量声明语句“Ta;”修改为“Ta__1;”,递归遍历所选变量声明结点之后的所有结点,将结点中的标志符“a”修改为“a__1”;
(3h)判断是否选完所有变量声明结点,若是,则执行步骤(3i),否则,执行步骤(3g);
(3i)将修改后的函数定义结点副本的所有子结点依次添加到修改后的所选函数定义结点的最后一个子结点之后,得到一个更新后的函数定义结点,将更新后的函数定义结点添加到列表self_com_list中;
(3j)判断是否选择完所有函数定义结点,若是,则执行步骤(4),否则,执行步骤(3c);
(4)配置安全级别:
(4a)定义一个空的可扩展标记语言xml格式的Secu_Config.xml文件,再分别定义三个空的列表DeclList、GlobalList和FuncList;
(4b)生成对应AST结点的可扩展标记语言xml格式元素,将生成后的所有元素存储到Secu_Config.xml文件中;所述可扩展标记语言xml格式的元素以root为根元素,根元素下的子元素为自定义标签decl、global、function中的一种;标签为decl的元素有自定义标签variable的至少一个子元素,标签为function的元素有自定义标签params、ret、fglobal三种类型的子元素;为每个自定义标签的元素都定义name属性和type属性,除此而外,还为标签为function的元素定义returntype属性,还为标签为variable、param、ret、global的元素定义ptr、arr、level和ref属性;自定义的所有标签和属性都有其含义;
(4c)对Secu_Config.xml文件中的level属性配置安全级别,得到配置后的文件;从配置后的文件中提取标签为decl的所有元素放入列表DeclList中,提取标签为global的所有元素放入列表GlobalList中,提取标签为function的所有元素放入列表Funclist中;
(5)在函数定义结点中插入赋值结点与断言结点:
(5a)定义一个空的列表assert_list;
(5b)从列表self_com_list中提取所有函数定义结点;
(5c)选择一个未选过的函数定义结点,从列表Funclist中找到与所选函数定义结点对应的元素,提取该元素的returntype属性及其所有子元素;
(5d)选择一个未选过的子元素,若子元素的标签为param或ret,从所选子元素中提取name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;若子元素的标签为fglobal,从列表GlobalList中找出与子元素对应的元素,提取所找出的元素的name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;
(5e)若type属性值为基本类型,根据level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入断言结点;
(5f)若type属性值为结构体类型,根据ref属性值调用递归函数在所选函数定义结点中插入赋值结点与断言结点;
(5g)判断是否选择完所有子元素,若是,则执行步骤(5h),否则,执行步骤(5d);
(5h)将插入赋值结点和断言结点后的函数定义结点添加到列表assert_list中;
(5i)判断是否选择完所有函数定义结点,若是,则执行步骤(6),否则执行步骤(5c);
(6)验证数据流安全:
(6a)利用解析工具,将列表assert_list中的所有函数定义结点转换为嵌入式源代码,得到拥有赋值和断言的源代码;
(6b)利用python脚本,批量生成拥有交叉赋值和断言的源代码中与每个函数对应的验证命令,该验证命令同时与验证工具对应;
(6c)选择一个未选过的验证命令,利用验证工具执行所选验证命令验证嵌入式程序是否满足所插入的断言结点对应的语句,若满足,则验证通过,否则,生成违反断言语句的反例路径;
(6d)判断是否选择完所有验证命令,若是,执行步骤(7),否则,执行步骤(6c);
(7)结束验证。
2.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(4b)中所述生成对应AST结点的可扩展标记语言xml格式元素的具体步骤为:
第一步,再一次利用解析工具解析嵌入式程序的源代码,生成抽象语法树AST,该抽象语法树AST有一个根结点;根结点下有函数定义结点、结构体定义结点和声明全局变量结点三种类型的结点;其中,函数定义结点至少有一个,结构体定义结点或声明全局变量结点为零个或至少一个;
第二步,提取抽象语法树AST根结点下的所有结点;
第三步,从所有结点中选择一个未选过的结点,判断所选结点的类型,利用工具生成与结点类型对应的具有可扩展标记语言xml格式的元素;
第四步,判断是否选择完所有的结点,若是,则执行第五步,否则,执行第三步;
第五步,将可扩展标记语言xml格式的所有元素存储到Secu_Config.xml文件中。
3.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(4b)中所述自定义的所有标签和属性都有其含义是指:
标签decl表示结构体定义;标签variable表示结构体定义中的成员变量;标签global表示声明全局变量;标签function表示函数定义;标签param表示函数定义中的形参;标签fglobal表示函数定义中所使用的全局变量;标签ret表示函数定义中的返回值;name属性的值是结构体定义的类型名、结构体定义中的成员变量名、声明全局变量的全局变量名、函数定义的函数名中的一种;type属性的值为基本类型和结构体类型中的一种;returntype属性表示函数定义的返回值类型,其值为基本类型、结构体类型或void中的一种;ptr属性表示指针,其值为“*”或null;arr属性表示数组,其值为数组的长度或null;level属性表示元素对应的变量的安全级别,若type属性值为基本类型,其值由人工配置,若type属性值为结构体类型,其值为null;ref属性表示元素对应的变量的安全级别由ref属性值所指的结构体类型定义决定,若level属性值为null,其值为结构体类型中的一种,若level属性值不为null,其值为null。
4.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(4c)中所述对Secu_Config.xml文件中的level属性配置安全级别是指:将嵌入式程序中的数据划分为两个级别:高安全级和低安全级,将Secu_Config.xml文件中的level属性配置为高安全级、低安全级中的一种。
5.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(5e)所述根据level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入断言结点的方法如下:
若ptr属性值和arr属性值都为null,则在所选函数定义结点的第一个子结点之前插入表示语句“Ta__1;”的AST结点后,再插入表示语句“a__1=a;”的AST赋值结点;若ptr属性值和arr属性值都为null且returntype属性值为void,则在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(a__1==a);”的AST断言结点;若ptr属性值和arr属性值都为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(a__1==a);”的AST断言结点;其中,T为步骤(5d)中所选提取的type属性值,a为步骤(5d)中提取的name属性值,a__1为对应a的重命名标识符;
若ptr属性值为null但arr属性值不为null,则在所选函数定义结点的第一个子结点之前插入表示语句“Ta__1[n];”的AST结点后,再插入表示语句“for(int i=1;i<n;i++)a__1[i]=a[i];”的AST赋值结点;若ptr属性值为null但arr属性值不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<n;i++)assert(a[i]==a__1[i]);”的AST断言结点,若ptr属性值为null但arr属性值不为null且returntype属性值为非void,,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=1;i<n;i++)assert(a[i]==a__1[i]);”的AST断言结点;其中,T为步骤(5d)中所选提取的type属性值,a为步骤(5d)中提取的name属性值,a__1为对应a的重命名标识符,n为步骤(5d)中提取的arr属性值;
若ptr属性值不为null但arr属性值为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“T*a__1;”的AST结点、表示语句“Ta__2;”的AST结点和表示语句“a__2=*a;a__1=&a__2;”的AST赋值结点;若ptr属性值不为null但arr属性值为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“assert(*a__1==*a);”的AST断言结点,若ptr属性值不为null但arr属性值为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“assert(*a__1==*a);”的AST断言结点;其中,T为步骤(5d)中所选提取的type属性值,a为步骤(5d)中提取的name属性值,a__1为对应a的重命名标识符;
若ptr属性值和arr属性值都不为null,则在所选函数定义结点的第一个子结点之前依次插入表示语句“T*a__1[n];”的AST结点、表示语句“Ta__2[n];”的AST结点和表示语句“for(int i=0;i<n;i++){a__2[i]=*a[i];a__1[i]=&a__2[i];}”的AST赋值结点;若ptr属性值和arr属性值都不为null且returntype属性值为void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之后插入表示语句“for(int i=1;i<n;i++)assert(*a__1[i]==*a[i]);”的AST断言结点,若ptr属性值和arr属性值都不为null且returntype属性值为非void,在插入完赋值结点后的所选函数定义结点的最后一个子结点之前插入表示语句“for(int i=0;i<n;i++){a__2[i]=*a[i];a__1[i]=&a__2[i];}”的AST断言结点;其中,T为步骤(5d)中所选提取的type属性值,a为步骤(5d)中提取的name属性值,a__1为对应a的重命名标识符,n为步骤(5d)中提取的arr属性值。
6.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(5f)中所述递归函数具有形参decllist、rawname,、newname、ptype、pptr、parr、pref、self_com_ast,其中,形参decllist对应的实参值为列表DeclList,形参rawname对应的实参值为name属性值,将name属性值对应的标识符“a”重命名为“a__1”,形参newname对应的实参值为重命名后的标识符“a__1”,形参ptype对应的实参值为type属性值,形参pptr对应的实参值为ptr属性值,形参parr对应的实参值为arr属性值,形参pref对应的实参值为ref属性值,形参self_com_ast对应的实参为步骤(5b)中所选的函数定义结点;
7.根据权利要求1所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于:步骤(5f)所述根据ref属性值调用递归函数在所选函数定义结点中插入赋值结点与断言结点的方法如下:
若arr属性值和ptr属性值都为null,在所选函数定义结点的第一个结点之前插入表示语句“Ta;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点;
若arr属性值为null但ptr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“T*a__1;”的AST结点后,再根据ref属性值调用递归函数插入赋值结点和断言结点;
若ptr属性值为null但arr属性值不为null,在所选函数定义结点的第一个子结点之前插入表示语句“Ta__1[n];”的AST结点后,再根据ref属性值对每一个数组元素a__1[i]调用递归函数插入赋值结点和断言结点;
若ptr属性值和arr属性值都不为null,在所选函数定义结点的第一个子结点之前插入表示语句“T*a__1[n];”的AST结点后,再根据ref属性值对每一个数组元素a__1[i]调用递归函数插入赋值结点和断言结点。
8.根据权利要求7所述的基于抽象语法树AST自合成的嵌入式程序数据流安全验证方法,其特征在于,所述的根据ref属性值调用递归函数插入赋值结点和断言结点的步骤如下:
第一步,从形参decllist的值中找到name属性值与参数pref的值相同的元素,提取该元素之下标签为variable的所有子元素;
第二步,选择一个未选过的标签为variabel的子元素,从所选标签为variable的子元素中提取name属性值、type属性值、ptr属性值、arr属性值、level属性值和ref属性值;
第三步,若标签为variable的元素的type属性值为基本类型,根据该元素的level属性值在所选函数定义结点的第一个子结点之前插入赋值结点,在所选函数定义结点的最后一个子结点之后插入断言结点;若标签为variable的元素的type属性值为结构体类型,根据该元素的ref属性值调用递归函数插入赋值结点和断言结点;当形参pptr对应的实参值为null时,所插入的赋值结点和断言结点对应的语句中包含结构体运算符,当形参pptr对应的实参值不为null时,所插入的赋值结点和断言结点对应的语句中包含指针运算符;
第四步,判断是否选完标签为variable的所有子元素,若是,则完成在所选函数定义结点中插入赋值结点与断言结点,否则,执行第二步。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010171039.5A CN111414632B (zh) | 2020-03-12 | 2020-03-12 | 基于ast自合成的嵌入式程序数据流安全验证方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010171039.5A CN111414632B (zh) | 2020-03-12 | 2020-03-12 | 基于ast自合成的嵌入式程序数据流安全验证方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111414632A CN111414632A (zh) | 2020-07-14 |
CN111414632B true CN111414632B (zh) | 2022-04-19 |
Family
ID=71492869
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010171039.5A Active CN111414632B (zh) | 2020-03-12 | 2020-03-12 | 基于ast自合成的嵌入式程序数据流安全验证方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111414632B (zh) |
Families Citing this family (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111984233B (zh) * | 2020-08-03 | 2022-02-01 | 南京航空航天大学 | 一种AltaRica模型中类的平展化方法 |
CN117971672B (zh) * | 2024-01-31 | 2024-08-16 | 北京长木谷医疗科技股份有限公司 | 一种自适应测试方法及装置 |
Family Cites Families (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20140282373A1 (en) * | 2013-03-15 | 2014-09-18 | Trinity Millennium Group, Inc. | Automated business rule harvesting with abstract syntax tree transformation |
CN108932192B (zh) * | 2017-05-22 | 2020-01-14 | 南京大学 | 一种基于抽象语法树的Python程序类型缺陷检测方法 |
CN110851367B (zh) * | 2019-11-18 | 2023-09-01 | 杭州安恒信息安全技术有限公司 | 一种基于ast评估源码泄漏风险的方法、装置和电子设备 |
-
2020
- 2020-03-12 CN CN202010171039.5A patent/CN111414632B/zh active Active
Non-Patent Citations (1)
Title |
---|
TUnit-UnitTesting For Template-based Code Generators;Carsten Kolassa et al.;《https://arxiv.org/abs/1606.04682》;20160615;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111414632A (zh) | 2020-07-14 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN106777101B (zh) | 数据处理引擎 | |
US5446652A (en) | Constraint knowledge in simulation modeling | |
US5493682A (en) | Object based system for software maintenance | |
EP1849064B1 (en) | Applying coding standards in graphical programming environments | |
US20010037492A1 (en) | Method and apparatus for automatically extracting verification models | |
CN111414632B (zh) | 基于ast自合成的嵌入式程序数据流安全验证方法 | |
CN103955426A (zh) | 一种检测c代码空指针引用的方法及系统 | |
EP1027648A2 (en) | Apparatus and method for semi-automated generation and application of language conformity tests | |
CN109522005A (zh) | 跨平台图形化程序设计方法 | |
US11593076B2 (en) | Method for merging architecture data | |
Balsini et al. | Generation of Simulink monitors for control applications from formal requirements | |
US20100275183A1 (en) | Source code auditor with a customized rules builder | |
JP2010140407A (ja) | ソースコード検査装置 | |
CN110928761B (zh) | 需求链及其应用的系统和方法 | |
CN107402764B (zh) | 一种图形化页面程序功能特征码计算刷新方法 | |
CN107291435B (zh) | 一种不确定性环境下混成aadl模型量化分析方法 | |
CN115310095A (zh) | 一种区块链智能合约混合形式化验证方法及系统 | |
CN115408289A (zh) | 一种面向scade模型的测试用例自动生成方法 | |
EP2535813B1 (en) | Method and device for generating an alert during an analysis of performance of a computer application | |
Yusuf et al. | An automatic approach to measure and visualize coupling in object-oriented programs | |
CN108647018A (zh) | 可实时预览的代码生成系统 | |
CN113282495A (zh) | 一种基于轨迹监控的Java软件故障定位方法 | |
CN111176993A (zh) | 一种基于抽象语法树的代码静态检测方法 | |
Klusener et al. | Reducing code duplication by identifying fresh domain abstractions | |
Li et al. | Comparison Test Based on Program Model and Design Document |
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 |