โปรแกรมตรวจสอบความบ้า


16

บ้า: ทำสิ่งเดียวกันซ้ำแล้วซ้ำอีกและคาดหวังผลลัพธ์ที่แตกต่าง

เขียนโปรแกรมที่เพิ่งส่งข้อยกเว้น (ข้อผิดพลาดรันไทม์) ทุกครั้งที่มีการเรียกใช้ ความท้าทายที่จะมีความเป็นไปได้ที่จะสร้างความผิดพลาดมากกว่าหนึ่งครั้งโดยไม่ต้องเรียกข้อยกเว้นโดยตรง (ไม่มีthrowคำสั่ง) และไม่ใช้ฟังก์ชั่นการนับจำนวนสุ่มหรือ cpu tick

  • 10 คะแนนสำหรับข้อผิดพลาดที่เป็นไปได้แต่ละข้อ
  • 25 คะแนนโบนัสหากข้อผิดพลาด / ความผิดพลาดเกิดขึ้นในกระบวนการอื่นหรือระบบ

กฎระเบียบ

  1. คำตอบต้องระบุข้อผิดพลาดที่เป็นไปได้และวิธีสร้างข้อผิดพลาด
  2. ไม่สามารถใช้ตัวสร้างหมายเลขสุ่มของระบบ (ในตัว) เว้นแต่จะได้รับการหว่านด้วยหมายเลขเดียวกันทุกครั้งที่โปรแกรมทำงาน
  3. ไม่สามารถใช้จำนวนของสำบัดสำนวนหรือรอบ cpu เว้นแต่ว่าพวกเขาจะถูกนับค่อนข้างเริ่มต้นของเธรดโปรแกรมหลัก
  4. อนุญาตให้ใช้มัลติเธรด (ถ้าไม่สนับสนุน)

แก้ไข 1

  1. การสร้าง GUID อยู่ภายใต้ตัวสร้างตัวเลขสุ่มในตัว อนุญาตการสร้าง GUID "แบบกำหนดเอง" ที่กำหนดเองได้

  2. การเข้าถึงระบบไฟล์ได้รับอนุญาตสำหรับ I / O ของไฟล์ยกเว้นเมื่อทำเพื่อข้ามกฎ (อ่านไฟล์ของบิตสุ่มหรือเวลาประทับ)

แก้ไข 2

  1. การโทรabort()หรือassert()ฝ่าฝืนจิตวิญญาณของความท้าทายในการทำซอฟต์แวร์บ้าดังนั้นจะไม่มีการให้คะแนน 10 คะแนนสำหรับโหมดความล้มเหลวนี้

โชคดี!


การสร้าง guid ถือเป็นการสุ่มหรือไม่?
microbian

คำถามที่ดี. ฉันคิดว่าเอนโทรปีจะต้องประสบความสำเร็จอย่างน่าอัศจรรย์ (บ้านของรหัสบัตร) และไม่ปลอมดังนั้นฉันจะบอกว่าไม่มีของ GUID
ja72

สำหรับ JS - เบราว์เซอร์หยุดทำงานนับเป็น 25 โบนัสหรือไม่ ฉันสามารถเลือกเบราว์เซอร์ที่ควรทดสอบรหัสของฉันหรือไม่
eithed

การทำลายโฮสต์ (เบราว์เซอร์หรือกรอบ) จะมอบคะแนนโบนัส 25 คะแนน มันจะต้องผิดพลาดเสมอ
ja72

ปัญหาคือการเขียนฟังก์ชั่นที่ไม่ได้กำหนดไว้โดยไม่ใช้วิธีการที่ไม่ได้กำหนดไว้ (ยกเว้นนาฬิกาด้วย) C เป็นหนึ่งในภาษาที่ให้คุณสามารถเข้าถึงการอ้างอิงตัวชี้แบบไม่กำหนดค่าเริ่มต้น ดังนั้นวิธีแก้ปัญหาที่ฉันเห็นอยู่บนพื้นฐานของพอยน์เตอร์ที่ไม่ได้กำหนดค่าเริ่มต้น สำหรับฉันแล้วการใช้ตัวชี้เริ่มต้นนั้นดี (หรือไม่ดี) เหมือนกับการใช้ guid หรือ random method
microbian

คำตอบ:


15

Java, 400

Java เป็นความสุข (?) กับหลายExceptionและErrors มีหลายExceptions ที่เฉพาะกับการดำเนินงานของชั้นเดียว เป็นตัวอย่างของหนึ่งในกรณีที่มากที่สุดที่มีมากกว่า 10 Exceptions (ทั้งหมดเป็น subclass ของIllegalFormatException) ที่ทุ่มเทให้กับFormatterชั้นเรียนเพียงอย่างเดียวและฉันได้ใช้เวลาในการทำให้โค้ดโยน (เกือบ) ทั้งหมด

คำตอบปัจจุบันของฉันมี 40 Exceptions / s ที่แตกต่างกันErrorและพวกเขาได้รับการดำเนินการแบบสุ่มขึ้นอยู่กับ modulo ของSystem.nanoTime()ด้วยจำนวนเต็มบางส่วน

วิธีนี้สามารถใช้เพื่อวัดเวลาที่ผ่านไปและไม่เกี่ยวข้องกับความคิดอื่น ๆ ของระบบหรือเวลานาฬิกาแขวน ค่าที่ส่งคืนแสดงถึง nanoseconds ตั้งแต่บางเวลาคงที่ แต่กำเนิดโดยพลการ (อาจเป็นในอนาคตดังนั้นค่าอาจเป็นค่าลบ) ต้นกำเนิดเดียวกันถูกใช้โดยการเรียกใช้เมธอดนี้ทั้งหมดในอินสแตนซ์ของเครื่องเสมือน Java; อินสแตนซ์ของเครื่องเสมือนอื่น ๆ มีแนวโน้มที่จะใช้ต้นกำเนิดที่แตกต่างกัน

