Підроблене повідомлення про помилку


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, ваш запис дискваліфікується.

У разі нерівності я буду використовувати додаткові коефіцієнти оцінювання.


Ага ... Я закрив нещодавнє затуманення Sparky через те, що він не є об'єктивним, і тепер у нас є непомітна річ Пітера, і це (що, я визнаю, докладає доблесних зусиль для отримання об'єктивності). Замість того, щоб просто сидіти на всьому вольово-неволі або вибирати, виходячи з моїх особистих забобонів, я збираюся відкрити іншу тему з мета, чи, можливо, воскрешу стару. Будьте в курсі, що Джефф, здається, вважає, що "об'єктивність" є вимогою.
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

Блискуча. Це нагадує мені ще одну дивацтво 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

Лол, історія редакцій забавна: P
Дверна ручка

1

Java

throw new Error();  

Я не знав, чи маєте ви на увазі справді викинути необроблений виняток (як у цьому прикладі) чи імітувати повідомлення про помилку. Якщо це так, це має працювати:

С

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

(передбачається, що stdio.h# включено)


ой, просто прочитайте ваш пост поглиблено про частину обфускування. Я додав би до нього обфускатора, але в даний час я не маю доступу до жодних ідей. [:(] коли я отримаю його, я обов'язково опублікую примхливу версію (хто знає, можливо, ще в одному
мові

0

Мова виробника ігор

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

0

ДІЇSCRIPT 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.