Program kontroli szaleństwa

16

Szaleństwo: powtarzanie tego samego w kółko i oczekiwanie różnych rezultatów.

Napisz program, który generuje wyjątek (błąd w czasie wykonywania) przy każdym uruchomieniu. Wyzwanie polega na tym, że istnieje prawdopodobieństwo wywołania więcej niż jednej awarii bez bezpośredniego wywoływania wyjątków (bez throwinstrukcji) i nie korzystania z wbudowanych funkcji zliczania losowego lub procesora.

  • 10 punktów za każdy możliwy błąd.
  • 25 punktów bonusowych, jeśli błąd / awaria wystąpi w innym procesie lub systemie.

Zasady

  1. Odpowiedzi muszą wskazywać, jakie błędy są możliwe i jak są generowane.
  2. Nie można użyć systemowego (wbudowanego) generatora liczb losowych, chyba że jest on zapełniany tą samą liczbą przy każdym uruchomieniu programu.
  3. Nie można użyć liczby cykli tiki lub procesora, chyba że są one liczone w stosunku do początku głównego wątku programu.
  4. Wielowątkowość jest dozwolona (jeśli nie jest zakodowana).

Edytuj 1

  1. Generowanie identyfikatora GUID należy do wbudowanego generatora liczb losowych. Dozwolone jest niestandardowe generowanie GUID „na miejscu”.

  2. Dostęp do systemu plików jest dozwolony dla operacji we / wy plików, z wyjątkiem sytuacji, gdy wykonano je w celu ominięcia reguł (odczyt pliku losowych bitów lub znacznika czasu).

Edytuj 2

  1. Wołanie abort()lub assert()łamanie ducha wyzwania związanego z tworzeniem szalonego oprogramowania i dlatego za ten tryb niepowodzenia nie zostanie przyznanych 10 punktów.

Powodzenia!

ja72
źródło
Czy wygenerowanie przewodnika jest uważane za losowe?
drobnoustrój
Dobre pytanie. Myślę, że entropia musi być osiągnięta magicznie (kod kart), a nie sztucznie, więc powiedziałbym „nie” GUID-owi.
ja72
W przypadku JS - czy awarie przeglądarek są liczone jako 25 premii czy nie? Czy mogę wybrać, w której przeglądarce powinien być testowany mój kod?
wyjechał
Awaria hosta (przeglądarki lub frameworka) przyznaje 25 punktów bonusowych. Zawsze musi się jednak zawieszać.
ja72
Problem polega na napisaniu funkcji niedeterministycznej bez użycia środków niedeterministycznych (z wyłączeniem również zegara). C jest jednym z języków, który zapewnia dostęp do niezainicjowanych odniesień do wskaźników. Rozwiązania, które widzę, oparte są na niezainicjowanych wskaźnikach. Dla mnie używanie niezainicjowanych wskaźników jest równie dobre (lub złe), jak stosowanie metody GUID lub losowej.
mikrobian

Odpowiedzi:

15

Java, 400

Java jest błogosławiona (?) Wieloma Exceptionsi i Errors. Istnieje wiele Exceptionspecyficznych dla działania jednej klasy. Jako przykład jednego z najbardziej ekstremalnych przypadków, istnieje więcej niż 10 Exceptionsekund (wszystkie są podklasami IllegalFormatException) poświęconych Formattersamej klasie i poświęciłem trochę czasu, aby kod wygenerował (prawie) wszystkie z nich.

Moja obecna odpowiedź zawiera 40 różnych Exceptions / Errors i są one losowo wykonywane w zależności od modułu System.nanoTime()z jakąś liczbą całkowitą.

Metodę tę można stosować wyłącznie do pomiaru upływającego czasu i nie jest ona związana z żadnym innym pojęciem czasu systemowego ani zegara ściennego. Zwrócona wartość reprezentuje nanosekundy od pewnego ustalonego, ale dowolnego czasu początkowego (być może w przyszłości, więc wartości mogą być ujemne). Z tego samego źródła korzystają wszystkie wywołania tej metody w instancji wirtualnej maszyny Java; inne instancje maszyn wirtualnych prawdopodobnie będą miały inne pochodzenie.

Powyższa metoda powinna być dozwolona, ​​ponieważ mieści się w przypadku „3. Nie można użyć liczby cykli tików lub procesorów, chyba że są one liczone względem początku głównego wątku programu” .

Instrukcja kompilacji

JRE / JDK lub OpenJDK firmy Oracle jest zdecydowanie zalecane do uruchamiania kodu. W przeciwnym razie niektóre wyjątki mogą nie zostać zgłoszone, ponieważ niektóre z nich opierają się na wewnętrznych szczegółach implementacji referencyjnej i nie mam wiarygodnego rozwiązania awaryjnego.

