最短的错误信息


135

挑战

编写最短的程序,该程序在编译或执行时会产生比程序本身小的致命错误消息。该错误信息可能不是由程序本身生成的,例如Python的raise。有效答案必须同时包含代码和错误消息。有效答案最短者获胜。

没有错误消息不算作错误消息。

例子(卢阿)

代码(46字节):

[
--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

错误(45个字节):

[string "[..."]:1: unexpected symbol near '['

评论不作进一步讨论;此对话已转移至聊天
丹尼斯

1
@丹尼斯,我想这是解决“ OP不会将澄清内容变成问题”的一种方法。
与Orjan约翰森

1
感谢您接受我的回答,获得了最多的投票;但是,这被标记为code-golf,因此您应该接受最短的答案
MD XF

@smartpeople是这个:“ __main__.CodeException: Raised an &rror.”我的错误还是这个:“ Raised an &rror.
FantaC

TrumpScript在中国运行?
Stan Strum,

Answers:


58

ed,3个字节

注意:这里的大多数答案都忽略了作为错误消息一部分打印的尾随换行符的计数。但是我在问题中没有看到任何理由可以忽略它,因此作者评论说应该包括换行符。因此,除非问题已更改,否则我将把它包括在内。

代码(后跟换行符):

??

错误(尾随换行符):

?


19
实际上,这是无法克服的。:P
完全人类的,2015年

1
ed可以做加法和素数测试吗?还是这种挑战不是必需的?
斯蒂芬,

4
@StepHen是的,它可以通过常规的带有反向引用的正则表达式技巧对一元进行加法和素性测试。
Anders Kaseorg '17

1
很聪明,但是“?” 不是致命的。
Mark Plotnick

2
正如标志中指出的那样,如果未从终端读取代码,则错误是致命的。在线尝试!
丹尼斯

59

C(现代Linux),19字节

本来可以做我著名的段错误,但完全是人为偷的。

main(){longjmp(0);}

输出(18个字节):

Segmentation fault

您目前的得分比我高,所以...双赢?
totallyhuman


没有其他具有较短版本的语言环境(以便您可以使用main(){main();})吗?
12431234123412341234123

@ 12431234123412341234123我不知道。另外,main(){main();}也不保证会出现段故障。
MD XF

1
@MDXF无法保证(并且在gcc或clang中启用了优化功能后,它会陷入无限循环或忽略调用)。但是在Code Golf上,我们需要有效的实现方式,而不是保证。
12431234123412341234123年

48

Python 2,35个字节

import sys;sys.tracebacklimit=000;a

给出错误:

NameError: name 'a' is not defined

14
修改回溯限制...好人
HyperNeutrino

1
这很聪明!
斯凯勒

34

JavaScript(Firefox),31个字节

# This is a comment, right? ...

引发此错误:

SyntaxError: illegal character

在Windows 7的Firefox 54.0.1控制台中进行了测试。


26

Python 2中87 79个字节

-8个字节,感谢Zacharý和Outgolfer的Erik。

from __future__ import braces
#i am most surely seriously actually totallyhuman

在线尝试!

错误消息,78个字节:

假设代码存储在名为的文件中a

  File "a", line 1
    from __future__ import braces
SyntaxError: not a chance

这实际上是Python中不错的复活节彩蛋。:D


1
您可以假设一个字符的文件名!
扎卡里

1
假设1字符的文件名,你可以打高尔夫球来
暴民埃里克(Erik the Outgolfer)'17年

嘿,很好。- - -
totallyhuman

1
但是错误消息必须小于程序本身……
Leaky Nun

1
如果使用IDLE \s\sFile "<stdin>", line 1\nSyntaxError: not a chance,则只能获得50个字节[ \s是一个空格,并且\n是一个换行符],因此您可以获得一个51字节的程序
。。– boboquack


19

出租车38 21字节

Switch to plan "abc".

产生:

error: no such label

在线尝试!

-17字节的感谢Toast

尝试切换到“ abc”,该名称不存在。你会在[abc]某个地方。


4
你可以到21个字节Switch to plan "abc".生产error: no such label。这可能是Taxi击败某些传统语言的少数几个代码挑战之一。
Engineer Toast

@EngineerToast谢谢,没想到那个。
斯蒂芬·

18

> <>,26个字节

>>>>>>>>>>>>>>>>>>>>>>>>>:

在线尝试!

Fish中的每个错误消息均为something smells fishy...,因此这只会将指针向右移动足够长的时间,以使其更长,并尝试复制栈顶(当时为空)。


2
我喜欢它,它绝对是所有解决方案中最烂的:-)
Xan-Kun Clark-Davis

