Программа проверки безумия


16

Безумие: делать одно и то же снова и снова и ожидать разных результатов.

Напишите программу, которая просто выдает исключение (ошибка времени выполнения) при каждом запуске. Задача состоит в том, чтобы иметь возможность генерировать более одного сбоя, без непосредственного вызова исключений (без throwоператоров) и не использовать встроенные функции подсчета случайных чисел или тиков.

  • 10 баллов за каждую возможную ошибку.
  • 25 бонусных баллов, если ошибка / сбой происходит в другом процессе или системе.

правила

  1. Ответы должны указывать, какие ошибки возможны и как они генерируются.
  2. Невозможно использовать системный (встроенный) генератор случайных чисел, если он не засевается одинаковым номером при каждом запуске программы.
  3. Невозможно использовать количество тактов или тактов процессора, если они не подсчитаны относительно начала основного потока программы.
  4. Многопоточность разрешена (если не поощрена).

Редактировать 1

  1. Генерация GUID подпадает под встроенный генератор случайных чисел. Пользовательская генерация GUID "доморощенного" разрешена.

  2. Доступ к файловой системе разрешен для ввода / вывода файлов, за исключением случаев, когда это делается для обхода правил (чтение файла со случайными битами или отметка времени).

Редактировать 2

  1. Вызов abort()или assert()нарушение духа задачи создания безумного программного обеспечения, и, таким образом, за этот способ отказа не будет начисляться 10 баллов.

Удачи!


Генерация guid считается случайным?
микробиан

Хороший вопрос. Я думаю, что энтропия должна быть достигнута магически (код карточного домика), а не искусственно, поэтому я бы сказал нет GUID.
ja72

Для JS - сбой браузеров считается 25 бонусом или нет? Могу ли я выбрать браузер для проверки моего кода?
Прибытие

Сбой хоста (браузера или фреймворка) присуждает 25 бонусных очков. Это должно всегда терпеть крах все же.
ja72

Проблема заключается в написании недетерминированной функции без использования недетерминированных средств (кроме часов). C - это один из языков, который дает вам доступ к неинициализированным ссылкам на указатели. Поэтому решения, которые я вижу, основаны на неинициализированных указателях. Для меня использование неинициализированных указателей так же хорошо (или плохо), как использование метода guid или случайного метода.
микробиан

Ответы:


15

Ява, 400

Ява благословлена (?) Многими Exceptions и Errors. Есть много Exceptions, которые являются специфическими для работы одного класса. В качестве примера одного из наиболее экстремальных случаев выделено более 10 Exceptionсекунд (все они являются подклассами IllegalFormatException) дляFormatter одному классу, и я потратил время на то, чтобы код перебросил (почти) все из них.

Мой текущий ответ содержит 40 различных Exceptionс / Errorх, и они выполняются случайным образом в зависимости от модуля System.nanoTime()с некоторым целым числом.

Этот метод может использоваться только для измерения прошедшего времени и не связан с каким-либо другим понятием системного или настенного времени. Возвращаемое значение представляет наносекунды с некоторого фиксированного, но произвольного времени начала (возможно, в будущем, поэтому значения могут быть отрицательными). Один и тот же источник используется всеми вызовами этого метода в экземпляре виртуальной машины Java; другие экземпляры виртуальной машины могут использовать другое происхождение.

Вышеуказанный метод должен быть разрешен, так как он попадает в случай «3. Невозможно использовать количество тактов или тактов процессора, если они не подсчитаны относительно начала основного потока программы» .

Инструкция по компиляции

Для запуска кода настоятельно рекомендуется использовать Oracle JRE / JDK или OpenJDK . В противном случае некоторые исключения могут быть не выданы, поскольку некоторые из них основаны на внутренних деталях эталонной реализации, и у меня нет надежного запасного варианта.

Приведенный ниже код успешно компилируется javac 1.7.0_11и создает все исключения java 1.7.0_51.

  1. Чтобы запустить этот код, вам нужно скопировать и вставить приведенный ниже код в редактор с поддержкой Unicode (например, Notepad ++), сохранить его в UTF-16 (Big-Endian или Little-Endian не имеет значения, пока записана спецификация) ,

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

Список исключений и ошибок

