Programme de contrôle de la folie

16

Folie: faire la même chose encore et encore et attendre des résultats différents.

Écrivez un programme qui lève juste une exception (erreur d'exécution) à chaque exécution. Le défi étant d'avoir la probabilité de produire plus d'un crash, sans appeler directement les exceptions (pas d' throwinstructions) et de ne pas utiliser de fonctions de comptage de ticks aléatoires ou CPU intégrées.

  • 10 points pour chaque erreur possible.
  • 25 points bonus si l'erreur / crash se produit sur un autre processus ou le système.

Règles

  1. Les réponses doivent indiquer quelles erreurs sont possibles et comment elles sont générées.
  2. Impossible d'utiliser le générateur de nombres aléatoires système (intégré) à moins qu'il ne soit associé au même numéro à chaque exécution du programme.
  3. Impossible d'utiliser le nombre de cycles de tics ou de processeurs, sauf s'ils sont comptés par rapport au début du thread principal du programme.
  4. Le multithreading est autorisé (s'il n'est pas encouragé).

Modifier 1

  1. La génération de GUID relève du générateur de nombres aléatoires intégré. La génération de GUID "maison" personnalisée est autorisée.

  2. L'accès au système de fichiers est autorisé pour les E / S de fichiers, sauf lorsque cela est fait pour contourner les règles (lire un fichier de bits aléatoires ou horodatage).

Modifier 2

  1. Appeler abort()ou assert()viole l'esprit du défi de faire des logiciels insensés et donc pas 10 points seront attribués pour ce mode d'échec.

Bonne chance!

ja72
la source
La génération d'un guid est-elle considérée comme aléatoire?
microbian
Bonne question. Je pense que l'entropie doit être réalisée par magie (code du château de cartes) et non artificiellement, donc je dirais non aux GUID.
ja72
Pour JS - les navigateurs en panne comptent-ils comme 25 bonus ou non? Puis-je choisir le navigateur sur lequel mon code doit être testé?
eithed
Plantage de l'hôte (navigateur ou framework) attribue les 25 points bonus. Il doit toujours planter cependant.
ja72
Le problème est d'écrire une fonction non déterministe sans utiliser de moyens non déterministes (hors horloge aussi). C est l'un des langages qui vous donne accès à des références de pointeurs non initialisées. Les solutions que je vois sont donc basées sur des pointeurs non initialisés. Pour moi, utiliser des pointeurs non initialisés est aussi bon (ou mauvais) que d'utiliser une méthode guid ou aléatoire.
microbian

Réponses:

15

Java, 400

Java est béni (?) Avec de nombreux Exceptions et Errors. De nombreux Exceptions sont spécifiques au fonctionnement d'une seule classe. À titre d’exemple de l’un des cas les plus extrêmes, il existe plus de 10 Exceptions (tous sont des sous-classes de IllegalFormatException)Formatter classe seule, et j'ai pris le temps de faire le code jette (presque) tous.

Ma réponse actuelle comporte 40 Exceptions / Errors différents, et ils sont exécutés au hasard en fonction du module de System.nanoTime()avec un entier.

Cette méthode ne peut être utilisée que pour mesurer le temps écoulé et n'est liée à aucune autre notion de temps système ou d'horloge murale. La valeur renvoyée représente des nanosecondes depuis un certain temps d'origine fixe mais arbitraire (peut-être à l'avenir, donc les valeurs peuvent être négatives). La même origine est utilisée par toutes les invocations de cette méthode dans une instance d'une machine virtuelle Java; d'autres instances de machine virtuelle sont susceptibles d'utiliser une origine différente.

La méthode ci-dessus doit être autorisée, car elle tombe dans le cas «3. Impossible d'utiliser le nombre de cycles de tics ou de CPU, à moins qu'ils ne soient comptés par rapport au début du thread principal du programme» .

Instruction de compilation

