Delilik Kontrol Programı


16

Delilik: Aynı şeyi tekrar tekrar yapmak ve farklı sonuçlar beklemek.

Her çalıştırıldığında bir istisna (çalışma zamanı hatası) atan bir program yazın. Zorluk, istisnaları doğrudan çağırmadan ( throwdeyim olmadan) birden fazla çökme üretme olasılığına sahip olmak ve rastgele veya cpu kene sayma işlevlerini kullanmamaktır.

  • Her olası hata için 10 puan .
  • Başka bir işlemde veya sistemde hata / kilitlenme oluşursa 25 bonus puanı .

kurallar

  1. Yanıtlar, hangi hataların olası olduğunu ve nasıl oluşturulduğunu belirtmelidir.
  2. Program her çalıştırıldığında aynı numara ile tohumlanmadıkça sistem (yerleşik) rastgele sayı üretecini kullanamazsınız.
  3. Ana program iş parçacığının başlangıcına göreli olarak sayılmadığı sürece, tiklerin veya cpu döngülerinin sayısı kullanılamaz.
  4. Çok iş parçacığına izin verilir (kodlanmamışsa).

Düzenle 1

  1. GUID üretimi yerleşik rasgele sayı üretecinin altına girer. Özel "evde yetiştirilen" GUID oluşturulmasına izin verilir.

  2. Kuralları atlamak dışında (rasgele bitler veya zaman damgası içeren bir dosyayı okuyun) dışında dosya sistemine I / O için erişime izin verilir.

Düzenle 2

  1. Çılgın yazılım yapma zorluğunun ruhunu çağırmak abort()veya assert()ihlal etmek ve böylece bu başarısızlık modu için 10 puan verilmeyecektir.

İyi şanslar!


Bir rehber oluşturmak rastgele kabul edilir mi?
microbian

İyi soru. Entropinin sihirli bir şekilde başarılması gerektiğini düşünüyorum (kartların evi kodu) ve yapay olarak değil, bu yüzden GUID'lere hayır diyebilirim.
ja72

JS için - çöken tarayıcılar 25 bonus olarak sayılır mı sayılmaz mı? Kodumun hangi tarayıcıda test edileceğini seçebilir miyim?
14'te

Ana makinenin (tarayıcı veya çerçeve) çökmesi 25 bonus puan verir. Yine de her zaman çökmelidir.
ja72

Sorun, deterministik olmayan araçlar kullanmadan deterministik olmayan bir fonksiyon yazmaktır (saat hariç). C, başlatılmamış işaretçi referanslarına erişmenizi sağlayan dillerden biridir. Gördüğüm çözümler başlatılmamış göstergelere dayanıyor. Benim için başlatılmamış işaretçiler kullanmak, bir kılavuz veya rastgele yöntem kullanmak kadar iyi (veya kötü).
microbian

Yanıtlar:


15

Java, 400

Java birçok s ve s ile kutsanmıştır (?) . Tek bir sınıfın işleyişine özgü birçok s vardır. En aşırı durumlarda birinin bir örnek olarak, orada 10'dan fazla s (tüm alt sınıfıdır adanmış) tek başına sınıfa, ben kodu (neredeyse) hepsi atar yapmak için zaman almış.ExceptionErrorExceptionExceptionIllegalFormatExceptionFormatter

Şu anki cevabım 40 farklı Exceptions / Errors ve System.nanoTime()bir tamsayı ile modulo bağlı olarak rastgele yürütülüyor .

Bu yöntem yalnızca geçen süreyi ölçmek için kullanılabilir ve başka herhangi bir sistem veya duvar saati zamanı kavramıyla ilgili değildir. Döndürülen değer, sabit ancak keyfi bir başlangıç ​​zamanından beri nanosaniyeyi temsil eder (belki de gelecekte, bu nedenle değerler negatif olabilir). Aynı kaynak, Java sanal makinesinin bir örneğinde bu yöntemin tüm çağrıları tarafından kullanılır; diğer sanal makine örneklerinin farklı bir başlangıç ​​noktası kullanması olasıdır.

