Chương trình kiểm tra sự điên rồ


16

Sự điên rồ: làm đi làm lại nhiều lần và mong đợi kết quả khác nhau.

Viết chương trình chỉ ném ngoại lệ (lỗi thời gian chạy) mỗi lần chạy. Thách thức là có xác suất tạo ra nhiều hơn một sự cố, mà không gọi trực tiếp các ngoại lệ (không có throwcâu lệnh) và không sử dụng các hàm đếm đếm ngẫu nhiên hoặc cpu tích hợp.

  • 10 điểm cho mỗi lỗi có thể.
  • 25 điểm thưởng nếu xảy ra lỗi / sự cố trên một quy trình khác hoặc hệ thống.

Quy tắc

  1. Phản hồi phải chỉ ra lỗi nào có thể xảy ra và cách chúng được tạo.
  2. Không thể sử dụng trình tạo số ngẫu nhiên (tích hợp) của hệ thống trừ khi nó được gieo cùng một số mỗi khi chương trình chạy.
  3. Không thể sử dụng số lượng tics hoặc chu kỳ cpu, trừ khi chúng được tính tương đối cho đến khi bắt đầu chuỗi chương trình chính.
  4. Đa luồng được cho phép (nếu không sắp xếp).

Chỉnh sửa 1

  1. Thế hệ GUID nằm trong bộ tạo số ngẫu nhiên tích hợp. Tạo GUID "cây nhà lá vườn" tùy chỉnh được cho phép.

  2. Truy cập hệ thống tệp được phép cho I / O của các tệp trừ khi được thực hiện để bỏ qua các quy tắc (đọc tệp của các bit ngẫu nhiên hoặc dấu thời gian).

Chỉnh sửa 2

  1. Gọi điện thoại abort()hoặc assert()vi phạm tinh thần của thách thức tạo ra phần mềm điên rồ và do đó, sẽ không có 10 điểm nào được trao cho chế độ thất bại này.

Chúc may mắn!


Là tạo ra một hướng dẫn được coi là ngẫu nhiên?
microbian

Câu hỏi hay. Tôi nghĩ rằng entropy cần phải đạt được một cách kỳ diệu (mã nhà thẻ) và không giả tạo nên tôi sẽ nói không với GUID.
ja72

Đối với JS - trình duyệt bị lỗi có được tính là 25 phần thưởng hay không? Tôi có thể chọn trình duyệt nào để kiểm tra mã của mình không?
thúc vào

Phá vỡ máy chủ (trình duyệt hoặc khung) thưởng 25 điểm thưởng. Nó phải luôn luôn sụp đổ mặc dù.
ja72

Vấn đề là viết một hàm không xác định mà không sử dụng các phương tiện không xác định (không bao gồm đồng hồ quá). C là một trong những ngôn ngữ cho phép bạn truy cập vào các tham chiếu con trỏ chưa được khởi tạo. Vì vậy, các giải pháp tôi đang thấy được dựa trên các con trỏ chưa được khởi tạo. Đối với tôi, việc sử dụng các con trỏ chưa được khởi tạo cũng tốt (hoặc xấu) như sử dụng một hướng dẫn hoặc phương pháp ngẫu nhiên.
microbian

Câu trả lời:


14

Java, 400

Java được ban phước (?) Với nhiều Exceptions và Errors. Có nhiều Exceptions đặc trưng cho hoạt động của một lớp duy nhất. Như một ví dụ về một trong những trường hợp cực đoan nhất, có hơn 10 Exceptiongiây (tất cả đều là lớp con IllegalFormatException) dành riêng cho Formatterlớp và tôi đã dành thời gian để làm cho mã ném (gần như) tất cả chúng.

Câu trả lời hiện tại của tôi có 40 Exceptions / s khác nhau Errorvà chúng được thực hiện ngẫu nhiên tùy thuộc vào modulo của System.nanoTime()với một số nguyên.

Phương pháp này chỉ có thể được sử dụng để đo thời gian trôi qua và không liên quan đến bất kỳ khái niệm nào khác về thời gian của hệ thống hoặc đồng hồ treo tường. Giá trị được trả về đại diện cho nano giây do một số thời gian gốc cố định nhưng tùy ý (có thể trong tương lai, vì vậy giá trị có thể âm). Cùng một nguồn gốc được sử dụng bởi tất cả các yêu cầu của phương thức này trong một thể hiện của máy ảo Java; các trường hợp máy ảo khác có khả năng sử dụng một nguồn gốc khác.

