Program Pemeriksaan Gila

16

Kegilaan: melakukan hal yang sama berulang-ulang dan mengharapkan hasil yang berbeda.

Tulis program yang hanya melempar pengecualian (runtime error) setiap kali dijalankan. Tantangannya adalah memiliki probabilitas untuk menghasilkan lebih dari satu crash, tanpa memanggil pengecualian secara langsung (tidak ada throwpernyataan) dan tidak menggunakan built in fungsi penghitungan cpu tick atau acak.

  • 10 poin untuk setiap kemungkinan kesalahan.
  • 25 poin bonus jika kesalahan / kerusakan terjadi pada proses lain atau sistem.

Aturan

  1. Respons harus menunjukkan kesalahan apa yang mungkin terjadi dan bagaimana kesalahan itu dihasilkan.
  2. Tidak dapat menggunakan generator nomor acak sistem (built-in) kecuali jika diunggulkan dengan nomor yang sama setiap kali program berjalan.
  3. Tidak dapat menggunakan jumlah tics atau siklus cpu, kecuali mereka dihitung relatif ke awal utas program utama.
  4. Multithreading diperbolehkan (jika tidak didukung).

Edit 1

  1. Generasi GUID berada di bawah penghasil angka acak bawaan. Pembuatan GUID "buatan lokal" diizinkan.

  2. Mengakses sistem file diperbolehkan untuk I / O file kecuali ketika dilakukan untuk memotong aturan (membaca file bit acak, atau cap waktu).

Edit 2

  1. Menyebut abort()atau assert()melanggar semangat tantangan membuat perangkat lunak gila dan karenanya tidak ada 10 poin yang akan diberikan untuk mode kegagalan ini.

Semoga berhasil!

Ja72
sumber
Apakah menghasilkan panduan dianggap acak?
microbian
Pertanyaan bagus. Saya pikir entropi harus dicapai secara ajaib (kode kartu house) dan tidak secara artifisial sehingga saya akan mengatakan tidak kepada GUID.
ja72
Untuk JS - apakah browser yang mogok dihitung sebagai 25 bonus atau tidak? Bisakah saya memilih browser tempat kode saya harus diuji?
eithed
Menghancurkan host (browser atau framework) memberikan 25 poin bonus. Itu harus selalu crash sekalipun.
ja72
Masalahnya adalah untuk menulis fungsi non-deterministik tanpa menggunakan cara non-deterministik (tidak termasuk jam juga). C adalah salah satu bahasa yang memberi Anda akses ke referensi penunjuk yang tidak diinisialisasi. Jadi solusi yang saya lihat didasarkan pada petunjuk yang tidak diinisialisasi. Bagi saya, menggunakan pointer yang tidak diinisialisasi sama baiknya (atau buruk) dengan menggunakan panduan atau metode acak.
microbian

Jawaban:

15

Jawa, 400

Jawa diberkati (?) Dengan banyak Exceptions dan Errors. Ada banyak Exceptions yang spesifik untuk pengoperasian satu kelas. Sebagai contoh dari salah satu kasus yang paling ekstrem, ada lebih dari 10 Exceptiondetik (semua adalah subkelas IllegalFormatException) yang didedikasikan untuk Formatterkelas saja, dan saya telah mengambil waktu untuk membuat kode melempar (hampir) semuanya.

Jawaban saya saat ini menampilkan 40 Exceptions / s berbeda Error, dan mereka dijalankan secara acak tergantung pada modulo System.nanoTime()dengan beberapa integer.

Metode ini hanya dapat digunakan untuk mengukur waktu yang berlalu dan tidak terkait dengan gagasan lain tentang waktu sistem atau jam dinding. Nilai yang dikembalikan mewakili nanodetik sejak beberapa waktu asal tetap tetapi sewenang-wenang (mungkin di masa depan, sehingga nilai mungkin negatif). Asal yang sama digunakan oleh semua doa metode ini dalam mesin virtual Java; contoh mesin virtual lainnya cenderung menggunakan asal yang berbeda.

Metode di atas harus diizinkan, karena termasuk dalam kasus "3. Tidak dapat menggunakan jumlah siklus atau siklus cpu, kecuali jika dihitung secara relatif pada permulaan utas program utama" .

Instruksi Kompilasi

Oracle JRE / JDK atau OpenJDK sangat disarankan untuk menjalankan kode. Kalau tidak, beberapa Pengecualian mungkin tidak dibuang, karena beberapa dari mereka bergantung pada detail internal implementasi referensi dan saya tidak memiliki back-back yang dapat diandalkan.