Yukarıdaki yönteme izin verilmelidir, çünkü "3. ana program iş parçacığının başlangıcına göreli olarak sayılmadığı sürece tikler veya cpu döngüleri sayısı kullanılamaz" .

Derleme Talimatı

Kodu çalıştırmak için Oracle'ın JRE / JDK veya OpenJDK'sı kesinlikle önerilir. Aksi takdirde, bazıları Referans uygulamasının iç detaylarına bağlı olduğu ve güvenilir bir geri adımım olmadığı için bazı İstisnalar atılamayabilir.

Aşağıdaki kod javac 1.7.0_11, ile tüm İstisnaları başarıyla derler ve üretir java 1.7.0_51.

  1. Bu kodu çalıştırmak için, aşağıdaki kodu kopyalayıp bir Unicode farkında düzenleyiciye (örn. Notepad ++) yapıştırmanız ve UTF-16'ya kaydetmeniz gerekir (Big-Endian veya Little-Endian, BOM yazıldığı sürece önemli değildir) .

  2. cdKaynak dizinin kaydedildiği çalışma dizinini ( ) değiştirin ( bu önemlidir ).

  3. Kodu aşağıdaki komutla derleyin:

    javac G19115.java -encoding "UTF-16"
    
  4. Ve kodu çalıştırın:

    java G19115
    

Kodumda yıkıcı bir şey yok, çünkü bilgisayarımda da test etmek istiyorum. En "tehlikeli" kod, ToBeRemoved.classgeçerli klasördeki dosyayı silmektir. Bunun dışında, geri kalanı dosya sistemine veya ağa dokunmuyor.


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

İstisnalar ve Hatalar Listesi

