1 puan yazan GN⁺ 2024-11-28 | 1 yorum | WhatsApp'ta paylaş
  • 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.py komutunu ç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.sh betiği yazıldı.
  • Betik, RustPython ikilisini mutlak yoluyla kullanarak scrapscript.py dosyası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-c kullanı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

 
GN⁺ 2024-11-28
Hacker News yorumları
  • Küçültülmüş dosyayı paylaşmadıkları için kendim çalıştırdım. RustPython'ı derleyip scrapscript.py dosyasını aldıktan sonra interesting.sh içindeki yolu değiştirerek nix run nixpkgs#creduce -- --not-c interesting.sh scrapscript.py komutuyla çalıştırdım; sonunda %96,4, 7347 bayt civarında durdu ve sonuç https://gist.github.com/judofyr/47cba8a20cb2cd5798943ef975d0... adresinde

    • Aklıma gelen bir şey: Başka biri, küçültme sürecinde programın bozulup yerel makinede yıkıcı işlemler yapabileceğinden endişe etmişti. Küçültücüyü kaynak-kaynağa bir Nix derivation olarak çalıştırırsak tehlikeli davranışları engelleyip uzak derleyicilere de kolayca dağıtamaz mıyız diye düşündüm
    • Bu arada shrinkray, 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 Shrinkray denemeyi öneriyor. Shrinkray biç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/113489759789563570

  • 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...

    • Bu makaleyi okudum ama bunun nasıl mümkün olduğuna hâlâ pek aklım ermiyor. Rastgele bir programlama dili için tokenize etmeyi, satır birleştirmeyi, token silmeyi vb. anlıyor gibi görünüyor; yalnızca bu algoritmayı ayrıca açıklayan başka bir makale var mı merak ediyorum
    • Bu makale C-Reduce'un tamamı hakkında değil, projeye eklenen 3 alana özgü test vakası küçültücüsü hakkında
      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

    • Üniversiteden sonraki ilk işimde C/C++ derleyici ekibindeyken bu işi elle yapıyorduk. Aynı şeyin otomasyonla yapılabilmesi epey şaşırtıcı
    • 6502 işlemcisi için bir C derleyicisi olan cc65'te, derleyici hatası gibi görünen bir sorun yaşadım. Hedefler C64, NES, Apple 1 gibi sistemler
      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
    • Rastgele test girdisi üreteci ile birlikte kullanıldığında harika
  • Delta debugging yeni bir kavram değil: https://en.wikipedia.org/wiki/Delta_debugging
    Benim yazdığım delta debugging uygulaması delta 19 yıldan eski: https://github.com/dsw/delta
    Microsoft'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

    • C-Reduce, basit delta debugging'den biraz daha incelikli. 2012 tarihli 「Test-Case Reduction for C Compiler Bugs」 makalesinin özetine göre C-Reduce'un sonuçları, diğer küçültücülerden veya derleyici geliştiricilerinin o dönemde en çok kullandığı mevcut küçültücüden ortalama 25 kattan fazla daha küçük
      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ı BugPoint yalnı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

  • creduce harika
    Ben tuhaf bir LLVM hedef backend'i geliştirirken, CSmith ile 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ı oldu

  • SQL’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ı

    • Kısaca, bazı küçültme geçişleri C ailesi dillere epey genellenebiliyor ve bu geçişler en etkili olanlar arasında
      Ö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 etkili
      Gerç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ı
    • asmeurer’ın bağlantısını verdiği PLDI makalesine göz atmanızı öneririm. İyi özetlenmiş
      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
    • Bu daha çok eski usul bilgisayar bilimine yakın. Umarım HN bu geleneksel bilgisayar bilimini şimdiden unutmamıştır
      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
    • Nasıl çalıştığını anlamazsam bu şekilde kullanmanın güvenli olup olmadığını bilemem. creduce değiştirilmiş girdi betiğini çalıştırıp dosyalarımı silebilir ya da öğle yemeğimi yiyebilir mi?
    • Makaleyi okumadan tahmin yürütürsem, girdi boyutunu azaltan mutasyonlar uygulayan bir fuzzer’a benziyor olabilir
  • dustmite ile karşılaştırınca nasıl? https://dlang.org/blog/2020/04/13/dustmite-the-general-purpo...