通过类型驱动的变异技术对C++编译器进行模糊测试
《Proceedings of the ACM on Programming Languages》:Fuzzing C++ Compilers via Type-Driven Mutation
【字体:
大
中
小
】
时间:2025年11月07日
来源:Proceedings of the ACM on Programming Languages
编辑推荐:
C++类型系统测试工具TyMut通过突变生成和必须分析发现102个编译器错误,其中56个经开发者确认为新发现,包括26个崩溃问题,7个超过20年未修复的隐患,并推动C++标准修正。
摘要
C++是一种用于现代软件开发的系统级编程语言,支持多种编程范式,包括面向对象、泛型和函数式编程。这些范式及其相互作用本身具有复杂性,赋予了C++强大的表达能力,但同时也给编译器在正确实现其类型系统方面带来了重大挑战。类型系统涵盖了类型推断、类型检查、子类型化、类型转换、泛型、作用域和绑定等多个方面。然而,在现有研究中,对C++编译器类型系统的系统性测试仍然鲜有探讨。
在这项工作中,我们提出了TyMut,这是首个专门用于测试C++类型系统的工具。TyMut是一种基于变异的编译器模糊测试工具,配备了先进的类型驱动变异操作符,这些操作符经过精心设计,能够针对模板泛型、类型转换和继承等复杂的类型相关特性进行测试。除了差异测试之外,TyMut还引入了增强型的测试预言机制(测试预言器),通过这种机制可以部分验证生成程序的有效性。具体来说,变异操作符被分为“形式正确”和“形式不正确”两类:由形式正确的变异操作符生成的程序是有效的,编译器必须接受它们;而由形式不正确的操作符生成的程序则需要根据一套形式正确性规则进行验证。任何违规情况都表明程序无效,必须被拒绝。对于那些通过规则测试但缺乏明确验证结果的程序,TyMut会运用差异测试来识别不同编译器之间的行为差异。
整个测试过程耗时约32小时,生成并测试了250,584个程序。测试预言机制为几乎所有生成的程序提供了明确的验证结果。TyMut在GCC和Clang的最新版本中发现了102个漏洞,其中56个漏洞被编译器开发者确认为新问题。在这些被确认的漏洞中,有26个会导致编译器崩溃,超过50%的漏洞会导致编译错误。此外,有7个漏洞潜伏了20年以上,22个潜伏了10年以上,39个潜伏了5年以上。TyMut发现的一个长期存在的漏洞后来被证实是TensorFlow中实际问题的根源。在提交本文之前,已有13个漏洞被修复,其中大部分在60天内得到了修复。值得注意的是,一些未被确认的漏洞引发了开发者之间的深入讨论。例如,有一个漏洞促使一位编译器开发者向C++语言标准委员会提交了新的问题报告,表明我们在语言规范中发现了歧义。
生物通微信公众号
生物通新浪微博
今日动态 |
人才市场 |
新技术专栏 |
中国科学人 |
云展台 |
BioHot |
云讲堂直播 |
会展中心 |
特价专栏 |
技术快讯 |
免费试用
版权所有 生物通
Copyright© eBiotrade.com, All Rights Reserved
联系信箱:
粤ICP备09063491号