@ Xan-KunClark-Davis 不得不叹息 ...:P
HyperNeutrino

18

JavaScript(Firefox),21个字节

(a=null)=>a.charAt(1)

错误(20个字节)TypeError: a is null


2
天哪!我知道那是一个较短的...
ETHproductions'Jul

我有同样的想法,想出了a = null; a.x01234567890相同数量的字节
RuteNL

16

System V Shell,25个字节

mount /dev/hda1 /mnt/hda1

错误消息(23个字节):

mount: not a typewriter

“不是打字机”,或者ENOTTYerrno.h在Unix系统上定义的错误代码。这用于指示在ioctl系统调用中指定了无效的ioctl(输入/输出控制)编号。在系统上的/usr/include/asm-generic/errno-base.h,我可以找到以下行:

#define ENOTTY          25      /* Not a typewriter */

在UNIX 6和更早版本的UNIX中,I / O仅限于串行连接的终端设备,例如电传打字机(TTY)。这些通常通过gttystty系统调用进行管理。如果要尝试在非终端设备上使用这些系统调用中的任何一个,ENOTTY则会生成。

如今,自然无需使用电传打字机。当gttystty被替换时ioctlENOTTY被保留。某些系统仍显示此消息。但是大多数人会说“设备不适当的ioctl”。


请解释...
Mega Man

@MegaMan更新,并附有说明。
MD XF

1
赞成实际启发性的解释。
Xan-Kun Clark-Davis

11

QBasic,11个字节

QBasic中有11个字节的两种解决方案,其中一种可能更进一步。QBasic具有的最短错误消息是overflow,可以这样触发:

i%=i%+32677

overflow是因为整数(i%)的最大值为32676。如果32677没有QBasic的自动广播,我就无法打高尔夫球。

另一个错误(为11个字节)为out of data。QBasic具有DATA在程序中存储数据的语句,以后可以由READ语句访问。发出READDATAs 多的s会导致错误:

READ a$ '--

请注意,该语句用注释填充,以使其达到错误消息的长度。是的,我的程序错误消息较短,而程序的错误消息较短...


11

C(现代Linux),19字节

我在聊天中提出了这个建议,但是没人愿意。:P感谢MD XF的搞笑回答

main(){puts('s');;}

错误消息,18字节

Segmentation fault

1
但是错误消息必须小于程序本身……
Leaky Nun

字节计数搞砸了,我不好。
完全人类

9
这是外壳程序在子进程以退出代码139终止时打印的通用消息。C程序本身完全不产生任何错误消息。
丹尼斯,

7
@Dennis退出代码139实际上是由Shell组成的另一个谎言。Unix区分信号11(W_EXITCODE(0, 11) == 11)和退出代码139(W_EXITCODE(139, 9) == 139 << 8)。Shell毫无疑问地将设置$?WIFEXITED(wstatus) ? WEXITSTATUS(wstatus) : WTERMSIG(wstatus) + 128,但是大多数语言都揭示了差异。
Anders Kaseorg '17

2
@Anders WIFEXITED(wstatus)等于等于DIVORCE(alimony)有什么机会吗?
Janus Bahs Jacquet



10

PowerShell中215个 189字节

[]
111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

在线尝试!

因此,PowerShell具有...详细...错误消息。此外,大多数非语法错误消息都是Runtime Exception,这意味着它们不是致命错误,这使该问题减少了需要查找简短的分析错误的时间。

觉得这是最短的一个,如果不是最短, @TessellatingHeckler已经证明这是最短的解析错误,它仍然在重量在188刚刚的错误消息字节。因此,我们基本上需要附加足够的1s才能到达189“代码”字节。

c:\a.ps1例如,在本地运行此命令将减少字节数,因为它只是一个较短的文件路径,但是在TIO上不可用。

产生错误:

At /tmp/home/.code.tio.ps1:1 char:2
+ []
+  ~
Missing type name after '['.
    + CategoryInfo          : ParserError: (:) [], ParseException
    + FullyQualifiedErrorId : MissingTypename

我在评论中被问到三个问题,您问了其中一个,但是您没有问到的两个都适用于您的答案,而不是您的答案。
user72528

@ user72528是的,我也觉得很有趣。
AdmBorkBork

您可以使用一个char文件名!
扎卡里

1
@Zacharý我可以,但是由于TIO处理沙箱的原因,它在TIO上不可复制。我宁愿保持它在TIO上的可用性,而不是节省一些字节。
AdmBorkBork's