JRE / JDK ou OpenJDK d'Oracle est fortement recommandé pour exécuter le code. Sinon, certaines exceptions peuvent ne pas être levées, car certaines d'entre elles reposent sur les détails internes de l'implémentation de référence et je n'ai pas de solution de secours fiable.

Le code ci-dessous se compile avec succès javac 1.7.0_11et produit toutes les exceptions java 1.7.0_51.

  1. Pour exécuter ce code, vous devez copier et coller le code ci-dessous dans un éditeur compatible Unicode (par exemple Notepad ++), l'enregistrer en UTF-16 (Big-Endian ou Little-Endian n'a pas d'importance tant que la nomenclature est écrite) .

  2. Changez le répertoire de travail ( cd) à l'endroit où le code source est enregistré ( c'est important ).

  3. Compilez le code avec la commande suivante:

    javac G19115.java -encoding "UTF-16"
    
  4. Et exécutez le code:

    java G19115
    

Il n'y a rien de destructeur dans mon code, car je veux aussi le tester sur mon ordinateur. Le code le plus "dangereux" est la suppression du ToBeRemoved.classfichier dans le dossier actuel. En dehors de cela, le reste ne touche pas le système de fichiers ou le réseau.


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

Liste des exceptions et erreurs

Dans l'ordre comme déclaré dans l'instruction switch-case. Il y a 37 Exceptions et 3 Errors au total.

  1. PatternSyntaxException (via bug in Pattern, avec un cas ennuyeux comme sauvegarde)
  2. StringIndexOutOfBoundsException (via bug in Pattern, avec casse ennuyeuse comme sauvegarde)
  3. IllegalArgumentException (m'aide à trouver un bogue dans Pattern, avec un cas ennuyeux comme sauvegarde)
  4. StackOverflowError (via une implémentation récursive dans Pattern, avec un cas ennuyeux comme sauvegarde)
  5. NumberFormatException (montre que $dans Patternpeut correspondre avant le terminateur de ligne finale)
  6. IllegalStateException (via l'accès aux groupes correspondants Matchersans effectuer de correspondance)
  7. ArrayIndexOutOfBoundsException (montre un comportement déroutant de split(String regex))
  8. ConcurrentModificationException (via la modification d'une collection pendant une boucle pour chaque)
  9. ArithmeticException (via la division entière par 0)
  10. ExceptionInInitializerError (via une cause Exceptionlors de l'initialisation d'une classe)
  11. BufferOverflowException ( java.nio.*Spécifiques Exception)
  12. BufferUnderflowException ( java.nio.*-specific Exception)
  13. InvalidMarkException ( java.nio.*-specific Exception)
  14. IndexOutOfBoundsException (via une référence à un groupe de capture inexistant en remplacement)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException ( java.util.StackSpécifiques Exception)
  20. NegativeArraySizeException
  21. OutOfMemoryError (via une allocation ennuyeuse d'un grand tableau)
  22. UnsupportedCharsetException
  23. IllegalCharsetNameException (indique quand Charset.isSupported(String name)retourne false ou jette Exception)
  24. NoClassDefFoundError (montre que les classes sont chargées lors du premier accès à la méthode / constructeur ou au champ)
  25. InputMismatchException ( java.util.ScannerSpécifiques Exception)
  26. DuplicateFormatFlagsException (d'ici à 35 sont java.util.Formatterspécifiques Exception)
  27. FormatFlagsConversionMismatchException (avec un exemple intéressant de syntaxe de format)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (avec un exemple intéressant de syntaxe de format)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPointerException
  38. AccessControlException (montre que la valeur par défaut SecurityManagerest utilisable)
  39. SecurityException (via l'appel du constructeur de Classclasse)
  40. UnknownFormatFlagsException (montre que cela Exceptionne peut pas être levé dans l'implémentation d'Oracle, pas de sauvegarde)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
la source
Merci pour l'explication nanoTimeet le travail effectué avec cette réponse.
ja72
1
En Javaest -1 % 40 == -1ou -1 % 40 = 39?
ja72
@ ja72: Oui -1. Avez-vous obtenu un nombre négatif? (Modifié pour s'assurer que tout n'est pas négatif).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Compilation très impressionnante d'exceptions Java. +1.
ApproachingDarknessFish
5

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

Le programme suivant s'appuie sur 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");
    };
}

L'exception suivante se produirait au hasard

  1. Assertion de débogage (Vector Subscript Out of Range )
  2. Débordement de pile à l'aide Infinite Recursion
  3. Diviser par zéro par Dividing by Zero
  4. Out Of Memory par Allocating Huge Memory
  5. Exception protégée By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. et enfin, utilise taskkill pour tuer un processus utilisateur en cours d'exécution
Abhijit
la source
1
est <iostream>nécessaire?
user12205
@ace: Non, c'était un vestige
Abhijit
Je pense qu'appeler assert()équivaut à lever une exception.
ja72
1
Après avoir examiné cette entrée et d'autres, j'ai décidé de ne pas invoquer directement les exceptions via abortet assert.
ja72
1
@ ja72: Dans Windows, assert ne déclenche aucune exception. Il lance une fenêtre d'assertion de débogage via _crtMessageBoxWet fait semblant d'appeler raise(SIGABRT), qui se termine viaexit(3)
Abhijit
5

Perl

Ci-dessous est un extrait de Perl qui meurt avec un nombre illimité de messages de compilation de Perl. Il utilise un générateur de nombres pseudo-aléatoires homebrewed pour générer des caractères ASCII imprimables, puis essaie de les exécuter en perl. Je ne connais pas le nombre exact d'avertissements de temps de compilation que perl peut donner, mais il y a certainement au moins 30 erreurs de ce type, et elles peuvent se présenter sous différentes combinaisons. Donc, à moins qu'il ne soit jugé invalide, je dirais que ce code obtient un ordre de grandeur de plus de points que les autres solutions =)

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

Exemple de sortie de deux séries différentes (entrecoupées de nouvelles lignes):

ski@anito:/tmp$ perl nicely.pm
Bad name after N' at -e line 1.

ski@anito:/tmp$ perl nicely.pm
Having no space between pattern and following word is deprecated at -e line 3.
syntax error at -e line 1, near "oi>"
Bad name after tNnSSY' at -e line 3.

ski@anito:/tmp$ perl nicely.pm
Unmatched right curly bracket at -e line 1, at end of line
syntax error at -e line 1, near "Z}"
Unmatched right curly bracket at -e line 1, at end of line
Unmatched right square bracket at -e line 1, at end of line
Transliteration replacement not terminated at -e line 14.

ski@anito:/tmp$ perl nicely.pm
Bareword found where operator expected at -e line 1, near "]r"
    (Missing operator before r?)
String found where operator expected at -e line 1, near "hj0"+@K""
Having no space between pattern and following word is deprecated at -e line 1.
Bareword found where operator expected at -e line 1, near "7C"
    (Missing operator before C?)
Semicolon seems to be missing at -e line 1.
Semicolon seems to be missing at -e line 2.
Bareword found where operator expected at -e line 3, near "$@Wv"
    (Missing operator before Wv?)
Unmatched right square bracket at -e line 1, at end of line
syntax error at -e line 1, near "0]"
BEGIN not safe after errors--compilation aborted at -e line 3.
skibrianski
la source
3

C # (85) (sans abandon ni assertion)

Cette solution utilise l'ID de processus actuel pour déterminer comment planter.

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

Le processus peut se terminer en raison de:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. L'arrêt entraînera l'arrêt anormal d'autres processus. (10 + 25)

10x6 + 25 = 85

Éditer

Après que l'OP a interdit Assert et Abort, je les ai supprimés de ma solution, il est donc réduit à 85 avec toutes les méthodes autorisées valides.

microbien
la source
J'ai édité le post pour interdire Abort()et Assert(). Vérifiez si vous pouvez toujours lever ces exceptions sans les invoquer directement.
ja72
1
Notez qu'un identifiant de processus est toujours divisible par 4, ce qui signifie que, selon le nombre d'éléments dans la liste d'actions, certaines exceptions peuvent ne jamais être levées. Dans ce cas, OutOfMemory, OutOfRange et Shutdown ne seront pas invoqués (sauf erreur de ma part).
RobIII
eh bien, alors il pourrait simplement écrire Process.GetCurrentProcess().Id / 4 % actions.Count?
McKay
2

Je ne sais pas si cela est admissible ...

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

Les deux iéléments etp sont pas initialisés, ce qui peut donc entraîner:

  1. Une erreur de segmentation si i <0
  2. Une exception à virgule flottante si i arrive à 0
  3. Une erreur de segmentation si c, après des incréments répétés, devient supérieure ài

De plus, cela peut ou non tuer une application existante (selon la valeur de p[c] ) avec un SIGSEGV.

Notez que je n'ai pas testé cela ... veuillez donc commenter si cela ne fonctionne pas

user12205
la source
trop dangereux pour le tester;)
ajay
1

Pétillant .

Avertissement: similaire à la merveilleuse solution d'Abhijit, mais:

  1. la principale source de folie est que le code managé obtient un détail d'implémentation native grâce à un tas de hacks laids;

  2. celui-ci ne nécessite pas ASLR, juste une allocation dynamique de mémoire.


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

Ce que cela fait:

  1. le programme appelle son propre interpréteur ( spncommande) et renvoie la description d'un tableau vide dans un fichier. Le tableau est alloué dynamiquement et la description inclut son adresse mémoire.

  2. Le programme ouvre ensuite le fichier, analyse la description et obtient l'adresse sous forme d'entier. Il effectue ensuite une sorte de hachage sur la valeur résultante et exécute l'une des actions erronées suivantes:

    1. Opérations avec des types incompatibles. Opérateurs logiques sur les non-booléens (oui, le langage l'interdit!), Division modulo des nombres à virgule flottante, ajout de deux chaînes (il y a un opérateur de concaténation séparé ..et l'ajout de chaînes est une exception à l'exécution)
    2. Appel d'une chaîne comme s'il s'agissait d'une fonction.
    3. Les constantes globales ne peuvent pas être nilconformes à la spécification du langage (cela a à voir avec un détail d'implémentation - il est impossible de le distinguer d'un global inexistant). Lorsqu'un tel symbole est rencontré, une erreur d'exécution est levée.
H2CO3
la source
1

Code Python - Bashing Computer with a Bat (au figuré)

Je suis trop paresseux pour finir ça, mais quelqu'un, s'il te plait prends mon idée et cours avec! Le but ici est de supprimer un composant important de votre ordinateur et d'exploiter les exceptions pour cette partie jusqu'à ce que vous finissiez par rmer tout / etc ou / usr / bin ou quelque chose d'important comme ça et regarder le tout se planter et graver. Je suis sûr que vous pouvez marquer beaucoup de "25 points" lorsque tout se bloque. :)

Je l'ai ciblé sur les machines Linux. Bien sûr, cela doit être exécuté en tant que root pour un maximum de dégâts et si vous l'exécutez à plusieurs reprises, cela laissera votre système totalement brique!

Des exceptions:

  1. ZeroDivisionError: division entière ou modulo par zéro
  2. OSError: [Errno 2] Aucun fichier ou répertoire de ce type:
  3. socket.gaierror: [Errno 8] nom de noeud ni nom de serveur fournis, ou inconnu
  4. Besoin de vous pour en ajouter plus ici

bat.py:

#!/usr/bin/env python

import os
import socket

print "You really should stop running this application... it will brick your computer. Don't say I didn't warn you!"

if os.path.exists('/tmp/selfdestruct.touch'):
    if ! os.path.exists("/etc/resolv.conf"):
        if ! os.path.exists("/etc/shadow"):
            ## until finally ##
            if ! os.path.exists("/usr/lib/"):
                 print "I'm not sure if this will even print or run... but... your computer is totally gone at this point."

            print "There goes your ability to login..."
            os.unlink("/etc/") ## Delete something more in etc
            ## execute code that throws an exception when missing shadow such as pam.d function
        print "There goes your dns ability..."
        os.unlink("/etc/shadow")
        codeGolfIP=socket.gethostbyname('codegolf.stackexchange.com') # exception #3
    print "we warned you! We're starting to get destructive!"
    os.unlink('/etc/resolv.conf')
    os.unlink('/tmp/whatever') # exception #2
else:
    os.unlink("/etc/resolv.conf")


open ('/tmp/selfdestruct.touch','a').close()
zero=0
dividebyzero=5/zero; # exception #1
PressingOnAlways
la source
4
Idée géniale! Veuillez le tester et faire rapport!
rubik
0

TI-BASIC, 130

Pour votre calculatrice 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

Erreurs fatales (dans l'ordre):

  1. Archiver
  2. Argument
  3. Type de données
  4. Diviser par 0
  5. Nid illégal
  6. Dim non valide
  7. Étiquette
  8. Mémoire
  9. Nonreal Ans
  10. Débordement
  11. Syntaxe
  12. Indéfini
  13. Variable
Timtech
la source
0

Code PHP: 38 (+2) caractères, 5 erreurs, inaccessible

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

Liste des erreurs possibles:

  • Erreur fatale: le temps d'exécution maximal de 'n' secondes dépassé sur la ligne 1

    for(;;)représente une boucle infinie

  • Erreur fatale: la taille de la mémoire autorisée de 2097152 octets est épuisée (a tenté d'allouer 884737 octets) sur la ligne 1

    PHP a un php.inifichier, et il y a une ligne disant memory_limit=et voici l'utilisation maximale du RAM en octets.
    La partie où l'on dit $e.=$e++signifie que $esera le résultat de la concaténation de soi augmentée de 1 à chaque itération.

  • Erreur fatale: le nom de la classe doit être un objet valide ou une chaîne sur la ligne 1 Les

    classes en PHP peuvent être appelées soit par le nom de la classe, soit en stockant le nom de la classe sous forme de chaîne dans un var ou en affectant une nouvelle instance de la classe et en l'appelant .
    Exemple: $b='PDO';$a=new $b();$a::connect();$b::connect()-> c'est un code PHP valide.
    Cette erreur se produit car se $etrouve nulldans la première itération de la for(;;)boucle.

  • Erreur fatale: Nom de la fonction doit être une chaîne sur la ligne 1
    Comme les classes, mais les fonctions doivent être une chaîne (et $eest null) ou le nom de la fonction directement ( par exemple: a())

  • Erreur fatale: impossible de créer des références aux éléments d'une expression de tableau temporaire sur la ligne 1
    PHP a la foreachboucle qui boucle à travers chaque élément d'un tableau. Le asmot-clé est utilisé pour indiquer le nom de la nouvelle variable utilisée pour stocker une copie de la valeur de l'index de tableau courant.
    Lors de l'utilisation foreach($array as &$v), PHP crée une référence lorsqu'il a &avant le nom de la variable.

C'est un score faible (5 erreurs et est inaccessible) = 50 points

PHP ne permet pas de détecter les erreurs fatales.


Sous linux, l'ajout shutdown -P +0entre les backticks exécutera cette commande (dans ce cas, entraînera l'arrêt brutal du système).

Cela provoque l'arrêt de tous les processus.

Je ne sais pas si cela est valable pour le bonus ou non.

Ismael Miguel
la source
-2

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

Les fonctions sont appelées dans une boucle sans fin provoquant le crash de l'interpréteur.

Mauro
la source
Veuillez jouer au golf avec votre code, formater le code avec quatre espaces devant et spécifier la longueur.
1
Ce n'est pas une question de codegolf . Mais la réponse ne produit pas d'exceptions aléatoires. Il est garanti à 100% d'échouer, ce qui n'en ferait pas un insaneprogramme.
ja72