Fałszywy komunikat o błędzie

18

Napisz program, który wypisze komunikat o błędzie składni kompilatora lub interpretera. Komunikat o błędzie powinien wprowadzać w błąd, aby opiekunowie kodu mieli dni, by dowiedzieć się, że błąd został sfałszowany, co oznacza, że ​​powinieneś zaciemnić (i ukryć swój zamiar). Ponadto błąd musi być możliwie jak najdokładniejszy i powinien poprawnie odnosić się do kodu.

W przypadku zgodnych języków załóż, że opiekun kodu zrobi to compile program.p && ./programw wierszu poleceń, aby skompilować ORAZ uruchomić program, co oznacza, że ​​nie może odróżnić, czy dane wyjściowe pochodzą z kompilatora czy z samego programu. Załóżmy również, że Twój opiekun kodu włączy komunikaty o błędach składni.

Dla odniesienia, oto przykład, który zrobiłem: https://gist.github.com/359604

DATASekcja koduje ciąg komunikatu o błędzie, a hash %abcdefjest tabela dekodowania. Błąd wydrukował odwołania do ukośników odwrotnych, co powoduje, że opiekun kodu spróbuje policzyć ukośniki odwrotne.

Zgłoszenia będą oceniane według:

  • Kod ma zwodniczo oczywistą intencję /6
  • Kod poprawnie odtwarza błąd /16 (punkt zaczyna się od 16 i dzieli przez odpowiednie współczynniki dla każdej niedokładności)
    • Prawidłowa wielkość liter: 4
    • Prawidłowy numer wiersza i numer kolumny: 4
    • Prawidłowe sformułowanie: 2 dla każdego niepoprawnego słowa
  • Podany numer linii wprowadza w błąd opiekuna kodu /3

Na przykład,

./pythontest1.py: line 7: syntax error near token `('
./pythontest1.py: line 7: `   x=input("Enter a number:") #Number input'

otrzymuje 8 (16/2) poprawności za brakujące „nieoczekiwane” przed „tokenem”, normalny interpreter Pythona wyświetla

./pythontest1.py: line 7: syntax error near unexpected token `('
./pythontest1.py: line 7: `   x=input("Enter a number:") #Number input'

Jeśli punkt „kod poprawnie odtwarza błąd” jest poniżej 1, Twój wpis jest dyskwalifikowany.

W przypadku remisu przedstawię dodatkowe czynniki oceny.

Ming-Tang
źródło
Uh ... Zamknąłem ostatnie pytanie zaciemniające Sparky'ego z powodu braku obiektywności, a teraz mamy podstępną rzecz Petera i to (co, przyznaję, robi dzielny wysiłek, aby uzyskać obiektywizm). Zamiast po prostu usiąść na wszystkim chcąc nie chcąc lub wybierając na podstawie moich osobistych uprzedzeń, otworzę inny temat na temat meta, a może wskrzeszę stary. Pamiętaj, że Jeff wydaje się uważać, że „cel” jest wymagany.
dmckee
Rozwiązaniem może być konkurs popularności . Cóż, obiektywne kryteria wygranej.
Johannes Kuhn

Odpowiedzi:

35

Pyton

import sys,traceback
try:
  f=open(sys.argv[0])
  print eval(f.readline())
except Exception, e:
  traceback.print_exc(0)

Jest to program, który powinien pobrać nazwę pliku z wiersza poleceń, ocenić pierwszy wiersz i wydrukować wynik. Ma 2 błędy. Głównym błędem jest to, że powinien używać sys.argv[1], a nie sys.argv[0], więc kończy ocenę samego programu, a nie zawartość pliku wymienionego przez pierwszy argument. Drugi błąd polega na tym, że argument, który print_excpowoduje, że drukuje tylko najgłębszą ramkę na stosie, ukrywając fakt, że błąd miał miejsce wewnątrz eval. W rezultacie pojawia się taki błąd:

$ python fake_error.py twelve 
Traceback (most recent call last):
  File "<string>", line 1
     import sys,traceback
          ^
 SyntaxError: invalid syntax

Wygląda to bardzo podobnie, jak w pierwszym wierszu programu występuje błąd składniowy. Plik nie jest do końca właściwy, ponieważ <string>nie jest fake_error.py, ale poza tym jest nie do odróżnienia od przypadku, gdy na przykład importźle wpisujesz .

