- C-Reduce adalah alat untuk mengecilkan kode reproduksi bug compiler C, tetapi juga dapat diterapkan ke bahasa lain jika ada kondisi deterministik, reproduksi yang cepat, dan file sumber yang bisa dimodifikasi
- Contohnya adalah proses mengecilkan bug yang muncul saat menjalankan scrapscript di RustPython, dengan
interesting.shmenentukan apakah bug tereproduksi dengan mencari pesan error tertentu - Hanya dengan menjalankan
creduce --not-c interesting.sh scrapscript.py, ukuran file berkurang dengan cepat, dan pada tahap awal terlihat progres hampir 50% lebih kecil --not-cadalah opsi untuk menghindari pass reduksi khusus C, sehingga membantu mengurangi waktu eksekusi yang tidak perlu pada input seperti Python- Jika kondisi reproduksi bug dapat dibuat sebagai skrip singkat, laporan bug untuk bahasa selain C pun dapat dibuat lebih kecil dan lebih mudah ditangani dengan C-Reduce
Syarat Menggunakan C-Reduce untuk Input Selain C
- C-Reduce adalah alat buatan Regehr dan rekan-rekannya untuk meminimalkan kode reproduksi bug compiler C
- Saat file C 10.000 baris memicu bug Clang, alat ini dapat digunakan untuk mengecilkannya secara otomatis alih-alih mengirim file besar apa adanya
- Meski tampak seperti alat khusus C, C-Reduce juga dapat digunakan untuk input bahasa lain jika memenuhi syarat berikut
-
Kondisi deterministik
- Metode reproduksi yang relatif cepat, yang membantu kecepatan reduksi
- Satu atau lebih file sumber yang dapat dimodifikasi dan bisa diperkecil oleh C-Reduce
- Kondisi deterministik juga dapat ditiru secara probabilistik menggunakan loop wrapper
-
Contoh Mengecilkan Reproduksi Bug RustPython
- Sebuah bug terjadi saat menjalankan scrapscript di RustPython, dan untuk melaporkannya dibuat skrip
interesting.sh - Skrip menjalankan
scrapscript.pydengan path absolut ke binary RustPython, lalu mencari string berikut pada output, termasuk standard errortried to push value onto stack but overflowed max_stackdepth
- Perintah eksekusinya adalah sebagai berikut
creduce --not-c interesting.sh scrapscript.py
- C-Reduce menjalankan interestingness test secara paralel dan dengan cepat mengecilkan ukuran file
- Contoh progres ditampilkan sebagai 0,5%, 9,2%, 18,1%, 47,5%, dan seterusnya
- Dalam beberapa detik, file berkurang hampir 50%
- Saat tulisan selesai, reduksi telah mencapai 96,9%
- Jika
--not-ctidak digunakan, C-Reduce memakai banyak pass khusus C- Pada input Python, pass seperti ini dapat memperlambat waktu eksekusi
- Kemungkinan besar tidak benar-benar mengubah hasilnya sendiri
- Konten terkait kemudian dipindahkan ke halaman Delta debugging
1 komentar
Komentar Hacker News
Karena file yang sudah diperkecil tidak dibagikan, saya mencobanya sendiri. Saya membangun
RustPython, mengambilscrapscript.py, lalu mengubah path diinteresting.shdan menjalankannix run nixpkgs#creduce -- --not-c interesting.sh scrapscript.py; pada akhirnya proses berhenti di sekitar 96,4%, 7347 byte, dan hasilnya ada di https://gist.github.com/judofyr/47cba8a20cb2cd5798943ef975d0...shrinkraykalau dijalankan sekitar 10 menit bisa menyusut hingga 162 byte: https://gist.github.com/DRMacIver/ee025c90b4867125b382a13aaa...Kalau dibiarkan lebih lama mungkin bisa sedikit lebih baik, tapi kelihatannya hampir berhenti total jadi saya bosan dan mematikannya
John Regehr, penulis C-Reduce, juga menyarankan untuk mencoba
Shrinkrayuntuk penggunaan ini. KatanyaShrinkraydibuat agar bekerja independen dari format, dan cocok bahkan pada kasus yang tidak ditangani baik oleh C-Reduce: https://mastodon.social/@regehr/113489759789563570Shrinkray? https://github.com/DRMacIver/shrinkraycvise: https://github.com/marxin/cviseIni adalah alternatif Python yang juga bekerja cukup baik untuk bahasa selain C
Ada makalah tahun 2012 oleh John Regehr dan penulis lain yang menjelaskan cara kerjanya: https://fsl.cs.illinois.edu/publications/regehr-chen-cuoq-ei...
Kalau saya ingat benar, sebagian besar reduksi nonspesifik-domain di C-Reduce lebih mirip brute force sederhana
Saya baru saja mengetahui C-Reduce, tapi langsung terpikat. Rasanya mirip saat pertama kali menemukan git bisect
Saya harus menyimpannya di sudut pikiran untuk dipakai suatu hari nanti kalau situasinya pas
Saya jadi ingin menyiapkannya. Ternyata VICE mendukung fitur untuk “mengeluarkan” ke file di sistem operasi host, jadi sepertinya pengujian bisa dijalankan di emulator
Delta debugging bukan konsep baru: https://en.wikipedia.org/wiki/Delta_debugging
Implementasi delta debugging buatan saya,
delta, sudah berumur lebih dari 19 tahun: https://github.com/dsw/deltaPada masa ketika Microsoft menyebut open source sebagai “kanker”, Microsoft Research sampai mengirim orang ke kantor saya untuk meminta agar ini dipublikasikan, jadi saya merilisnya sebagai open source. Presentasi pengantar LLVM oleh Latner juga menyebutnya sebagai “alat delta debugging standar”, jadi ini alat yang cukup dikenal: https://aosabook.org/en/v1/llvm.html
Artinya, reduksi program yang efektif membutuhkan sesuatu yang lebih dari sekadar delta debugging sederhana. Tentu saja, C-Reduce sendiri sekarang juga sudah berumur 12 tahun
Pada saat yang sama,
BugPoint, alat LLVM yang ditautkan itu, khusus untuk LLVM IR, sedangkan C-Reduce tampak lebih umum. Alat dan teknik minimisasi test case otomatis masih asing bagi sebagian besar pengembang, jadi meskipun idenya sudah lama dikenal di bidang ini, tulisan ini tetap bisa bermanfaatSaya menemukan tulisan dengan contoh sebelum-dan-sesudah: https://pramodkumbhar.com/2024/01/c-reduce-systematically-ta...
Meski begitu, saya masih belum benar-benar paham bagaimana ia tahu apa yang harus dihapus pada tiap iterasi. Pasti ada tokenisasi sampai tingkat tertentu, tapi saya tidak tahu bagaimana itu bekerja lintas banyak bahasa pemrograman
creducememang luar biasaSaat mengembangkan backend target LLVM yang aneh, saya menulis skrip pengujian yang membuat program uji acak dengan
CSmithselama berjam-jam. Begitu terjadi crash, skrip itu otomatis menjalankan C-Reduce dan menyisakan file untuk diperiksa; itu benar-benar sangat membantuJuga bekerja baik untuk SQL. Saya memakainya di pekerjaan, dan mengetahuinya lewat https://github.com/sqlancer/sqlancer?tab=readme-ov-file#redu...
Sulit dipercaya kalau tidak dijelaskan kenapa ini juga bekerja untuk bahasa selain C. Saya tidak mengira ini bohong, tapi mengejutkan bahwa ini bisa dilakukan tanpa LLM
Misalnya, setelah input ditokenisasi dengan cara ala C lalu potongan sepanjang kira-kira 1~13 dibuang secara acak, ini cukup ampuh menghapus qualifier atau atribut yang tidak perlu karena kebanyakan bahasa yang mirip C punya aturan tokenisasi serupa. Pass yang menghapus unit tanda kurung seimbang
(),{},[]juga berguna di hampir semua bahasa. Penghapusan komentar dan spasi juga efektif karena banyak bahasa memakai gaya/* */,//yang sama seperti C.Sebenarnya tidak banyak pass yang benar-benar khusus untuk C/C++. Dari pengalaman, salah satu kelemahan besar
creducejustru adalah buruknya tahap reduksi untuk menghapus template, yaitu pekerjaan yang tampaknya relatif mudah diotomatisasiSebagian transformasi cukup spesifik ke C karena memakai frontend Clang, dan sebagian lagi cukup umum sehingga kemungkinan besar bekerja untuk bahasa keluarga Algol. Karena ini alat modular, kalau mau Anda juga bisa menambahkan transformasi yang memahami bahasa lain
Yang dibicarakan di sini adalah hal-hal seperti algoritme, bukan machine learning menyeramkan. Termasuk juga hal seperti memakai Prolog untuk AI, meski ada kelemahan kecil bahwa itu tidak terlalu berhasil untuk tujuan membuat AI
creducebisa saja menjalankan skrip input yang sudah diubah lalu menghapus file saya atau bahkan melahap makan siang saya?Dibandingkan dengan
dustmite, bagaimana? https://dlang.org/blog/2020/04/13/dustmite-the-general-purpo...