Poniższy kod pomyślnie się kompiluje javac 1.7.0_11i generuje wszystkie wyjątki java 1.7.0_51.

  1. Aby uruchomić ten kod, musisz skopiować i wkleić poniższy kod do edytora obsługującego Unicode (np. Notepad ++), zapisać go w UTF-16 (Big-Endian lub Little-Endian nie ma znaczenia, dopóki napisany jest BOM) .

  2. Zmień katalog roboczy ( cd) na miejsce, w którym zapisany jest kod źródłowy ( jest to ważne ).

  3. Skompiluj kod za pomocą następującego polecenia:

    javac G19115.java -encoding "UTF-16"
    
  4. I uruchom kod:

    java G19115
    

W moim kodzie nie ma nic destrukcyjnego, ponieważ chcę również przetestować go na moim komputerze. Najbardziej „niebezpiecznym” kodem jest usuwanie ToBeRemoved.classpliku w bieżącym folderze. Poza tym reszta nie dotyka systemu plików ani sieci.


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

Lista wyjątków i błędów

W kolejności zadeklarowanej w instrukcji skrzynki rozdzielczej. Łącznie jest 37 Exceptionsi 3 Errors.

  1. PatternSyntaxException (przez błąd w Pattern, z nudną skrzynką jako kopię zapasową)
  2. StringIndexOutOfBoundsException (przez błąd w Pattern, z nudną skrzynką jako kopię zapasową)
  3. IllegalArgumentException (pomaga mi znaleźć błąd Pattern, z nudną skrzynką jako kopią zapasową)
  4. StackOverflowError (poprzez rekurencyjną implementację w Pattern, z nudną skrzynką jako kopią zapasową)
  5. NumberFormatException (pokazuje, że $w Patternmożna pasujących przed końcowym linii terminatora)
  6. IllegalStateException (poprzez dostęp do dopasowanych grup Matcherbez wykonywania dopasowania)
  7. ArrayIndexOutOfBoundsException (pokazuje mylące zachowanie split(String regex))
  8. ConcurrentModificationException (poprzez modyfikację kolekcji podczas pętli dla każdej)
  9. ArithmeticException (poprzez dzielenie liczb całkowitych przez 0)
  10. ExceptionInInitializerError (powodując Exceptionpodczas inicjowania klasy)
  11. BufferOverflowException ( java.nio.*-specyficznej Exception)
  12. BufferUnderflowException ( java.nio.*-specyficznej Exception)
  13. InvalidMarkException ( java.nio.*-specyficznej Exception)
  14. IndexOutOfBoundsException (przez odniesienie do nieistniejącej grupy przechwytywania zamiast)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException ( java.util.Stack-specyficznej Exception)
  20. NegativeArraySizeException
  21. OutOfMemoryError (poprzez nudny przydział dużej tablicy)
  22. UnsupportedCharsetException
  23. IllegalCharsetNameException (pokazuje, kiedy Charset.isSupported(String name)zwraca false lub wyrzuca Exception)
  24. NoClassDefFoundError (pokazuje, że klasy są ładowane przy pierwszym dostępie do metody / konstruktora lub pola)
  25. InputMismatchException ( java.util.Scanner-specyficznej Exception)
  26. DuplicateFormatFlagsException ( java.util.Formatterodtąd do 35 są -swoiste Exception)
  27. FormatFlagsConversionMismatchException (z ciekawym przykładem składni formatu)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (z ciekawym przykładem składni formatu)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPointerException
  38. AccessControlException (pokazuje, że wartość domyślna SecurityManagerjest użyteczna)
  39. SecurityException (poprzez wywołanie konstruktora Classklasy)
  40. UnknownFormatFlagsException (pokazuje, że Exceptionnie można tego wyrzucić w implementacji Oracle, brak kopii zapasowej)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
źródło
Dziękujemy za wyjaśnienie nanoTimei pracę wykonaną przy tej odpowiedzi.
ja72
1
W Javajest -1 % 40 == -1lub -1 % 40 = 39?
ja72
@ ja72: Tak jest -1. Czy dostałeś liczbę ujemną? (Edytowane, aby upewnić się, że wszystko nie jest ujemne).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨d̷̰̀ĥ̷̳
Bardzo imponująca kompilacja wyjątków Java. +1.
Zbliża się do
5

C (Windows 7) - 80 + 25 = 105 punktów

Poniższy program opiera się na 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");
    };
}

Następujący wyjątek wystąpiłby losowo

  1. Asercja debugowania ( Vector Subscript Out of Range)
  2. Przepełnienie stosu za pomocą Infinite Recursion
  3. Podziel przez zero przez Dividing by Zero
  4. Brak pamięci przez Allocating Huge Memory
  5. Chroniony wyjątek By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. i na koniec używa taskkill do zabicia działającego procesu użytkownika
