क्या पैकमैन के खेल में "स्तर 256 बग" को एक खंडित सेगफॉल्ट माना जा सकता है?


51

मैं किसी को विभाजन के दोषों को समझाने की कोशिश कर रहा हूं, और मैं पैकमैन में स्तर 256 किल-स्क्रीन के बारे में सोच रहा था, और यह पूर्णांक अतिप्रवाह से कैसे ट्रिगर होता है, और एक विभाजन में "अज्ञात राज्य" की तरह-तरह का व्यवहार कैसे होता है। गलती।

मैं कहना चाहता हूं कि यह एक अच्छा उदाहरण है जिसे मैं "अनहेल्ड सेगफॉल्ट" कहता हूं, लेकिन मैं संभावित रूप से गलत सूचना फैलाने से पहले एक दूसरी राय प्राप्त करूंगा।

मैंने इसे देखने की कोशिश की, लेकिन मुझे जो कुछ भी मिल रहा है वह बग पर ही है, साथ ही हिपस्टर व्हेल और नमको के बीच के कोलाब भी हैं।

तो, क्या आप पैकमैन के स्तर 256 में व्यवहार को खंडित उल्लंघन का एक उदाहरण मानते हैं?


3
यहाँ बग का सटीक वर्णन है, साथ में इसे ठीक करने के लिए एक पैच: donhodges.com/how_high_can_you_get2.htm
abligh

26
अवैध मेमोरी एक्सेस से बचने के लिए सेगमेंटेशन दोष हार्डवेयर द्वारा उठाए जाते हैं। मैं Pacman पर कोई विशेषज्ञ नहीं हूँ, लेकिन यह जिस हार्डवेयर पर चलता है, निश्चित रूप से उसके पास यह सुरक्षा सुविधा नहीं थी।
ब्लूराजा - डैनी पफ्लुघोफ्ट

3
विकिपीडिया के अनुसार Pacman ने Z80 का उपयोग किया। Z80 निश्चित रूप से स्मृति सुरक्षा नहीं था।
रोबोट

यह एक सेगफॉल्ट नहीं है - सिस्टम में मेमोरी सुरक्षा का कोई रूप नहीं था। गलती पीएसी मैन स्तर 256 पर अनुभव करता है बस एक पूर्णांक अतिप्रवाह जाता है कि सही ढंग से खेल के कोड द्वारा नियंत्रित नहीं है।
bwDraco

3
FYI करें, मुझे नहीं लगता कि यह एक बग के रूप में योग्य है। बग एक कंप्यूटर प्रोग्राम या सिस्टम में विफलता या गलती है जो इसे गलत या अप्रत्याशित परिणाम उत्पन्न करने या अनपेक्षित तरीके से व्यवहार करने का कारण बनता है। यह जानबूझकर उस तरह से प्रोग्राम किया गया था, क्योंकि यह महसूस किया गया था कि कोई भी उस स्तर तक नहीं पहुंचेगा। हकीकत में, इसका सिर्फ गरीब सॉफ्टवेयर डिजाइन।
कल्टारी

जवाबों:


113

निश्चित रूप से नहीं।

आपके द्वारा आवंटित स्मृति पते तक पहुंचना हमेशा एक प्रोग्रामिंग त्रुटि है। और आपके द्वारा इससे निकलने वाली सूचना पर कार्य करने से अपरिभाषित व्यवहार उत्पन्न होता है, यह बहुत सटीक है। मुझे नहीं पता कि मूल पीएसी-मैन के लिए कौन सा मंच लिखा गया था, लेकिन मुझे पूरा यकीन है कि यह किसी अन्य वॉन न्यूमैन मशीन की तरह ही इस व्यवहार को प्रदर्शित करता है।

