Programa de verificación de locura


16

Locura: hacer lo mismo una y otra vez y esperar resultados diferentes.

Escriba un programa que solo arroje una excepción (error de tiempo de ejecución) cada vez que se ejecute. El desafío es tener la probabilidad de producir más de un bloqueo, sin invocar las excepciones directamente (sin throwdeclaraciones) y no utilizar funciones de conteo de tics aleatorias o de CPU incorporadas.

  • 10 puntos por cada posible error.
  • 25 puntos de bonificación si el error / bloqueo ocurre en otro proceso o en el sistema.

Reglas

  1. Las respuestas deben indicar qué errores son posibles y cómo se generan.
  2. No se puede usar el generador de números aleatorios del sistema (incorporado) a menos que se siembra con el mismo número cada vez que se ejecuta el programa.
  3. No se puede usar el número de tics o ciclos de CPU, a menos que se cuenten relativamente al inicio del hilo principal del programa.
  4. Se permite el subprocesamiento múltiple (si no se recomienda).

Editar 1

  1. La generación de GUID se incluye en el generador de números aleatorios incorporado. Se permite la generación personalizada de GUID "de cosecha propia".

  2. El acceso al sistema de archivos está permitido para E / S de archivos, excepto cuando se hace para omitir las reglas (leer un archivo de bits aleatorios o marca de tiempo).

Editar 2

  1. Llamar abort()o assert()viola el espíritu del desafío de hacer un software loco y, por lo tanto, no se otorgarán 10 puntos por este modo de falla.

¡Buena suerte!


¿Generar un guid se considera aleatorio?
microbio

Buena pregunta. Creo que la entropía debe lograrse mágicamente (código de la casa de cartas) y no artificialmente, por lo que diría que no a los GUID.
ja72

Para JS: ¿los navegadores fallidos cuentan como 25 bonus o no? ¿Puedo elegir en qué navegador se debe probar mi código?
Publicado el

El bloqueo del host (navegador o marco) otorga los 25 puntos de bonificación. Sin embargo, siempre debe bloquearse.
ja72

El problema es escribir una función no determinista sin utilizar medios no deterministas (excluyendo también el reloj). C es uno de los lenguajes que le da acceso a referencias de puntero no inicializadas. Entonces, las soluciones que estoy viendo se basan en punteros no inicializados. Para mí, usar punteros no inicializados es tan bueno (o malo) como usar un método guid o aleatorio.
microbio

Respuestas:


15

Java, 400

Java está bendecido (?) Con muchos Exceptionsy Errors. Hay muchos Exceptioncorreos electrónicos específicos para la operación de una sola clase. Como ejemplo de uno de los casos más extremos, hay más de 10 Exceptions (todos son subclase deIllegalFormatException ) dedicados Formattersolo a la clase, y me he tomado el tiempo para hacer que el código arroje (casi) todos ellos.

Mi respuesta actual presenta 40 Exceptions / Errors diferentes , y se ejecutan aleatoriamente según el módulo deSystem.nanoTime() con algún número entero.

Este método solo se puede utilizar para medir el tiempo transcurrido y no está relacionado con ninguna otra noción de tiempo de sistema o reloj de pared. El valor devuelto representa nanosegundos desde un tiempo de origen fijo pero arbitrario (quizás en el futuro, por lo que los valores pueden ser negativos). Todas las invocaciones de este método utilizan el mismo origen en una instancia de una máquina virtual Java; Es probable que otras instancias de máquinas virtuales utilicen un origen diferente.

Se debe permitir el método anterior, ya que se incluye en el caso "3. No se puede usar el número de tics o ciclos de CPU, a menos que se cuenten relativamente al inicio del hilo principal del programa" .

Instrucción de compilación

Oracle JRE / JDK u OpenJDKSe recomienda encarecidamente para ejecutar el código. De lo contrario, es posible que no se produzca alguna excepción, ya que algunas de ellas se basan en los detalles internos de la implementación de referencia y no tengo un respaldo confiable.