Switch-case deyiminde beyan edildiği gibi. Toplam 37 Exceptions ve 3 Errors vardır.

  1. PatternSyntaxException (hata girişi yoluyla Pattern, sıkıcı durum yedek olarak)
  2. StringIndexOutOfBoundsException (hata girişi yoluyla Pattern, sıkıcı durum yedek olarak)
  3. IllegalArgumentException ( Patternsıkıcı durumda yedek olarak bir hata bulmama yardımcı oluyor )
  4. StackOverflowError (içinde yinelenen uygulama ile Pattern, sıkıcı durum yedek olarak)
  5. NumberFormatException ( $içinde Patternson satır sonlandırıcıdan önce eşleşebileceğini gösterir )
  6. IllegalStateException (eşleşen gruplara Matchereşleşme yapmadan erişerek )
  7. ArrayIndexOutOfBoundsException (kafa karıştırıcı davranışını gösterir split(String regex))
  8. ConcurrentModificationException (for-each döngüsü sırasında bir Koleksiyonu değiştirerek)
  9. ArithmeticException (0'a tamsayı bölme yoluyla)
  10. ExceptionInInitializerError ( Exceptionbir sınıfın başlatılması sırasında neden olarak )
  11. BufferOverflowException ( java.nio.*özgü Exception)
  12. BufferUnderflowException ( java.nio.*özgü Exception)
  13. InvalidMarkException ( java.nio.*özgü Exception)
  14. IndexOutOfBoundsException (değiştirilen var olmayan yakalama grubuna gönderme yoluyla)
  15. ClassCastException
  16. NoSuchElementException
  17. ArrayStoreException
  18. IllegalThreadStateException
  19. EmptyStackException ( java.util.Stacközgü Exception)
  20. NegativeArraySizeException
  21. OutOfMemoryError (büyük dizinin sıkıcı tahsisi yoluyla)
  22. UnsupportedCharsetException
  23. IllegalCharsetNameException ( Charset.isSupported(String name)dönüşlerin yanlış veya atıldığını gösterir Exception)
  24. NoClassDefFoundError (sınıfların yöntem / yapıcıya veya alana ilk erişimde yüklendiğini gösterir)
  25. InputMismatchException ( java.util.Scannerözgü Exception)
  26. DuplicateFormatFlagsException (buradan 35'e kadar java.util.Formatter-sözeldir Exception)
  27. FormatFlagsConversionMismatchException (ilginç biçim sözdizimi örneğiyle)
  28. IllegalFormatCodePointException
  29. IllegalFormatConversionException
  30. IllegalFormatFlagsException
  31. IllegalFormatPrecisionException
  32. IllegalFormatWidthException
  33. MissingFormatArgumentException (biçim sözdiziminin ilginç bir örneğiyle)
  34. MissingFormatWidthException
  35. UnknownFormatConversionException
  36. IllformedLocaleException
  37. NullPointerException
  38. AccessControlException (varsayılanın SecurityManagerkullanılabilir olduğunu gösterir )
  39. SecurityException ( Classsınıfın yapıcısını çağırarak )
  40. UnknownFormatFlagsException (bunun ExceptionOracle'ın uygulamasında atılamayacağını , yedek olmadığını gösterir)

nanoTimeBu cevapla ilgili yapılan açıklama ve çalışmalar için teşekkürler .
ja72

1
In Javaolduğunu -1 % 40 == -1veya -1 % 40 = 39?
ja72

@ ja72: Öyle -1. Negatif bir sayı aldınız mı? (Her şeyin negatif olmadığından emin olmak için düzenlenmiştir).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Java İstisnalarının çok etkileyici bir derlemesi. +1.
ApproachingDarknessFish

5

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

Aşağıdaki program ASLR'ye dayanmaktadır

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

Aşağıdaki İstisna rastgele gerçekleşir

  1. Hata Ayıklama Onayı ( Vector Subscript Out of Range)
  2. Yığın Taşması Infinite Recursion
  3. Sıfıra böl Dividing by Zero
  4. Bellek Yetersiz Allocating Huge Memory
  5. Korumalı İstisna By Accessing NULL
  6. Stackoverrun By overwriting stack
  7. INT 3
  8. ve Son olarak, çalışan bir Kullanıcı İşlemini öldürmek için taskkill'i kullanır

1
olan <iostream>gerekli?
user12205

@ace: Hayır, kibardı
Abhijit

Bence arama assert()bir istisna atmaya eşdeğerdir.
ja72

1
Bu ve diğer girdileri gözden geçirdikten sonra, üzeri istisnalar doğrudan çağırmayı izin vermeyecek şekilde karar verdik abortve assert.
ja72

1
@ ja72: Pencerelerde, iddia aslında bir istisna oluşturmaz. Bir Hata Ayıklama Assert Penceresini atar _crtMessageBoxWve aramayı yapar raise(SIGABRT), bu da sona ererexit(3)
Abhijit

5

Perl

Aşağıda, herhangi bir sayıda perl'in derleme zamanı mesajıyla ölen bir perl snippet'i bulunmaktadır. Yazdırılabilir ASCII karakterleri oluşturmak için ev yapımı bir sözde rasgele sayı üreteci kullanır ve bunları perl olarak yürütmeye çalışır. Perl'in verebileceği derleme zamanı uyarılarının tam sayısını bilmiyorum, ancak kesinlikle en az 30 hata var ve çeşitli farklı kombinasyonlarda gelebilirler. Yani, geçersiz sayılmadığı sürece, bu kodun diğer çözümlerden daha fazla puan büyüklüğünde olduğunu söyleyebilirim =)

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

Birkaç farklı çalışmadan örnek çıktı (yeni satırlarla serpiştirilmiş):

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) (İptal veya Onay Olmadan)

Bu çözüm, kilitlenmeyi belirlemek için geçerli işlem kimliğini kullanır.

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

İşlem şu nedenlerle sona erebilir:

  1. OutOfMemoryException (10)
  2. StackOverflowException (10)
  3. NullRefrenceException (10)
  4. DivideByZeroException (10)
  5. IndexOutOfRangeException (10)
  6. Kapatma, diğer işlemlerin anormal olarak sonlandırılmasına neden olur. (10 + 25)

10x6 + 25 = 85

Düzenle

OP Assert ve Abort'a izin verdikten sonra bunları çözümümden kaldırdım, bu nedenle tüm geçerli izin verilen yöntemlerle 85'e düştü.


İzin vermemek için gönderiyi düzenledim Abort()ve Assert(). Bu istisnaları gerçekten doğrudan çağırmadan atmaya devam edip edemeyeceğinize bakın.
ja72

1
Bir işlem kimliğinin her zaman 4 ile bölünebileceğini unutmayın; bu, eylemler listesindeki öğelerin sayısına bağlı olarak bazı istisnaların asla atılamayabileceği anlamına gelir. Bu durumda OutOfMemory, OutOfRange ve Shutdown çalıştırılmaz (yanılmıyorsam).
RobIII

Peki, o zaman yazabilir Process.GetCurrentProcess().Id / 4 % actions.Countmi?
McKay

2

Bunun uygun olup olmadığından emin değilim ...

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

Hem iöğeleri hem de öğeleri pbaşlatılmaz, bu da şunlara neden olabilir:

  1. i<0 ise bir segfault
  2. Bir işekilde 0 olursa kayan nokta istisnası
  3. cTekrarlanan artışlardan sonra bir segfault ,i

Ayrıca bu, p[c]SIGSEGV ile mevcut bir uygulamayı (değerine bağlı olarak) öldürebilir veya öldürmeyebilir .

Bunu test etmediğimi unutmayın ... bu işe yaramazsa lütfen yorum yapın


test etmek için çok tehlikeli;)
ajay

1

Köpüklü .

Feragatname: Abhijit'in harika çözümüne benzer, ancak:

  1. deliliğin birincil kaynağı yönetilen kodun bir grup çirkin hack yoluyla yerel bir uygulama detayı elde etmesidir;

  2. bu ASLR gerektirmez, sadece dinamik bellek tahsisi.


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

Bu ne yapar:

  1. program kendi yorumlayıcısını ( spnkomut) çağırır ve boş bir dizinin açıklamasını bir dosyaya verir. Dizi dinamik olarak ayrılır ve açıklama bellek adresini içerir.

  2. Program daha sonra dosyayı açar, açıklamayı ayrıştırır ve adresi bir tamsayı olarak alır. Daha sonra, elde edilen değer üzerinde bir tür karma gerçekleştirir ve aşağıdaki hatalı eylemlerden birini yürütür:

    1. Uyuşmayan tiplerle işlemler. Boole olmayanlar üzerinde mantıksal işleçler (evet, dil bunu yasaklar!), Kayan noktalı sayıların modulo bölünmesi, iki dize ekleme (ayrı bir birleştirme işleci vardır ..ve dizelerin eklenmesi bir çalışma zamanı istisnasıdır)
    2. Bir dizeyi bir işlevmiş gibi çağırmak.
    3. Global sabitler nildil spesifikasyonuna göre olamaz (bunun bir uygulama ayrıntısıyla ilgisi vardır - muhtemelen var olmayan bir küreselden ayırt edilemez). Böyle bir sembolle karşılaşıldığında, bir çalışma zamanı hatası atılır.

1

Python Kodu - Bilgisayarı Yarasa ile Çalmak (mecazi anlamda)

Bunu bitirmek için çok tembelim, ama birisi, lütfen fikrimi al ve onunla koş! Burada amaç, bilgisayarınızın önemli bir bileşenini silmek ve nihayetinde tüm / etc veya / usr / bin veya bunun gibi önemli bir şey rm olana kadar ve her şeyin çökmesini ve yanmasını izlemek için istisnalardan yararlanmaktır. Eminim ki her şey çöktüğünde "25 puan" kazanabilirsiniz. :)