हालांकि, "विभाजन दोष" एक तकनीकी शब्द है जो बहुत अधिक विशिष्ट स्थिति के लिए है। ऐसा तब होता है जब कंप्यूटर स्वचालित रूप से पता लगाता है कि ऐसा हुआ था और अपरिभाषित व्यवहार होने की बजाय प्रक्रिया को समाप्त कर दिया। इसके लिए परिष्कृत स्वामित्व टैगिंग के साथ एक विशिष्ट (खंड) मेमोरी मॉडल की आवश्यकता होती है। मुझे नहीं लगता कि 1980 आर्केड गेम्स में ऐसा था, और वास्तव में गेम के व्यवहार से पता चलता है कि त्रुटि का पता नहीं चला था , और अपरिभाषित व्यवहार नहीं हुआ था


19
@ B1KMusic: आप वास्तव में पूछ रहे हैं "क्या यह कोड 'बग' आउट-ऑफ-बाउंड मेमोरी एक्सेस के माध्यम से अपरिभाषित व्यवहार को लागू करने का एक उदाहरण है" और जवाब "हां" है। SIGSEGV सिग्नल न मिलने, अनदेखा करने, पकड़ने के बारे में कोई भी तर्क सिर्फ मामलों को भ्रमित कर रहा है।
मोनिका

5
@ B1KMusic सभी बफर ओवररन सेगफॉल्ट का परिणाम नहीं है। यह इस बात पर निर्भर करता है कि मेमोरी कैसे आवंटित की गई थी। यदि मेमोरी स्टेटिकली आबंटित होती है (एक बड़ा बफर मैन्युअल रूप से अलग-अलग ज़ोन में विभाजित हो जाता है) और अंतिम स्तर के तुरंत बाद का क्षेत्र किसी चीज़ के लिए इस्तेमाल किया जाता था (जैसे स्प्राइट ग्राफिक्स) तो यह सेगफॉल्ट नहीं होगा।
शाफ़्ट

6
उन पुराने आर्केड सिस्टम में आदिम OS का उपयोग किया जाता था जो कि DOS के शुरुआती संस्करणों के समान हार्डवेयर पर गेम को बहुत अधिक पूर्ण नियंत्रण देता था। उस प्रकार की वास्तुकला में सेगफॉल्ट का विचार एक गैर-स्टार्टर है, क्योंकि यह एक चल रही प्रक्रिया (पीएसी-मैन) को स्मृति के सभी के मालिक नहीं मानता है । अधिक जानकारी के लिए, कोई MAME प्रोजेक्ट और उसके इतिहास को पढ़ सकता है ।

20
अपरिभाषित व्यवहार वॉन न्यूमैन मशीनों की संपत्ति नहीं है, यह प्रोग्रामिंग भाषा सी की संपत्ति है। असेंबली लैंग्वेज में लिखे प्रोग्राम अपरिभाषित व्यवहार को प्रदर्शित नहीं कर सकते हैं, क्योंकि असेंबली लैंग्वेज के निर्देशों का व्यवहार हमेशा अच्छी तरह से परिभाषित होता है (भले ही परिणाम कभी-कभी अनिर्दिष्ट हों)।
डायट्रिच एप

8
@ जानेमन पैक-मैन मशीन पर ऐसी कोई परत नहीं है। कोई लोडर नहीं है - गेम रोम-इन-प्लेस रोम में है। कोई स्मृति प्रबंधन नहीं है - सब कुछ स्थिर है। कोई "सेवाएं" नहीं है; खेल सीधे हार्डवेयर तक पहुँचता है और उस सिस्टम पर कोड का बाइट नहीं है जो गेम का हिस्सा नहीं है और गेम के लिए लिखा गया है।
हॉब्स

38

ऐसा लगता है कि आप "अपरिभाषित व्यवहार" और "विभाजन दोष" को भ्रमित कर रहे हैं।

अनहेल्दी सीगफॉल्ट जैसी कोई बात नहीं है। एक विभाजन गलती है परिभाषा से, त्रुटि हैंडलिंग।

यदि आपके पास ऐसा OS नहीं है जो खराब मेमोरी एक्सेस का पता लगाता है और सुरक्षा के लिए प्रक्रिया को समाप्त कर देता है, तो आपके पास विभाजन दोष नहीं है।

यदि कुछ भी है, तो यह एक बहुत अच्छा उदाहरण है कि कैसे यूबी हमेशा एक सेगफॉल्ट में परिणाम नहीं करता है