Abhijit
źródło
1
jest <iostream>konieczne?
user12205,
@ace: Nie, to było szczątkowe
Abhijit
Myślę, że dzwonienie assert()jest równoznaczne z zgłoszeniem wyjątku.
ja72
1
Po przejrzeniu tego i innych wpisów postanowiłem zabronić bezpośredniego wywoływania wyjątków za pośrednictwem aborti assert.
ja72
1
@ ja72: W systemie Windows assert nie wywołuje żadnego wyjątku. Rzuca okno potwierdzenia debugowania przez _crtMessageBoxWi udaje, że dzwoni raise(SIGABRT), co kończy się przezexit(3)
Abhijit
5

Perl

Poniżej znajduje się fragment perla, który umiera z dowolną liczbą komunikatów czasu kompilacji perla. Używa domowego pseudolosowego generatora liczb do generowania drukowalnych znaków ASCII, a następnie próbuje je wykonać jako perl. Nie znam dokładnej liczby ostrzeżeń czasowych kompilacji, które może dać perl, ale z pewnością jest co najmniej 30 takich błędów i mogą występować w różnych kombinacjach. Tak więc, chyba że zostanie uznany za nieprawidłowy, powiedziałbym, że ten kod otrzymuje rząd wielkości więcej punktów niż inne rozwiązania =)

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

Przykładowe dane wyjściowe z kilku różnych przebiegów (przeplatanych znakami nowej linii):

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.
skibrianski
źródło
3

C # (85) (bez przerwania lub potwierdzenia)

To rozwiązanie wykorzystuje bieżący identyfikator procesu do określenia sposobu awarii.

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

Proces może zostać zakończony z powodu:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. Wyłączenie spowoduje nieprawidłowe zakończenie innych procesów. (10 + 25)

10x6 + 25 = 85

Edytować

Po tym, jak PO nie zezwoliło na Assert i Abort, usunąłem je z mojego rozwiązania, dlatego spada do 85 przy wszystkich prawidłowych dopuszczalnych metodach.

drobnoustrój
źródło
Zredagowałem post, aby zabronić Abort()i Assert(). Sprawdź, czy nadal możesz zgłaszać te wyjątki, nie wywołując ich bezpośrednio.
ja72
1
Zauważ, że identyfikator procesu jest zawsze podzielny przez 4, co oznacza, że ​​w zależności od liczby elementów na liście akcji pewne wyjątki mogą nigdy nie zostać zgłoszone. W takim przypadku OutOfMemory, OutOfRange i Shutdown nie zostaną wywołane (chyba że się mylę).
RobIII
więc mógł po prostu pisać Process.GetCurrentProcess().Id / 4 % actions.Count?
McKay
2

Nie jestem pewien, czy to się kwalifikuje ...

do

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

Zarówno ielement, jak i elementy psą niezainicjowane, więc może to spowodować:

  1. Awaria, jeśli i<0
  2. Wyjątek zmiennoprzecinkowy, jeśli ijakoś osiągnie 0
  3. Awaria, jeśli c po wielokrotnych przyrostach stają się większe niżi

Ponadto może to zabić istniejącą aplikację (w zależności od wartości p[c]) za pomocą SIGSEGV.

Pamiętaj, że nie testowałem tego ... więc skomentuj, jeśli to nie działa

użytkownik12205
źródło
zbyt niebezpieczne, aby to przetestować;)
aj
1

Musujące .

Oświadczenie: podobne do cudownego rozwiązania Abhijita, ale:

  1. głównym źródłem szaleństwa jest to, że zarządzany kod uzyskuje natywny szczegół implementacji poprzez kilka brzydkich hacków;

  2. ten nie wymaga ASLR, tylko dynamiczny przydział pamięci.


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

Co to robi:

  1. program wywołuje własnego interpretera ( spnkomendę) i przekazuje opis pustej tablicy do pliku. Tablica jest przydzielana dynamicznie, a opis zawiera jej adres pamięci.

  2. Następnie program otwiera plik, analizuje opis i uzyskuje adres jako liczbę całkowitą. Następnie wykonuje pewnego rodzaju haszowanie wartości wynikowej i wykonuje jedną z następujących błędnych akcji:

    1. Operacje z typami niedopasowania. Operatory logiczne na non-booleanach (tak, język tego zabrania!), Dzielenie modulo liczb zmiennoprzecinkowych, dodawanie dwóch ciągów (istnieje osobny operator konkatenacji .., a dodawanie ciągów jest wyjątkiem wykonawczym)
    2. Wywołanie ciągu znaków, jakby to była funkcja.
    3. Stałe globalne nie mogą być nilzgodne ze specyfikacją języka (ma to związek ze szczegółami implementacyjnymi - nie można go odróżnić od nieistniejącego globalnego). Po napotkaniu takiego symbolu generowany jest błąd czasu wykonywania.
