Програма перевірки божевілля


16

Божевілля: робити те саме і знову і знову і очікувати різних результатів.

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

  • 10 балів за кожну можливу помилку.
  • 25 бонусних балів, якщо помилка / збій стався в іншому процесі чи системі.

Правила

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

Редагуйте 1

  1. Генерація GUID підпадає під вбудований генератор випадкових чисел. Дозволено генерування GUID на замовлення для користувача.

  2. Доступ до файлової системи дозволено для вводу / виводу файлів, за винятком випадків, коли вони обходять правила (читайте файл випадкових біт або часову позначку).

Редагувати 2

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

Удачі!


Чи генерування настанови вважається випадковим?
мікроб

Гарне питання. Я думаю, що ентропію потрібно досягти магічним шляхом (код картки), а не штучно, тому я б сказав «ні» для GUID.
ja72

Для JS - чи вважається збій браузерів 25 бонусом чи ні? Чи можу я вибрати, на якому браузері слід перевірити мій код?
вийшов

Збій хоста (браузера або рамки) присуджує 25 бонусних балів. Це завжди має крах, хоча.
ja72

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

Відповіді:


15

Ява, 400

Ява благословенна (?) З багатьма Exceptions та Errors. Є багато Exceptions, які характерні для роботи одного класу. Як приклад одного з найбільш екстремальних випадків, існує більше 10 Exceptionс (усі є підкласом IllegalFormatException), присвячених Formatterодному класу, і я зайняв час, щоб код кидав (майже) їх усіх.

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

Цей метод може використовуватися лише для вимірювання минулого часу і не пов'язаний з будь-яким іншим поняттям системи або часу настінного годинника. Повернене значення являє собою наносекунд, оскільки деякий фіксований, але довільний час початку (можливо, у майбутньому, тому значення можуть бути негативними). Те саме походження використовується всіма викликами цього методу в екземплярі віртуальної машини Java; інші екземпляри віртуальної машини, ймовірно, використовують інше походження.

Наведений вище метод повинен бути дозволений, оскільки він потрапляє у випадок "3. Не можна використовувати кількість циклів або циклів процесора, якщо вони не рахуються відносно початку основного потоку програми" .

Інструкція зі складання

Настійно рекомендується використовувати JRE / JDK або OpenJDK Oracle для запуску коду. В іншому випадку, деякі Винятки можуть не бути кинутими, оскільки деякі з них покладаються на внутрішні деталі реалізації еталонної бази, і я не маю надійної резервної копії.

Код нижче успішно компілюється javac 1.7.0_11та створює всі винятки на java 1.7.0_51.

  1. Щоб запустити цей код, вам потрібно скопіювати і вставте його нижче в редактор відомого Unicode (наприклад, Блокнот ++), зберегти його в UTF-16 (Big-Endian або Little-Endian не має значення, поки BOM написано) .

  2. Змініть робочий каталог ( cd) на місце збереження вихідного коду ( це важливо ).

  3. Складіть код за допомогою наступної команди:

    javac G19115.java -encoding "UTF-16"
    
  4. І запустіть код:

    java G19115
    

У моєму коді немає нічого руйнівного, оскільки я також хочу тестувати його на своєму комп’ютері. Найбільш "небезпечний" код - це видалення ToBeRemoved.classфайлу в поточній папці. Крім цього, решта не торкається файлової системи чи мережі.


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

class G19115 {

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

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

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

        System.out.println(n);

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

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

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

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

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

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

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

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

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

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

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

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

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

                System.out.println(l7);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                // No format conversion %q

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

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

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

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

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

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

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

        System.out.println(k);

        return k;
    }
}

class ToBeRemoved {};

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

Список винятків та помилок

Для того, як заявлено в заяві перемикача. Всього 37 Exceptionі 3 Errorс.

  1. PatternSyntaxException (через помилку Pattern, із нудною справою як резервне копіювання)
  2. StringIndexOutOfBoundsException (через помилку Pattern, із нудною справою як резервне копіювання)
  3. IllegalArgumentException (допомагає мені знайти помилку Patternіз нудною справою як резервну копію)
  4. StackOverflowError (через рекурсивну реалізацію в Pattern, із нудною справою як резервне копіювання)
  5. NumberFormatException (показує, що $в Patternможе збігатися перед кінцевим рядком термінатора)
  6. IllegalStateException (через доступ до відповідних груп у Matcherбез проведення відповідності)
  7. ArrayIndexOutOfBoundsException (показує заплутану поведінку split(String regex))
  8. ConcurrentModificationException (шляхом зміни колекції під час кожного циклу)
  9. ArithmeticException (через ціле ділення на 0)
  10. 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. НепідтримуванийCharsetException
  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. НезаконнеFormatConversionException
  30. IllegalFormatFlagsException
  31. Незаконна формаформа точності
  32. НезаконнеFormatWidthException
  33. MissingFormatArgumentException (з цікавим прикладом синтаксису формату)
  34. ВідсутнєFormatWidthException
  35. UnknownFormatConversionException
  36. Ілформована Локальна Ексцепція
  37. NullPointerException
  38. AccessControlException (показує, що за замовчуванням SecurityManagerможна використовувати)
  39. SecurityException (через виклик конструктора Classкласу)
  40. UnknownFormatFlagsException (показує, що це Exceptionне можна кинути в реалізацію Oracle, немає резервного копіювання)