В порядке, указанном в заявлении о переключении. Всего 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 (путем изменения коллекции во время цикла for-each)
  9. ArithmeticException (через целочисленное деление на 0)
  10. ExceptionInInitializerError (через вызывающий 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)возвращает false или бросает Exception)
  24. NoClassDefFoundError (показывает, что классы загружаются при первом доступе к методу / конструктору или полю)
  25. InputMismatchException ( java.util.Scanner-специфический Exception)
  26. DuplicateFormatFlagsException (отсюда до 35 java.util.Formatter-специфичных Exceptionс)
  27. FormatFlagsConversionMismatchException (с интересным примером синтаксиса формата)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (с интересным примером синтаксиса формата)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. Исключение нулевого указателя
  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.
Приближается к

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: В окнах assert фактически не вызывает никаких исключений. Он выбрасывает окно отладки Assert _crtMessageBoxWи делает вид, что вызывает raise(SIGABRT), что заканчивается черезexit(3)
Abhijit

5

Perl

Ниже приведен фрагмент кода Perl, который умирает с любым количеством сообщений Perl во время компиляции. Он использует самодельный генератор псевдослучайных чисел для генерации печатных символов 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)

10х6 + 25 = 85

редактировать

После того, как OP запретил Assert и Abort, я удалил их из своего решения, следовательно, он снизился до 85 со всеми допустимыми допустимыми методами.


Я отредактировал пост, чтобы запретить Abort()и Assert(). Посмотрите, можете ли вы по-прежнему генерировать эти исключения, не вызывая их напрямую.
ja72

1
Обратите внимание, что идентификатор процесса всегда делится на 4, что означает, что в зависимости от количества элементов в списке действий некоторые исключения могут никогда не генерироваться. В этом случае OutOfMemory, OutOfRange и Shutdown не будут вызываться (если я не ошибаюсь).
RobIII

ну тогда он мог просто написать Process.GetCurrentProcess().Id / 4 % actions.Count?
МакКей

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. Сегфо если 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. Операции с несовпадающими типами. Логические операторы для небулевых (да, язык запрещает это!), Деление по модулю чисел с плавающей точкой, добавление двух строк (есть отдельный оператор конкатенации.. , и добавление строк является исключением времени выполнения)
    2. Вызов строки, как если бы это была функция.
    3. Глобальные константы не могут nilсоответствовать спецификации языка (это связано с деталями реализации - ее невозможно отличить от несуществующей глобальной). Когда встречается такой символ, выдается ошибка времени выполнения.

1

Python Code - избиение компьютера битой (образно говоря)

Я слишком ленив, чтобы закончить это, но кто-то, пожалуйста, возьмите мою идею и бегите с этим! Цель здесь - удалить один важный компонент вашего компьютера и использовать исключения для этой части, пока вы, наконец, просто не запустите все / etc или / usr / bin или что-то важное в этом роде и не увидите, как все это рухнет и сгорит. Я уверен, что вы можете набрать много «25 баллов», когда все падает. :)

Я нацелился на машины с Linux. Это, конечно, должно быть выполнено с правами суперпользователя для максимального урона, и если вы запустите его несколько раз, это сделает вашу систему полностью заблокированной!

Исключения:

  1. ZeroDivisionError: целочисленное деление или по модулю на ноль
  2. OSError: [Errno 2] Нет такого файла или каталога:
  3. socket.gaierror: [Errno 8] имя узла или имя сервера указаны или неизвестны
  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
Отличная идея! Пожалуйста, проверьте это и сообщите!
Рубик

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. Неверный Дим
  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=и здесь указывается максимальное использование оперативной памяти в байтах.
    Часть, где говорится, $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 не позволяет ловить фатальные ошибки.


На линукс, добавив shutdown -P +0 между обратными галочками запустит эту команду (в этом случае система внезапно завершит работу).

Это приводит к тому, что все процессы останавливаются.

Не уверен, действительно ли это для бонуса или нет.


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

Функции вызываются в бесконечном цикле, вызывающем сбой интерпретатора.


Пожалуйста, введите ваш код, отформатируйте код с четырьмя пробелами впереди и укажите длину.
Hosch250

1
Это не вопрос Codegolf . Но ответ не дает случайных исключений. Это на 100% гарантированно потерпит неудачу, что не сделает его insaneпрограммой.
ja72
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.