El siguiente código se compila con éxito javac 1.7.0_11y produce todas las Excepciones en java 1.7.0_51.

  1. Para ejecutar este código, debe copiar y pegar el siguiente código en un editor compatible con Unicode (por ejemplo, Notepad ++), guárdelo en UTF-16 (Big-Endian o Little-Endian no importa mientras se escriba la lista de materiales) .

  2. Cambie el directorio de trabajo ( cd) a donde se guarda el código fuente ( esto es importante ).

  3. Compile el código con el siguiente comando:

    javac G19115.java -encoding "UTF-16"
    
  4. Y ejecuta el código:

    java G19115
    

No hay nada destructivo en mi código, ya que también quiero probar ejecutarlo en mi computadora. El código más "peligroso" es eliminar el ToBeRemoved.classarchivo en la carpeta actual. Aparte de eso, el resto no toca el sistema de archivos o la red.


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 de excepciones y errores

En orden como se declara en la declaración de cambio de caso. Hay 37 Exceptionsy 3 Errors en total.

  1. PatternSyntaxException (a través de un error Pattern, con un caso aburrido como copia de seguridad)
  2. StringIndexOutOfBoundsException (a través de un error Pattern, con un caso aburrido como copia de seguridad)
  3. IllegalArgumentException (me ayuda a encontrar un error Pattern, con un caso aburrido como copia de seguridad)
  4. StackOverflowError (mediante implementación recursiva en Pattern, con caso aburrido como copia de seguridad)
  5. NumberFormatException (muestra que $enPattern puede igualar antes de terminador de línea final)
  6. IllegalStateException (a través del acceso a grupos coincidentes Matchersin realizar una coincidencia)
  7. ArrayIndexOutOfBoundsException (muestra un comportamiento confuso de split(String regex))
  8. ConcurrentModificationException (mediante la modificación de una colección durante un ciclo for-each)
  9. ArithmeticException (a través de la división de enteros por 0)
  10. ExceptionInInitializerError (por causa Exceptiondurante la inicialización de una clase)
  11. BufferOverflowException ( java.nio.*-específico Exception)
  12. BufferUnderflowException ( java.nio.*específico de Exception)
  13. InvalidMarkException ( java.nio.*-específico Exception)
  14. IndexOutOfBoundsException (mediante referencia a un grupo de captura inexistente en reemplazo)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException ( java.util.Stackespecífico de Exception)
  20. NegativeArraySizeException
  21. OutOfMemoryError (a través de la asignación aburrida de una gran matriz)
  22. UnsupportedCharsetException
  23. IllegalCharsetNameException (se muestra cuando Charset.isSupported(String name)devuelve false o throws Exception)
  24. NoClassDefFoundError (muestra que las clases se cargan en el primer acceso al método / constructor o campo)
  25. InputMismatchException ( java.util.Scannerespecífico de Exception)
  26. DuplicateFormatFlagsException (de aquí a 35 son -s java.util.Formatterespecíficos Exception)
  27. FormatFlagsConversionMismatchException (con un ejemplo interesante de sintaxis de formato)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (con un ejemplo interesante de sintaxis de formato)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. Excepción de puntero nulo
  38. AccessControlException (muestra que SecurityManagerse puede usar el valor predeterminado )
  39. SecurityException (a través de la invocación del constructor de Classclase)
  40. UnknownFormatFlagsException (muestra que esto Exceptionno se puede lanzar en la implementación de Oracle, sin respaldo)

Gracias por la explicación nanoTimey el trabajo realizado con esta respuesta.
ja72

1
En Javaes -1 % 40 == -1o -1 % 40 = 39?
ja72

@ ja72: lo es -1. ¿Recibiste un número negativo? (Editado para asegurarse de que todo no sea negativo).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Muy impresionante compilación de excepciones de Java. +1.
ApproachingDarknessFish

5

C (Windows 7) - 80 + 25 = 105 puntos

El siguiente programa se basa en 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");
    };
}

La siguiente excepción ocurriría al azar

  1. Afirmación de depuración ( Vector Subscript Out of Range)
  2. Desbordamiento de pila usando Infinite Recursion
  3. Dividir por cero entre Dividing by Zero
  4. Sin memoria por Allocating Huge Memory
  5. Excepción protegida By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. y, por último, usa taskkill para eliminar un proceso de usuario

