Messaggio di errore falso


18

Scrivi un programma che stampa il messaggio di errore di sintassi del compilatore o dell'interprete. Il messaggio di errore dovrebbe essere fuorviante in modo che i manutentori del codice impiegheranno giorni per scoprire che l'errore era falso, ciò significa che dovresti offuscare (e nascondere le tue intenzioni). Inoltre, l'errore deve essere il più esatto possibile e deve fare riferimento al codice correttamente.

Per i linguaggi rispettati, supponiamo che il manutentore del codice eseguirà compile program.p && ./programla riga di comando per compilare ED eseguire il programma, ciò significa che non può distinguere se l'output proviene dal compilatore o dal programma stesso. Inoltre, supponiamo che il manutentore del codice attivi i messaggi di errore di sintassi.

Per riferimento, ecco un esempio che ho fatto: https://gist.github.com/359604

La DATAsezione codifica la stringa del messaggio di errore e l'hash %abcdefè la tabella di decodifica. L'errore ha stampato i riferimenti alle barre rovesciate, il che rende un manutentore del codice tenterà di contare le barre rovesciate.

Le voci saranno classificate in base a:

  • Il codice ha un'intenzione ingannevolmente ovvia /6
  • Il codice riproduce correttamente l'errore /16 (il punto inizia con 16 e si divide per i fattori corrispondenti per ogni imprecisione)
    • Lettere maiuscole corrette: 4
    • Numero di riga e numero di colonna corretti: 4
    • Formulazione corretta: 2 per ogni parola errata
  • Il numero di riga a cui viene fatto riferimento fuorvia il manutentore del codice /3

Per esempio,

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

ottiene 8 (16/2) sulla correttezza per la mancanza di "imprevisto" prima di "token", viene visualizzato un normale interprete Python

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

Se il punto "il codice riproduce correttamente l'errore" è inferiore a 1, la voce viene squalificata.

In caso di pareggio, inserirò ulteriori fattori di classificazione.


Uh ... ho chiuso la recente domanda di oscuramento di Sparky a causa del non essere obiettivo, e ora abbiamo la cosa subdola di Peter e questo (che ammetto fa uno sforzo valoroso per ottenere l'obiettività). Piuttosto che limitarmi a sedermi su tutto ciò che è volente o nolente o scegliere in base al mio pregiudizio personale, aprirò un altro argomento su meta, o forse farò risorgere un vecchio. Essere consapevoli del fatto che Jeff sembra pensare che "obiettivo" sia un requisito.
dmckee,


Una soluzione può essere il concorso di popolarità . Bene, un criterio vincente oggettivo.
Johannes Kuhn,

Risposte:


35

Pitone

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

Questo è un programma che dovrebbe prendere un nome di file nella riga di comando, valutare la prima riga in esso e stampare il risultato. Ha 2 bug. Il bug principale è che dovrebbe usare sys.argv[1], non sys.argv[0], quindi finisce per valutare il programma stesso, non il contenuto del file indicato dal primo argomento. Il secondo bug è che l'argomento per print_excfarlo stampare solo il frame più profondo nella pila, nascondendo il fatto che l'errore si è verificato all'interno del file eval. Di conseguenza, viene visualizzato un errore simile al seguente:

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

Sembra che la prima riga del programma abbia un errore di sintassi. Non è del tutto corretto come è il file <string>, no fake_error.py, ma altrimenti è indistinguibile dal caso in cui, per esempio, si scrive importmale.

Entrambi gli errori sono in qualche modo "subdoli" in quanto potrebbero essere accidentali.


Questo è geniale
Cruncher,

Brillante. Questo mi ricorda un'altra stranezza di Python. L'esecuzione raisein Python 2, ma in IDLE, l'IDE predefinito di python, provoca un errore interno durante la stampa di code incomprensibili. 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
Matt

10

Mi ricorda una battuta pratica.

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

9

Brainf ***

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

Non riesco a trovare il compilatore specifico che ho usato prima, ma ti assicuro che è il messaggio di errore esatto.


5
Per quelli di voi senza compilatori BF che sono curiosi, questo stampa, il token "F ***! Errore di sintassi: chiusura] è apparso prima di un token di apertura
Peter Olson,

1
È bello vederti su CG, Minitech:)
Bojangles il

Lol, la storia delle revisioni è divertente: P
Maniglia della porta

1

Giava

throw new Error();  

Non sapevo se intendevi effettivamente lanciare un'eccezione non gestita (come in quell'esempio) o simulare un messaggio di errore. In tal caso, dovrebbe funzionare:

C

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

(questo presuppone che stdio.hsia #incluso)


oops, leggi il tuo post in modo approfondito sulla parte offuscata. aggiungerei un offuscatore, ma al momento non ho accesso a nessun id. [:(] quando ne avrò uno, posterò sicuramente una versione offuscata (chissà, forse anche in un'altra lingua;)
Nate Koppenhaver,

0

Lingua di Game Maker

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

0

ACTIONSCRIPT 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.