ควรอนุญาตวิธีการข้างต้นเนื่องจากตรงกับกรณี"3. ไม่สามารถใช้จำนวนของสำบัดสำนวนหรือรอบ cpu ยกเว้นว่าพวกเขาจะถูกนับค่อนข้างเริ่มต้นของเธรดโปรแกรมหลัก"ไม่สามารถใช้จำนวนสำบัดสำนวนหรือรอบซีพียูจนกว่าพวกเขาจะถูกนับค่อนข้างที่จะเริ่มด้ายโปรแกรมหลัก"

การรวบรวมการเรียนการสอน

แนะนำให้ใช้JRE / JDK หรือ OpenJDK ของ Oracleสำหรับการเรียกใช้รหัส มิฉะนั้นข้อยกเว้นบางอย่างอาจไม่ถูกโยนเนื่องจากบางคนอาศัยรายละเอียดภายในของการดำเนินการอ้างอิงและฉันไม่มีข้อผิดพลาดที่น่าเชื่อถือ

โค้ดข้างล่างนี้รวบรวมประสบความสำเร็จกับและผลิตทั้งหมดในข้อยกเว้นjavac 1.7.0_11java 1.7.0_51

  1. ในการเรียกใช้รหัสนี้คุณต้องคัดลอกและวางรหัสด้านล่างไปยังตัวแก้ไขการรับรู้ Unicode (เช่น Notepad ++) บันทึกใน UTF-16 (Big-Endian หรือ Little-Endian ไม่สำคัญตราบใดที่เขียน BOM) .

  2. เปลี่ยนไดเร็กตอรี่การทำงาน ( cd) เป็นตำแหน่งที่จะบันทึกซอร์สโค้ด ( ซึ่งเป็นสิ่งสำคัญ )

  3. รวบรวมรหัสด้วยคำสั่งต่อไปนี้:

    javac G19115.java -encoding "UTF-16"
    
  4. และเรียกใช้รหัส:

    java G19115
    

ไม่มีอะไรเป็นอันตรายในรหัสของฉันเนื่องจากฉันต้องการทดสอบเรียกใช้บนคอมพิวเตอร์ของฉัน รหัส "อันตราย" ที่สุดคือการลบToBeRemoved.classไฟล์ในโฟลเดอร์ปัจจุบัน นอกจากนั้นส่วนที่เหลือไม่ได้แตะระบบไฟล์หรือเครือข่าย


import java.util.*;
import java.util.regex.*;
import java.lang.reflect.*;
import java.text.*;
import java.io.*;
import java.nio.*;
import java.nio.charset.*;
import java.security.*;

class G19115 {

    // The documentation says System.nanoTime() does not return actual time, but a relative
    // time to some fixed origin.
    private static int n = (int) ((System.nanoTime() % 40) + 40) % 40;

