CN110704065B - 基于非法程序输入的编译器前端差分测试方法 - Google Patents
基于非法程序输入的编译器前端差分测试方法 Download PDFInfo
- Publication number
- CN110704065B CN110704065B CN201910952281.3A CN201910952281A CN110704065B CN 110704065 B CN110704065 B CN 110704065B CN 201910952281 A CN201910952281 A CN 201910952281A CN 110704065 B CN110704065 B CN 110704065B
- Authority
- CN
- China
- Prior art keywords
- information
- compiler
- test case
- illegal
- test
- 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
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/42—Syntactic analysis
- G06F8/425—Lexical analysis
-
- 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/3624—Software debugging by performing operations on the source code, e.g. via a compiler
-
- 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/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
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)
- Quality & Reliability (AREA)
- Software Systems (AREA)
- Debugging And Monitoring (AREA)
- Devices For Executing Special Programs (AREA)
Abstract
基于非法程序输入的编译器前端差分测试方法,属于软件编译领域。该方法首先将自动生成的测试用例表示为抽象语法树,即AST树;然后通过循环删除AST树的节点及其子节点构造非法测试用例,将其作为编译器的输入,并收集编译之后的警告信息和错误信息;通过对多个不同版本和不同类别编译器的警告信息和错误信息的比较,收集导致信息不一致和信息缺失的非法测试用例;最后将收集到的非法测试用例进行约减并提交bug报告。本发明能够有效测试编译器前端的的正确性与健壮性,一旦发现了触发编译器前端bug的非法测试用例,在对该测试用例进行约减之后可直接提交给开发者修复。
Description
技术领域
本发明属于软件编译领域,涉及编译器前端语法分析器的测试,具体为基于非法程序输入的编译器前端差分测试方法。
背景技术
编译器在软件开发中是一种重要的基础设施工具,能帮助加快软件开发过程。编译器包括前端、中端和后端。编译器前端经过词法分析、语法分析和语义分析,将符合语法规范的高级语言源程序编译为中间代码。中间代码经过编译器优化,最终被编译为平台可运行的二进制文件。对于不符合编程语言规范的源程序,即非法程序,编译器前端在进行静态分析时会输出程序中的错误和警告信息,包括行列位置信息,错误/警告类型以及错误/警告详细信息。这些非法程序无法通过编译器前端生成中间代码,也不能在目标平台上被正常运行。
错误/警告信息有助于软件开发者快速定位并分析非法程序中的错误。如果编译器前端出现bug,这些错误/警告信息会误导开发者从而降低开发效率,同时也会降低编译器的可用性。因此,尽可能多地发现编译器前端存在的bug可帮助完善编译器。由于编译器结构复杂且输入是高级语言源程序,对编译器测试通常采用差分测试的方法,即将同一个源程序输入到不同版本或不同类型的编译器中,如若不同编译器的输出信息不一致,则少数不一致的编译器中存在bug。编译器差分测试的输入通常是符合高级语言规范的源程序,然而这种源程序并不适合测试编译器前端。为了解决这一问题,本发明通过对源程序的AST树进行删除从而构造非法程序作为编译器的输入,进而采用差分测试的方法对编译器前端进行测试。
发明内容
本发明的目的是提供了一种基于非法程序输入的编译器前端差分测试方法。
本发明的技术方案:
基于非法程序输入的编译器前端差分测试方法,步骤如下:
步骤1、构建测试用例的抽象语法树,即AST树:使用Csmith工具自动生成完整的可编译的测试用例,并使用Pyparser工具构建该测试用例的AST树。
步骤2、每棵AST树循环删除节点信息数次,并将删除信息记录在删除列表中。每进行一次删除操作后,对该AST树还原为源代码,得到新的测试用例。
步骤3、使用差分测试方法将新的测试用例输入到不同类型和不同版本的编译器中,得到编译输出信息。编译输出信息是指编译器前端进行词法分析、语法分析和语义分析后,输出的错误信息和警告信息的集合。
步骤4:将同一个测试用例的编译输出信息进行对齐操作,首先从输出信息中将错误信息和警告信息所在的行列、类型以及详细信息提取出来,然后分别对行列位置信息对齐、类型信息对齐以及详细信息对齐。其中,详细信息对齐通过计算Levenshtein距离进行比较。
经过对齐操作之后可将输出信息分为三类:
(1)一致信息:是指报告该错误或警告的行列信息、错误类型信息和详细信息完全一致;
(2)不一致信息:是指报告该错误或警告的行列信息、错误类型信息和详细信息中的一种或两种信息出现不一致情况;
(3)缺失信息:是指报告该错误或警告的行列信息、错误类型信息和详细信息完全不一致,即编译器缺失某些错误信息或警告信息的诊断。
后两种类型的信息能够检测到编译器前端存在的bug,通过修复这些bug,提高编译器前端的正确性与健壮性。
步骤5:将出现缺失信息和不一致信息的测试用例C的删除列表D进行约减。保留删除列表D中最后一次删除的节点信息,并依次将其他删除的节点信息进行还原,得到新的测试用例。重复步骤3和步骤4,如果新的测试用例的输出信息得到和测试用例C一致的分类,则将该删除信息从删除列表D中移除;若不一致,则该删除操作保留到删除列表D中,最终得到删除列表的一个子集D'。
步骤6:在原始AST树中查找删除列表D'中的节点信息的位置,并标记该节点位置。对AST树采用深度优先遍历方法,标记D'中每个删除节点的路径位置。将所有标记的节点还原为代码,并作为初步约减的测试用例,之后对该测试用例进行手动约减。约减之后的测试用例需要保证和未约减之前的测试用例触发相同的编译器bug。约减之后的测试用例以及触发的编译器bug信息以bug报告形式提交给编译器开发者,帮助修复完善编译器。
本发明的有益效果:能够有效测试编译器前端的正确性与健壮性,一旦发现了触发编译器前端bug的测试用例,在对该测试用例进行约减之后可直接提交给开发者修复。
附图说明
图1是本发明的编译器前端测试方法流程示意图。
具体实施方式
本方法部署在x86_64-Linux14.04服务器上,并编译安装GCC 6-9、LLVM 6-8、Csmith以及Pyparser等工具。方法由基于AST树的非法测试用例生成程序、编译测试用例程序、文本对齐程序、测试用例约减程序构成。
步骤1:使用Csmith工具自动生成完整的c语言测试用例,并维持每个测试用例的代码行数在500行左右。对每个完整的测试用例,使用Pyparser工具构建AST树。
步骤2:随机删除每棵AST树上的某个节点i及其子节点,并将删除信息di记录在删除列表D中,即D∩{di}。每进行一次删除操作之后,将删除节点后的AST树转换为c语言代码,得到新的测试用例(非法.c文件)。此步骤重复5次,每次删除都是在前一个AST树上进行,可得到5个不同的测试用例。
步骤3:使用不同版本的GCC6-9编译器和LLVM6-8编译器中对新的测试用例(非法.c文件)进行编译,得到编译输出信息(Oi=Ei∪Wi)。将输出信息按照信息类型进一步分为错误信息(Ei={ei1,ei2,ei3,…})和警告信息(Wi={wi1,wi2,wi3,…})。
步骤4:分别将错误信息和警告信息进行对齐(E1vs.E2,W1 vs.W2)操作。首先使用正则表达式将错误信息和警告信息所在的位置(ELi∈E1,E2或者WLi∈W1,W2),类型(ETi∈E1,E2或者WTi∈W1,W2)以及详细信息(EIi∈E1,E2或者WIi∈W1,W2)提取出来。然后比较这些信息是否一致,即EL1vs.EL2,ET1vs.ET2,EI1 vs.EI2或者WL1 vs.WL2,WT1 vs.WT2,WI1 vs.WI2。位置信息和类型信息进行字符串比较实现对齐操作。详细信息通过计算Levenshtein距离进行比较:
其中o1和o2是需要对齐的字符串,i和j分别是字符串o1和o2的长度。如果o1i=o2j,levo1,o2(i,j)=levo1,o2(i-1,j-1)。如果levo1,o2(i,j)/min(i,j)>50%,可以认为o1和o2是不相似字符串。
经过对齐之后,可将警告信息或错误信息分为三个等级:
②如果a∈o1∧b∈o2,说明编译器诊断信息出现不一致情况。
③如果o1=o2,说明编译器诊断信息完全一致。
步骤5:将步骤4中①②类型的测试用例(记为C)的删除列表D进行约减。首先保留列表D中最后一个删除的节点信息至D'={d5},然后还原d4节点信息。将还原之后的测试用例重新输入到编译器中,重复步骤3和步骤4。如若得到和测试用例C不一致的分类,则该节点信息保存至D'={d4,d5};如若一致,则D'不做任何变动。重复步骤5直至删除列表D中的其他节点(d1,d2,d3)都被还原过一次,最终得到删除列表D的一个子集D'。
步骤6:对AST树采用深度优先遍历,标记经过D'中节点的路径位置。将所有标记的AST树节点还原为代码,之后对该代码进一步手动约减。将约减之后的代码以及编译器bug信息形成bug报告提交到Bugzilla中,供编译器开发者核实并修复。
Claims (3)
1.基于非法程序输入的编译器前端差分测试方法,其特征在于,步骤如下:
步骤1、构建测试用例的抽象语法树,即AST树:使用Csmith工具自动生成完整的可编译的测试用例,并使用Pyparser工具构建该测试用例的AST树;
步骤2、每棵AST树循环删除节点信息数次,并将删除信息记录在删除列表中;每进行一次删除操作后,对该AST树还原为源代码,得到新的测试用例;
步骤3、使用差分测试方法将新的测试用例输入到不同类型和不同版本的编译器中,得到编译输出信息;编译输出信息是指编译器前端进行词法分析、语法分析和语义分析后,输出的错误信息和警告信息的集合;
步骤4:将同一个测试用例的编译输出信息进行对齐操作,首先从输出信息中将错误信息和警告信息所在的行列、类型以及详细信息提取出来,然后分别对行列位置信息对齐、类型信息对齐以及详细信息对齐;其中,详细信息对齐通过计算Levenshtein距离进行比较;
经过对齐操作之后可将输出信息分为三类:
(1)一致信息:是指报告该错误信息或警告信息的行列信息、错误类型信息和详细信息完全一致;
(2)不一致信息:是指报告该错误信息或警告信息的行列信息、错误类型信息和详细信息中的一种或两种信息出现不一致情况;
(3)缺失信息:是指报告该错误信息或警告信息的行列信息、错误类型信息和详细信息完全不一致,即编译器缺失某些错误信息或警告信息的诊断;
后两种类型的信息能够检测到编译器前端存在的bug,通过修复这些bug,提高编译器前端的正确性与健壮性;
步骤5:将出现缺失信息和不一致信息的测试用例C的删除列表D进行约减;保留删除列表D中最后一次删除的节点信息,并依次将删除列表D中,除最后一次删除的节点信息之外的其他删除的节点信息进行还原,得到新的测试用例;重复步骤3和步骤4,如果新的测试用例的输出信息得到和测试用例C一致的分类,则将步骤5中的删除信息从删除列表D中移除;若不一致,则步骤5中的删除操作保留到删除列表D中,最终得到删除列表的一个子集D';
步骤6:在原始AST树中查找删除列表D'中的节点信息的位置,并标记该节点信息的位置;对AST树采用深度优先遍历方法,标记D'中每个删除节点的路径位置;将所有标记的节点还原为代码,并作为初步约减的测试用例,之后对该测试用例进行手动约减;约减之后的测试用例需要保证和未约减之前的测试用例触发相同的编译器bug;约减之后的测试用例以及触发的编译器bug信息以bug报告形式提交给编译器开发者,帮助修复完善编译器。
2.根据权利要求1所述的基于非法程序输入的编译器前端差分测试方法,其特征在于,所述步骤2中,对原始测试用例的变异是通过构造程序的AST树,循环删除节点实现的,比现有的将程序当作文本进行变异的方法更高效;另外,删除节点之后可得到非法测试用例,这些非法测试用例比现有的正常测试用例更适合测试编译器前端的bug。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910952281.3A CN110704065B (zh) | 2019-10-09 | 2019-10-09 | 基于非法程序输入的编译器前端差分测试方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910952281.3A CN110704065B (zh) | 2019-10-09 | 2019-10-09 | 基于非法程序输入的编译器前端差分测试方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN110704065A CN110704065A (zh) | 2020-01-17 |
CN110704065B true CN110704065B (zh) | 2021-04-20 |
Family
ID=69199139
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910952281.3A Active CN110704065B (zh) | 2019-10-09 | 2019-10-09 | 基于非法程序输入的编译器前端差分测试方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN110704065B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113238937B (zh) * | 2021-05-11 | 2023-02-03 | 西北大学 | 一种基于代码精简与误报过滤的编译器模糊测试方法 |
CN115033472B (zh) * | 2022-04-18 | 2024-03-22 | 大连理工大学 | 基于线程循环调度顺序化的中断驱动程序模型检测方法 |
CN114817047A (zh) * | 2022-04-29 | 2022-07-29 | 上海阵量智能科技有限公司 | 编译器测试方法、用例生成方法及装置、指令存储结构 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407973A (zh) * | 2014-11-25 | 2015-03-11 | 珠海格力电器股份有限公司 | 一种自动化单元测试的实现方法及装置 |
CN104796158A (zh) * | 2015-05-05 | 2015-07-22 | 大连理工大学 | 一种针对固定信息长度的ldpc编译码系统平台 |
CN109977019A (zh) * | 2019-04-01 | 2019-07-05 | 大连理工大学 | 一种基于增量采样的编译器优化序列测试方法 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN100442243C (zh) * | 2005-08-12 | 2008-12-10 | 中国科学院计算技术研究所 | 一种对编译器中的错误进行自动定位的方法 |
US9542166B2 (en) * | 2012-10-30 | 2017-01-10 | Oracle International Corporation | System and method for inferring immutability of program variables |
-
2019
- 2019-10-09 CN CN201910952281.3A patent/CN110704065B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN104407973A (zh) * | 2014-11-25 | 2015-03-11 | 珠海格力电器股份有限公司 | 一种自动化单元测试的实现方法及装置 |
CN104796158A (zh) * | 2015-05-05 | 2015-07-22 | 大连理工大学 | 一种针对固定信息长度的ldpc编译码系统平台 |
CN109977019A (zh) * | 2019-04-01 | 2019-07-05 | 大连理工大学 | 一种基于增量采样的编译器优化序列测试方法 |
Non-Patent Citations (1)
Title |
---|
编译原理立体化教学体系建设探索;徐秀娟 等;《计算机教育》;20170610;第45-49页 * |
Also Published As
Publication number | Publication date |
---|---|
CN110704065A (zh) | 2020-01-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Watson et al. | On learning meaningful assert statements for unit test cases | |
Brockschmidt et al. | Generative code modeling with graphs | |
Le et al. | S3: syntax-and semantic-guided repair synthesis via programming by examples | |
Tufano et al. | Towards automating code review activities | |
CN110704065B (zh) | 基于非法程序输入的编译器前端差分测试方法 | |
Patra et al. | Semantic bug seeding: a learning-based approach for creating realistic bugs | |
Weimer et al. | Automatically finding patches using genetic programming | |
Ernst | Natural language is a programming language: Applying natural language processing to software development | |
Afzal et al. | SOSRepair: Expressive semantic search for real-world program repair | |
Zhang et al. | A survey of learning-based automated program repair | |
Zhang et al. | Repairing bugs in python assignments using large language models | |
Schulte et al. | Evolving exact decompilation | |
Park et al. | Generative type-aware mutation for testing SMT solvers | |
CN102141959B (zh) | 一种受上下文无关文法约束的测试用例生成方法 | |
Nguyen et al. | Mofuzz: A fuzzer suite for testing model-driven software engineering tools | |
Pârțachi et al. | Flexeme: Untangling commits using lexical flows | |
Hodován et al. | Tree preprocessing and test outcome caching for efficient hierarchical delta debugging | |
Kreutzer et al. | Language-agnostic generation of compilable test programs | |
CN112131120B (zh) | 一种源代码缺陷检测方法及装置 | |
CN112131122B (zh) | 一种源代码缺陷检测工具误报评估方法及装置 | |
Nokhbeh Zaeem et al. | History-aware data structure repair using SAT | |
Sakkas et al. | Seq2Parse: neurosymbolic parse error repair | |
Greenan | Method-level code clone detection on transformed abstract syntax trees using sequence matching algorithms | |
Liu et al. | Identifying change patterns of API misuses from code changes | |
Shobha et al. | Comparison between code clone detection and model clone detection |
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 |