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 && ./program
w 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
DATA
Sekcja koduje ciąg komunikatu o błędzie, a hash %abcdef
jest 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.
źródło
Odpowiedzi:
Pyton
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 niesys.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óryprint_exc
powoduje, że drukuje tylko najgłębszą ramkę na stosie, ukrywając fakt, że błąd miał miejsce wewnątrzeval
. W rezultacie pojawia się taki błąd: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 jestfake_error.py
, ale poza tym jest nie do odróżnienia od przypadku, gdy na przykładimport
źle wpisujesz .Oba błędy są nieco „podstępne”, ponieważ mogą być przypadkowe.
źródło
raise
w 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
Przypomina mi praktyczny żart.
źródło
BrainF ***
Nie mogę znaleźć konkretnego kompilatora, którego użyłem wcześniej, ale zapewniam, że jest to dokładny komunikat o błędzie.
źródło
:)
Jawa
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
(zakłada się, że
stdio.h
jest to # włączone)źródło
Język Game Maker
źródło
ACTIONSCRIPT 3
źródło