    @SuppressWarnings("deprecation")
    public static void main(String args[]) {

        /**
         * If the code is stated to be a bug, then it is only guaranteed to throw Exception on
         * Oracle's JVM (or OpenJDK). Even if you are running Oracle's JVM, there is no
         * guarantee it will throw Exception in all future releases future either (since bugs
         * might be fixed, classes might be reimplemented, and an asteroid might hit the earth,
         * in order from the least likely to most likely).
         */

        System.out.println(n);

        switch (n) {
            case 0:
                // Bug JDK-7080302
                // https://bugs.openjdk.java.net/browse/JDK-7080302
                // PatternSyntaxException
                System.out.println(Pattern.compile("a(\u0041\u0301\u0328)", Pattern.CANON_EQ));
                System.out.println(Pattern.compile("öö", Pattern.CANON_EQ));

                // Leave this boring pattern here just in case
                System.out.println(Pattern.compile("??+*"));
                break;
            case 1:
                // Bug JDK-6984178
                // https://bugs.openjdk.java.net/browse/JDK-6984178
                // StringIndexOutOfBoundsException
                System.out.println(new String(new char[42]).matches("(?:(?=(\\2|^))(?=(\\2\\3|^.))(?=(\\1))\\2)+."));

                // Leave this boring code here just in case
                System.out.println("".charAt(1));
                break;
            case 2:
                // IllegalArgumentException

                // Bug JDK-8035975
                // https://bugs.openjdk.java.net/browse/JDK-8035975
                // Should throw IllegalArgumentException... by documentation, but does not!
                System.out.println(Pattern.compile("pattern", 0xFFFFFFFF));

                // One that actually throws IllegalArgumentException
                System.out.println(new SimpleDateFormat("Nothing to see here"));
                break;
            case 3:
                // Bug JDK-6337993 (and many others...)
                // https://bugs.openjdk.java.net/browse/JDK-6337993
                // StackOverflowError
                StringBuffer buf = new StringBuffer(2000);
                for (int i = 0; i < 1000; i++) {
                    buf.append("xy");
                }
                System.out.println(buf.toString().matches("(x|y)*"));

                // Leave this boring code here just in case
                main(args);
                break;
            case 4:
                // NumberFormatException
                String in4 = "123\r\n";
                Matcher m4 = Pattern.compile("^\\d+$").matcher(in4);

                if (m4.find()) {
                    System.out.println(Integer.parseInt(in4));
                } else {
                    System.out.println("Bad input");
                }

                // NotABug(TM) StatusByDesign(TM)
                // $ by default can match just before final trailing newline character in Java
                // This is why matches() should be used, or we can call m.group() to get the string matched
                break;
            case 5:
                // IllegalStateException
                String in5 = "123 345 678 901";
                Matcher m5 = Pattern.compile("\\d+").matcher(in5);

                System.out.println(m5.group(0));

                // The Matcher doesn't start matching the string by itself...
                break;
            case 6:
                // ArrayIndexOutOfBoundsException

                // Who is the culprit?
                String[] in6 = {
                    "Nice weather today. Perfect for a stroll along the beach.",
                    " Mmmy  keeyboaardd    iisss   bbrokkkkeeen  ..",
                    "",
                    "\t\t\t     \n\n"};
                for (String s: in6) {
                    System.out.println("First token: " + s.split("\\s+")[0]);
                }

                // Culprit is "\t\t\t     \n\n"
                // String.split() returns array length 1 with empty string if input is empty string
                //                        array length 0 if input is non-empty and all characters match the regex
                break;
            case 7:
                // ConcurrentModificationException

                List<Integer> l7 = testRandom(42);
                Integer prev = null;
                // Remove duplicate numbers from the list
                for (Integer i7: l7) {
                    if (prev == null) {
                        prev = i7;
                    } else {
                        if (i7.equals(prev)) {
                            l7.remove(i7);
                        }
                    }
                }

                System.out.println(l7);

                // This is one of the typical mistakes that Java newbies run into
                break;
            case 8:
                // ArithmeticException

                // Integer division by 0 seems to be the only way to trigger this exception?
                System.out.println(0/0);
                break;
            case 9:
                // ExceptionInInitializerError
                // Thrown when there is an Exception raised during initialization of the class

                // What Exception will be thrown here?
                Static s9 = null;
                System.out.println(s9.k);

                // A bit less interesting
                Static ss9 = new Static();

                // ----
                // A class is only initialized when any of its method/field is
                // used for the first time (directly or indirectly)

                // Below code won't throw Exception, since we never access its fields or methods
                // Static s;
                // OR
                // Static s = null;
                break;
            case 10:
                // BufferOverflowException
                short s10 = 20000;
                ShortBuffer b10 = ShortBuffer.allocate(0).put(s10);

                // Boring stuff...
                break;
            case 11:
                // BufferUnderflowException
                ShortBuffer.allocate(0).get();

                // Another boring stuff...
                break;
            case 12:
                // InvalidMarkException
                ShortBuffer.allocate(0).reset();

                // Boring stuff again...
                // reset() cannot be called if mark() is not called before
                break;
            case 13:
                // IndexOutOfBoundsException
                System.out.println("I lost $m dollars".replaceAll("[$]m\\b", "$2"));

                // $ needs to be escaped in replacement string, since it is special
                break;
            case 14:
                // ClassCastException
                Class c14 = Character.class;
                for (Field f: c14.getFields()) {
                    System.out.println(f);
                    try {
                        int o = (int) f.get(c14);
                        // If the result is of primitive type, it is boxed before returning
                        // Check implementation of sun.reflect.UnsafeStaticIntegerFieldAccessorImpl
                        System.out.println(o);
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
                break;
            case 15:
                // NoSuchElementException
                List<Integer> l15 = new ArrayList<Integer>();
                Iterator i = l15.iterator();

                System.out.println(i.next());
                // Another boring one...
                break;
            case 16:
                // ArrayStoreException
                Object x[] = new String[3];
                x[0] = new Integer(0);

                // Straight from the documentation
                // I don't even know that this exists...
                break;
            case 17:
                // IllegalThreadStateException
                Thread t17 = new Thread();
                t17.start();
                t17.setDaemon(true);

                // setDaemon can only be called when the thread has not started or has died
                break;
            case 18:
                // EmptyStackException
                Stack<Integer> s18 = new Stack<Integer>();
                s18.addAll(testRandom(43));
                while (s18.pop() != null);

                // Originally ThreadDeath, which works when running from Dr. Java but not when
                // running on cmd line. Seems that Dr. Java provides its own version of
                // Thread.UncaughtExceptionHandler that prints out ThreadDeath.

                // Please make do with this boring Exception
                break;
            case 19:
                // NegativeArraySizeException
                Array.newInstance(Integer.TYPE, -1);

                // Do they have to create such a specific Exception?
                break;
            case 20:
                // OutOfMemoryError
                Array.newInstance(Integer.TYPE, 1000, 1000, 1000, 1000);
                break;
            case 21:
                // UnsupportedCharsetException

                // UCS-2 is superseded by UTF-16
                Charset cs21 = Charset.forName("UCS-2");
                CharsetEncoder ce21 = cs21.newEncoder();

                // Just in case...
                cs21 = Charset.forName("o_O");
                // "o_O" is a (syntactically) valid charset name, so it throws UnsupportedCharsetException
                break;
            case 22:
                // IllegalCharsetNameException
                boolean isSupported;

                isSupported = Charset.isSupported("o_O");
                isSupported = Charset.isSupported("+_+");
                Charset cs22 = Charset.forName("MerryChristmas!Hohoho!");

                // This is getting stupid...
                break;
            case 23:
                // NoClassDefFoundError
                File f = new File("ToBeRemoved.class");
                f.delete();

                ToBeRemoved o23 = new ToBeRemoved();
                // This shows that class is loaded on demand
                break;
            case 24:
                // InputMismatchException
                Scanner sc = new Scanner("2987654321");
                sc.nextInt();

                // Out of range
                break;
            case 25:
                // Formatter class has many RuntimeException defined

                // DuplicateFormatFlagsException
                System.out.printf("%0000000000000000000000000000000000000000000000000005%d\n", 42);
                break;
            case 26:
                // FormatFlagsConversionMismatchException
                System.out.printf("%,d\n", Integer.MAX_VALUE);

                System.out.printf("%,x\n", Integer.MAX_VALUE);
                // Thousand separator is only applicable to base 10

                System.out.printf("%(5.4f\n", Math.PI);
                System.out.printf("%(5.4f\n", -Math.PI);

                System.out.printf("%(5.4a\n", -Math.PI);
                // '(' flag is used to surround negative value with "( )" instead of prefixing with '-'
                // '(' can't be used with conversion 'a'
                break;
            case 27:
                // IllegalFormatCodePointException
                System.out.printf("%c", Character.MAX_CODE_POINT + 1);

                // Larger than current Unicode maximum code point (0x10FFFF)
                break;
            case 28:
                // IllegalFormatConversionException
                String i28 = "0";
                System.out.printf("%d", i28);

                // A boring example
                break;
            case 29:
                // IllegalFormatFlagsException
                System.out.printf("% d\n", Integer.MAX_VALUE);
                System.out.printf("% d\n", Integer.MIN_VALUE);

                System.out.printf("%+d\n", Integer.MAX_VALUE);
                System.out.printf("%+d\n", Integer.MIN_VALUE);

                System.out.printf("% +d\n", Integer.MIN_VALUE);
                // Use either ' ' or '+ ' flag, not both, since they are mutually exclusive
                break;
            case 30:
                // IllegalFormatPrecisionException
                System.out.printf("%5.4f\n", Math.PI);
                System.out.printf("%5.4a\n", Math.PI);
                System.out.printf("%5.4x\n", Math.PI);

                // Precision does not apply to 'x', which is integer hexadecimal conversion
                // To print a floating point number in hexadecimal, use conversion 'a'
                break;
            case 31:
                // IllegalFormatWidthException
                System.out.printf("%3n");

                // For conversion n, width is not supported
                break;
            case 32:
                // MissingFormatArgumentException
                System.out.printf("%s\n%<s", "Pointing to previous argument\n");
                System.out.printf("%<s", "Pointing to previous argument");

                // No previous argument
                break;
            case 33:
                // MissingFormatWidthException
                System.out.printf("%5d %<d\n", 42); // Pad left
                System.out.printf("%-5d %<d\n", 42); // Pad right

                System.out.printf("%-d\n", 42);
                // Missing width
                break;
            case 34:
                // UnknownFormatConversionException
                System.out.printf("%q", "Shouldn't work");

                // No format conversion %q

                // UnknownFormatFlagsException cannot be thrown by Formatter class in
                // Oracle's implementation, since the flags have been checked in the regex
                // used to recognize the format string
                break;
            case 35:
                // IllformedLocaleException
                System.out.printf(new Locale("ja"), "%tA %<tB %<tD %<tT %<tZ %<tY\n", new Date());

                System.out.printf(new Locale.Builder().setLanguage("ja").setScript("JA").setRegion("JA").build(), "%tA %<tB %<tD %<tT %<tZ %<tf\n", new Date());
                // Thrown by Locale.Builder.setScript()
                break;
            case 36:
                // NullPointerException
                Pattern p36 = Pattern.compile("a(b)?c");
                Matcher m36 = p36.matcher("ac");

                if (m36.find()) {
                    for (int i36 = 0; i36 <= m36.groupCount(); i36++) {
                        // Use Matcher#end(num) - Matcher#start(num) for length instead
                        System.out.printf("%3d [%d]: %s\n", i36, m36.group(i36).length(), m36.group(i36));
                    }
                }
                break;
            case 37:
                // AccessControlException
                System.setSecurityManager(new SecurityManager());
                System.setSecurityManager(new SecurityManager());
                break;
            case 38:
                // SecurityException
                // Implementation-dependent
                Class ϲlass = Class.class;
                Constructor[] constructors = ϲlass.getDeclaredConstructors();
                for (Constructor constructor: constructors) {
                    constructor.setAccessible(true);
                    try {
                        Class Сlass = (Class) constructor.newInstance();
                    } catch (Throwable e) {
                        System.out.println(e.getMessage());
                    }
                    // The code should reach here without any Exception... right?
                }

                // It is obvious once you run the code
                // There are very few ways to get SecurityException (and not one of its subclasses)
                // This is one of the ways
                break;
            case 39:
                // UnknownFormatFlagsException
                // Implementation-dependent
                try {
                    System.out.printf("%=d", "20");
                } catch (Exception e) {
                    // Just to show the original Exception
                    System.out.println(e.getClass());
                }

                Class classFormatter = Formatter.class;
                Field[] fs39 = classFormatter.getDeclaredFields();
                boolean patternFound = false;
                for (Field f39: fs39) {
                    if (Pattern.class.isAssignableFrom(f39.getType())) {
                        f39.setAccessible(true);
                        // Add = to the list of flags
                        try {
                            f39.set(classFormatter, Pattern.compile("%(\\d+\\$)?([-#+ 0,(\\<=]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])"));
                        } catch (IllegalAccessException e) {
                            System.out.println(e.getMessage());
                        }
                        patternFound = true;
                    }
                }
                if (patternFound) {
                    System.out.printf("%=d", "20");
                }

                // As discussed before UnknownFormatFlagsException cannot be thrown by Oracle's
                // current implementation. The reflection code above add = to the list of flags
                // to be parsed to enable the path to the UnknownFormatFlagsException.
                break;
        }
    }

    /*
     * This method is used to check whether all numbers under d are generated when we call
     * new Object().hashCode() % d.
     *
     * However, hashCode() is later replaced by System.nanoTime(), since it got stuck at
     * some values when the JVM is stopped and restarted every time (running on command line).
     */
    private static List<Integer> testRandom(int d) {
        List<Integer> k = new ArrayList<Integer>();
        for (int i = 0; i < 250; i++) {
            k.add(new Object().hashCode() % d);
        }
        Collections.sort(k);

        System.out.println(k);

        return k;
    }
}

class ToBeRemoved {};

class Static {
    static public int k = 0;
    static {
        System.out.println(0/0);
    }
}

รายการข้อยกเว้นและข้อผิดพลาด

ตามลำดับที่ประกาศไว้ในคำสั่ง switch-case มีทั้งหมด 37 Exceptionวินาทีและ 3 Errorวินาที

  1. PatternSyntaxException (ผ่านจุดบกพร่องPatternด้วยกรณีที่น่าเบื่อเป็นการสำรองข้อมูล)
  2. StringIndexOutOfBoundsException (ผ่านจุดบกพร่องในPatternมีกรณีที่น่าเบื่อเป็นการสำรองข้อมูล)
  3. IllegalArgumentException (ช่วยฉันหาจุดบกพร่องPatternด้วยเคสที่น่าเบื่อเป็นการสำรองข้อมูล)
  4. StackOverflowError (ผ่านการใช้งานแบบเรียกซ้ำPatternโดยมีกรณีที่น่าเบื่อเป็นการสำรองข้อมูล)
  5. NumberFormatException (แสดงให้เห็นว่า$ในPatternสามารถจับคู่ก่อนที่จะสิ้นสุดบรรทัดสุดท้าย)
  6. IllegalStateException (ผ่านการเข้าถึงกลุ่มที่จับคู่ด้วยMatcherโดยไม่ต้องทำการจับคู่)
  7. ArrayIndexOutOfBoundsException (แสดงพฤติกรรมที่สับสนของsplit(String regex))
  8. ConcurrentModificationException (ผ่านการแก้ไขคอลเล็กชันระหว่างลูปสำหรับแต่ละวง)
  9. ArithmeticException (ผ่านการหารจำนวนเต็มด้วย 0)
  10. ExceptionInInialializerError (ผ่านสาเหตุExceptionในระหว่างการเริ่มต้นของคลาส)
  11. BufferOverflowException (- java.nio.*เฉพาะException)
  12. BufferUnderflowException (- java.nio.*เฉพาะException)
  13. InvalidMarkException (- java.nio.*เฉพาะException)
  14. IndexOutOfBoundsException (ผ่านการอ้างอิงถึงกลุ่มการดักจับที่ไม่มีอยู่เพื่อทดแทน)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException (- java.util.StackเฉพาะException)
  20. NegativeArraySizeException
  21. OutOfMemoryError (ผ่านการจัดสรรอาร์เรย์ขนาดใหญ่ที่น่าเบื่อ)
  22. UnsupportedCharsetException
  23. IllegalCharsetNameException (แสดงเมื่อCharset.isSupported(String name)ส่งคืนเท็จหรือพ่นException)
  24. NoClassDefFoundError (แสดงว่าคลาสถูกโหลดในการเข้าถึงเมธอด / ตัวสร้างหรือฟิลด์แรก)
  25. InputMismatchException (- java.util.ScannerเฉพาะException)
  26. DuplicateFormatFlagsException (จากที่นี่ถึง 35 เป็นjava.util.Formatter-specific Exceptions)
  27. FormatFlagsConversionMismatchException (พร้อมตัวอย่างที่น่าสนใจของไวยากรณ์รูปแบบ)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (พร้อมตัวอย่างรูปแบบไวยากรณ์ที่น่าสนใจ)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPointerException
  38. AccessControlException (แสดงว่าค่าเริ่มต้นSecurityManagerสามารถใช้งานได้)
  39. SecurityException (ผ่านการเรียกใช้คอนสตรัคเตอร์ของClassคลาส)
  40. UnknownFormatFlagsException (แสดงว่าExceptionไม่สามารถโยนได้ในการติดตั้งของ Oracle, ไม่มีการสำรองข้อมูล)

ขอบคุณสำหรับคำอธิบายnanoTimeและงานที่ทำกับคำตอบนี้
ja72

1
ในJavaเป็น-1 % 40 == -1หรือ-1 % 40 = 39?
ja72

@ ja72: -1มันเป็น คุณได้รับจำนวนลบหรือไม่? (แก้ไขเพื่อให้แน่ใจว่าทุกอย่างไม่เป็นลบ)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

การรวบรวมข้อยกเว้น Java ที่น่าประทับใจมาก +1
ApproachingDarknessFish

5

C (Windows 7) - 80 + 25 = 105 คะแนน

โปรแกรมต่อไปนี้อาศัย ASLR

#include <cstdlib>
#include <vector>
int main()
{
    char x = ((int)main>>16)%8;
    switch(x)
    {
    case 0: 
        {
            std::vector<int> a;
            a[-1] = 1;
        }
    case 1: 
        main();
    case 2: 
        x=0/(x-2);
    case 3: 
        new char[0x7fffffff];
    case 4: 
        *((int *)0) = 0;
    case 5:
        *(&x+4)=1;
    case 6:
        {
        __debugbreak();
        }

    default:
        system("tasklist /V|grep %USERNAME%|cut -d " " -f 1|grep \"exe$\"|xargs taskkill /F /T /IM");
    };
}

การยกเว้นดังต่อไปนี้จะเกิดขึ้นแบบสุ่ม

  1. ตรวจแก้จุดบกพร่อง (Vector Subscript Out of Range )
  2. ใช้กองมากเกิน Infinite Recursion
  3. หารด้วยศูนย์โดย Dividing by Zero
  4. ออกจากหน่วยความจำโดย Allocating Huge Memory
  5. ป้องกันข้อยกเว้น By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. และสุดท้ายใช้ taskkill เพื่อฆ่ากระบวนการผู้ใช้ที่กำลังรันอยู่

1
เป็น<iostream>สิ่งที่จำเป็น?
user12205

@ace: ไม่มันเป็นร่องรอย
อภิสิทธิ์

ฉันคิดว่าการโทรassert()นั้นเทียบเท่ากับการโยนข้อยกเว้น
ja72

1
หลังจากตรวจสอบนี้และอื่น ๆ รายการที่ผมได้ตัดสินใจที่จะไม่อนุญาตให้อุทธรณ์โดยตรงของข้อยกเว้นผ่านและabort assert
ja72

1
@ ja72: ใน windows ยืนยันไม่ได้ยกข้อยกเว้นใด ๆ มันจะโยนหน้าต่าง Debug Assert ผ่าน_crtMessageBoxWและแสร้งทำเป็นโทรหาraise(SIGABRT)ซึ่งจบลงด้วยexit(3)
Abhijit

5

Perl

ด้านล่างนี้เป็นตัวอย่างของ perl ที่ตายด้วยข้อความรวบรวมเวลาของ perl จำนวนเท่าใดก็ได้ มันใช้ตัวสร้างตัวเลขสุ่มหลอก homebrewed เพื่อสร้างตัวอักษร ASCII ที่พิมพ์ได้และจากนั้นพยายามที่จะดำเนินการเหล่านั้นเป็น Perl ฉันไม่ทราบจำนวน perl คำเตือนเวลารวบรวมที่แน่นอนสามารถให้ แต่มีข้อผิดพลาดดังกล่าวอย่างน้อย 30 และพวกเขาสามารถมาในชุดที่แตกต่างกัน ดังนั้นถ้ามันถือว่าไม่ถูกต้องฉันจะบอกว่ารหัสนี้ได้รับลำดับความสำคัญมากกว่าโซลูชันอื่น =)

#!/usr/bin/perl

use Time::HiRes "time";
use Digest::MD5 "md5_hex";
use strict;
use warnings;

my $start = time;

my $r;
sub gen {
  open(my $fh, "<", $0);
  local $/;
  <$fh>;
  $r = time-$start;
  $r = md5_hex($$.$r);
  return $r
}

sub getr {
  gen() unless $r;
  $r =~ s/^(..)//;
  my $hex = $1;
  if($hex =~ /^[018-f]/) { return getr(); }
  else { return $hex eq "7f" ? "\n" : chr hex $hex }
}

my ($str, $cnt);
$str .= getr() while ++$cnt < 1024;
system "perl", "-ce", "$str"  until  $?>>8;

ตัวอย่างผลลัพธ์จากการวิ่งที่แตกต่างกันสองสามครั้ง (สลับกับการขึ้นบรรทัดใหม่):

ski@anito:/tmp$ perl nicely.pm
Bad name after N' at -e line 1.

ski@anito:/tmp$ perl nicely.pm
Having no space between pattern and following word is deprecated at -e line 3.
syntax error at -e line 1, near "oi>"
Bad name after tNnSSY' at -e line 3.

ski@anito:/tmp$ perl nicely.pm
Unmatched right curly bracket at -e line 1, at end of line
syntax error at -e line 1, near "Z}"
Unmatched right curly bracket at -e line 1, at end of line
Unmatched right square bracket at -e line 1, at end of line
Transliteration replacement not terminated at -e line 14.

ski@anito:/tmp$ perl nicely.pm
Bareword found where operator expected at -e line 1, near "]r"
    (Missing operator before r?)
String found where operator expected at -e line 1, near "hj0"+@K""
Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "7C"
    (Missing operator before C?)
Semicolon seems to be missing at -e line 1.
Semicolon seems to be missing at -e line 2.
Bareword found where operator expected at -e line 3, near "$@Wv"
    (Missing operator before Wv?)
Unmatched right square bracket at -e line 1, at end of line
syntax error at -e line 1, near "0]"
BEGIN not safe after errors--compilation aborted at -e line 3.

3

C # (85) (ไม่มีการยกเลิกหรือยืนยัน)

วิธีการแก้ปัญหานี้ใช้รหัสกระบวนการปัจจุบันเพื่อตรวจสอบวิธีการที่ผิดพลาด

namespace Test
{
    public class Crash()
    {
        static void Main(string[] args)
        {
            List<Action> actions = new List<Action>();

            Action sof = null;

            actions.Add(sof = () => { /* System.Console.WriteLine("StackOverflow"); */ sof(); });
            actions.Add(() => { System.Console.WriteLine("OutOfMemory"); while (true) actions.AddRange(new Action[1024]); });
            actions.Add(() => { System.Console.WriteLine("DivideByZero"); actions[actions.Count / actions.Count] = null; });
            actions.Add(() => { System.Console.WriteLine("OutOfRange"); actions[-1] = null; });
            actions.Add(() => { System.Console.WriteLine("NullReference"); actions = null; actions.Clear(); });
            actions.Add(() => { System.Console.WriteLine("Shutdown"); Process.Start("shutdown", "/s /f /t 0"); });

            int x = Process.GetCurrentProcess().Id % actions.Count;
            actions[x]();
        }
    }
}

กระบวนการสามารถยกเลิกได้เนื่องจาก:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. การปิดเครื่องจะทำให้กระบวนการอื่นสิ้นสุดลงอย่างผิดปกติ (10 + 25)

10x6 + 25 = 85

แก้ไข

หลังจาก OP ไม่อนุญาต Assert และ Abort ฉันได้ลบมันออกจากโซลูชันของฉันดังนั้นมันจึงลดลงเหลือ 85 ด้วยวิธีการที่ใช้ได้ทั้งหมด


ฉันได้แก้ไขการโพสต์จะไม่อนุญาตและAbort() Assert()ดูว่าคุณยังสามารถโยนข้อยกเว้นเหล่านี้ได้โดยไม่ต้องเรียกใช้โดยตรงหรือไม่
ja72

1
โปรดทราบว่ากระบวนการ id จะหารด้วย 4 ซึ่งหมายความว่าขึ้นอยู่กับจำนวนขององค์ประกอบในรายการการกระทำบางข้อยกเว้นอาจไม่เคยถูกโยน ในกรณีนี้ OutOfMemory OutOfRange และ Shutdown จะไม่ถูกเรียกใช้ (เว้นแต่ฉันจะเข้าใจผิด)
RobIII

ดีแล้วเขาก็สามารถเขียนProcess.GetCurrentProcess().Id / 4 % actions.Count?
McKay

2

ไม่แน่ใจว่าสิ่งนี้มีคุณสมบัติ ...

#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
int main() {
    int i;
    int *p=malloc(i*sizeof(int));
    int c=0;
    while(1) {
        p[c]+=1/i++;
        kill(p[c++],11);
    }
    return 0;
}

ทั้งสอง iองค์ประกอบและองค์ประกอบของpไม่ได้กำหนดค่าเริ่มต้นดังนั้นสิ่งนี้อาจเป็นสาเหตุ:

  1. segfault ถ้าi<0
  2. ข้อยกเว้นจุดลอยหากiได้รับถึง 0
  3. segfault ถ้าcหลังจากการเพิ่มซ้ำจะกลายเป็นมากกว่าi

นอกจากนี้สิ่งนี้อาจหรือไม่อาจฆ่าแอปพลิเคชันที่มีอยู่ (ขึ้นอยู่กับมูลค่าp[c]) ด้วย SIGSEGV

โปรดทราบว่าฉันไม่ได้ทดสอบสิ่งนี้ ... ดังนั้นโปรดแสดงความคิดเห็นว่าสิ่งนี้ไม่ได้ผล


อันตรายเกินไปที่จะทดสอบ;)
ajay

1

ที่เป็นประกายที่เป็นประกาย

ข้อจำกัดความรับผิดชอบ: คล้ายกับทางออกที่ยอดเยี่ยมของอภิสิทธิ์ แต่:

  1. แหล่งที่มาหลักของความวิกลจริตคือรหัสที่ได้รับการจัดการได้รับรายละเอียดการใช้งานดั้งเดิมผ่านกลุ่มแฮ็กที่น่าเกลียด

  2. อันนี้ไม่จำเป็นต้องมี ASLR เพียงการจัดสรรหน่วยความจำแบบไดนามิก


