Поддельное сообщение об ошибке


18

Напишите программу, которая распечатывает сообщение о синтаксической ошибке компилятора или интерпретатора. Сообщение об ошибке должно вводить в заблуждение, так что сопровождающим кода потребуется несколько дней, чтобы выяснить, что ошибка была фальсифицирована, то есть вам следует запутать (и скрыть свое намерение). Кроме того, ошибка должна быть максимально точной и должна правильно ссылаться на код.

Для компилируемых языков предположим, что ваш сопровождающий код будет выполнять compile program.p && ./programв командной строке компиляцию и запускать программу, это означает, что он не может различить, поступает ли результат от компилятора или самой программы. Также предположим, что ваш сопровождающий код включит синтаксические сообщения об ошибках.

Для справки вот пример, который я сделал: https://gist.github.com/359604

DATAСекция кодирует строку сообщения об ошибке, и хэш %abcdefявляется таблицей декодирования. Ошибка напечатала ссылки на обратную косую черту, которая заставляет сопровождающего кода попытаться подсчитать обратную косую черту.

Записи будут оцениваться по:

  • Кодекс имеет обманчиво очевидное намерение /6
  • Код корректно воспроизводит ошибку /16 (ваша точка начинается с 16 и делится на соответствующие коэффициенты для каждой неточности)
    • Правильная капитализация: 4
    • Правильный номер строки и номер столбца: 4
    • Правильная формулировка: 2 за каждое неверное слово
  • Указанный номер строки вводит в заблуждение сопровождающий код /3

Например,

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

получает 8 (16/2) правильности за пропущенное «неожиданное» перед «токеном», отображается обычный интерпретатор Python

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

Если ваш пункт «Код воспроизводит ошибку правильно» меньше 1, ваша заявка будет дисквалифицирована.

В случае галстука я выставлю дополнительные оценочные факторы.


Э-э ... Я закрыл недавний вопрос о спускании у Спарки из-за того, что он не объективен, и теперь у нас есть закулисная вещь Питера и это (что, я признаю, делает доблестное усилие, чтобы добиться объективности). Вместо того, чтобы просто сидеть на всем, что угодно, или выбирать, основываясь на моих личных предрассудках, я собираюсь открыть другую тему на мета или возродить старую. Имейте в виду, что Джефф, кажется, думает, что «цель» является требованием.
dmckee


Решением может стать конкурс на популярность . Ну, объективные критерии победы.
Йоханнес Кун

Ответы:


35

питон

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

Это программа, которая должна взять имя файла в командной строке, вычислить в нем первую строку и распечатать результат. Есть 2 ошибки. Основной ошибкой является то, что он должен использовать sys.argv[1], а не sys.argv[0]так, что в итоге он оценивает саму программу, а не содержимое файла, названного первым аргументом. Вторая ошибка заключается в том, что аргумент, print_excзаставляющий его печатать только самый глубокий кадр в стеке, скрывает тот факт, что ошибка произошла внутри eval. В результате вы получите ошибку, подобную этой:

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

Это выглядит очень похоже на синтаксическую ошибку в первой строке программы. Это не совсем правильно, как файл <string>, нет fake_error.py, но в остальном он неотличим от случая, когда, например, вы пишете importнеправильно.

Обе ошибки несколько «закулисны» в том смысле, что они могут быть случайными.


Это великолепно
Cruncher

Brilliant. Это напоминает мне еще одну странность Python. Выполнение raiseв Python 2, но в IDLE, IDE по умолчанию Python, вызывает внутреннюю ошибку печати бред о очередях. 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
Мэтт

10

Напоминает мне практическую шутку.

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

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

Я не могу найти тот компилятор, который использовал раньше, но уверяю вас, что это именно то сообщение об ошибке.


5
Для тех из вас, кто не заинтересован в BF-компиляторах, это напечатает: «F ***! Синтаксическая ошибка: закрывающий] токен появился перед открывающим [токеном»
Питер Олсон,

1
Приятно видеть вас на CG, Minitech:)
Bojangles

Lol, история изменений забавна: P
Ручка двери

1

Джава

throw new Error();  

Я не знал, имели ли вы в виду генерирование необработанного исключения (как в этом примере) или симуляцию сообщения об ошибке. Если это так, это должно работать:

С

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

(это предполагает, что stdio.h#included)


К сожалению, просто прочитайте ваш пост в деталях о запутывания части. я бы добавил к нему обфускатор, но в настоящее время у меня нет доступа ни к одному иду. [:(] когда я получу один, я обязательно опубликую обфусцированную версию (кто знает, может быть, даже в другом языке;)
Нейт Коппенхавер

0

Game Maker Language

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.");
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.