Oba błędy są nieco „podstępne”, ponieważ mogą być przypadkowe.

Keith Randall
źródło
To jest genialne
Cruncher
Znakomity. To przypomina mi kolejną osobliwość Pythona. Działa raisew Pythonie 2, ale w IDLE, domyślnym IDE Pythona, powoduje błąd wewnętrzny podczas drukowania bełkotu na temat kolejek. Traceback (most recent call last): ** IDLE Internal Exception: File "2.7/lib/python2.7/idlelib/run.py", line 325, in runcode exec code in self.locals File "2.7/lib/python2.7/idlelib/run.py", line 111, in main seq, request = rpc.request_queue.get(block=True, timeout=0.05) File "2.7/lib/python2.7/Queue.py", line 176, in get raise Empty
The Matt
10

Przypomina mi praktyczny żart.

$ ls -l
$ cat readme.txt
cat: readme.txt: No such file or directory
$ echo 'cat: readme.txt: No such file or directory' >readme.txt
$ ls -l
total 8
-rw-r--r--  1 florian  staff  43 Mar 16 09:52 readme.txt
$ cat readme.txt
cat: readme.txt: No such file or directory
$ 
Florian F.
źródło
9

BrainF ***

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++++++++++[<+++++++++++<++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++<+++<++++++++++<+++++++++++<++++++++++<+++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++++<+++++++++<+++<++++++++++<+++++++++++<+++++++++++<++++++++++<++++++++++<+++++++++<+++<++++++++++<++++++++++<+++++++++++<+++++++++<++++++++++<+++++++++++<+++++++++++<+++++++++<+++<+++++++++++<++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++<+++<++++++++++<+++++++++++<++++++++++<+++++++++++<+++++++++++<++++++++++<+++++++++<+++<+++++<+++++++++++<+++++++++++<+++++++++++<+++++++++++<++++++++++<+++<++++++++++++<+++++++++<+++++++++++<+++++++++++<++++++++++++<++++++++<+++<+++<++++<++++<++++<+++++++>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.>++.>++.>++.>+++.>++.>+++.>+.>.>++++++.>+++++++.>.>++.>+.>++++.>++++.>+.>++++.>++++++++.>++.>+++++++++.>++++++++.>+.>+++++.>+++++.>.>+++.>++.>+++.>++.>++++++.>+.>+++++++.>+.>.>++.>+++++++.>++.>++.>+.>+++++++.>++++.>+.>.>++.>++++++++.>+.>++.>+.>++++.>+.>++.>+++++++.>.>++.>+.>++.>+.>.>+++++.>.>+++.>++.>+.>++.>++++++.>+.>+++++++.>+.>.>

Nie mogę znaleźć konkretnego kompilatora, którego użyłem wcześniej, ale zapewniam, że jest to dokładny komunikat o błędzie.

Ry-
źródło
5
Dla tych, którzy nie są ciekawi kompilatorów BF, wyświetla się komunikat: „F ***! Błąd składni: zamykanie] token pojawił się przed otwierającym [tokenem”
Peter Olson
1
Miło cię widzieć na CG, Minitech:)
Bojangles
Lol, historia zmian jest zabawna: P
Klamka
1

Jawa

throw new Error();  

Nie wiedziałem, czy chodziło Ci o zgłoszenie nieobsługiwanego wyjątku (jak w tym przykładzie) lub symulację komunikatu o błędzie. W takim przypadku powinno to działać:

do

printf("FATAL ERROR #0xBAD\nProgram execution stopped\n\nIn line 123, character 321, of file 'buggy.c'");

(zakłada się, że stdio.hjest to # włączone)

Nate Koppenhaver
źródło
Ups, po prostu przeczytaj dokładnie swój post o części zaciemniającej. dodałbym do tego obfuscator, ale obecnie nie mam dostępu do żadnych idów. [:(] kiedy go dostanę, zdecydowanie opublikuję zaciemnioną wersję (kto wie, może nawet w innym języku;)
Nate Koppenhaver
0

Język Game Maker

show_error("Error: Undefined variable a##Line 1, character 4, of event Create in obj_controller",0)
Timtech
źródło
0

ACTIONSCRIPT 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
Wuiyang
źródło