Kode di bawah ini berhasil dikompilasi dengan javac 1.7.0_11dan menghasilkan semua Pengecualian aktif java 1.7.0_51.

  1. Untuk menjalankan kode ini, Anda perlu menyalin dan menempelkan kode di bawah ini ke editor Unicode aware (mis. Notepad ++), simpan di UTF-16 (Big-Endian atau Little-Endian tidak masalah selama BOM ditulis) .

  2. Ubah direktori kerja ( cd) ke tempat kode sumber disimpan ( ini penting ).

  3. Kompilasi kode dengan perintah berikut:

    javac G19115.java -encoding "UTF-16"
    
  4. Dan jalankan kodenya:

    java G19115
    

Tidak ada yang merusak dalam kode saya, karena saya juga ingin menguji menjalankannya di komputer saya. Kode yang paling "berbahaya" adalah menghapus ToBeRemoved.classfile di folder saat ini. Selain itu, sisanya tidak menyentuh sistem file atau jaringan.


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

Daftar Pengecualian dan Kesalahan

Agar dinyatakan dalam pernyataan switch-case. Ada 37 Exceptions dan 3 Errors total.

  1. PatternSyntaxException (melalui bug di Pattern, dengan kasus membosankan sebagai cadangan)
  2. StringIndexOutOfBoundsException (melalui bug di Pattern, dengan kasus membosankan sebagai cadangan)
  3. IllegalArgumentException (membantu saya menemukan bug Pattern, dengan kasus yang membosankan sebagai cadangan)
  4. StackOverflowError (melalui implementasi rekursif dalam Pattern, dengan kasus membosankan sebagai cadangan)
  5. NumberFormatException (menunjukkan itu $ diPattern dapat cocok sebelum terminator garis akhir)
  6. IllegalStateException (melalui mengakses grup yang cocok di Matcher tanpa melakukan pertandingan)
  7. ArrayIndexOutOfBoundsException (menunjukkan perilaku membingungkan split(String regex) )
  8. ConcurrentModificationException (melalui memodifikasi Koleksi selama setiap loop)
  9. ArithmeticException (melalui pembagian integer oleh 0)
  10. ExceptionInInitializerError (melalui penyebab Exceptionselama inisialisasi kelas)
  11. BufferOverflowException ( java.nio.*-specific Exception)
  12. BufferUnderflowException ( java.nio.*-specific Exception)
  13. InvalidMarkException ( java.nio.*-specific Exception)
  14. IndexOutOfBoundsException (melalui referensi ke grup penangkap yang tidak ada sebagai pengganti)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException ( java.util.Stack-specific Exception)
  20. NegativeArraySizeException
  21. OutOfMemoryError (melalui alokasi array besar yang membosankan)
  22. EksepsiCharsetException yang tidak didukung
  23. IllegalCharsetNameException (muncul ketika Charset.isSupported(String name)mengembalikan false atau melempar Exception)
  24. NoClassDefFoundError (menunjukkan bahwa kelas dimuat pada akses pertama ke metode / konstruktor atau bidang)
  25. InputMismatchException ( java.util.Scanner-specific Exception)
  26. DuplicateFormatFlagsException (dari sini ke 35 adalah- java.util.Formatterspesifik Exceptions)
  27. FormatFlagsConversionMismatchException (dengan contoh sintaksis format yang menarik)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (dengan contoh sintaks format yang menarik)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPointerException
  38. AccessControlException (menunjukkan bahwa default SecurityManagerdapat digunakan)
  39. SecurityException (melalui memanggil konstruktor Classkelas)
  40. UnknownFormatFlagsException (menunjukkan bahwa ini Exceptiontidak dapat dilemparkan ke dalam implementasi Oracle, tanpa cadangan)
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
sumber
Terima kasih atas penjelasan nanoTimedan pekerjaan yang dilakukan dengan jawaban ini.
ja72
1
In Javais -1 % 40 == -1atau -1 % 40 = 39?
ja72
@ ja72: Ya -1. Apakah Anda mendapat angka negatif? (Diedit untuk memastikan semuanya tidak negatif).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Kompilasi Pengecualian Java yang sangat mengesankan. +1.
ApproachingDarknessFish
5

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

Program berikut bergantung pada 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");
    };
}

Mengikuti Pengecualian akan terjadi secara acak

  1. Pernyataan Debug ( Vector Subscript Out of Range)
  2. Stack Overflow menggunakan Infinite Recursion
  3. Bagi dengan Nol dengan Dividing by Zero
  4. Kehabisan Memori oleh Allocating Huge Memory
  5. Pengecualian yang Dilindungi By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. dan Akhirnya, gunakan taskkill untuk mematikan Proses Pengguna yang sedang berjalan