Linux makinelerini hedef aldım. Bu elbette maksimum hasar için kök olarak çalıştırılmalıdır ve tekrar tekrar çalıştırırsanız, sisteminizi tamamen tuğla bırakacaktır!

İstisnalar:

  1. ZeroDivisionError: sıfıra tamsayı bölümü veya modulo
  2. OSError: [Errno 2] Böyle bir dosya veya dizin yok:
  3. socket.gaierror: [Errno 8] nodename veya servname sağlandı veya bilinmiyor
  4. Buraya daha fazlasını eklemeniz gerekiyor

bat.py:

#!/usr/bin/env python

import os
import socket

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

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

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


open ('/tmp/selfdestruct.touch','a').close()
zero=0
dividebyzero=5/zero; # exception #1

4
Harika fikir! Lütfen test edin ve rapor verin!
rubik

0

TI-BASIC, 130

TI-84 hesap makineniz için

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

Önemli Hatalar (sırayla):

  1. Arşiv
  2. tartışma
  3. Veri tipi
  4. 0'a böl
  5. Yasadışı Yuva
  6. Geçersiz Dim
  7. Etiket
  8. Hafıza
  9. Gerçek Olmayan Ans
  10. taşma
  11. Sözdizimi
  12. Tanımsız
  13. Değişken

