编写最短的程序,生成最多的编译器警告和错误


42

挑战:

编写一个非常简短的程序,该程序在编译时会创建最多数量的编译器警告和错误。可以用任何编程语言编写。

得分:

分数由以下公式确定:errors_and_warnings_length/code_length。最高分获胜。

例:

C#程序的class长度为5个字符,并生成3个警告,得分为(1/5)* 3 = 0.6。

编辑:

由于某些混淆,程序必须至少为1个字符长。否则它将得到无穷大。


17
虽然我喜欢这个概念,但我发现该指标有点令人担忧。什么编译器?有哪些设置(尤其是关于警告的设置)?我的意思gcc -Wall -pedantic是与普通ol gcc非常不同,tcc可能与某些其他c编译器不同。
dmckee 2012年

2
刚刚得到一个编译器在俄罗斯或德语,你会得到一些长期的错误(没有双关语意)
ζ--

2
我希望看到除C / C ++之外的其他语言的答案。
肯·布鲁姆

4
如果挑战是产生尽可能多的不同错误,我将很喜欢
Hannesh 2012年

3
啊 否则,其分数将不确定
wizzwizz4 2016年

Answers:


94

GCC,得分2200 /36≈4.5×10 58

#include __FILE__
#include __FILE__

我实际上尚未完成这段代码的编译,但是基于测试和简单的数学计算,它应该总共产生2 200个 #include nested too deeply错误。

当然,该程序可以轻松扩展。添加第三行可使得分提高到3 200 /54≈4.9×10 93。四行给出4 200 /72≈3.6×10 118,依此类推。


6
非常聪明的答案。+1
约翰·卫斯理亲王

5
我非常聪明地同意,但是我认为这是1个错误(“嵌套太深”),而不是回溯的每一行都有单独的错误。
凯文(Kevin)

1
@Kevin:需要明确的是,它应该产生2²⁰⁰倍的错误,对于可能达到嵌套限制的每条路径一次。每个错误包括200行回溯,这一事实使输出变得更加冗长。
Ilmari Karonen

1
嗯 昨晚我尝试发誓时,我发誓gcc在出现1个错误后获得了保释,但现在看来它正在运行更多打印。异议撤回。顺便说一句,c标准是200?
凯文(Kevin)

1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html:“ #include为了避免失控递归,我们对[嵌套] 施加了200个级别的任意限制。该标准至少需要15 个级别水平。”
zwol 2014年

48

C,0个字符-分数=(1/0)* 1 =无穷大



产生1个错误:

/usr/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status

注意:http//ideone.com/xdoJyA


49
1/0是未定义的,不是“无限”。
Frank

3
+1即使未定义1/0,也明显大于一个1除以任何更大的数字。0拿蛋糕。
jnm2 2012年

6
@ jnm2不确定。1/0是未定义的,尽管右侧接近+无穷大,但根本没有定义1/0。
kaoD 2012年

5
由于领域是积极的,所以我认为我所说的是有道理的。理论很有趣,但是我认为我们需要一些常识。请记住,编译器错误最多,代码最少。限制很明显。
jnm2 2012年

15
1.0 / 0.0 = + INF,至少根据IEEE 754 :)因此,您只需要在浮点数中进行计算即可。
基思·兰德尔

19

海湾合作委员会(GCC),得分5586.6(如果需要,还可以更高)

179个字符,1000003个警告/错误(使用-Wall

#define E a,a,a,a,a,a,a,a,a,a
#define D E,E,E,E,E,E,E,E,E,E
#define C D,D,D,D,D,D,D,D,D,D
#define B C,C,C,C,C,C,C,C,C,C
#define A B,B,B,B,B,B,B,B,B,B
_(){A,A,A,A,A,A,A,A,A,A}

当然,这可以任意扩展。例如,使用10 #define而不是5而不是10而不是10会导致得分大约为(20 ** 10)/(179 * 4)= 14301675977.65(并且需要花费一些时间才能运行) ;)


7
使用#define X(A) A,A,A,A,A,A,AX(X(X(X(X(X(A))))))您可以更快地复制代码。
ugoren

12

海湾合作委员会两次,86

我的系统上有22个字符,1898个错误+警告。
我相信通过选择名称较短的较长文件,可以大大改善这种方法。

#include</usr/bin/gcc>

3
/usr/bin/gdb明显更大(550万对760K),但是/vmlinuz560万可能是最好的选择。
wchargin 2015年

12

HQ9 ++,1((n + 29)/ n的限制)

下面Warning: this is not a quine针对代码中的每个Q 发出警告。

QQQQQ...Q
Warning: this is not a quine

小就是好吧?嗯...


FWIW,这是个玩笑。如果那不是很明显。
2012年

10

C,.727

11个字符,5个错误,3个警告,(1/11)* 8 = .727273

m(;){@,x}2

cc -g -Wall    er.c   -o er
er.c:1: error: expected declaration specifiers or '...' before ';' token
er.c:1: warning: return type defaults to 'int'
er.c: In function 'm':
er.c:1: error: stray '@' in program
er.c:1: error: expected expression before ',' token
er.c:1: error: 'x' undeclared (first use in this function)
er.c:1: error: (Each undeclared identifier is reported only once
er.c:1: error: for each function it appears in.)
er.c:1: warning: left-hand operand of comma expression has no effect
er.c:1: warning: control reaches end of non-void function
er.c: At top level:
er.c:1: error: expected identifier or '(' before numeric constant


我算出5个错误,外加3个警告
2012年

我想你是对的。我在数“错误:”和“警告:”字符串。
luser droog 2012年

5
我认为,如果我们仅计算不同的错误/警告,您将获胜。
ugoren

如果在命令行上使用-Werror,则会将警告升级为错误。而且,使用哪个C编译器会影响报告的错误数(或者-Werror是否可用,等等。) 人们可能会说,调用的命令行长度可能会算作“程序”长度的一部分...每个平台上的编译器版本都是单独的类别。:-)
Rebmu博士18年