Abhijit
sumber
1
Apakah <iostream>perlu?
user12205
@ace: Tidak, itu hanya sisa
Abhijit
Saya pikir menelepon assert()sama dengan melempar pengecualian.
ja72
1
Setelah meninjau entri ini dan lainnya, saya telah memutuskan untuk tidak mengizinkan permintaan pengecualian langsung melalui abortdan assert.
ja72
1
@ ja72: Di windows, menegaskan tidak benar-benar memunculkan pengecualian. Itu melempar Debug Assert Window via _crtMessageBoxWdan berpura-pura menelepon raise(SIGABRT), yang berakhir melaluiexit(3)
Abhijit
5

Perl

Di bawah ini adalah cuplikan perl yang mati dengan sejumlah pesan kompilasi waktu perl. Ini menggunakan generator nomor pseudo-acak buatan untuk menghasilkan karakter ASCII yang dapat dicetak dan kemudian mencoba untuk mengeksekusi mereka sebagai perl. Saya tidak tahu persis jumlah waktu kompilasi yang dapat diberikan oleh perl peringatan, tetapi pasti ada setidaknya 30 kesalahan seperti itu, dan mereka bisa datang dalam berbagai kombinasi yang berbeda. Jadi, kecuali itu dianggap tidak valid, saya akan mengatakan kode ini mendapat urutan lebih banyak poin daripada solusi lain =)

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

Contoh keluaran dari beberapa proses yang berbeda (diselingi dengan baris baru):

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
sumber
3

C # (85) (Tanpa Membatalkan atau Menegaskan)

Solusi ini menggunakan proses id saat ini untuk menentukan bagaimana crash.

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

Proses dapat berakhir karena:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. Shutdown akan menyebabkan proses lain diakhiri secara tidak normal. (10 + 25)

10x6 + 25 = 85

Edit

Setelah OP telah melarang Assert dan Abort, saya telah menghapusnya dari solusi saya, maka itu turun ke 85 dengan semua metode yang diijinkan yang valid.

mikrobia
sumber
Saya telah mengedit pos untuk melarang Abort()dan Assert(). Lihat apakah Anda masih bisa membuang pengecualian ini tanpa benar-benar memohonnya secara langsung.
ja72
1
Perhatikan bahwa id proses selalu dapat dibagi dengan 4 yang berarti bahwa, tergantung pada jumlah elemen dalam daftar tindakan, beberapa pengecualian mungkin tidak pernah dilempar. Dalam hal ini OutOfMemory, OutOfRange dan Shutdown tidak akan dipanggil (kecuali saya salah).
RobIII
baik, maka dia bisa menulis Process.GetCurrentProcess().Id / 4 % actions.Count?
McKay
2

Tidak yakin apakah ini memenuhi syarat ...

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

Baik idan elemenp tidak diinisialisasi, jadi ini dapat menyebabkan:

  1. Segfault jika i <0
  2. Pengecualian floating point jika i entah bagaimana mencapai 0
  3. Segfault jika c, setelah peningkatan berulang, menjadi lebih besar darii

Selain itu, ini mungkin atau mungkin tidak membunuh aplikasi yang sudah ada (tergantung pada nilai p[c] ) dengan SIGSEGV.

Perhatikan bahwa saya belum menguji ini ... jadi tolong beri komentar jika ini tidak berhasil

pengguna12205
sumber
terlalu berbahaya untuk mengujinya;)
ajay
1

Berkilau .

Penafian: mirip dengan solusi hebat Abhijit, tetapi:

  1. sumber utama kegilaan adalah bahwa kode terkelola memperoleh detail implementasi asli melalui sekelompok peretasan yang buruk;

  2. yang ini tidak memerlukan ASLR, hanya alokasi memori dinamis.


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

Apa yang dilakukan:

  1. program memanggil juru bahasa sendiri ( spnperintah) dan menampilkan deskripsi dari array kosong ke file. Array dialokasikan secara dinamis, dan deskripsi termasuk alamat memorinya.

  2. Program kemudian membuka file, mem-parsing deskripsi, dan mendapatkan alamat sebagai integer. Itu kemudian melakukan semacam hashing pada nilai yang dihasilkan, dan mengeksekusi salah satu tindakan salah berikut:

    1. Operasi dengan tipe yang tidak cocok. Operator logis pada non-Boolean (ya, bahasa melarang ini!), Pembagian modulo angka floating-point, menambahkan dua string (ada operator gabungan terpisah.. , dan penambahan string adalah pengecualian runtime)
    2. Memanggil string seolah-olah itu sebuah fungsi.
    3. Konstanta global tidak dapat nilsesuai dengan spesifikasi bahasa (ini ada hubungannya dengan detail implementasi - tidak mungkin dibedakan dari global yang tidak ada). Ketika simbol seperti itu ditemukan, kesalahan runtime dilemparkan.
H2CO3
sumber
1

Kode Python - Memukul Komputer dengan Kelelawar (secara kiasan)