2
关于[]哪个看起来更短的错误Missing type name after '[',取决于您的确切计数方式,大约是190-tio.run / ## K8gvTy0qzkjNyfn / PzqWy3Dogv // AQ(从这里解析器字符串中获取,对我来说似乎是最短的解析器错误 ([xml](gc .\ParserStrings.resx)).root.data.value | sort { $_.length } -Desc)。
TessellatingHeckler

9

Commodore 64 Basic,15个字节

?SYNTAX   ERROR

产生

?SYNTAX  ERROR

(请注意错误消息中的两个空格,程序有三个空格)

?SYNTAX ERROR?VERIFY ERRORC64 Basic可以产生的第三条最短的错误消息捆绑在一起,并且可以由代码可靠地触发的最短错误消息(最短的消息BREAK IN 1,需要用户交互,而?LOAD ERROR需要有缺陷的磁带或软盘,并且?VERIFY ERROR需要存在包含与RAM中的程序不匹配的文件的软盘或磁带)。


1
哈,我发给我的时候甚至都没有看到。看到另一个BASIC用户总是很高兴... +1
MD XF

8

R29 28字节

-1个字节感谢JarkoDubbeldam

a #abcdefghijklmnopqrstuvwxy

引发Error: object 'a' not found27个字节的错误。

在线尝试!


2
a #abcdefghijklmnopqrstuvwxy的错误Error: object 'a' not found缩短了一个字节。
JAD

@JarkoDubbeldam谢谢。
朱塞佩

7

红宝石(33 32字节)

32字节

&
#abcdefghijklmnopqrstuvwxyz12

引发错误(假设文件名为“ a”):

31个字节

a:1: syntax error, unexpected &

编辑:通过使用&而不是<<感谢Eric节省了一个字节,他还提出了一个更短的Ruby解决方案:http : //codegolf.stackexchange.com/a/135087/65905


1
欢迎来到PPCG!
Martin Ender

@EricDuminil不错!我以为错误消息中引用了所有单个字符运算符,但是您是对的:&不是。整齐!另外,很好的发现与六角逃生。我一直在寻找语法错误以外的更短且没有堆栈痕迹的致命错误消息。
ameketa

@ameketa:我实际上编写了一个蛮力程序,并测试了每个可能的1、2和3字节的Ruby程序:D感谢您的链接。
艾里克·杜米尼尔

5

Brainf ** k,17个字节,此解释器

+++++++++++++++<<

Brainf ** k是一种简单的语言,几乎每个解释器都有不同的错误消息。这一次使用Memory Error: -1时,鼠标指针移动到左边太多,你尝试其他操作


我想选择口译员和选择语言一样,是挑战的一部分。
user72528

@ user72528在这里,我们通过其解释器定义一种语言,因此此挑战有点在于选择错误消息最短的解释器:)
HyperNeutrino

1
谁击败了脑干?没有人?好的。
暴民埃里克(Erik the Outgolfer)'17年

无与伦比的解决方案将是两个字节的解决方案,这将导致1个字符的错误。
扎卡里

@Zacharý当然可以笑
HyperNeutrino

5

普通Lisp,20字节

(/ 1 0))))))))))))))

在线尝试!

错误信息

/: division by zero

11
o_o Lisp中括号不平衡...您每天都会学到新东西。
扎卡里

1
如果将0替换为1,它将在括号中出错,但不会达到0的程度。我只需要添加比消息长的字符
Cheldon

5

TryAPL,11个字节

代码(11):

'abcdefghij

错误(10):

open quote

5

Javascript(Firefox),29 27字节

new Date('-').toISOString()

抛出RangeError: invalid date24个字节。已在Windows 10的Firefox 54.0.1上测试。


5

ZX Spectrum Basic,9个字节

RUN USR 8

产生:

错误信息

说明:

我(例外地)出于长度目的(包括行尾)计算程序的ASCII表示形式(这并不是很重要,因为我们总是可以用空格填充较短的程序)。

通常,ZX Spectrum错误消息比这更长并且更有帮助-位于0x0008的ROM例程期望在对RST 8。的机器代码调用之后出现错误代码,并从ROM中获取一些随机(确定性)字节,从而产生此无意义的错误消息M5是错误号,,由错误打印例程添加,并且0:1是错误的line:command位置。


实际上,无论如何实际上这通常是9个字节,因为ZX Spectrum在运行时不会评估数字,因此实际上有6个隐藏的字节可以直接访问8的二进制表示形式。
尼尔


4

Perl 5、5个字节

die$/

输出换行符,为一个字节。

在线尝试!


._。现在...如果在空文件上只有perl错误!
扎卡里