2
सटीक ओएस होना करने के लिए कर सकते हैं मारने के लिए (यानी निराशाजनक) प्रक्रिया निर्णय लेते हैं। इसके बजाय आधुनिक ओएस इसे समाप्त करना पसंद करते हैं , जिसे एफडब्ल्यूआईडब्ल्यू पकड़ा और संभाला जा सकता है।
edmz

@black: यह नहीं है कि मैंने क्या कहा?
मोनिका

15
यह "अपरिभाषित व्यवहार" भी नहीं हो सकता है। यदि Pacman को शुद्ध असेंबली में लिखा गया था, तो कोड ने वही किया जो इसे पूरी तरह से परिभाषित तरीके से करना बताया गया था। अपरिभाषित व्यवहार नहीं, लेकिन केवल एक बग। जैसे, कोड किसी भी सिस्टम पर चलने वाला ठीक उसी तरह से चलेगा जिसमें अंतर्निहित चिपसेट का सही पोर्ट था।
रोबोट

@StevenBurnap: यह सच है।
मोनिका

@black 'किल' और 'टर्मिनेट' में क्या अंतर है? इस तथ्य के अलावा कि 'मार' आम तौर पर यूनिक्स की शब्दावली है, और 'टर्मिनेट' अधिक विंडोज-वाई है?
ब्रैंडिन

24

इन शब्दों में से कोई भी एक आर्केड गेम में बग के लिए उपयुक्त है जो असेंबली भाषा में प्रोग्राम किया गया था और मेमोरी-प्रोटेक्शन हार्डवेयर या ऑपरेटिंग सिस्टम के लाभ के बिना चलता है।

"अपरिभाषित व्यवहार" सी और संबंधित भाषाओं में एक टर्म-ऑफ-आर्ट है, जिसे सी मानकों समिति ने 1989 में वापस बनाया था। कोड में अपरिभाषित व्यवहार होता है जब भाषा विनिर्देश परिभाषित नहीं करता है कि यह क्या करेगा। Z80 असेंबली लैंग्वेज में ऐसी कोई बात नहीं है: हर संभव इनपुट के साथ हर ओपकोड का प्रभाव अच्छी तरह से परिभाषित होता है। "अपरिभाषित व्यवहार" के पारंपरिक अंग्रेजी अर्थ को लागू करने के लिए पढ़ा जा सकता है - किल स्क्रीन व्यवहार है जो कि खेल लिखने वाले लोगों द्वारा परिभाषित नहीं है - लेकिन मैं इस संदर्भ में इसका उपयोग नहीं करूंगा क्योंकि यह गलत देने की संभावना है छाप।

"सेगमेंटेशन फॉल्ट" POSIX में एक टर्म-ऑफ-आर्ट है, जो अंततः पीडीपी सिस्टम प्रोग्रामिंग शब्दजाल से लिया गया है। सेगमेंटेशन दोष तब होता है जब कोई प्रोग्राम मेमोरी एड्रेस को एक्सेस करने का प्रयास करता है जो किसी भी चीज़ के लिए "मैप" नहीं किया जाता है: हार्डवेयर और ऑपरेटिंग सिस्टम इस बात का पता लगाता है और खराबी वाले प्रोग्राम को बंद कर देता है, ध्यान से परिभाषित तरीके से जो प्रोग्राम को पुनर्प्राप्त करने का मौका देता है। । कुछ इस तरहयह पीएसी-मैन गेम कार्यक्रम में बग के परिणामस्वरूप हो सकता है, क्योंकि पीएसी मैन सर्किट बोर्ड केवल ROM, RAM और बाह्य उपकरणों के साथ Z80 के 64kB पते वाले स्थान से आधे से भी कम की आबादी देता है, लेकिन मैं 'हेवन' टी पता लगाने में सक्षम है कि यदि वास्तविक सॉफ्टवेयर अनमैप मेमोरी तक पहुंचने का प्रयास करता है तो वास्तविक हार्डवेयर क्या करेगा। जो भी होगा, हालांकि, इसे "विभाजन दोष" के रूप में वर्णित करना अनुचित होगा, क्योंकि पीएसी-मैन के लिए "ऑपरेटिंग सिस्टम" (इस हद तक कि एक भी है ) यूनिक्स का कार्यान्वयन नहीं है और, फिर से, यह गलत धारणा देगा।

