挑战:
编写一个非常简短的程序,该程序在编译时会创建最多数量的编译器警告和错误。可以用任何编程语言编写。
得分:
分数由以下公式确定:errors_and_warnings_length/code_length
。最高分获胜。
例:
C#程序的class
长度为5个字符,并生成3个警告,得分为(1/5)* 3 = 0.6。
编辑:
由于某些混淆,程序必须至少为1个字符长。否则它将得到无穷大。
编写一个非常简短的程序,该程序在编译时会创建最多数量的编译器警告和错误。可以用任何编程语言编写。
分数由以下公式确定:errors_and_warnings_length/code_length
。最高分获胜。
C#程序的class
长度为5个字符,并生成3个警告,得分为(1/5)* 3 = 0.6。
由于某些混淆,程序必须至少为1个字符长。否则它将得到无穷大。
Answers:
#include __FILE__
#include __FILE__
我实际上尚未完成这段代码的编译,但是基于测试和简单的数学计算,它应该总共产生2 200个 #include nested too deeply
错误。
当然,该程序可以轻松扩展。添加第三行可使得分提高到3 200 /54≈4.9×10 93。四行给出4 200 /72≈3.6×10 118,依此类推。
#include
为了避免失控递归,我们对[嵌套] 施加了200个级别的任意限制。该标准至少需要15 个级别水平。”
产生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
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(并且需要花费一些时间才能运行) ;)
#define X(A) A,A,A,A,A,A,A
,X(X(X(X(X(X(A))))))
您可以更快地复制代码。
我的系统上有22个字符,1898个错误+警告。
我相信通过选择名称较短的较长文件,可以大大改善这种方法。
#include</usr/bin/gcc>
/usr/bin/gdb
明显更大(550万对760K),但是/vmlinuz
560万可能是最好的选择。
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
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
gcc -Wall -pedantic
是与普通olgcc
非常不同,tcc
可能与某些其他c编译器不同。