Phương pháp trên phải được cho phép, vì nó rơi vào trường hợp "3. Không thể sử dụng số lượng tics hoặc chu kỳ cpu, trừ khi chúng được tính tương đối khi bắt đầu chuỗi chương trình chính" .

Hướng dẫn biên soạn

JRE / JDK hoặc OpenJDK của Oracle được khuyến khích mạnh mẽ để chạy mã. Mặt khác, một số Ngoại lệ có thể không bị ném, vì một số trong số chúng phụ thuộc vào các chi tiết nội bộ của việc triển khai tham chiếu và tôi không có dự phòng đáng tin cậy.

Mã dưới đây biên dịch thành công với javac 1.7.0_11và tạo ra tất cả Ngoại lệ trên java 1.7.0_51.

  1. Để chạy mã này, bạn cần sao chép và dán mã bên dưới vào trình chỉnh sửa nhận biết Unicode (ví dụ: Notepad ++), lưu mã đó trong UTF-16 (Big-Endian hoặc Little-Endian không quan trọng miễn là BOM được viết) .

  2. Thay đổi thư mục làm việc ( cd) thành nơi lưu mã nguồn ( điều này rất quan trọng ).

  3. Biên dịch mã bằng lệnh sau:

    javac G19115.java -encoding "UTF-16"
    
  4. Và chạy mã:

    java G19115
    

Không có gì phá hủy trong mã của tôi, vì tôi cũng muốn thử chạy nó trên máy tính của mình. Mã "nguy hiểm" nhất là xóa ToBeRemoved.classtệp trong thư mục hiện tại. Ngoài ra, phần còn lại không chạm vào hệ thống tệp hoặc mạng.


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);
    }
}

Danh sách các trường hợp ngoại lệ và lỗi

Theo như tuyên bố trong trường hợp chuyển đổi tuyên bố. Có tổng cộng 37 Exceptiongiây và 3 Errorgiây.

  1. PatternSyntaxException (thông qua lỗi trong Pattern, với trường hợp nhàm chán là sao lưu)
  2. StringIndexOutOfBoundException (thông qua lỗi trong Pattern, với trường hợp nhàm chán là sao lưu)
  3. IllegalArgumentException (giúp tôi tìm ra lỗi Pattern, với trường hợp nhàm chán là bản sao lưu)
  4. StackOverflowError (thông qua triển khai đệ quy trong Pattern, với trường hợp nhàm chán là sao lưu)
  5. NumberFormatException (cho thấy $trong Patternthể phù hợp trước khi dòng terminator thức)
  6. IllegalStateException (thông qua việc truy cập các nhóm phù hợp Matchermà không thực hiện một trận đấu)
  7. ArrayIndexOutOfBoundException (hiển thị hành vi khó hiểu của split(String regex))
  8. ConcurrencyModificationException (thông qua sửa đổi Bộ sưu tập trong một vòng lặp cho mỗi vòng lặp)
  9. Số học ngoại lệ (thông qua phép chia số nguyên cho 0)
  10. ExceptionInInialialError (thông qua việc gây ra Exceptiontrong quá trình khởi tạo một lớp)
  11. BufferOverflowException (đặc java.nio.*biệt Exception)
  12. BufferUnderflowException ( java.nio.*cụ thể Exception)
  13. InvalidMarkException ( java.nio.*cụ thể Exception)
  14. IndexOutOfBoundException (thông qua tham chiếu đến nhóm bắt giữ không tồn tại thay thế)
  15. ClassCastException
  16. NoSuchEuityException
  17. ArrayStoreException
  18. Bất hợp phápThreadStateException
  19. EmptyStackException (đặc java.util.Stackbiệt Exception)
  20. Tiêu cựcArraySizeException
  21. OutOfMemoryError (thông qua phân bổ nhàm chán của mảng lớn)
  22. Không được hỗ trợCharsetException
  23. IllegalCharsetNameException (hiển thị khi Charset.isSupported(String name)trả về false hoặc ném Exception)
  24. NoClassDefFoundError (cho thấy các lớp được tải khi truy cập lần đầu vào phương thức / hàm tạo hoặc trường)
  25. InputMismatchException (đặc java.util.Scannerbiệt Exception)
  26. Sao chépFormatFlagsException (từ đây đến 35 là java.util.Formatter-specific Exceptions)
  27. FormatFlagsConversionMismatchException (với ví dụ thú vị về cú pháp định dạng)
  28. Bất hợp phápFormatCodePointException
  29. Bất hợp phápFormatConversionException
  30. Bất hợp phápFormatFlagsException
  31. Bất hợp phápFormatPrecisionException
  32. Bất hợp phápFormatWidthException
  33. MissingFormatArgumentException (với ví dụ thú vị về cú pháp định dạng)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPulumException
  38. AccessControlException (cho thấy mặc định SecurityManagerlà có thể sử dụng được)
  39. SecurityException (thông qua việc gọi hàm tạo của Classlớp)
  40. UnknownFormatFlagsException (cho thấy rằng điều này Exceptionkhông thể được ném trong triển khai của Oracle, không có bản sao lưu)