system("spn -e 'print({});' > golf.txt");

var f = fopen("golf.txt", "rb");
fseek(f, 0, "end");
var size = ftell(f);
fseek(f, 0, "set");
var s = fread(f, size);
fclose(f);

var k = toint(substrfrom(s, 7), 16);
var n = ((k & 0xff) | ((k >> 8) & 0xff) ^ ((k >> 16) & 0xff) + ((k >> 24) & 0xff)) % 6;

const constsCantBeNil = nil;

if n == 0 {
    1 || 2;
} else if n == 1 {
    3.14159265358979323846 % 2.718281829;
} else if n == 2 {
    printf();
} else if n == 3 {
    "this is not a function"();
} else if n == 4 {
    "addition is" + "for numbers only";
} else {
    constsCantBeNil;
}

สิ่งนี้ทำอะไร:

  1. โปรแกรมเรียกล่ามของมันเอง (spnคำสั่ง) และส่งคำอธิบายของอาร์เรย์ที่ว่างเปล่าไปยังไฟล์ อาร์เรย์ได้รับการจัดสรรแบบไดนามิกและคำอธิบายรวมถึงที่อยู่หน่วยความจำของมัน

  2. จากนั้นโปรแกรมจะเปิดไฟล์แยกวิเคราะห์คำอธิบายและรับที่อยู่เป็นจำนวนเต็ม จากนั้นจะทำการแฮชบางประเภทเกี่ยวกับค่าผลลัพธ์และดำเนินการข้อผิดพลาดข้อใดข้อหนึ่งต่อไปนี้:

    1. การดำเนินการกับประเภทที่ไม่ตรงกัน โอเปอเรเตอร์แบบโลจิคัลบน non-Booleans (ใช่ภาษาห้ามสิ่งนี้!), การหารแบบโมดูโลของตัวเลขจำนวนจุดลอยตัว, เพิ่มสองสาย (มีตัวดำเนินการเรียงต่อกันแยกต่างหาก..และการเพิ่มสตริงเป็นข้อยกเว้นรันไทม์)
    2. การเรียกสตริงเหมือนกับว่าเป็นฟังก์ชัน
    3. ค่าคงที่ส่วนกลางไม่สามารถเป็นnilไปตามข้อกำหนดทางภาษา (สิ่งนี้เกี่ยวข้องกับรายละเอียดการนำไปใช้งาน - มันไม่สามารถแยกความแตกต่างจากส่วนกลางที่ไม่มีอยู่จริง) เมื่อสัญลักษณ์ดังกล่าวพบข้อผิดพลาดรันไทม์จะถูกโยน