Saya terlalu malas untuk menyelesaikan ini, tetapi seseorang, tolong ambil ide saya dan jalankan dengan itu! Tujuannya di sini adalah untuk menghapus satu komponen penting dari komputer Anda dan mengeksploitasi pengecualian untuk bagian itu sampai Anda akhirnya hanya rm semua / etc atau / usr / bin atau sesuatu yang penting seperti itu dan melihat semuanya hancur dan terbakar. Saya yakin Anda bisa mencetak banyak "25 poin" ketika semuanya crash. :)

Saya menargetkannya ke mesin linux. Ini tentu saja harus dijalankan sebagai root untuk kerusakan maksimum dan jika Anda menjalankannya berulang kali, itu akan membuat sistem Anda benar-benar rusak!

Pengecualian:

  1. ZeroDivisionError: pembagian integer atau modulo oleh nol
  2. OSError: [Errno 2] Tidak ada file atau direktori seperti itu:
  3. socket.gaierror: [Errno 8] nama panggilan atau servname tidak disediakan, atau tidak dikenal
  4. Perlu Anda menambahkan lebih banyak di sini

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
Menekan Selalu
sumber
4
Ide yang luar biasa! Silakan mengujinya dan laporkan kembali!
rubik
0

TI-BASIC, 130

Untuk kalkulator TI-84 Anda

:"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

Kesalahan fatal (berurutan):

  1. Arsipkan
  2. Argumen
  3. Tipe data
  4. Bagi dengan 0
  5. Sarang Ilegal
  6. Dim. Tidak Valid
  7. Label
  8. Penyimpanan
  9. Ans Tidak Nyata
  10. Meluap
  11. Sintaksis
  12. Tidak terdefinisi
  13. Variabel
Timtech
sumber
0

Kode PHP: 38 (+2) karakter, 5 kesalahan, tidak tertandingi

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

Daftar kemungkinan kesalahan:

  • Kesalahan fatal: Waktu eksekusi maksimum 'n' detik yang dilampaui pada baris 1

    for(;;)menunjukkan loop tak terbatas

  • Kesalahan fatal: Ukuran memori yang diizinkan sebesar 2097152 byte habis (mencoba mengalokasikan 884737 byte) pada baris 1

    PHP memiliki php.inifile, dan ada baris yang mengatakan memory_limit=dan di sinilah penggunaan ram maksimum dalam byte.
    Bagian mana yang dikatakan $e.=$e++berarti yang $eakan menjadi hasil dari rangkaian itu sendiri meningkat sebesar 1 di setiap iterasi.

  • Kesalahan fatal: Nama kelas harus berupa objek yang valid atau string pada baris 1

    Kelas dalam PHP dapat dipanggil baik dengan nama kelas atau menyimpan nama kelas sebagai string dalam var atau dengan menetapkan instance baru dari kelas dan memanggilnya .
    Contoh: $b='PDO';$a=new $b();$a::connect();$b::connect()-> ini adalah kode PHP yang valid.
    Kesalahan ini terjadi karena $eadalah nullpada iterasi pertama dari for(;;)lingkaran.

  • Kesalahan fatal: Nama fungsi harus berupa string pada baris 1
    Sama seperti kelas, tetapi fungsi harus berupa string (dan $eis null) atau nama fungsi secara langsung (contoh a():)

  • Kesalahan fatal: Tidak dapat membuat referensi ke elemen ekspresi array sementara di baris 1
    PHP memiliki foreachloop yang loop meskipun setiap elemen dalam array. Kata askunci digunakan untuk menunjukkan nama variabel baru yang digunakan untuk menyimpan salinan nilai indeks array saat ini.
    Saat menggunakan foreach($array as &$v), PHP membuat referensi ketika ada &sebelum nama variabel.

Itu adalah skor yang lemah (5 kesalahan dan tidak dapat ditandingi) = 50 poin

PHP tidak memungkinkan menangkap kesalahan fatal.


Di linux, menambahkan shutdown -P +0 antara backticks akan menjalankan perintah itu (dalam hal ini, akan menyebabkan sistem mati tiba-tiba).

Ini menyebabkan semua proses berhenti.

Tidak yakin apakah ini valid untuk bonus atau tidak.

Ismael Miguel
sumber
-2

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

Fungsi dipanggil dalam loop tanpa henti yang menyebabkan penerjemah macet.

Mauro
sumber
Harap golf kode Anda, format kode dengan empat spasi di depan, dan tentukan panjangnya.
Hosch250
1
Ini bukan pertanyaan codegolf . Tetapi jawabannya tidak menghasilkan pengecualian acak. Ini dijamin 100% gagal, yang tidak akan membuatnya menjadi insaneprogram.
ja72