1
es <iostream>necesario?
user12205

@ace: No, era vestigial
Abhijit

Creo que llamar assert()es equivalente a lanzar una excepción.
ja72

1
Después de revisar esta y otras entradas, he decidido no permitir la invocación directa de excepciones a través de aborty assert.
ja72

1
@ ja72: En Windows, afirmar en realidad no genera ninguna excepción. Lanza una ventana de confirmación de depuración a través de _crtMessageBoxWy finge llamar raise(SIGABRT), que termina víaexit(3)
Abhijit el

5

Perl

A continuación se muestra un fragmento de Perl que muere con cualquier cantidad de mensajes en tiempo de compilación de Perl. Utiliza un generador de números pseudoaleatorio hecho en casa para generar caracteres ASCII imprimibles y luego intenta ejecutarlos como perl. No sé el número exacto de advertencias de tiempo de compilación que Perl puede dar, pero ciertamente hay al menos 30 de esos errores, y pueden venir en varias combinaciones diferentes. Entonces, a menos que se considere inválido, diría que este código obtiene un orden de magnitud más puntos que las otras soluciones =)

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

Salida de muestra de un par de ejecuciones diferentes (intercaladas con nuevas líneas):

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) (sin cancelar o afirmar)

Esta solución utiliza la identificación del proceso actual para determinar cómo bloquearse.

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

El proceso puede finalizar debido a:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. El apagado hará que otros procesos terminen de manera anormal. (10 + 25)

10x6 + 25 = 85

Editar

Después de que el OP ha rechazado Assert and Abort, los eliminé de mi solución, por lo tanto, se redujo a 85 con todos los métodos válidos permitidos.


He editado la publicación para no permitir Abort()y Assert(). Vea si aún puede lanzar estas excepciones sin invocarlas directamente.
ja72

1
Tenga en cuenta que un id de proceso siempre es divisible por 4, lo que significa que, dependiendo del número de elementos en la lista de acciones, es posible que nunca se produzcan algunas excepciones. En este caso, OutOfMemory, OutOfRange y Shutdown no se invocarán (a menos que me equivoque).
RobIII

bueno, ¿entonces podría escribir Process.GetCurrentProcess().Id / 4 % actions.Count?
McKay

2

No estoy seguro si esto califica ...

C

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

Ambos iy elementos dep no están inicializados, por lo que esto puede causar:

  1. Un segfault si i <0
  2. Una excepción de coma flotante si i alguna manera llega a 0
  3. Un segfault si c, después de incrementos repetidos, se vuelve mayor quei

Además, esto puede o no matar una aplicación existente (dependiendo del valor de p[c] ) con un SIGSEGV.

Tenga en cuenta que no he probado esto ... así que por favor comente si esto no funciona


demasiado peligroso para probarlo;)
ajay

1

Espumoso .

Descargo de responsabilidad: similar a la maravillosa solución de Abhijit, pero:

  1. La fuente principal de locura es que el código administrado obtiene un detalle de implementación nativa a través de un montón de trucos feos;

  2. este no requiere ASLR, solo asignación de memoria dinámica.


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

Lo que esto hace:

  1. el programa llama a su propio intérprete ( spncomando) y envía la descripción de una matriz vacía a un archivo. La matriz se asigna dinámicamente y la descripción incluye su dirección de memoria.

  2. Luego, el programa abre el archivo, analiza la descripción y obtiene la dirección como un entero. Luego realiza algún tipo de hash en el valor resultante y ejecuta una de las siguientes acciones erróneas:

    1. Operaciones con tipos no coincidentes. Operadores lógicos en no booleanos (sí, ¡el lenguaje lo prohíbe!), División de módulo de números de punto flotante, agregando dos cadenas (hay un operador de concatenación separado.. , y la adición de cadenas es una excepción en tiempo de ejecución)
    2. Llamar a una cadena como si fuera una función.
    3. Las constantes globales no pueden estar de nilacuerdo con la especificación del lenguaje (esto tiene que ver con un detalle de implementación; no podría distinguirse de un global inexistente). Cuando se encuentra dicho símbolo, se genera un error de tiempo de ejecución.