Cảm ơn lời giải thích nanoTimevà công việc được thực hiện với câu trả lời này.
ja72

1
Trong Java-1 % 40 == -1hay -1 % 40 = 39?
ja72

@ ja72: Nó là -1. Bạn đã nhận được một số âm? (Được chỉnh sửa để đảm bảo mọi thứ đều không âm).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Biên dịch rất ấn tượng về các ngoại lệ Java. +1.
Tiếp

5

C (Windows 7) - 80 + 25 = 105 Điểm

Chương trình sau đây dựa trên 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");
    };
}

Theo dõi ngoại lệ sẽ xảy ra ngẫu nhiên

  1. Xác nhận gỡ lỗi (Vector Subscript Out of Range )
  2. Stack Overflow sử dụng Infinite Recursion
  3. Chia cho Zero bởi Dividing by Zero
  4. Hết bộ nhớ bởi Allocating Huge Memory
  5. Bảo vệ ngoại lệ By Accessing NULL
  6. Xếp chồng By overwriting stack
  7. INT 3
  8. và Cuối cùng, sử dụng taskkill để giết tiến trình người dùng đang chạy

1
<iostream>cần thiết không
dùng12205

@ace: Không, đó là dấu tích
Abhijit

Tôi nghĩ rằng gọi assert()là tương đương với ném một ngoại lệ.
ja72

1
Sau khi xem xét mục này và các mục khác, tôi đã quyết định không cho phép gọi ngoại lệ trực tiếp qua abortassert.
ja72

1
@ ja72: Trong các cửa sổ, khẳng định không thực sự đưa ra bất kỳ ngoại lệ nào. Nó ném một cửa sổ Debug Assert qua _crtMessageBoxWvà giả vờ gọi raise(SIGABRT), kết thúc quaexit(3)
Abhijit

5

Perl

Dưới đây là đoạn mã perl chết với bất kỳ số lượng tin nhắn thời gian biên dịch nào của perl. Nó sử dụng một trình tạo số giả ngẫu nhiên homebrewed để tạo các ký tự ASCII có thể in và sau đó cố gắng thực hiện các ký tự dưới dạng perl. Tôi không biết chính xác số lượng cảnh báo thời gian biên dịch mà perl có thể đưa ra, nhưng chắc chắn có ít nhất 30 lỗi như vậy và chúng có thể xuất hiện trong nhiều kết hợp khác nhau. Vì vậy, trừ khi nó được coi là không hợp lệ, tôi muốn nói rằng mã này nhận được một số điểm lớn hơn các giải pháp khác =)

#!/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;

Đầu ra mẫu từ một vài lần chạy khác nhau (xen kẽ với dòng mới):

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) (Không hủy bỏ hoặc khẳng định)

Giải pháp này sử dụng id quá trình hiện tại để xác định cách khắc phục sự cố.

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]();
        }
    }
}

Quá trình có thể chấm dứt do:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. Tắt máy sẽ khiến các quá trình khác bị chấm dứt bất thường. (10 + 25)

10 x 6 + 25 = 85

Biên tập

