Escreva o programa mais curto que gere mais avisos e erros do compilador

42

O desafio:

Escreva um programa muito curto que, quando compilado, crie a maior quantidade de avisos e erros do compilador. Pode ser escrito em qualquer linguagem de programação.

Pontuação:

A pontuação é determinada por esta equação: errors_and_warnings_length/code_length. Maior pontuação ganha.

Exemplo:

O programa C # classtem 5 caracteres e gera 3 avisos, com uma pontuação de (1/5) * 3 = 0,6.

EDITAR:

Por causa de alguma confusão, os programas precisam ter pelo menos 1 caractere. Caso contrário, obteria uma pontuação infinita.

MD XF
fonte
17
Enquanto eu gosto do conceito, acho a métrica um pouco preocupante. Qual compilador? Quais configurações (especialmente em relação aos avisos)? Quero dizer, gcc -Wall -pedanticé muito diferente do comum ol` gccé diferente de tccpresumivelmente diferente de algum outro compilador c.
dmckee
2
Basta obter um compilador em russo ou alemão; você obtém alguns erros LONGOS (sem trocadilhos)
13-12
2
Eu adoraria ver respostas em outros idiomas além do C / C ++.
Ken Bloom
4
Eu teria gostado se o desafio era gerar tantas diferentes erros possível
Hannesh
3
Ahem. Caso contrário, sua pontuação seria indefinida .
Wizzwizz4

Respostas:

94

GCC, pontuação de 2 200 /36 ≈ 4,5 × 10 58

#include __FILE__
#include __FILE__

Na verdade, eu não terminei de compilar esse código, mas com base em testes e em matemática simples, ele deve produzir um total de 2 200 #include nested too deeply erros.

Obviamente, o programa é trivialmente extensível. Adicionando uma terceira linha traz a pontuação até 3 200 /54 ≈ 4,9 × 10 93 . Quatro linhas dar 4 200 /72 ≈ 3,6 × 10 118 , e assim por diante.

Ilmari Karonen
fonte
6
Resposta muito inteligente. +1
Prince John Wesley
5
Concordo muito, mas consideraria isso como 1 erro ("aninhado muito profundamente"), não como um erro separado para cada linha do backtrace.
22412 Kevin
11
@ Kevin: Só para esclarecer, ele deve produzir esse erro 2²⁰⁰ vezes, uma vez para cada caminho possível pelo qual o limite de aninhamento pode ser atingido. O fato de cada erro também incluir 200 linhas de backtrace apenas torna a saída ainda mais detalhada.
Ilmari Karonen
11
Hmm. Eu poderia jurar quando tentei ontem à noite que o gcc foi liberado após 1 erro, mas parece estar executando a impressão mais agora. Objeção retirada. Aliás, é 200 do padrão c?
22712 Kevin
11
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html : "Nós impomos um limite arbitrário de 200 níveis [de aninhados #include], para evitar recursões descontroladas. O padrão requer pelo menos 15 níveis ".
Zwol
48

C, 0 caracteres - Pontuação = (1/0) * 1 = Infinito



gera 1 erro:

/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

Nota: http://ideone.com/xdoJyA

l0n3sh4rk
fonte
49
1/0 é indefinido, não "infinito".
31412 Frank
3
+1 Mesmo que 1/0 seja indefinido, é comprovadamente maior que um dividido por qualquer número maior. 0 pega o bolo.
jnm2
6
@ jnm2 não tenho certeza disso. 1/0 é indefinido e, embora o lado direito se aproxime + infinito, isso não faz com que 1/0 seja definido.
KaoD 12/12/12
5
Como o domínio é positivo, acho que o que eu disse faz sentido. A teoria é divertida, mas acho que precisamos de algum senso comum aqui. Lembre-se dos erros de maior compilador para a menor quantidade de código. O limite é óbvio.
Jnm2 12/12
15
1.0 / 0.0 = + INF, pelo menos de acordo com a IEEE 754 :) Portanto, você só precisa fazer o cálculo em ponto flutuante.
Keith Randall
19

GCC, pontuação 5586,6 (e mais, se necessário)

179 caracteres, 1000003 avisos / erros (usando -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}

Isso pode ser estendido arbitrariamente, é claro. Por exemplo, usar 10 #defines em vez de 5 e um comprimento de 20 "chamadas" em vez de 10 levaria a uma pontuação de aproximadamente (20 ** 10) / (179 * 4) = 14301675977.65 (e levaria algum tempo para ser executado ;)

schnaader
fonte
7
Usando #define X(A) A,A,A,A,A,A,Ae X(X(X(X(X(X(A))))))você pode duplicar o código muito mais rapidamente.
Ugoren
12

GCC duas vezes, 86

22 caracteres, 1898 erros + avisos no meu sistema.
Tenho certeza de que essa abordagem pode ser muito melhorada, escolhendo arquivos mais longos com nomes mais curtos.

#include</usr/bin/gcc>
Ugoren
fonte
3
/usr/bin/gdbé significativamente maior (5,5 milhões vs 760 mil), mas /vmlinuz5,6 milhões pode ser sua melhor aposta.
precisa saber é
12

HQ9 ++, 1 (limite de (n + 29) / n)

A seguir, emite o aviso Warning: this is not a quinepara cada Q no código.

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

Pequeno é bom, certo? Hmm...

boothby
fonte
FWIW, isso é uma piada. Se isso não fosse óbvio.
Boothby
10

C, .727

11 caracteres, 5 erros, 3 avisos, (1/11) * 8 = 0,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

luser droog
fonte
Conto 5 erros, mais 3 avisos
Kevin
Suponho que você esteja certo. Eu estava contando as seqüências "error:" e "warning:".
Luser droog
5
Eu acho que você vence se contarmos apenas erros / avisos diferentes.
Ugoren
Se -Werror for usado na linha de comandos, os avisos serão promovidos para erros. E também, qual o compilador C usado afetará o número de erros relatados (ou se -Werror está disponível etc.). Pode-se argumentar que o comprimento da linha de comando para invocação pode ser contado como parte do comprimento do "programa" ... e cada A versão do compilador em cada plataforma é uma categoria separada. :-)
Dr. Rebmu
8

NASM, pontuação 63/40 * 2 ^ 32 ≈ 2.905 * 10 ^ 19

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

Produzirá c.asm:3: error: label or instruction expected at start of line2 ^ 64 vezes. Novamente, isso é facilmente extensível a saídas muito maiores.

cópia de
fonte
2

C ++ 98 (211 bytes) g ++ - 5 (Ubuntu 5.2.1-23ubuntu1 ~ 12.04) 5.2.1 0151031

Eu queria ver o quão bem eu poderia fazer em C ++ sem usar o pré-processador. Este programa produz 2.139.390.572 bytes de saída, a maioria dos quais é uma única mensagem de erro.

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

Ungolfed:

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;
}

Este programa funciona definindo um modelo de estrutura recursiva R que contém um typedef D contendo duas cópias de R. Isso resulta em um nome de tipo que cresce exponencialmente, que é impresso na íntegra na mensagem de erro. Infelizmente, o g ++ parece engasgar ao tentar imprimir uma mensagem de erro maior que (1 << 31) bytes. 2.139.390.572 bytes foi o mais próximo que pude chegar ao limite sem ultrapassar. Estou curioso 27, float, 24, int*const*para saber se alguém pode ajustar os limites de recursão e os tipos de parâmetros para se aproximar do limite (ou encontrar um compilador que possa imprimir uma mensagem de erro ainda mais longa).

Trechos da mensagem de erro:

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 bytes / 211 bytes = 10.139.291,8

Calculando a porca
fonte
É por isso que eu sempre uso o STLfilt ... Bem-vindo ao PPCG! Esta é uma ótima primeira submissão!
Mego
11
Infelizmente, parece que eu não entendi o desafio; parece que os envios são pontuados pelo número de mensagens de erro, não pela contagem de bytes. Obviamente, minha entrada de 1 erro não é muito competitiva. Talvez a minha resposta deve ser movido aqui
Cálculo Nut
-1

SmileBASIC, 1/1 = 1

A

Gera o erro Syntax Error in 0:1

12Me21
fonte
O SB sempre gera apenas um erro de cada vez; portanto, essa é realmente a única resposta que você pode fazer.
snail_