
C-Vise:C-Reduce 的超级并行 Python 移植版发布
来源标题:cvise: Super-parallel Python port of C-Reduce
C-Vise 是 C-Reduce 的超级并行 Python 移植版,完全兼容原工具并沿用基于 LLVM 的 clang_delta 缩减工具。它能自动将触发编译器 bug 的大型 C/C++/OpenCL 程序缩减为更小的等效程序,也可用于 JavaScript、Rust 等语言。项目目前正在寻找维护者。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
C-Vise 是 C-Reduce 的一个超级并行 Python 移植版。该移植版与 C-Reduce 完全兼容,并使用同样高效的、基于 LLVM 的 C/C++ 缩减工具 clang_delta。本项目正在寻找维护者——如果你有兴趣,请联系 [@marxin]。
C-Vise 是一个工具,它接收一个具有某种关注属性(例如触发编译器 bug)的大型 C、C++ 或 OpenCL 程序,并自动生成一个具有相同属性的小得多的 C/C++ 或 OpenCL 程序。它面向那些在编译器和其他处理 C/C++ 或 OpenCL 代码的工具中发现并报告 bug 的人。
该项目还包含一个简单的包装器 cvise-delta,它模拟原始 delta 工具的行为(但以超级并行的方式)。
注意:C-Vise 恰好也能很好地缩减 C/C++ 以外语言(如 JavaScript 和 Rust)程序的体积。如果你需要缩减其他语言的程序,不妨一试。
注意:二进制 pass 组(--pass-group=binary)包含一个实验性 pass,可以缩减 GCC 的 .gcda 文件。
我在 AMD Ryzen 7 2700X 八核处理器机器上对几个 GCC bug 报告做了对比,结果如下:
C-Vise 可用于缩减编译器崩溃。这里我们以现有的 PR94534 为例:
template<typename T> class Demo struct Demo* p; } payload{this}; friend decltype(payload); }; int main() Demo<int> d;
该程序在 GCC 中崩溃,但 Clang 可以接受:
$ g++ pr94534.C -c pr94534.C: In instantiation of ‘class Demo<int>’: pr94534.C:13:13: required from here pr94534.C:7:5: internal compiler error: Segmentation fault 7 | } payload{this}; | ^~~~~~~ 0x10a1d8f crash_signal /home/marxin/Programming/gcc/gcc/toplev.c:328 0x7ffff78fef1f ??? /usr/src/debug/glibc-2.31-4.1.x86_64/signal/../sysdeps/unix/sysv/linux/x86_64/sigaction.c:0 0xae31a8 instantiate_class_template_1 /home/marxin/Programming/gcc/gcc/cp/pt.c:11973 ... $ clang++ pr94534.C -c
因此,我们编写一个缩减脚本,让它在标准错误输出中 grep instantiate_class_template_1,并且能用 Clang 编译通过:
#!/bin/sh g++ pr94534.C -c 2>&1 | grep 'instantiate_class_template_1' && clang++ -c pr94534.C
然后就可以运行缩减:
$ cvise ./reduce-ice.sh pr94534.C INFO ===< 30356 >=== INFO running 16 interestingness tests in parallel INFO INITIAL PASSES INFO ===< IncludesPass >=== ... template <typename> class a { int b; friend decltype(b); }; void c() { a<int> d; }
多文件输入的用法
C-Vise 也可以缩减包含多个文件的测试用例——这些文件可以在命令行中单独传入,也可以作为整个目录传入。后者通常更高效,并允许 C-Vise 执行以下缩减:
例如,假设有如下目录树:
//--- repro/h1.h int x; //--- repro/h2.h #include "h1.h" //--- repro/src1.c #include "h2.h" //--- repro/src2.c // duplicate! int x; //--- repro/src3.c int main() { return 0; //--- repro/Makefile .PHONY: all clean all: prog src1.o: gcc -c src1.c src2.o: gcc -c src2.c src3.o: gcc -c src3.c prog: src1.o src2.o src3.o gcc -o prog src1.o src2.o src3.o clean: rm -f src1.o src2.o src3.o prog
然后就可以运行缩减:
$ cvise repro -c "(make -C repro 2>&1 || true) | grep 'multiple definition'" ... Reduced test-cases: --- repro --- //--- repro/Makefile .PHONY: all clean all: prog src1.o: gcc -c src1.c src2.o: gcc -c src2.c prog: src1.o src2.o gcc -o prog src1.o src2.o clean: rm -f src1.o src2.o prog //--- repro/src1.c int x ; //--- repro/src2.c int x ;
注意事项
C-Vise 会在 $TMPDIR 中创建临时目录,因此建议使用 tmpfs 目录。
每次运行 interestingness 测试时,都会在一个新的临时目录中执行,该目录包含正在被缩减文件的副本。如果你的 interestingness 测试需要访问其他文件,你应该将它们复制到当前工作目录,或者使用绝对路径引用它们。
如果你从构建工具中复制编译器调用行,请删除其中的 -Werror(如果存在)。某些 C-Vise pass 会引入警告,因此 -Werror 会使这些 pass 失效。这样做通常会使缩减速度更快,但最终可能会得到一段充满警告的代码片段,需要在缩减后处理。
在 interestingness 测试中添加 -Wfatal-errors 可以加速大型缩减,因为它会让编译器在遇到错误时快速退出,而不是继续硬撑并产生最终会被丢弃的结果。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。