0

PHP kodu: 38 (+2) karakter, 5 hata, erişilemez

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

Olası hataların listesi:

  • Ölümcül hata: Satır 1'de maksimum 'n' saniye yürütme süresi

    for(;;)sonsuz bir döngüyü temsil ediyor

  • Önemli hata: Hat 1'de izin verilen 2097152 baytlık izin verilen bellek boyutu (884737 bayt ayırmaya çalıştı)

    PHP'nin bir php.inidosyası var ve bir satır var memory_limit=ve bayt cinsinden maksimum ram kullanımı geliyor.
    Söylenen kısım , her bir yinelemede kendisinin birleşmesinin 1 artacağı $e.=$e++anlamına gelir $e.

  • Önemli hata: Sınıf adı geçerli bir nesne veya satır 1'de bir dize olmalıdır

    PHP'deki sınıflar, sınıf adı ile çağrılabilir veya sınıf adını bir var içinde dize olarak saklayarak veya sınıfın yeni bir örneğini atayarak ve çağırarak çağrılabilir .
    Örnek: $b='PDO';$a=new $b();$a::connect();$b::connect()-> Bu geçerli bir PHP kodudur.
    Çünkü bu hata olur $eise nullilk tekrarında for(;;)döngü.

  • Önemli hata: Fonksiyon adı 1. satırda bir dize olmalıdır
    sınıflar aynı, ancak işlevleri bir dize olmak zorunda (ve $eolduğu null) veya doğrudan işlev adı (örnek: a())

  • Önemli hata: Satır 1'de geçici bir dizi ifadesinin öğelerine referanslar oluşturulamıyor
    PHP, foreachbir dizideki her öğeden yine de döngü yapan döngüye sahip . asAnahtar kelime bir depolamak için kullanılan yeni değişkenin adını belirtmek için kullanılır kopyaya akım dizi indeksi değerini. PHP
    kullanılırken değişken adından önce olduğunda foreach($array as &$v)bir başvuru oluşturur &.

Zayıf bir puan (5 hata ve erişilemez) = 50 puan

PHP önemli hataların yakalanmasına izin vermez.


Linux'ta, shutdown -P +0ters tırnaklar arasına ekleme yapmak bu komutu çalıştırır (bu durumda, sistemin aniden kapanmasına neden olur).

Bu, tüm işlemlerin durmasına neden olur.

Bunun bonus için geçerli olup olmadığından emin değilim.


-2

Actionscript'te

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

Fonksiyonlar hiç bitmeyen bir döngüde çağrılır ve yorumlayıcının çökmesine neden olur.


Lütfen kodunuzu golf yapın, kodu dört boşluk önde olacak şekilde biçimlendirin ve uzunluğu belirtin.

1
Bu bir codegolf sorusu değil . Ancak cevap rastgele istisnalar oluşturmaz. Başarısız olması% 100 garantilidir, bu da onu bir insaneprogram yapmaz .
ja72
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.