H2CO3
źródło
1

Kod Python - Walenie w komputer za pomocą nietoperza (w przenośni)

Jestem zbyt leniwy, aby to skończyć, ale ktoś, proszę, weź mój pomysł i biegnij z tym! Celem jest usunięcie jednego ważnego komponentu komputera i wykorzystywanie wyjątków dla tej części, aż w końcu po prostu uruchomisz wszystkie pliki / etc lub / usr / bin lub coś ważnego i obejrzysz, jak cała gra się psuje. Jestem pewien, że możesz zdobyć dużo „25 punktów”, gdy wszystko się zawiesi. :)

Skierowałem go na maszyny Linux. To oczywiście musi być uruchomione jako root dla maksymalnych obrażeń, a jeśli uruchomisz go wielokrotnie, spowoduje to, że twój system będzie całkowicie zepsuty!

Wyjątki:

  1. ZeroDivisionError: dzielenie liczb całkowitych lub modulo przez zero
  2. OSError: [Errno 2] Brak takiego pliku lub katalogu:
  3. socket.gaierror: [Errno 8] nazwa lub nazwa węzła nie została podana lub nie jest znana
  4. Musisz dodać więcej tutaj

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
PressingOnAlways
źródło
4
Świetny pomysł! Sprawdź to i zgłoś się!
rubik
0

TI-BASIC, 130

Do kalkulatora 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

Błędy krytyczne (w kolejności):

  1. Archiwum
  2. Argument
  3. Typ danych
  4. Podziel przez 0
  5. Nielegalne gniazdo
  6. Nieprawidłowy wym
  7. Etykieta
  8. Pamięć
  9. Nonreal Ans
  10. Przelewowy
  11. Składnia
  12. Nieokreślony
  13. Zmienna
Timtech
źródło
0

Kod PHP: 38 (+2) znaków, 5 błędów, nie do zdobycia

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

Lista możliwych błędów:

  • Błąd krytyczny: przekroczony maksymalny czas wykonania „n” sekund w linii 1

    for(;;)oznacza nieskończoną pętlę

  • Błąd krytyczny: Dozwolony rozmiar pamięci 2097152 wyczerpanych bajtów (próbowano przydzielić 884737 bajtów) w linii 1

    PHP ma php.iniplik, i jest tam wiersz z napisem memory_limit=i tutaj pojawia się maksymalne użycie RAM w bajtach.
    Część, która mówi, $e.=$e++oznacza, że $ebędzie wynikiem konkatenacji samego siebie powiększonej o 1 w każdej iteracji.

  • Błąd krytyczny: nazwa klasy musi być poprawnym obiektem lub łańcuchem w wierszu 1

    Klasy w PHP mogą być wywoływane albo przez nazwę klasy, albo przez zapisanie nazwy klasy jako łańcucha w var lub przez przypisanie nowej instancji klasy i wywołanie jej .
    Przykład: $b='PDO';$a=new $b();$a::connect();$b::connect()-> to jest prawidłowy kod PHP.
    Ten błąd występuje, ponieważ $ewystępuje nullw pierwszej iteracji for(;;)pętli.

  • Błąd krytyczny: nazwa funkcji musi być ciągiem w wierszu 1
    Tak samo jak klasy, ale funkcje muszą być ciągiem (i $ejest null) lub nazwą funkcji bezpośrednio (przykład a():)

  • Błąd krytyczny: nie można tworzyć odwołań do elementów wyrażenia tymczasowej tablicy w linii 1.
    PHP ma foreachpętlę, która zapętla każdy element tablicy. Słowo askluczowe służy do wskazania nazwy nowej zmiennej używanej do przechowywania kopii wartości bieżącego indeksu tablicy.
    Podczas używaniaforeach($array as &$v) PHP tworzy referencję, gdy ma &przed nazwą zmiennej.

To słaby wynik (5 błędów i jest nie do zdobycia) = 50 punktów

PHP nie pozwala na łapanie krytycznych błędów.


W shutdown -P +0systemie Linux dodawanie między tylnymi palcami spowoduje uruchomienie tego polecenia (w tym przypadku spowoduje gwałtowne zamknięcie systemu).

Powoduje to zatrzymanie wszystkich procesów.

Nie jestem pewien, czy dotyczy to premii, czy nie.

Ismael Miguel
źródło
-2

W języku 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();

Funkcje są wywoływane w niekończącej się pętli powodującej awarię interpretera.

Mauro
źródło
Dodaj kod do golfa, sformatuj kod z czterema spacjami z przodu i określ długość.
1
To nie jest pytanie o codegolf . Ale odpowiedź nie generuje przypadkowych wyjątków. Gwarantuje 100% porażkę, co nie czyni z niego insaneprogramu.
ja72