假错误消息


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'

正常的Python解释器显示正确性为8(16/2),因为在“令牌”之前缺少“意外”

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

如果您的“代码正确再现错误”点低于1,则您的输入将被取消资格。

如果是平局,我将提出其他评分因素。


呃... 由于不客观,我关闭了Sparky最近的令人困惑的问题,现在我们得到了Peter轻率的事,这(我承认为获得客观性做出了英勇的努力)。我不只是随意摆弄所有东西,也不是根据我的个人偏见来选择,我将在meta上讨论另一个话题,或者复活一个旧话题。请注意,Jeff似乎认为“客观”是必要条件。
dmckee 2011年


解决方案可以是人气竞赛。好吧,客观的获胜标准。
Johannes Kuhn

Answers:


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],因此最终会评估程序本身,而不是第一个参数命名的文件的内容。第二个错误是参数to 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错误,则无法区分。

这两个错误在某种程度上都是“偶然的”,因为它们可能是偶然的。



辉煌。这让我想起了Python的另一个奇怪之处。raise在Python 2中运行,但在Python的默认IDE IDLE中运行,会导致内部错误,打印有关队列的乱码。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 ***!语法错误:closeing”标记出现在open [token]之前
Peter Olson

1
很高兴看到你CG,MiniTech移动:)
Bojangles

大声笑,修订历史记录很有趣:P
门把手

1

爪哇

throw new Error();  

我不知道您是要实际抛出未处理的异常(如该示例),还是模拟错误消息。如果是这种情况,这应该起作用:

C

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

(假定包含stdio.h在#include中)


糟糕,请深入阅读您有关混淆部分的文章。我会在其上添加混淆器,但我目前无法访问任何对象。[:(]当我得到一个时,我将明确发布一个混淆的版本(谁知道,甚至可能是另一个lang;)
Nate Koppenhaver

0

游戏制作者语言

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

0

动作脚本3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.