intel/yarpgen

GitHub: intel/yarpgen

一款面向编译器优化的随机程序生成器,通过生成语义正确的 C/C++ 代码来系统性地发现编译器后端缺陷。

Stars: 546 | Forks: 64

# 又一个随机程序生成器 [![TravisCI 构建状态 (Linux 和 Mac)](https://travis-ci.org/intel/yarpgen.svg?branch=main)](https://travis-ci.org/intel/yarpgen) [![Appveyor 构建状态 (Windows 和 Ubuntu)](https://ci.appveyor.com/api/projects/status/meuyl409mtd4cljb/branch/main?svg=true)](https://ci.appveyor.com/project/webmasterintel/yarpgen/branch/main) [![许可证](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://github.com/intel/yarpgen/blob/main/LICENSE.txt) ``yarpgen`` 是一个随机程序生成器,它可以生成正确且可运行的 C/C++ 和 DPC++(此项工作处于早期阶段)程序。该生成器专门设计用于触发编译器优化错误,旨在用于编译器测试。 生成的随机程序保证在静态和动态上都是正确的程序。这意味着没有未定义行为,但允许实现定义行为。 目前,YARPGen 存在两个版本:一个设计用于测试循环(正在开发中,位于 main 分支),另一个设计用于测试标量优化(位于 [v1 分支](https://github.com/intel/yarpgen/tree/v1))。 关于 YARPGen 和循环版本的信息可以在 [这次演讲](https://youtu.be/Yyj2Fex9yEo) 和 [ 这篇论文](papers/yarpgen-pldi-2023.pdf) 中找到,该论文发表于 PLDI23。 关于标量版本的更多信息可以在 [ 这次演讲](https://www.youtube.com/watch?v=mb9aRoXnicE) 和 [ 这篇论文](papers/yarpgen-ooplsa-2020.pdf) 中找到,该论文发表于 OOPSLA 2020 并获得了 ACM SIGPLAN 杰出论文奖。 每个生成的程序由多个文件组成,编译并运行后会产生一个十进制数,该数字是所有程序全局变量值的哈希值。对于所有编译器和优化级别,该数字理应相同。如果不同编译器和/或优化级别的输出不同,您应该遇到了编译器错误。 为了增加触发编译器错误的概率,使用了几种技术: * 所有变量类型、对齐方式和值/值范围在生成时都是已知的,这允许准确检测未定义行为并提供生成代码的最大可变性。 * 生成是随机的,但受多种策略引导,这增加了对生成代码应用优化的可能性。 * 在某些情况下,首先生成具有已知属性的高级计算模型,然后用其他随机计算对其进行扩充。这确保了代码是“有意义的”,并且更类似于人类编写的代码。 ## YARP Generator 发现的编译器错误 ``yarpgen`` 成功在 [``gcc``](https://gcc.gnu.org/)、[``clang``](https://clang.llvm.org/)、[``ispc``](https://ispc.github.io/)、[``dpc++``](https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/dpc-compiler.html)、[``sde``](https://software.intel.com/content/www/us/en/develop/articles/intel-software-development-emulator.html)、[`alive2`](https://github.com/AliveToolkit/alive2) 中发现了超过 260 个错误,以及在商业编译器中发现了数量相当的错误。有关 ``gcc``、``clang``、``ispc`` 和 ``alive2`` 中的错误列表,请参阅 [bugs.rst](bugs.rst)。 如果您使用 ``yarpgen`` 在开源编译器中发现了错误,请更新 bugs.rst。我们也很高兴听到您将其用于商业编译器和您可能想要验证的其他工具的经验。 ## 构建和运行 构建 ``yarpgen`` 非常简单。您所需要做的就是使用 cmake: ``` mkdir build cd build cmake .. make ``` 要运行 ``yarpgen``,我们建议使用 [``run_gen.py``](scripts/run_gen.py) 脚本,它将使用一组预定义选项在多个可用的编译器上为您运行生成器。请随意修改 [``test_sets.txt``](scripts/test_sets.txt) 以添加或删除编译器选项。 该脚本将使用多个编译器选项运行多个编译器,并运行可执行文件以比较输出结果。如果结果不匹配,测试程序将被保存在“testing/results”文件夹中供您分析。 此外,您可能希望为目前尚不可用的未来硬件测试编译器。执行此操作的标准方法是下载 [Intel® Software Development Emulator](http://www.intel.com/software/sde)。``run_gen.py`` 假定它在您的 ``$PATH`` 中可用。 ## ISPC 测试 如果您想测试 [ISPC](https://ispc.github.io/),请确保它以及 [``ispc-proxy``](scripts/ispc-proxy) 和 [``ispc-disp``](scripts/ispc-disp) 存在于您的路径中。之后您可以像往常一样使用 [``run_gen.py``](scripts/run_gen.py) 并带上 ``--std=ispc`` 参数。 ## 联系方式 如需联系作者、提出问题或留下反馈,请使用 Github [问题](https://github.com/intel/yarpgen/issues) 或通过 Github 个人资料中提供的联系方式直接联系。 ## 人员 * Vsevolod Livinskii * Dmitry Babokin * John Regehr 特别感谢 Martin Liška 和 Detlef Riekenberg,他们使用 YARPGen 在各种编译器中发现了错误。
标签:Bash脚本, C++, DPC++, Intel, OOPSLA, PLDI, 云安全监控, 代码生成, 安全测试, 循环优化, 攻击性安全, 数据擦除, 标量优化, 渗透测试工具, 编译器Bug检测, 编译器测试, 软件测试工具, 逆向工具, 随机程序生成器, 静态分析