Sau khi OP không cho phép Assert và Abort, tôi đã xóa chúng khỏi giải pháp của mình, do đó, nó giảm xuống còn 85 với tất cả các phương thức cho phép hợp lệ.


Tôi đã chỉnh sửa bài viết để không cho phép Abort()Assert(). Xem nếu bạn vẫn có thể ném những ngoại lệ này mà không thực sự gọi chúng trực tiếp.
ja72

1
Lưu ý rằng id quá trình luôn chia hết cho 4, điều đó có nghĩa là, tùy thuộc vào số lượng phần tử trong danh sách hành động, một số ngoại lệ có thể không bao giờ được đưa ra. Trong trường hợp này OutOfMemory, OutOfRange và Shutdown sẽ không được gọi (trừ khi tôi nhầm).
RobIII

tốt, sau đó anh chỉ có thể viết Process.GetCurrentProcess().Id / 4 % actions.Count?
McKay

2

Không chắc chắn nếu điều này đủ điều kiện ...

C

#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;
}

Cả hai ivà các yếu tố của pchưa được khởi tạo, vì vậy điều này có thể gây ra:

  1. Một segfault nếu i<0
  2. Một ngoại lệ dấu phẩy động nếu ibằng cách nào đó được 0
  3. Một segfault nếu c, sau khi tăng lặp lại, trở nên lớn hơni

Ngoài ra, điều này có thể hoặc không thể giết chết một ứng dụng hiện có (tùy thuộc vào giá trị của p[c]) với SIGSEGV.

Lưu ý rằng tôi chưa kiểm tra điều này ... vì vậy hãy bình luận nếu điều này không hoạt động


quá nguy hiểm để kiểm tra nó;)
Ajay

1

Lấp lánh .

Tuyên bố miễn trừ trách nhiệm: tương tự như giải pháp tuyệt vời của Abhijit, nhưng:

  1. nguồn điên rồ chính là mã được quản lý có được một chi tiết triển khai riêng thông qua một loạt các bản hack xấu xí;

  2. cái này không yêu cầu ASLR, chỉ cần cấp phát bộ nhớ động.


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;
}

Cái này làm gì

  1. chương trình gọi trình thông dịch riêng của nó (spn lệnh) và đưa ra mô tả của một mảng trống vào một tệp. Mảng được phân bổ động và mô tả bao gồm địa chỉ bộ nhớ của nó.

  2. Chương trình sau đó mở tệp, phân tích mô tả và lấy địa chỉ dưới dạng số nguyên. Sau đó, nó thực hiện một số cách băm trên giá trị kết quả và thực hiện một trong các hành động sai lầm sau:

    1. Hoạt động với các loại không phù hợp. Toán tử logic trên phi Booleans (vâng, ngôn ngữ cấm điều này!), Phân chia modulo các số dấu phẩy động, thêm hai chuỗi (có một toán tử nối riêng.. và thêm chuỗi là ngoại lệ thời gian chạy)
    2. Gọi một chuỗi như thể nó là một hàm.
    3. Các hằng số toàn cầu không thể niltheo đặc tả ngôn ngữ (điều này phải được thực hiện với một chi tiết triển khai - nó không thể được phân biệt với một toàn cầu không tồn tại). Khi gặp một biểu tượng như vậy, một lỗi thời gian chạy được đưa ra.

1

Mã Python - Bashing Computer with a Bat (nói theo nghĩa bóng)

Tôi quá lười để hoàn thành việc này, nhưng ai đó, xin hãy lấy ý tưởng của tôi và chạy theo nó! Mục tiêu ở đây là xóa một thành phần quan trọng trong máy tính của bạn và khai thác các ngoại lệ cho phần đó cho đến khi cuối cùng bạn chỉ cần rm tất cả / etc hoặc / usr / bin hoặc một cái gì đó quan trọng như thế và xem toàn bộ sự cố và ghi. Tôi chắc rằng bạn có thể ghi được rất nhiều "25 điểm" khi mọi thứ gặp sự cố. :)

Tôi nhắm mục tiêu nó vào máy linux. Điều này tất nhiên phải được chạy dưới quyền root để có thiệt hại tối đa và nếu bạn chạy nó nhiều lần, nó sẽ khiến hệ thống của bạn hoàn toàn bị đóng gạch!