8

NASM,得分63/40 * 2 ^ 32≈2.905 * 10 ^ 19

%rep 1<<32
%rep 1<<32
!
%endrep
%endrep

将输出c.asm:3: error: label or instruction expected at start of line2 ^ 64次。同样,这很容易扩展到更大的输出。


2

C ++ 98(211字节) g ++-5(Ubuntu 5.2.1-23ubuntu1〜12.04)5.2.1 0151031

我想看看在不使用预处理器的情况下在C ++中的表现如何。该程序产生2,139,390,572字节的输出,其中大多数是单个错误消息。

template<int i,class S,class T>struct R{typedef R<i,typename R<i-1,S,S>::D,typename R<i-1,S,S>::D>D;};template<class S,class T>struct R<0,S,T>{typedef S D;};void f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}

me@Basement:~/src/junk$ ls -l a.C
-rw-rw-r-- 1 me me 211 Apr 27 21:44 a.C
me@Basement:~/src/junk$ g++-5 a.C -fmax-errors=1 2>a.C.errors.txt
me@Basement:~/src/junk$ ls -l a.C.errors.txt 
-rw-rw-r-- 1 me me 2139390572 Apr 27 22:01 a.C.errors.txt

取消高尔夫:

template <int i, class S, class T>
struct R {
    typedef R<i, typename R<i-1,S,S>::D, typename R<i-1,S,S>::D> D;
};
template <class S, class T>
struct R<0, S, T> {
    typedef S D;
};
void f() {
    R<27, float, R<24, int*const*, int>::D>::D &E = 4;
}

该程序通过定义一个递归结构模板R来工作,该模板包含一个包含两个R副本的typedefD。这将导致类型名称成指数增长,并在错误消息中完整打印出来。不幸的是,g ++似乎在尝试打印长度超过(1 << 31)字节的错误消息时感到窒息。2,139,390,572字节是我在不超过限制的情况下可以达到的最接近字节。我很好奇是否有人可以调整递归限制和参数类型27, float, 24, int*const*以更接近限制(或找到可以打印更长错误消息的编译器)。

错误消息摘录:

a.C: In function ‘void f()’:
a.C:1:208:  error:  invalid  initialization  of non-const reference of type
‘R<27, float, R<24, R<23, R<22, R<21, R<20, R<19, R<18, R<17, R<16, R<15,
R<14,  R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5, R<4, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*,  int*  const*>,  R<1, int* const*, int* const*> > >, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*,  int* const*>, R<1, int* const*, int* const*> > > >, R<4, R<3, R<2,
R<1, int* const*, int* const*>, R<1,
...
int*  const*,  int*  const*>  > > > > > > > > > > > > > > > > > > > > > > >
>::D& {aka R<27, R<26, R<25, R<24, R<23,  R<22,  R<21,  R<20,  R<19,  R<18,
R<17,  R<16,  R<15,  R<14, R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5,
R<4, R<3, R<2, R<1, float, float>, R<1, float, float> >, R<2,  R<1,  float,
float>,  R<1,  float, float> > >, R<3, R<2, R<1, float, float>, R<1, float,
float> >, R<2, R<1, float, float>, R<1, float, float> > > >, R<4, 
...
, R<1, float, float>, R<1, float, float> > >, R<3, R<2, R<1, float, float>,
R<1, float, float> >, R<2, R<1, float, float>, R<1, float, float> > > > > >
>  >  >  >  >  >  > > > > > > > > > > > > > > >&}’ from an rvalue of type
‘int’
    template<int    i,class   S,class   T>struct   R{typedef   R<i,typename
R<i-1,S,S>::D,typename  R<i-1,S,S>::D>D;};template<class  S,class  T>struct
R<0,S,T>{typedef                         S                         D;};void
f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}


                                                        ^
compilation terminated due to -fmax-errors=1.

2,139,390,572字节/ 211字节= 10,139,291.8


这就是为什么我总是使用STLfilt的原因。欢迎使用PPCG!这是一个很棒的初稿!
Mego

1
不幸的是,我似乎误解了挑战。似乎提交是根据错误消息的数量而不是字节数来计分的。显然我的1错误条目不是很有竞争力。也许我的答案应该移到这里
计算螺母

-1

SmileBASIC,1/1 = 1

A

产生错误 Syntax Error in 0:1


SB一次只会产生一个错误,因此,这实际上是您可以做出的唯一答案。
snail_
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.