Herhangi bir dilde kullanılabilen C-Reduce tekniği
(bernsteinbear.com)- C-Reduce, C derleyici hata yeniden üretim kodunu küçültmek için kullanılan bir araçtır; ancak belirleyici koşullar, hızlı yeniden üretim ve düzenlenebilir kaynak dosyaları varsa diğer dillere de uygulanabilir.
- Örnek, RustPython üzerinde scrapscript çalıştırılırken ortaya çıkan bir hatayı küçültme sürecini gösteriyor;
interesting.sh, belirli bir hata mesajını bularak yeniden üretilip üretilmediğine karar veriyor. - Yalnızca
creduce --not-c interesting.sh scrapscript.pykomutunu çalıştırarak dosya boyutu hızla küçüldü ve erken aşamada neredeyse %50 küçülme görülebildi. --not-c, C'ye özel küçültme geçişlerini atlayan bir seçenektir; bu da Python gibi girdilerde gereksiz çalışma süresini azaltmaya yardımcı olur.- Hatanın yeniden üretildiği koşulları kısa bir betik hâline getirebiliyorsanız, C dışındaki diller için hata raporlarını da C-Reduce ile daha küçük ve yönetilebilir hâle getirebilirsiniz.
C-Reduce'u C dışındaki girdilerde kullanma koşulları
- C-Reduce, Regehr ve çalışma arkadaşlarının geliştirdiği bir C derleyici hata yeniden üretim kodu en aza indirme aracıdır.
- 10.000 satırlık bir C dosyası Clang hatasını tetiklediğinde, devasa dosyayı olduğu gibi göndermek yerine otomatik olarak küçültmek için kullanılabilir.
- C'ye özel bir araç gibi görünse de, aşağıdaki koşullar sağlanırsa başka dillerin girdilerinde de kullanılabilir.
-
Belirleyici koşullar
- Küçültme hızına yardımcı olan görece hızlı bir yeniden üretim yöntemi
- C-Reduce'un küçültebildiği, düzenlenebilir bir veya daha fazla kaynak dosyası
- Belirleyici koşullar, bir döngü sarmalayıcısı kullanılarak olasılıksal biçimde de taklit edilebilir.
-
RustPython hata yeniden üretimini küçültme örneği
- RustPython üzerinde scrapscript çalıştırılırken bir hata oluştu ve bunu raporlamak için
interesting.shbetiği yazıldı. - Betik, RustPython ikilisini mutlak yoluyla kullanarak
scrapscript.pydosyasını çalıştırdıktan sonra, standart hata çıktısı dâhil olmak üzere çıktıda şu dizgeyi arıyor:tried to push value onto stack but overflowed max_stackdepth
- Çalıştırma komutu şu şekildedir:
creduce --not-c interesting.sh scrapscript.py
- C-Reduce, interestingness test'ini paralel olarak çalıştırır ve dosya boyutunu hızla küçültür.
- Örnek ilerleme yüzdeleri 0.5%, 9.2%, 18.1%, 47.5% olarak gösterilir.
- Birkaç saniye içinde dosyayı neredeyse %50 küçültür.
- Yazı tamamlanırken %96,9 küçültme seviyesine ulaşılmıştır.
--not-ckullanılmazsa, C-Reduce çok sayıda C'ye özel geçiş kullanır.- Python girdilerinde bu geçişler çalışma süresini yavaşlatabilir.
- Ancak sonucun kendisini pratikte değiştirmeme ihtimali yüksektir.
- İlgili içerik daha sonra Delta debugging sayfasına taşındı.
1 yorum
Hacker News yorumları
Küçültülmüş dosyayı paylaşmadıkları için kendim çalıştırdım.
RustPython'ı derleyipscrapscript.pydosyasını aldıktan sonrainteresting.shiçindeki yolu değiştirereknix run nixpkgs#creduce -- --not-c interesting.sh scrapscript.pykomutuyla çalıştırdım; sonunda %96,4, 7347 bayt civarında durdu ve sonuç https://gist.github.com/judofyr/47cba8a20cb2cd5798943ef975d0... adresindeshrinkray, yaklaşık 10 dakika çalışınca 162 bayta kadar küçülüyor: https://gist.github.com/DRMacIver/ee025c90b4867125b382a13aaa...Daha uzun bırakılırsa biraz daha iyi olabilir, ama neredeyse durmuş gibi göründüğü için sıkılıp kapattım
C-Reduce'un yazarı John Regehr de bu kullanım için
Shrinkraydenemeyi öneriyor.Shrinkraybiçimden bağımsız çalışacak şekilde tasarlanmış ve C-Reduce'un pek iyi olmadığı durumlara da uygun bir araç olduğunu söylüyor: https://mastodon.social/@regehr/113489759789563570Shrinkrayin resmi deposu mu? https://github.com/DRMacIver/shrinkraycvisedan da bahsetmek isterim: https://github.com/marxin/cviseC dışındaki dillerde de oldukça iyi çalışan Python alternatifi
John Regehr ve diğer yazarların 2012'de yazdığı, çalışma biçimini açıklayan bir makale var: https://fsl.cs.illinois.edu/publications/regehr-chen-cuoq-ei...
Hatırladığım kadarıyla C-Reduce'un alana özgü olmayan küçültme işlemlerinin çoğu basit kaba kuvvete yakın
C-Reduce'u az önce ilk kez öğrendim ve şimdiden içine çekildim. İlk kez git bisect'i keşfettiğim zamana benziyor
Bir gün uygun durumla karşılaşırsam kullanabilmek için bunu aklımın bir köşesine koymalıyım
Kurup denesem mi diye düşünüyorum. VICE, ana işletim sisteminin dosyasına “çıktı” yazma özelliğini destekliyormuş; testleri emülatörde çalıştırmak mümkün gibi
Delta debugging yeni bir kavram değil: https://en.wikipedia.org/wiki/Delta_debugging
Benim yazdığım delta debugging uygulaması
delta19 yıldan eski: https://github.com/dsw/deltaMicrosoft'un açık kaynağa “kanser” dediği dönemde Microsoft Research, yayımlamamı istemek için ofisime birini göndermişti; ben de açık kaynak olarak yayımladım. Latner'ın LLVM tanıtımında da “standart delta debugging aracı”ndan bahsediliyor, yani epey bilinen bir araç: https://aosabook.org/en/v1/llvm.html
Yani etkili program küçültme için basit delta debugging'den fazlası gerektiği sonucu çıkıyor. Elbette C-Reduce da artık 12 yıllık bir araç
Ayrıca bağlantısı verilen LLVM aracı
BugPointyalnızca LLVM IR'ye özgüyken, C-Reduce daha genel görünüyor. Otomatik test vakası küçültme araçları ve teknikleri çoğu geliştiriciye hâlâ yabancı; bu alanda uzun süredir bilinen bir fikir olsa bile bu yazı faydalı olabilirÖncesi-sonrası örnekleri olan bir yazı buldum: https://pramodkumbhar.com/2024/01/c-reduce-systematically-ta...
Yine de her yinelemede neyin kaldırılacağını nasıl bildiğini hâlâ tam anlayamıyorum. Bir ölçüde tokenizasyon olmalı, ama bunun birden çok programlama dili genelinde nasıl çalıştığını bilmiyorum
creduceharikaBen tuhaf bir LLVM hedef backend'i geliştirirken,
CSmithile saatlerce rastgele test programları üreten bir test betiği kullanıyordum. Çökme olursa otomatik olarak C-Reduce çalıştırıp incelemek üzere bir dosya bırakıyordu; gerçekten çok yardımcı olduSQL’de de iyi çalışıyor. İşte kullanıyorum ve https://github.com/sqlancer/sqlancer?tab=readme-ov-file#redu... üzerinden öğrendim
C dışındaki dillerde de çalıştığını açıklamazsanız inanması zor bir iddia. Yalan olduğunu düşünmüyorum ama bunu LLM olmadan yapıyor olması şaşırtıcı
Örneğin girdiyi C tarzında token’lara ayırıp uzunluğu yaklaşık 1–13 olan parçaları rastgele atma yöntemi, C’ye benzeyen dillerin çoğu benzer tokenizasyon kurallarına sahip olduğu için gereksiz niteleyicileri veya özellikleri kaldırmada iyi işe yarıyor. Dengeli parantez
(),{},[]birimlerini kaldıran geçiş de neredeyse tüm dillerde faydalı. Yorum ve boşluk kaldırma da birçok dil C ile aynı/* */,//stilini kullandığından etkiliGerçekte tamamen C/C++’a özgü geçiş sayısı çok değil. Deneyimlerime göre
creduce’un büyük zayıflıklarından biri, şablonları kaldıran küçültme adımında, yani nispeten otomasyonu kolay görünen bir işte, gerçekten kötü olmasıBazı dönüşümler Clang ön ucunu kullanan, oldukça C’ye özel şeyler; bazılarıysa epey genel, bu yüzden Algol ailesi dillerde büyük olasılıkla çalışır. Modüler bir araç olduğu için isterseniz başka dilleri anlayan dönüşümler de ekleyebilirsiniz
Burada kastedilen algoritma gibi şeyler; ürkütücü makine öğrenimi değil. Prolog’u yapay zekada kullanmak gibi şeyler de buna dahil, ama yapay zeka yapma amacı için pek iyi çalışmaması gibi küçük bir dezavantajı var
creducedeğiştirilmiş girdi betiğini çalıştırıp dosyalarımı silebilir ya da öğle yemeğimi yiyebilir mi?dustmiteile karşılaştırınca nasıl? https://dlang.org/blog/2020/04/13/dustmite-the-general-purpo...