$@='NOT ';print"$@CORRUPTED"__DATA__ =®®”print"$@CORRUPTED"__DATA__ =®®”Ê®›~
इस कार्यक्रम में कुछ आवारा ओकटेट्स शामिल हैं जो UTF-8 मान्य नहीं हैं। जैसे, यह दिखाया गया है कि यह विंडोज -1252 में दिखता है। (डिफ़ॉल्ट रूप से, यदि एक नाशपाती का पेड़ एक स्ट्रिंग-शाब्दिक में एक गैर-एएससीआईआई ऑक्टेट देखता है या जैसे वह इसे एक अपारदर्शी वस्तु के रूप में मानता है और यह समझने की कोशिश नहीं करता है कि इसका चरित्र कोड क्या है, इसके बारे में जागरूक होने से परे; यह व्यवहार हो सकता है; एन्कोडिंग घोषणा के माध्यम से बदल गया है, लेकिन कार्यक्रम में एक भी नहीं है। इसलिए कार्यक्रम तार्किक रूप से "अनिर्दिष्ट ASCII- संगत वर्ण सेट" है। सभी गैर-ASCII ओकटेट वैसे भी टिप्पणियों में हैं, इसलिए यह वास्तव में कोई फर्क नहीं पड़ता।)
व्याख्या
एक नाशपाती ट्री कार्यक्रम की जाँच करता है, जिसमें सबसे लंबे समय तक प्रतिस्थापन की तलाश है जिसमें सीआरसी -32 है 00000000
। (यदि कोई टाई है, तो वह पहले ऑक्टेबेटिक रूप से चुनता है।) फिर प्रोग्राम को शुरू में डालने के लिए घुमाया जाता है। अंत में, इस कार्यक्रम की व्याख्या एक ऐसी भाषा के रूप में की जाती है, जो लगभग पर्ल का सुपरसेट है, कुछ चीजों को परिभाषित करती है, जो पर्ल में अपरिभाषित हैं, जैसे कि पायथन में (और कुछ मामूली बदलावों के साथ, जैसे print
कि ए पीयर ट्री में एक अंतिम न्यूलाइन प्रिंट करता है। लेकिन पर्ल में नहीं)। यह तंत्र (और समग्र रूप से भाषा) बहुभाषाविद और विकिरण-कठोर समस्याओं के लिए डिज़ाइन किया गया था ; यह पूर्व नहीं है, लेकिन यह निश्चित रूप से उत्तरार्द्ध है।
इस कार्यक्रम में, हमारे पास दो उल्लेखनीय विकल्प हैं जो सीआरसी -32 से 00000000
; पूरा कार्यक्रम करता है, और ऐसा print"$@CORRUPTED"__DATA__ =®®
खुद से होता है (जो दो बार दिखाई देता है)। जैसे, यदि प्रोग्राम अनियंत्रित है, तो यह सेट $@
हो जाएगा NOT
और फिर उसके बाद प्रिंट होगा CORRUPTED
। यदि प्रोग्राम दूषित है, तो प्रोग्राम का CRC-32 पूर्ण रूप से मिलान करने में विफल रहेगा, लेकिन कम वर्गों में से एक अनियंत्रित रहेगा। जो भी कार्यक्रम की शुरुआत के लिए घुमाया जाएगा CORRUPTED
, वह सिर्फ प्रिंट करेगा , जैसा कि$@
करेगा कि नल स्ट्रिंग होगा।
एक बार स्ट्रिंग को प्रिंट कर लिया __DATA__
जाता है , इसका उपयोग बाकी प्रोग्राम को चलाने से रोकने के लिए किया जाता है। (यह मेरे दिमाग को यह लिखते हुए पार करता है कि __END__
इसका उपयोग किया जा सकता है, जो स्पष्ट रूप से दो बाइट्स को बचाएगा। लेकिन मैं अब इस संस्करण को भी पोस्ट कर सकता हूं, क्योंकि मैंने इसे सत्यापित करने के लिए समय का एक गुच्छा बिताया है, और एक संशोधित संस्करण होना चाहिए। सीआरसी परिवर्तनों के कारण पुन: सत्यापित किया गया है, और मैंने अभी तक "पेलोड" को गोल्फ में डालने का एक बड़ा प्रयास नहीं किया है, इसलिए मैं यह देखना चाहता हूं कि क्या किसी की टिप्पणियों में अन्य सुधार हैं जिन्हें मैं एक ही समय में शामिल कर सकता हूं। ध्यान दें कि#
उस स्थिति में काम नहीं करता है जहां एक चरित्र एक नई पंक्ति में दूषित है।)
आप सोच रहे होंगे कि मैंने अपने कोड के CRC-32 को पहली बार में कैसे नियंत्रित किया। यह एक बहुत ही सरल गणितीय चाल है, जो कि CRC-32 को परिभाषित करने के तरीके पर आधारित है: आप कोड के CRC-32 को लेते हैं, इसे थोड़ा-एंडियन क्रम में लिखते हैं (बाइट क्रम के विपरीत जो सामान्य रूप से CRC-32 गणना द्वारा उपयोग किया जाता है) कार्यक्रम), और XOR के साथ 9D 0A D9 6D
। फिर आप उस कार्यक्रम में जाते हैं, और आपके पास एक कार्यक्रम होगा सीआरसी -32 का 0. (जैसा कि सबसे सरल उदाहरण संभव है, अशक्त स्ट्रिंग में 0 का सीआरसी -32 है, इस प्रकार)9D 0A D9 6D
भी है। ।)
सत्यापन
एक नाशपाती का पेड़ अधिकांश प्रकार के उत्परिवर्तन को संभाल सकता है, लेकिन मैं "परिवर्तित" का अर्थ "एक मनमाना ऑक्टेट के साथ प्रतिस्थापित" कर रहा हूं। यह सैद्धांतिक रूप से संभव है (हालांकि इस कार्यक्रम में इस कमी की संभावना नहीं है) कि कहीं न कहीं एक हैश टक्कर हो सकती है जिससे गलत प्रोग्राम चल रहा है, इसलिए मुझे ब्रूट फोर्स के माध्यम से जांचना पड़ा कि सभी संभावित ऑक्टेट प्रतिस्थापन प्रोग्राम को सही तरीके से काम करना छोड़ देंगे। यहाँ सत्यापन स्क्रिप्ट (पर्ल में लिखित) है जिसका मैंने उपयोग किया है:
use 5.010;
use IPC::Run qw/run/;
use warnings;
use strict;
undef $/;
$| = 1;
my $program = <>;
for my $x (0 .. (length $program - 1)) {
for my $a (0 .. 255) {
print "$x $a \r";
my $p = $program;
substr $p, $x, 1, chr $a;
$p eq $program and next;
alarm 4;
run [$^X, '-M5.010', 'apeartree.pl'], '<', \$p, '>', \my $out, '2>', \my $err;
if ($out ne "CORRUPTED\n") {
print "Failed mutating $x to $a\n";
print "Output: {{{\n$out}}}\n";
print "Errors: {{{\n$err}}}\n";
exit;
}
}
}
say "All OK! ";