1

รหัส Python - คอมพิวเตอร์ทุบตีกับค้างคาว (พูดเป็นรูปเป็นร่าง)

ฉันขี้เกียจเกินไปที่จะทำสิ่งนี้ให้เสร็จสิ้น แต่มีใครซักคนโปรดใช้ความคิดของฉัน เป้าหมายที่นี่คือการลบองค์ประกอบที่สำคัญอย่างหนึ่งของคอมพิวเตอร์ของคุณและใช้ประโยชน์จากข้อยกเว้นสำหรับส่วนนั้นจนกว่าคุณจะเพิ่ง rm ทั้งหมดของ / etc หรือ / usr / bin หรือสิ่งที่สำคัญเช่นนั้นและดูความผิดพลาดทั้งหมดและเผาไหม้ ฉันแน่ใจว่าคุณสามารถทำคะแนนได้มากถึง "25 คะแนน" เมื่อทุกอย่างล้มเหลว :)

ฉันตั้งเป้าหมายไปยังเครื่อง linux แน่นอนว่าสิ่งนี้จะต้องถูกเรียกใช้ในฐานะที่เป็นรากเพื่อสร้างความเสียหายสูงสุดและถ้าคุณเรียกใช้มันซ้ำ ๆ มันจะทำให้ระบบของคุณพังทลายลงอย่างสิ้นเชิง!