1

Python Code - Bashing Computer with a Bat (en sentido figurado)

Soy demasiado vago para terminar esto, pero alguien, ¡por favor toma mi idea y corre con ella! El objetivo aquí es eliminar un componente importante de su computadora y explotar las excepciones para esa parte hasta que finalmente solo termine de / etc o / usr / bin o algo importante como eso y vea cómo todo se bloquea y se quema. Estoy seguro de que puedes obtener muchos "25 puntos" cuando todo falla. :)

Lo apunté a las máquinas Linux. Por supuesto, esto debe ejecutarse como raíz para un daño máximo y si lo ejecuta repetidamente, ¡dejará su sistema totalmente bloqueado!

Excepciones:

  1. ZeroDivisionError: división entera o módulo por cero
  2. OSError: [Errno 2] No existe tal archivo o directorio:
  3. socket.gaierror: [Errno 8] nombre de servidor ni nombre de servidor proporcionados, o no conocidos
  4. Necesito agregar más aquí

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

44
¡Idea increíble! Por favor, pruébelo e informe
rubik

0

TI-BASIC, 130

Para su calculadora 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

Errores fatales (en orden):

  1. Archivo
  2. Argumento
  3. Tipo de datos
  4. Dividir por 0
  5. Nido ilegal
  6. Dim inválido
  7. Etiqueta
  8. Memoria
  9. Ans no real
  10. Desbordamiento
  11. Sintaxis
  12. Indefinido
  13. Variable

0

Código PHP: 38 (+2) caracteres, 5 errores, no se puede capturar

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

Lista de posibles errores:

  • Error fatal: el tiempo de ejecución máximo de 'n' segundos excedido en la línea 1

    for(;;)representa un bucle infinito

  • Error fatal: tamaño de memoria permitido de 2097152 bytes agotados (trató de asignar 884737 bytes) en la línea 1

    PHP tiene un php.iniarchivo, y hay una línea que dice memory_limit=y aquí viene el uso máximo de RAM en bytes.
    La parte donde está diciendo $e.=$e++significa que$e será el resultado de la concatenación de sí mismo aumentada en 1 en cada iteración.

  • Error grave: el nombre de la clase debe ser un objeto válido o una cadena en la línea 1

    Las clases en PHP pueden llamarse ya sea por el nombre de la clase o almacenando el nombre de la clase como una cadena en una variable o asignando una nueva instancia de la clase y llamándola .
    Ejemplo: $b='PDO';$a=new $b();$a::connect();$b::connect()-> este es un código PHP válido.
    Este error ocurre porque $eestá nullen la primera iteración del for(;;)bucle.

  • Fatal error: Nombre de la función debe ser una cadena en la línea 1
    Igual que las clases, pero las funciones que tenga que ser una cadena (y $ees null) o el nombre de la función directamente (ejemplo: a())

  • Error grave: no se pueden crear referencias a elementos de una expresión de matriz temporal en la línea 1
    PHP tiene el foreachbucle que recorre todos los elementos de una matriz. La aspalabra clave se utiliza para indicar el nombre de la nueva variable utilizada para almacenar una copia del valor del índice de matriz actual.
    Cuando se usa foreach($array as &$v), PHP crea una referencia cuando tiene &antes del nombre de la variable.

Es un puntaje débil (5 errores y no se puede alcanzar) = 50 puntos

PHP no permite detectar errores fatales.


En Linux, agregando shutdown -P +0 entre comillas invertidas ejecutará ese comando (en este caso, hará que el sistema se apague abruptamente).

Esto hace que todos los procesos se detengan.

No estoy seguro si esto es válido para el bono o no.


-2

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

Las funciones se invocan en un bucle sin fin que hace que el intérprete se bloquee.


Golf su código, formatee el código con cuatro espacios al frente y especifique la longitud.
Hosch250

1
Esta no es una pregunta de codegolf . Pero la respuesta no produce excepciones aleatorias. Está 100% garantizado para fallar, lo que no lo convertiría en un insaneprograma.
ja72
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.