स्तर 256 बग, इस बीच, अनमैप्ड मेमोरी का उपयोग नहीं करता है , इसलिए यह मूट है।

यह कहना सही है कि खेल में एक बग है, जो 256 के स्तर पर आगे बढ़ने पर प्रकट होता है। यह कहना भी सही है कि बग का मूल कारण एक पूर्णांक अतिप्रवाह है , और इसके परिणाम स्मृति भ्रष्टाचार (या, इसके विपरीत, उल्लंघन) हैं की स्मृति और प्रकार सुरक्षा )। ये सभी सामान्य प्रयोजन के सीएस शब्द हैं जो किसी विशेष भाषा या ओएस वातावरण के संदर्भ के बिना परिभाषित किए गए हैं।

यह भी निरीक्षण करने के लिए, जो सटीक प्रभाव , बग के प्रभाव के समान हैं स्मृति भ्रष्टाचार बग्स का एक आधुनिक वातावरण में, नहीं है विभाजन दोष भड़काने। यदि आप किसी भी प्रोजेक्ट ज़ीरो शोषण राइटअप को पढ़ते हैं , तो आप पीएसी-मैन किल स्क्रीन के डॉन होजेस के विश्लेषण के लिए एक उल्लेखनीय समानता देखेंगे ।

ध्यान दें कि जब पीएसी-मैन रोम को खिलाया जाता है, तो गेम के हार्डवेयर का सही ढंग से अनुकरण नहीं करने पर एक एमुलेटर जो जानबूझकर किल स्क्रीन को पुन: उत्पन्न नहीं करता है।


वाक्यांश, "अपरिभाषित व्यवहार" 1989 से पहले उस सटीक तरीके से प्रिंट में उपयोग नहीं किया गया हो सकता है, लेकिन यह वाक्यांश जिस विचार का वर्णन करता है वह प्रोग्रामिंग के रूप में पुराना है। कॉमन लिस्प: द लैंग्वेज (डिजिटल प्रेस, 1984; आईएसबीएन 0-932376-41-एक्स) ने "एक त्रुटि है" शब्दों का इस्तेमाल किया, जिसका मतलब ठीक उसी तरह है। उदाहरण के लिए, "x <0 के साथ इस फ़ंक्शन को कॉल करना एक त्रुटि है। इसका मतलब है कि प्रोग्रामर को फ़ंक्शन को x <0 के साथ कॉल करने की अनुमति नहीं देनी चाहिए, और कार्यान्वयन को वस्तुतः कुछ भी करने की अनुमति दी गई थी यदि कार्यान्वयनकर्ता ऐसा करना चाहता था। आवेदन प्रोग्रामर ने पालन नहीं किया।
सोलोमन स्लो

5
@jameslarge मैं समझता हूं कि आपका क्या मतलब है, लेकिन मुझे अभी भी लगता है कि इस अवधारणा को Pac-Man पर लागू करना एक गलती है। हम कह सकते हैं कि मार स्क्रीन एक बग है क्योंकि खेल स्पष्ट रूप से डिजाइनर के रूप में व्यवहार नहीं कर रहा है। हम यह नहीं कह सकते हैं कि खेल ने अपरिभाषित व्यवहार को उकसाया है , क्योंकि कोई भी भाषा विनिर्देश कहने के लिए "किसी भी परिस्थिति में प्रोग्रामर एक्स को नहीं कर सकता है" एक्स के किसी भी मूल्य के लिए। (मुझे लगता है कि Z80 अनिर्धारित opcodes का उपयोग योग्य हो सकता है, सिवाय इसके कि। बहुत सारे आर्केड गेमों ने उन और AFAIK का उपयोग किया था, जिनके सभी पूर्वानुमान प्रभाव हैं।)
zwol