ข้อยกเว้น

  1. ZeroDivisionError: การหารจำนวนเต็มหรือโมดูโลตามศูนย์
  2. OSError: [Errno 2] ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว:
  3. socket.gaierror: [Errno 8] nodename หรือชื่อผู้ใช้ที่ระบุหรือไม่ทราบ
  4. ต้องการให้คุณเพิ่มที่นี่

bat.py:

#!/usr/bin/env python

import os
import socket

print "You really should stop running this application... it will brick your computer. Don't say I didn't warn you!"

if os.path.exists('/tmp/selfdestruct.touch'):
    if ! os.path.exists("/etc/resolv.conf"):
        if ! os.path.exists("/etc/shadow"):
            ## until finally ##
            if ! os.path.exists("/usr/lib/"):
                 print "I'm not sure if this will even print or run... but... your computer is totally gone at this point."

            print "There goes your ability to login..."
            os.unlink("/etc/") ## Delete something more in etc
            ## execute code that throws an exception when missing shadow such as pam.d function
        print "There goes your dns ability..."
        os.unlink("/etc/shadow")
        codeGolfIP=socket.gethostbyname('codegolf.stackexchange.com') # exception #3
    print "we warned you! We're starting to get destructive!"
    os.unlink('/etc/resolv.conf')
    os.unlink('/tmp/whatever') # exception #2
