किसी भी भाषा में इस्तेमाल की जा सकने वाली C-Reduce तकनीक
(bernsteinbear.com)- C-Reduce C compiler bug को reproduce करने वाले कोड को छोटा करने का टूल है, लेकिन अगर deterministic condition, तेज reproduction, और edit किए जा सकने वाले source file हों, तो इसे दूसरी भाषाओं पर भी लागू किया जा सकता है
- उदाहरण में RustPython में scrapscript चलाते समय आए bug को छोटा करने की प्रक्रिया दिखाई गई है, और
interesting.shकिसी खास error message को ढूंढकर तय करता है कि bug reproduce हुआ या नहीं - सिर्फ
creduce --not-c interesting.sh scrapscript.pyचलाने से file size तेजी से कम हुआ, और शुरुआत में ही लगभग 50% reduction की प्रगति देखी जा सकती है --not-cएक ऐसा option है जो C-विशेष reduction passes से बचाता है, इसलिए Python जैसे input पर यह अनावश्यक execution time घटाने में मदद करता है- अगर bug reproduce होने की शर्त को एक छोटी script में बदला जा सके, तो C के अलावा दूसरी भाषाओं के bug report भी C-Reduce से छोटे और संभालने में आसान बनाए जा सकते हैं
C-Reduce को C के अलावा दूसरे input पर इस्तेमाल करने की शर्तें
- C-Reduce Regehr और उनके साथियों द्वारा बनाया गया C compiler bug reproduction code minimization टूल है
- अगर 10,000 लाइन की कोई C file Clang bug ट्रिगर करती है, तो उस बड़ी file को जस का तस भेजने के बजाय इसे अपने-आप छोटा करने के लिए इस्तेमाल किया जा सकता है
- यह C-विशेष टूल जैसा दिखता है, लेकिन नीचे दी गई शर्तें हों तो दूसरी भाषाओं के input पर भी इस्तेमाल किया जा सकता है
-
Deterministic condition
- reproduction का अपेक्षाकृत तेज तरीका, जो reduction speed में मदद करे
- एक या अधिक edit किए जा सकने वाले source file, जिन्हें C-Reduce छोटा कर सके
- deterministic condition को loop wrapper का उपयोग करके probabilistic रूप में भी नकल किया जा सकता है
-
RustPython bug reproduction reduction का उदाहरण
- RustPython में scrapscript चलाते समय bug आया, और उसकी report के लिए
interesting.shscript लिखी गई - यह script RustPython binary के absolute path से
scrapscript.pyचलाने के बाद, standard error सहित output में नीचे दी गई string खोजती हैtried to push value onto stack but overflowed max_stackdepth
- चलाने का command इस प्रकार है
creduce --not-c interesting.sh scrapscript.py
- C-Reduce parallel में interestingness test चलाते हुए file size को तेजी से घटाता है
- उदाहरण progress 0.5%, 9.2%, 18.1%, 47.5% आदि के रूप में दिखाई जाती है
- कुछ ही सेकंड में file को लगभग 50% तक घटा देता है
- लेख समाप्त करते समय यह 96.9% reduction तक पहुंच गया था
- अगर
--not-cका उपयोग न किया जाए, तो C-Reduce C-विशेष passes की बड़ी संख्या चलाता है- Python input में ये passes execution time को धीमा कर सकते हैं
- लेकिन संभव है कि ये वास्तविक परिणाम को खास तौर पर न बदलें
- संबंधित सामग्री बाद में Delta debugging पेज पर स्थानांतरित कर दी गई
1 टिप्पणियां
Hacker News टिप्पणियाँ
घटाई गई फ़ाइल शेयर नहीं की गई थी, इसलिए मैंने खुद चलाकर देखा।
RustPythonबिल्ड किया,scrapscript.pyलिया, फिरinteresting.shका path बदलकरnix run nixpkgs#creduce -- --not-c interesting.sh scrapscript.pyसे चलाया। आखिर में यह लगभग 96.4%, 7347 bytes पर आकर रुक गया, और परिणाम यहाँ है: https://gist.github.com/judofyr/47cba8a20cb2cd5798943ef975d0...shrinkrayकरीब 10 मिनट चलाने पर इसे 162 bytes तक घटा देता है: https://gist.github.com/DRMacIver/ee025c90b4867125b382a13aaa...ज्यादा देर छोड़ने पर शायद थोड़ा और बेहतर हो, लेकिन यह लगभग रुका हुआ लग रहा था, इसलिए ऊबकर मैंने बंद कर दिया।
C-Reduce के लेखक John Regehr भी इस उपयोग के लिए
Shrinkrayआज़माने की सलाह देते हैं। उनका कहना है किShrinkrayको format-independent तरीके से काम करने के लिए बनाया गया है, और जिन मामलों में C-Reduce अच्छा नहीं करता, वहाँ यह ठीक बैठने वाला tool है: https://mastodon.social/@regehr/113489759789563570Shrinkrayकी official repository है? https://github.com/DRMacIver/shrinkraycviseका भी ज़िक्र करना चाहूँगा: https://github.com/marxin/cviseयह एक Python alternative है, जो non-C languages पर भी काफ़ी अच्छा काम करता है।
John Regehr और अन्य लेखकों का 2012 का एक paper है, जो बताता है कि यह कैसे काम करता है: https://fsl.cs.illinois.edu/publications/regehr-chen-cuoq-ei...
मेरी याद में, C-Reduce की ज़्यादातर domain-agnostic reduction simple brute force जैसी ही है।
C-Reduce के बारे में अभी-अभी पहली बार पता चला और मैं पहले ही इसमें खिंच गया हूँ। वैसा ही अनुभव है जैसा पहली बार git bisect खोजने पर हुआ था।
इसे दिमाग के किसी कोने में रख लेना चाहिए, ताकि कभी सही परिस्थिति मिले तो इस्तेमाल कर सकूँ।
सोच रहा हूँ इसे setup करके देखूँ। VICE host operating system की file में “output” करने की सुविधा support करता है, तो emulator में tests चलाए जा सकते हैं।
Delta debugging कोई नया concept नहीं है: https://en.wikipedia.org/wiki/Delta_debugging
मेरी बनाई delta debugging implementation
delta19 साल से ज्यादा पुरानी है: https://github.com/dsw/deltaजिस दौर में Microsoft open source को “cancer” कहता था, उस समय Microsoft Research ने मेरे office तक किसी को भेजकर इसे public करने का अनुरोध किया था, इसलिए मैंने इसे open source के रूप में release किया। Latner के LLVM introduction में भी “standard delta debugging tool” का ज़िक्र है, इसलिए यह काफ़ी जाना-पहचाना tool है: https://aosabook.org/en/v1/llvm.html
यानी प्रभावी program reduction के लिए simple delta debugging से आगे की चीज़ों की जरूरत होती है। बेशक C-Reduce भी अब 12 साल पुराना tool है।
साथ ही, linked LLVM tool
BugPointसिर्फ LLVM IR के लिए है, जबकि C-Reduce ज्यादा general दिखता है। automatic test case minimization tools और techniques अभी भी ज़्यादातर developers के लिए अपरिचित हैं, इसलिए इस field में पुरानी और well-known idea होने के बावजूद यह लेख उपयोगी हो सकता है।पहले/बाद के examples वाला एक लेख मिला: https://pramodkumbhar.com/2024/01/c-reduce-systematically-ta...
फिर भी मुझे अब तक ठीक से समझ नहीं आया कि हर iteration में क्या हटाना है यह इसे कैसे पता चलता है। tokenization कुछ हद तक तो होगा, लेकिन वह कई programming languages में कैसे काम करता है, यह नहीं समझ पा रहा।
creduceशानदार है।एक obscure LLVM target backend develop करते समय मैंने
CSmithसे random test programs घंटों तक generate करने वाली test script इस्तेमाल की थी। crash होने पर यह automatically C-Reduce चलाकर जांचने के लिए file छोड़ देती थी, और इससे सचमुच बहुत मदद मिली।SQL में भी अच्छी तरह काम करता है। इसे काम में इस्तेमाल कर रहा हूँ, और https://github.com/sqlancer/sqlancer?tab=readme-ov-file#redu... के जरिए इसके बारे में पता चला
अगर यह न बताया जाए कि यह C के अलावा दूसरी भाषाओं में भी क्यों काम करता है, तो इस दावे पर यकीन करना मुश्किल है। मुझे नहीं लगता कि यह झूठ है, लेकिन LLM के बिना ऐसा होना हैरान करता है
उदाहरण के लिए, input को C-style में tokenize करके लंबाई 1~13 के आसपास के chunks को randomly हटाने का तरीका, C जैसी अधिकांश languages में मिलते-जुलते tokenization rules होने के कारण गैर-जरूरी qualifiers या attributes हटाने में अच्छा काम करता है। balanced parentheses
(),{},[]units हटाने वाला pass भी लगभग हर language में उपयोगी है। comments और whitespace हटाना भी प्रभावी है, क्योंकि कई languages C जैसे/* */,//style इस्तेमाल करती हैंअसल में पूरी तरह C/C++-specific passes बहुत ज्यादा नहीं हैं। मेरे अनुभव में
creduceकी बड़ी कमजोरियों में से एक यह है कि templates हटाने वाला reduction step—यानी ऐसा काम जो अपेक्षाकृत automate करना आसान लगता है—यह सचमुच ठीक से नहीं कर पाताकुछ transformations Clang frontend इस्तेमाल करने वाले काफी C-specific हैं, और कुछ काफी general हैं, इसलिए Algol-family languages में आम तौर पर काम करने की संभावना है। यह modular tool है, इसलिए चाहें तो दूसरी language को समझने वाले transformations भी जोड़ सकते हैं
यहाँ बात algorithms जैसी चीजों की है, किसी डरावनी machine learning की नहीं। इसमें Prolog को AI में इस्तेमाल करने जैसी चीजें भी शामिल हैं, लेकिन इसमें एक छोटी-सी कमी है कि AI बनाने के मकसद से यह ठीक से काम नहीं करता
creduceबदले हुए input script को चलाकर मेरी files delete कर सकता है या मेरा lunch खा सकता है?dustmiteसे तुलना करें तो कैसा है? https://dlang.org/blog/2020/04/13/dustmite-the-general-purpo...