क्रैश (यानी दुभाषिया को काम करना बंद करने और करीब जाने के लिए मजबूर करना) अजगर [बंद]


16

मैं यह देखना चाहूंगा कि सबसे रचनात्मक कोड के साथ पायथन का घातक दुर्घटना कौन कर सकता है। इसका मतलब है कि जब प्रोग्राम चलता है, उदाहरण के लिए विंडोज, "IDLE ने काम करना बंद कर दिया है" जैसे कुछ को लेगा और पॉप अप करेगा, या जब कोई प्रोग्राम क्रैश होता है, तो लिनक्स जो कुछ भी करेगा वह लिनक्स करेगा।

नियम:

  1. यह पायथन 2.7 या इसके बाद के संस्करण में बनाया जाना चाहिए (इसलिए पुराने कीड़े का शोषण नहीं किया गया है जो कि पायथन के भविष्य के संस्करणों में तय किए गए हैं)।

  2. "क्रैश" की परिभाषा "आईडीएल या पायथन को अनपेक्षित तरीके से बाहर निकालना" है। इसका मतलब यह नहीं है "आईडीएल या पायथन हॉल्ट बनाएं और ट्रेसबैक दें"। इसका अर्थ निकास, sys.quit, गर्भपात आदि भी मान्य उत्तर नहीं हैं। उदाहरण के लिए, यह स्वीकार नहीं किया जाएगा:

    import sys
    try:
         print c # Crashes Here, as c is not defined.
     except NameError, SyntaxError:
         print "Oh No!"
         sys.exit()
    
  3. पायथन को रोकना जवाब देना स्वीकार नहीं है।

  4. कोड को यह समझाया जाना चाहिए कि यह दुर्घटना के लिए क्या करता है। बग रिपोर्ट का लिंक ठीक है।

10 दिनों की जीत के बाद सबसे उखाड़ा गया जवाब! शुरू!!

संपादित करें: मैं यह स्पष्ट कर सकता हूं कि उद्देश्य पायथन को ट्रेसबैक के साथ कार्यक्रम को निष्पादित करने से रोकना नहीं है । इसका उद्देश्य पायथन को पूरी तरह से दुर्घटनाग्रस्त करना या काम करना बंद करना है। इसका मतलब है कि यदि यह कार्य सफलतापूर्वक पूरा हो जाता है, तो Windows यह देगा (मैं यहां वर्ड को क्रैश नहीं कर रहा हूं, यह एक उदाहरण है कि एक अलग कार्यक्रम के लिए क्या होना चाहिए):

त्रुटि संवाद

या यह:

त्रुटि संवाद २


1
टैग कोड-चुनौती के लिए वस्तुनिष्ठ मानदंड की आवश्यकता होती है। मुझे लगता है कि सबसे रचनात्मक पर्याप्त उद्देश्य नहीं है ...
हावर्ड

ठीक है - बीमार इसे जितना संभव हो उतना छोटा बदलें, अधिकांश अन्य चुनौतियों की तरह .. क्रिएटिव वास्तव में काफी अस्पष्ट है ...
जॉर्ज

@GeorgeH अगर रचनात्मक वह है जो आप खोज रहे थे, लोकप्रियता-प्रतियोगिता पूरी तरह से काम करती है। मुझे व्यक्तिगत रूप से लगता है कि यह एक लोकप्रियता प्रतियोगिता के रूप में सबसे अच्छा होगा। भविष्य में, आप अपने प्रश्न को सैंडबॉक्स के माध्यम से चला सकते हैं जहां पोस्ट करने से पहले इन किंक को काम किया जा सकता है।
जस्टिन

2
@ लोग उच्च प्रतिनिधि के साथ, मेरे prntसवाल में जानबूझकर है।
जॉर्ज

6
मैं इस प्रश्न को ऑफ-टॉपिक के रूप में बंद करने के लिए मतदान कर रहा हूं क्योंकि यह प्रश्न दुर्भावनापूर्ण कोड के लिए पूछता है।
AdmBorkBork

जवाबों:


18

एक कोड-गोल्फ प्रतियोगिता होनी चाहिए थी;) - मुझे लगता है कि रचनात्मकता वह कथन है जो कोड बनाता है: "मुझे अभी नहीं पता कि यहां क्या है ..."

Windows पर चलने वाले IDLE में निम्न वर्ण को कॉपी और पेस्ट करें:

𐒢

क्रैश का कुछ ऐसा है कि चरित्र को विंडोज़ द्वारा UTF-16 के रूप में कूटबद्ध किया जा रहा है और IDLE द्वारा UTF-8 वर्ण को असफल रूपांतरण ...

संपादित करें: अजगर बग # 13153


मुझे यकीन नहीं है कि यह वास्तव में एक वैध जवाब है। सवाल कहता है "जब कार्यक्रम चलता है"। लेकिन यहां कार्यक्रम वास्तव में कभी नहीं चला। जब आप 𐒢इसे चला सकते हैं, तो इससे पहले कि आप केवल पेस्ट करते हैं , IDLE क्रैश हो जाता है।
सेबेस्टियन नेग्रास्ज़स

हाँ, मुझे @ एसबेस्टियन से सहमत होना होगा। एक पायथन प्रोग्राम में आप एक टेक्स्ट फ़ाइल से शुरू करते हैं और उस पर पायथन इंटरप्रेटर चलाते हैं, लेकिन इससे कोई फर्क नहीं पड़ता कि आप टेक्स्ट फाइल कैसे बनाते हैं।
डेविड जेड


यह मैक पर भी काम करता है!
TheDoctor

19

ctypes दुरुपयोग:

import ctypes;ctypes.string_at(1)

यह एक पते पर 1 डालता है और इसे dereferences करता है। किसी भी प्रणाली पर (यानी एक जिस पर 0x00000001 एक मैप किया गया पता नहीं है), यह तुरंत segfault होगा।


मेरी मशीन पर, यह दुभाषिया को क्रैश नहीं करता है। WindowsError त्रुटि के साथ एक ट्रेसबैक प्रदर्शित होता है।
धरा

@धारा: आह, यह ctypes संरचित अपवाद हैंडलर दुर्घटना को पकड़ने होगा। मुझे यकीन है कि आप ctypesकिसी अन्य तरीके से विंडोज में अजगर को दुर्घटनाग्रस्त कर सकते हैं , लेकिन शायद इतने कम पात्रों में नहीं।
nnonneo

12

60

import sys
sys.setrecursionlimit(1<<30)
f=lambda f:f(f)
f(f)

मेरा अपना विचार नहीं। यहां अजगर विकी से नकल की ।

यह एक अनंत पुनरावृत्ति का कारण बनता है, और दुभाषिया द्वारा रोका नहीं जाता है क्योंकि हमने पुनरावृत्ति सीमा को बदल दिया है।


धन्यवाद - यह एक महान जवाब है, लेकिन गलत सवाल के लिए! प्रश्न में उद्देश्य को स्पष्ट नहीं किया गया है। यद्यपि आपके उत्तर के लिए धन्यवाद।
जॉर्ज

2
@George H क्षमा करें, मैं अब एक Windows मशीन का उपयोग नहीं कर रहा हूं, लेकिन एक विभाजन दोष नहीं है जो अजगर इंटरप्रेटर को पर्याप्त कोर डंप करने का कारण बनता है? i.imgur.com/5gSGBpr.png
user12205

10

signal दुरुपयोग (केवल गैर-विंडोज):

import os;os.kill(0,4)

अधिकांश प्रणालियों पर (जिस पर SIGILL = 4) यह "अवैध निर्देश" त्रुटि के साथ पायथन को मार देगा।

या आप हत्यारे अलार्म घड़ी का उपयोग करके कार्यक्रम को मार सकते हैं :

import signal;signal.alarm(1)

एक सेकंड के बाद, पाइथन की गुप्त संदेश "अलार्म घड़ी" के साथ मृत्यु हो जाती है।


अन्य एकल वर्ण संकेत कोड जो काम करते हैं, उनमें 1, 3, 5, 6, 8 और 9. शामिल हैं
user12205

9

पायथन 3.3 में:

exec(type((lambda:0).__code__)(0,1,0,0,0,b'',(),(),(),'','',1,b''))

पायथन में 2.7 कोड ऑब्जेक्ट कुछ अलग हैं:

exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')

हां, आप किसी भी पुराने बकवास को बाइट कोड दुभाषिया के पास कर सकते हैं और यह इसे निष्पादित करता है ( पायथन अंक # 17182 )।


शॉर्टर (पायथन 2.x):exec type((lambda:0).func_code)(0,1,0,0,'Q',(),(),(),'','',0,'')
nneonneo

धन्यवाद! और पायथन 3 में हम उपयोग कर सकते हैं .__code__

6

पुनरावर्ती पुनरावर्तक सी स्टैक का उपयोग करते हैं, न कि पायथन स्टैक ( # 14010 जारी करने और # 14507 जारी ):

i=''
for _ in range(9**6):i=filter(int,i)
del i

यह मेरे मैक पर अजगर 2.7.11 दुर्घटना नहीं है, लेकिन यह 3.5.1 अजगर दुर्घटना।
nnonneo

4

दुभाषिया को दुर्घटनाग्रस्त करने का एक आसान तरीका यह है कि इसे किसी को भी निपटाया जाए:

import ctypes, sys
(ctypes.c_char*4).from_address(id(None))[:] = '\0'*4

एक बोनस के रूप में, यहाँ अजगर 2 segfault करने के लिए एक चतुर तरीका है:

import ctypes, struct, sys
inner = ()
outer = (inner,)
c_outer = (ctypes.c_char * sys.getsizeof(outer)).from_address(id(outer))
inner_index = c_outer[:].find(struct.pack('P', id(inner)))
c_outer[inner_index:inner_index+struct.calcsize('P')] = struct.pack('P', id(outer))
print outer

यह वास्तव में पाठक के लिए एक अभ्यास के रूप में छोड़ दिया जाता है।


2
पहले एक: शून्य से कोई भी सेट करें, क्योंकि यह प्रफुल्लित करने वाला है। दूसरा एक: सेल्फ-रेफरेंसिंग टपल का निर्माण और प्रिंट करें।
nnonneo

3

किसी ने सोचा कि वे नई FlagsTypeवस्तुओं को सेटिंग द्वारा बनाए जाने से रोक सकते हैं FlagsType.tp_new = NULL, लेकिन वे विधि को हटाना भूल गए ( अंक # 13204 ):

import sys
t=type(sys.flags)
t.__new__(t)

( sys.version_infoएक ही बग है)


3

उपयोग की allocaमें ctypesमॉड्यूल ( मुद्दा # 13096 ):

from ctypes import *
POINTER('a'*9**8)

0

एक संभव तरीका है जो मेरे अजगर के साथ दुर्घटनाओं MemoryError:

x=[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]

2
यह मेरे लिए काम नहीं करता है - यह सिर्फ पायथन हॉल्ट को एक बनाता है MemoryError। इसे ओएस द्वारा बंद करने की आवश्यकता है।
जॉर्ज

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