1
यह सबसे अच्छा जवाब है। "अपरिभाषित व्यवहार" का अर्थ है कि कोडर ने कोड लिखा है जिसके लिए मानक के आधार पर परिणाम पूर्व निर्धारित नहीं किया जा सकता है। यदि Pacman Z80 असेंबली में लिखा गया है (और मेरा मानना ​​है कि यह था) तो लिखे गए कोड का पूरी तरह से परिभाषित अर्थ था चाहे वह प्रोग्राम कुछ भी हो जो कोडर का इरादा नहीं था।
रोबोट

8

पीएसी मैन के स्तर -257 बग का परिणाम प्रोग्राम रीडिंग डेटा में है, जो कि इच्छित तालिका के अंत से परे है, लेकिन अभी भी पठनीय भंडारण है , और स्क्रीन के कुछ हिस्सों के लिए लेखन है, जो उन लोगों से परे हैं जिन्हें प्रोग्राम लिखने का इरादा है, लेकिन हैं अभी भी स्क्रीन के क्षेत्रों में अच्छी तरह से है कि कार्यक्रम को लिखने की अनुमति है । स्मृति का कोई अन्य क्षेत्र प्रभावित नहीं होता है।

कारण यह है कि बग गेम को अनपेक्षित रूप से प्रस्तुत करता है, यह निर्धारित करता है कि मशीन यह निर्धारित करती है कि खिलाड़ी स्क्रीन पर क्या खा रहा है, और यह तय करता है कि खिलाड़ी 244 डॉट्स खा चुका है या नहीं। स्क्रीन के भाग को ओवरराइट करके, बग 244 डॉट्स खाने के लिए खिलाड़ी को असंभव बनाता है; नतीजतन, खेल कभी भी खिलाड़ी को स्तर पूरा करने और डॉट्स के साथ स्क्रीन को फिर से लोड करने का श्रेय नहीं देगा।


1
जब आप अपने आप को स्तर 256 में मारते हैं, तो डॉट्स प्रतिक्रिया देते हैं, लेकिन आप कोई भी नहीं खोते हैं।
अवे

@ardaozkal: स्तर-ड्रा दिनचर्या 100 से अधिक बिंदुओं को मिटा देती है और कुछ को खींचती है। यदि किसी खिलाड़ी के पास पर्याप्त जीवन होता है, तो अंततः एक स्तर को आगे बढ़ाने के लिए पर्याप्त डॉट्स खाना संभव होगा, लेकिन इसके लिए 30 से अधिक जीवन की आवश्यकता होगी।
सुपरकैट

मुझे याद है कि एक वीडियो देखना जहां खिलाड़ी काफी रहता था, और उसने इसे प्रबंधित किया ... और मुझे यह पता चला
Ave

@ardaozkal: स्तर को खाली करने के लिए कितने जीवन की आवश्यकता होती है, और एक अनमॉडिफाइड मशीन पर एक खिलाड़ी को कितने जीवन मिल सकते हैं?
सुपरकैट

तुम भी एक unmodified मशीन पर 256 के स्तर पर नहीं मिल सकता है।
Ave

1

जैसा कि पहले कहा गया है कि यह एक सेग दोष नहीं है। मैं जोड़ता हूँ कि समस्या क्यों होती है: यह एक अतिप्रवाह है

स्तर संख्या एक बाइट पर स्टोर की जाती है, इसलिए सीमा 0-255 है। हर बार जब आप एक स्तर पूरा करते हैं तो काउंटर बढ़ जाता है। स्तर 256 पर काउंटर अतिप्रवाह के कारण वास्तव में 0 है।

हालाँकि खेल स्तर के तल पर कुछ फलों को प्रदर्शित करने का प्रयास करता है। फल संख्या / प्रकार स्तर पर निर्भर करता है। सूत्र 8 स्तर के नीचे प्रति स्तर पर एक फल प्रदर्शित करता है। काउंटर के अनुसार आप स्तर 0 पर हैं इसलिए 8. परीक्षण तब सत्य है और आपको 255 फल (पुराने स्तर का मूल्य) प्रिंट करना होगा। जो कि असंभव है और यह गड़बड़ स्क्रीन देता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.