(论文阅读)On Learning Meaningful Assert Statements for Unit Test Cases

[技术积累]On Learning Meaningful Assert Statements for Unit Test Cases 会议:ICSE’2020 作者:Cody Watson(Washington and Lee University),Michele Tufano(Microsoft) ABSTRACTSoftware testing是软件生命周期的重要组成部分,其需要花费大量的时间和精力。据估计,软件开发人员将近 50% 的时间用于测试他们编写的代码。因此,学术界的一个长期目标就是实现软件测试的(部分)自动化。虽然已经提出了几种自动生成测试方法的技术和工具,但最近的研究对其生成的断言语句的质量和实用性提出了批评。因此,我们采用了一种基于神经机器翻译(NMT)的方法叫ATLAS(AuTomatic Learning of Assert Statements)来自动化地为测试方法生成有意义的断言语句。给定一个test method和一个focal method(即被测试的方法),ATLAS 就能预测有意义的断言语句,以评估focal method的正确性。我们将 ATLAS 应用于 GitHub 项目中的数千个测试方法,当只考虑top1的预测断言时,它能在 31% 的情况下准确预测开发人员手动编写的断言语句。当考虑到top5的预测断言语句时,ATLAS 能够在 50% 的情况下预测出精确匹配的断言语句。这些令人鼓舞的结果表明,我们的方法具有以下潜在用途:(i) 作为自动测试案例生成技术的补充;(ii) 为开发人员提供代码完成支持,他们可以在编写测试代码时从推荐的断言语句中获益。

阅读全文

(论文阅读)Go or No Go-Differential Fuzzing of Native and C Libraries

Go or No Go: Differential Fuzzing of Native and C Libraries 时间:2023.5 作者:Alessandro Sorniotti(IBM)、Michael Weissbacher、Anil Kurmus 会议:S&P‘2023 Abstract​ 十多年来,Go 已经成为当今最流行的编程语言之一。Go 是一种静态类型的编译语言,通过强类型、自动插入的边界检查和标记-清扫垃圾收集器,实现了空间和时间上的内存安全性。Go 开发人员可以即时使用大量的本地库,这些库可以作为运行时的一部分提供,也可以从社区代码中导入;或者,Go 开发人员可以直接链接到 C/C++ 库,这些库可以通过cgo功能从GO源码中调用。做出支持以上功能的这一决定的原因包括稳定性、性能和可用性。因此,开发人员可以在 Go 本地库或非本地代码之间做出选择。然而,如今人们对如何在这一决策中考虑安全问题还知之甚少。

阅读全文

(论文阅读)Security Risks of Porting C Programs to WebAssembly

(论文阅读)Security Risks of Porting C Programs to WebAssembly 时间: 2022 作者:Quentin Stiévenart、Coen De Roover、Mohammad Ghafari 会议:Proceedings of the 37th ACM/SIGAPP Symposium on Applied Computing Abstract​ WebAssembly是一种用于跨平台应用程序的编译目标,目前正被越来越多地使用。在本文中,我们研究了能否将 C 程序不需要大量修改直接编译到 WebAssembly 中,如果不能,移植会对其安全性产生什么影响。我们将表现出常见漏洞的17802个程序编译成64位的x86和WebAssembly二进制文件,并观察到在这些平台上执行4911个二进制文件会产生不同的结果。 ​ 通过人工检查,我们找出了造成这种差异的三类根本原因: 使用了不同的标准库实现; WebAssembly 缺乏安全措施; 执行环境的语义不同。 ​ 我们描述了我们的观察结果,并讨论了从安全角度来看至关重要、最需要开发人员关注的问题。我们的结论是,将现有的 C 程序编译成 WebAssembly 进行跨平台发布可能需要对源代码进行调整;否则,WebAssembly 应用程序的安全性可能会受到威胁。

阅读全文

(论文阅读)★Finding Unstable Code via Compiler-Driven Differential Testing

Finding Unstable Code via Compiler-Driven Differential Testing 时间:2023 作者:Shaohua Li、Zhendong Su(苏黎世联邦理工) 会议:ASPLOS(CCF-A) 开源:shao-hua-li/compdiff (github.com) Abstract​ 不稳定的代码是指由于程序中存在未定义行为(UB),导致运行时语义不一致或不稳定的代码。编译器通过假设未定义行为永远不会发生来利用UB,从而生成高效但潜在语义不一致的二进制文件。实践者们在设计动态工具(例如sanitizers)来处理常见的UB问题时已付出了大量研究和工程努力。然而,目前的技术仍面临一个重大挑战,即如何检测那些超出当前技术范围的UB问题。 ​ 在本文中,我们介绍了一种名为Compiler-driven differential testing(CompDiff)的简单而有效的方法,用于发现C/C++程序中的不稳定代码。CompDiff利用了一个事实,即当编译不稳定代码时,不同的编译器实现可能会生成语义上不一致的二进制文件。我们的主要方法是检查相同输入上不同二进制文件的输出。输出的差异可能表明存在不稳定的代码。为了在实际程序中检测不稳定代码,我们还将CompDiff集成到AFL++中,这是最常用且积极维护的通用模糊测试工具。 ​ 尽管CompDiff的方法简单,但实践中非常有效:在Juliet基准程序上,相比于sanitizers,CompDiff独特地检测到1,409个错误;在23个流行的开源C/C++项目中,CompDiff-AFL++发现了78个新错误,其中52个已经被开发人员修复,而36个无法通过sanitizers检测出来。我们的评估还揭示了一个事实,即CompDiff的设计并不是为了取代当前的UB检测工具,而是为它们提供补充。

阅读全文