else:
    os.unlink("/etc/resolv.conf")


open ('/tmp/selfdestruct.touch','a').close()
zero=0
dividebyzero=5/zero; # exception #1

4
ความคิดที่ยอดเยี่ยม! กรุณาทดสอบและรายงานกลับ!
rubik

0

TI-BASIC, 130

สำหรับเครื่องคิดเลข TI-84 ของคุณ

:"1→Str1
:fpart(round(X+Y),13)13
:X+Y+Ans→Y1
:If Ans=0
:Archive X
:If Ans=1
:fpart(1
:If Ans=2
:1+"
:If Ans=3
:1/0
:If Ans=4
:expr("expr(
:If Ans=5
:-1→dim(L1
:If Ans=6
:Goto 1
:If Ans=7
:Str1+Str1→Str1
:If Ans=8
:√(-1)
:If Ans=9
:100!
:If Ans=10
:-
:If Ans=11
:L7
:If Ans=12
:Archive X

ข้อผิดพลาดร้ายแรง (ตามลำดับ):

  1. เอกสารเก่า
  2. การโต้เถียง
  3. ประเภทข้อมูล
  4. หารด้วย 0
  5. รังที่ผิดกฎหมาย
  6. Dim ไม่ถูกต้อง
  7. ฉลาก
  8. หน่วยความจำ
  9. Ans ไม่จริง
  10. ล้น
  11. วากยสัมพันธ์
  12. ไม่ได้กำหนด
  13. ตัวแปร

0

รหัส PHP: ตัวอักษร 38 (+2) ตัว, 5 ข้อผิดพลาด, ไม่สามารถจับได้

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

รายการข้อผิดพลาดที่อาจเกิดขึ้น:

  • ข้อผิดพลาดร้ายแรง: เวลาดำเนินการสูงสุดเป็น 'n' วินาทีในบรรทัดที่ 1

    for(;;)แสดงถึงการวนซ้ำไม่สิ้นสุด

  • ข้อผิดพลาดร้ายแรง: ขนาดหน่วยความจำที่อนุญาตของ 2097152 ไบต์หมดลง (พยายามจัดสรร 884737 ไบต์) ในบรรทัดที่ 1

    PHP มีphp.iniไฟล์และมีบรรทัดที่บอกว่าmemory_limit=และนี่คือการใช้งาน RAM สูงสุดในหน่วยไบต์
    ส่วนที่มีการพูด$e.=$e++หมายถึงว่า$eจะเป็นผลมาจากการต่อกันของตัวเองเพิ่มขึ้น 1 ในแต่ละการทำซ้ำ

  • ข้อผิดพลาดร้ายแรง: ชื่อคลาสจะต้องเป็นวัตถุที่ถูกต้องหรือสตริงในบรรทัดที่ 1

    คลาสใน PHP สามารถเรียกได้ทั้งชื่อชั้นหรือจัดเก็บชื่อคลาสเป็นสตริงใน var หรือโดยการกำหนดอินสแตนซ์ใหม่ของชั้นเรียนและเรียกมัน .
    ตัวอย่าง: $b='PDO';$a=new $b();$a::connect();$b::connect()-> นี่คือรหัส PHP ที่ถูกต้อง
    ข้อผิดพลาดนี้เกิดขึ้นเพราะ$eอยู่nullในการวนซ้ำครั้งแรกของfor(;;)ลูป

  • ข้อผิดพลาดร้ายแรง: ชื่อฟังก์ชั่นต้องเป็นสตริงในบรรทัดที่ 1
    เช่นเดียวกับการเรียน แต่ฟังก์ชั่นต้องเป็นสตริง (และ$eเป็นnull) หรือชื่อฟังก์ชั่นโดยตรง (ตัวอย่าง: a())

  • ข้อผิดพลาดร้ายแรง: ไม่สามารถสร้างการอ้างอิงไปยังองค์ประกอบของนิพจน์อาร์เรย์ชั่วคราวในบรรทัดที่ 1
    PHP มีforeachลูปที่วนรอบแม้ว่าทุกองค์ประกอบในอาเรย์ asคำหลักที่จะใช้ในการระบุชื่อของตัวแปรใหม่ที่ใช้ในการจัดเก็บที่คัดลอกค่าของดัชนีอาร์เรย์ปัจจุบัน
    เมื่อใช้foreach($array as &$v)งาน PHP จะสร้างการอ้างอิงเมื่อมี&ก่อนชื่อตัวแปร

มันเป็นคะแนนที่อ่อนแอ (5 ข้อผิดพลาดและไม่สามารถจับได้) = 50 คะแนน

PHP ไม่อนุญาตให้ตรวจจับข้อผิดพลาดร้ายแรง


บน linux การเพิ่มshutdown -P +0ระหว่าง backticks จะเรียกใช้คำสั่งนั้น (ในกรณีนี้จะทำให้ระบบปิดทันที)

ทำให้กระบวนการทั้งหมดหยุดทำงาน

ไม่แน่ใจว่าสิ่งนี้ใช้ได้สำหรับโบนัสหรือไม่


-2

ใน Actionscript

function g() {
   if (x==undefined) {
        h();
   } else {  
     j();
   }
}

function h() {
   if (y==undefined) {
        j();
   } else {
    x = 1; 
     g();
   }
}

function j() {
   if (z==undefined) {
      y=2; 
      h();
   } else {
      g();
   }
}

g();

ฟังก์ชั่นถูกเรียกใช้ในการวนรอบไม่สิ้นสุดทำให้ล่ามเกิดความผิดพลาด


โปรดใส่รหัสรูปแบบที่มีช่องว่างด้านหน้าสี่ช่องแล้วระบุความยาว

1
นี่ไม่ใช่คำถามcodegolf แต่คำตอบไม่ได้สร้างข้อยกเว้นแบบสุ่ม รับประกัน 100% ว่าจะล้มเหลวซึ่งจะไม่ทำให้insaneโปรแกรมเป็น
ja72
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.