4
等待,这是否违反了“程序本身可能不会生成”的规定?我不明白那个规则在说什么。
aschepler '17

1
@Zacharý...给出总长度为负的错误消息?
aschepler '17

1
这可能是无效的......与否,取决于该OP是否意味着该错误错误信息
扎卡里

^澄清:无论是直接的程序错误或直接创建的错误消息
扎卡里

4

Perl 5、11个字节

由于我不清楚其他答案是否符合挑战规则,因此这是另一种选择。

#line 0
die

错误输出:

Died.

以换行符结尾,为6个字节。

在线尝试!

由于某些原因,Perl解释器内部函数Perl_mess_sv包含:

if (CopLINE(cop))
    Perl_sv_catpvf(aTHX_ sv, " at %s line %" IVdf,
                    OutCopFILE(cop), (IV)CopLINE(cop));

在哪里CopLINE(cop)获取当前代码上下文的行号。因此,如果该行号恰好为零,Perl将跳过向" at <filename> line <n>"错误消息添加常规行的操作。


1
对我来说似乎无效。IIRC die用于程序退出。
sergiol

1
那和python有raise什么不同?
埃里克·杜米尼尔

好吧,OP可能一直在指代生成错误错误消息。我评论了他的意思。
扎卡里

4

150字节的ArnoldC

IT'S SHOWTIME
HEY CHRISTMAS TREE b
YOU SET US UP 0
GET TO THE CHOPPER b
HERE IS MY INVITATION b
HE HAD TO SPLIT 0
ENOUGH TALK
YOU HAVE BEEN TERMINATED

在线尝试!

错误为94个字节(包括结尾的换行符):

Exception in thread "main" java.lang.ArithmeticException: / by zero
    at code.main(Hello.java)

保留,因为我认为这更有趣-破坏者:那是那些当下的少年恶作剧。

ArnoldC,280字节

IT'S SHOWTIME
HEY CHRISTMAS TREE BRBDoorBetterNotBeThosePeskyTeenagePranksters
YOU SET US UP 0
GET YOUR ASS TO MARS BRBDoorBetterNotBeThosePeskyTeenagePranksters
DO IT NOW
I WANT TO ASK YOU A BUNCH OF QUESTIONS AND I WANT TO HAVE THEM ANSWERED IMMEDIATELY
YOU HAVE BEEN TERMINATED

伪代码:

start program
new variable
set to 0
set new variable to output from function
call function
take input
end program

在线尝试!

生成“无输入”错误。(ArnoldC中几乎所有其他错误都包含很大的样板):

279个字节(包括结尾的换行符):

Exception in thread "main" java.util.NoSuchElementException
    at java.util.Scanner.throwFor(Scanner.java:862)
    at java.util.Scanner.next(Scanner.java:1485)
    at java.util.Scanner.nextInt(Scanner.java:2117)
    at java.util.Scanner.nextInt(Scanner.java:2076)
    at code.main(Hello.java)

4

TI-Basic,9个字节

最短的错误消息均为8个字节:ERR:DATEERR:MODEERR:STAT,和ERR:ZOOM。我没有考虑,ERR:DATE因为这在没有内部时钟的模型上不起作用。另外,我也没有这么做,ERR:ZOOM因为它似乎很难触发。

程序(9字节):

Seq:DrawInv X:::::

错误消息:ERR:MODE(8个字节)

程序(9字节):

median({1},{0::

错误消息:ERR:STAT(8个字节)


3

Ruby,25个字节

那是一个有趣的练习,谢谢!可能有一种方法可以通过SegFault获得更短的错误消息,但我找不到任何消息。

/\x
# Invalid hexa regexp

错误信息:

a:1: invalid hex escape

24个字节,包括结尾的换行符。

在线尝试!

Ruby,26个字节

这是我以前的答案:

08
# No 8 allowed in octal

错误信息:

a:1: Invalid octal digit

25个字节,包括结尾的换行符。


我认为您应该分开答案。
所罗门·乌科

@SolomonUcko:为什么要这么做?已经有很多答案。我只是想留下我以前的答案。人们通常只用<s> 26 </ s> 25来编辑字节数,但这通常是微小的更改。
埃里克·杜米尼尔

实际上,我不确定为什么要这么说,所以没关系。
所罗门·乌科

3

C ++(在macOS High Sierra beta上),23个字符

int main(){*(int*)0=0;}

输出:(22个字符)

Segmentation fault: 11

我不记得以前的macOS版本是否提供了更传统的Segmentation fault (core dumped)响应,但是在代码中添加空格以弥补这一点是微不足道的。

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.