Gefälschte Fehlermeldung

18

Schreiben Sie ein Programm, das die Syntaxfehlermeldung des Compilers oder Interpreters ausgibt. Die Fehlermeldung sollte irreführend sein, so dass die Codewartenden Tage brauchen, um herauszufinden, dass der Fehler gefälscht wurde. Das bedeutet, Sie sollten dies verschleiern (und Ihre Absichten verbergen). Außerdem muss der Fehler so genau wie möglich sein und sollte korrekt auf den Code verweisen.

Bei kompatiblen Sprachen wird davon ausgegangen, dass Ihr Code-Betreuer compile program.p && ./programdas Programm in der Befehlszeile kompiliert UND ausführt. Dies bedeutet, dass er nicht unterscheiden kann, ob die Ausgabe vom Compiler oder vom Programm selbst stammt. Nehmen Sie außerdem an, dass Ihr Code-Betreuer Syntaxfehlermeldungen aktiviert.

Als Referenz ist hier ein Beispiel, das ich gemacht habe: https://gist.github.com/359604

Der DATAAbschnitt codiert die Zeichenfolge der Fehlermeldung und den Hash%abcdef ist die Decodiertabelle. Der Fehler gab Verweise auf die Backslashes aus, wodurch ein Code-Betreuer versucht, die Backslashes zu zählen.

Die Beiträge werden nach folgenden Kriterien bewertet:

  • Code hat eine täuschend offensichtliche Absicht /6
  • Der Code gibt den Fehler korrekt wieder /16 (Ihr Punkt beginnt mit 16 und wird für jede Ungenauigkeit durch die entsprechenden Faktoren dividiert).
    • Richtige Großschreibung: 4
    • Richtige Zeilennummer und Spaltennummer: 4
    • Richtiger Wortlaut: 2 für jedes falsche Wort
  • Die Zeilennummer, auf die verwiesen wird, führt den Code-Betreuer in die Irre /3

Beispielsweise,

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

Erhält 8 (16/2) für die Richtigkeit, wenn "Unerwartet" vor "Token" fehlt, wird ein normaler Python-Interpreter angezeigt

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

Wenn Ihr Punkt "Code reproduziert Fehler korrekt" unter 1 liegt, wird Ihre Eingabe disqualifiziert.

Im Falle eines Unentschieden werde ich zusätzliche Bewertungsfaktoren aufstellen.

Ming-Tang
quelle
Äh ... Ich habe Sparkys letzte Verschleierungsfrage geschlossen, weil er nicht objektiv ist, und jetzt haben wir Peters hinterhältiges Ding und dies (was ich zugeben muss, um Objektivität zu erlangen). Anstatt einfach auf alles zu sitzen oder mich aufgrund meiner persönlichen Vorurteile zu entscheiden, werde ich ein anderes Thema auf Meta eröffnen oder vielleicht ein altes wieder auferstehen lassen. Seien Sie sich bewusst, dass Jeff zu denken scheint, dass "objektiv" eine Voraussetzung ist.
dmckee
Eine Lösung kann der Beliebtheitswettbewerb sein . Nun, ein objektives Gewinnkriterium.
Johannes Kuhn

Antworten:

35

Python

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

Dies ist ein Programm, das einen Dateinamen in die Befehlszeile aufnehmen, die erste Zeile darin auswerten und das Ergebnis drucken soll. Es hat 2 Bugs. Der Hauptfehler ist, dass es sys.argv[1]nicht verwenden sollte sys.argv[0], so dass es das Programm selbst evaluiert, nicht den Inhalt der Datei, die durch das erste Argument benannt wurde. Der zweite Fehler ist, dass das Argument, print_excdass es nur den tiefsten Frame auf dem Stapel ausgeben soll, die Tatsache verbirgt, dass der Fehler in der aufgetreten ist eval. Als Ergebnis erhalten Sie folgende Fehlermeldung:

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

Dies sieht sehr danach aus, als hätte die erste Zeile des Programms einen Syntaxfehler. Es ist nicht ganz richtig, wie die Datei ist <string>, fake_error.pyaber ansonsten ist es nicht von dem Fall zu unterscheiden, in dem Sie beispielsweise importfalsch schreiben.

Beide Fehler sind insofern etwas "hintergangen", als sie versehentlich auftreten könnten.

Keith Randall
quelle
Dies ist brillant
Cruncher
Brillant. Dies erinnert mich an eine weitere Kuriosität von Python. Das Ausführen raisein Python 2, aber in IDLE, der Standard-IDE von Python, verursacht einen internen Fehler beim Drucken von Kauderwelsch über Warteschlangen. 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
Der Matt
10

Erinnert mich an einen Scherz.

$ 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
quelle
9

Gehirn ***

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

Ich kann den Compiler, den ich zuvor verwendet habe, nicht finden, aber ich versichere Ihnen, dass dies die genaue Fehlermeldung ist.

Ry-
quelle
5
Für diejenigen von Ihnen ohne BF-Compiler, die neugierig sind, wird der Ausdruck "F ***! Syntaxfehler: Schließen] Token erschien vor einem Eröffnungs [Token"
Peter Olson
1
Es ist schön dich auf CG zu sehen, Minitech:)
Bojangles
Lol, der Verlauf der Überarbeitung ist amüsant: P
Türklinke
1

Java

throw new Error();  

Ich wusste nicht, ob Sie tatsächlich eine unbehandelte Ausnahme (wie in diesem Beispiel) auslösen oder eine Fehlermeldung simulieren wollten. Wenn dies der Fall ist, sollte dies funktionieren:

C

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

(Dies setzt voraus, dass stdio.h#included ist)

Nate Koppenhaver
quelle
Hoppla! Lies einfach deinen Beitrag ausführlich über den Verschleierungsteil. Ich würde einen Obfuscator hinzufügen, aber ich habe derzeit keinen Zugriff auf IDs. [:(] Wenn ich eine bekomme, werde ich definitiv eine verschleierte Version posten (wer weiß, vielleicht sogar in einer anderen Sprache;)
Nate Koppenhaver
0

Game Maker-Sprache

show_error("Error: Undefined variable a##Line 1, character 4, of event Create in obj_controller",0)
Timtech
quelle
0

ACTIONSCRIPT 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
Wuiyang
quelle