Дякуємо за пояснення nanoTimeта роботу, виконану з цією відповіддю.
ja72,

1
В Javaє -1 % 40 == -1чи -1 % 40 = 39?
ja72,

@ ja72: Так -1. Ви отримали від’ємне число? (Відредаговано, щоб переконатися, що все є негативним).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Дуже вражаюча компіляція Java-винятків. +1.
Наближається до

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, щоб знищити запущений User Process

1
це <iostream>необхідно?
користувач12205

@ace: Ні, це було
неприємно

Я думаю, що дзвінок assert()еквівалентний викиданню виключення.
ja72

1
Переглянувши цю та інші записи, я вирішив заборонити пряме виклик виключень через abortта assert.
ja72

1
@ ja72: у windows, assert насправді не викликає жодного винятку. Він запускає вікно підтвердження налагодження через _crtMessageBoxWі робить вигляд, що дзвонить raise(SIGABRT), і закінчується черезexit(3)
Абхіджіт

5

Perl

Нижче представлений фрагмент perl, який вмирає з будь-якою кількістю повідомлень часу компіляції perl. Він використовує домашній псевдовипадковий генератор чисел для генерування друкованих символів ASCII, а потім намагається виконати такі як 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

Редагувати

Після того, як ОП заборонила 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.

Зауважте, що я цього не перевіряв ... тому, будь ласка, коментуйте, якщо це не працює


занадто небезпечно, щоб його перевірити;)
Адже

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 - комп’ютер, що грає з битою (образно кажучи)

Я занадто лінивий, щоб закінчити це, але хтось, будь ласка, прийміть мою ідею і побігайте з нею! Мета полягає в тому, щоб видалити один важливий компонент вашого комп’ютера і використовувати винятки для цієї частини, поки ви нарешті просто не вкажіть весь / etc або / usr / bin чи щось таке важливе, і спостерігайте за тим, як вся справа руйнується і спалиться. Я впевнений, що ти можеш набрати багато "25 балів", коли все вийде з ладу. :)

Я орієнтував його на машини Linux. Це, звичайно, має бути запущено як root, щоб отримати максимальний збиток, і якщо ви будете запускати його неодноразово, це залишить вашу систему повністю замурованою!

Винятки:

  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
Дивовижна ідея! Будь ласка, протестуйте його та повідомте про це!
rubik

0

TI-BASIC, 130

Для вашого калькулятора TI-84

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

Фатальні помилки (по порядку):

  1. Архів
  2. Аргумент
  3. Тип даних
  4. Ділимо на 0
  5. Незаконне гніздо
  6. Недійсний дим
  7. Мітка
  8. Пам'ять
  9. Нереальні відповіді
  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 можуть бути викликані або ім'ям класу, або збереженням імені класу як рядка у варі або шляхом призначення нового примірника класу та виклику його .
    Приклад: $b='PDO';$a=new $b();$a::connect();$b::connect()-> це дійсний код PHP.
    Ця помилка відбувається тому , що $eце nullв першій ітерації for(;;)циклу.

  • Фатальна помилка: ім'я функції має бути рядок у рядку 1
    Те саме, що і класи, але функції повинні бути рядком (і $eє null) або безпосередньо ім'ям функції (приклад a():)

  • Фатальна помилка: Неможливо створити посилання на елементи тимчасового виразу масиву в рядку 1.
    PHP має foreachцикл, який циркулює, хоч кожен елемент масиву. asКлючове слово використовується для вказівки імені нової змінної , використовуваної для зберігання Скопіюйте значення поточного індексу масиву.
    Під час використання foreach($array as &$v)PHP створює посилання, коли воно має &перед назвою змінної.

Це слабкий бал (5 помилок і неможливо знайти) = 50 балів

PHP не дозволяє вловлювати фатальні помилки.


У Linux під час додавання shutdown -P +0між backticks ця команда запустить цю команду (в цьому випадку система буде різко вимикатися).

Це призводить до того, що всі процеси зупиняються.

Не впевнений, чи дійсно це для бонусу чи ні.


-2

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

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


Будь ласка, гольфуйте свій код, відформатуйте код з чотирма пробілами спереду та вкажіть довжину.

1
Це не питання кодегольфа . Але відповідь не дає випадкових винятків. Це на 100% гарантовано провалиться, що не зробить це insaneпрограмою.
ja72
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.