Ngoại lệ:

  1. ZeroDivisionError: chia số nguyên hoặc modulo bằng 0
  2. OSError: [Errno 2] Không có tệp hoặc thư mục như vậy:
  3. socket.gaierror: [Errno 8] cái tên cũng như tên dịch vụ được cung cấp, hoặc không biết
  4. Cần bạn để thêm nhiều hơn ở đây

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
Ý tưởng tuyệt vời Vui lòng kiểm tra và báo cáo lại!
rubik

0

TI-CƠ BẢN, 130

Đối với máy tính TI-84 của bạn

:"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

Lỗi nghiêm trọng (theo thứ tự):

  1. Lưu trữ
  2. Tranh luận
  3. Loại dữ liệu
  4. Chia cho 0
  5. Yến trái phép
  6. Dim không hợp lệ
  7. Nhãn
  8. Ký ức
  9. Ans không thật
  10. Tràn ra
  11. Cú pháp
  12. Chưa xác định
  13. Biến đổi

0

Mã PHP: ký tự 38 (+2), 5 lỗi, không thể so sánh được

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

Danh sách các lỗi có thể xảy ra:

  • Lỗi nghiêm trọng: Thời gian thực hiện tối đa 'n' giây vượt quá trên dòng 1

    for(;;)thể hiện một vòng lặp vô hạn

  • Lỗi nghiêm trọng: Kích thước bộ nhớ cho phép hết 2097152 byte (đã cố gắng phân bổ 884737 byte) trên dòng 1

    PHP có một php.initệp và có một dòng nói memory_limit=và ở đây có mức sử dụng ram tối đa theo byte.
    Phần đang nói $e.=$e++có nghĩa là đó $esẽ là kết quả của việc ghép chính nó tăng thêm 1 trong mỗi lần lặp.

  • Lỗi nghiêm trọng: Tên lớp phải là một đối tượng hợp lệ hoặc một chuỗi trên dòng 1

    Các lớp trong PHP có thể được gọi bằng tên lớp hoặc lưu trữ tên classe dưới dạng một chuỗi trong một var hoặc bằng cách gán một thể hiện mới của lớp và gọi nó .
    Ví dụ: $b='PDO';$a=new $b();$a::connect();$b::connect()-> đây là mã PHP hợp lệ.
    Lỗi này xảy ra bởi vì $enulltrong phiên đầu tiên của for(;;)vòng lặp.

  • Lỗi nghiêm trọng: Tên hàm phải là một chuỗi trên dòng 1
    Giống như các lớp, nhưng các hàm phải là một chuỗi (và $enull) hoặc tên hàm trực tiếp (ví dụ a():)

  • Lỗi nghiêm trọng: Không thể tạo tham chiếu đến các phần tử của biểu thức mảng tạm thời trên dòng 1
    PHP có foreachvòng lặp lặp mặc dù mọi phần tử trong một mảng. Các astừ khóa được sử dụng để chỉ ra tên của biến mới được sử dụng để lưu trữ một bản sao giá trị của chỉ số mảng hiện hành.
    Khi sử dụng foreach($array as &$v), PHP tạo một tham chiếu khi nó có &trước tên biến.

Đó là điểm yếu (5 lỗi và không thể so sánh được) = 50 điểm

PHP không cho phép bắt lỗi nghiêm trọng.


Trên linux, việc thêm vào shutdown -P +0giữa các backticks sẽ chạy lệnh đó (trong trường hợp này, sẽ khiến hệ thống tắt đột ngột).

Điều này gây ra rằng tất cả các quá trình dừng lại.

Không chắc chắn nếu điều này là hợp lệ cho tiền thưởng hay không.


-2

Trong Actioncript

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();

Các hàm được gọi trong một vòng lặp không bao giờ kết thúc khiến trình thông dịch bị sập.


Vui lòng chơi mã của bạn, mã định dạng với bốn khoảng trắng ở phía trước và chỉ định độ dài.
Hosch250

1
Đây không phải là một câu hỏi codegolf . Nhưng câu trả lời không tạo ra ngoại lệ ngẫu nhiên. Nó được đảm bảo 100% để thất bại, điều này sẽ không làm cho nó trở thành một insanechương trình.
ja72
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.