Parece que alterações simples em um arquivo C ++, especialmente em modelos, podem gerar páginas de erros. Este concurso é para ver qual é o maior "estrondo", ou seja, o erro mais detalhado gerado com a menor alteração no código-fonte (adição de 1 caractere).
Como outros idiomas são mais saudáveis, isso será limitado ao C ++ e à versão 4.x do gcc.
Regras
O arquivo de origem original deve ser compilado com o gcc 4.9.2 para codificar o objeto sem erros.
Um caractere ASCII é adicionado ao código-fonte para criar um erro de digitação, aumentando o tamanho do arquivo em 1 byte.
O compilador é executado com opções padrão. Opções necessárias como
-c
e-std=c++11
são permitidas, opções como-Wall
não são.Métrica é
number of bytes of generated error messages ----------------------------------------------------------------------- (bytes of source code with typo) (length of filename passed to compiler)
As respostas serão validadas com http://ideone.com/ C ++ 4.9.2.
Exemplo:
O nome do arquivo é a.cpp
5 bytes.
int foo();
Compilação de trabalho
gcc -c a.cpp
Código fonte corrompido:
in t foo();
Falha na compilação
$ gcc -c a.cpp
a.cpp:1:1: error: ‘in’ does not name a type
in t foo();
^
$ gcc -c a.cpp |& -c wc
64
$ wc -c a.cpp
12 a.cpp
Pontuação: 64/12/5 = 1.0666
Melhor tentativa: inserir {
entre parênteses defoo()
$ gcc -c a.cpp |& wc -c
497
Nova pontuação: 497/12/5 = 8.283
Boa sorte!
ATUALIZAR
Encorajo as pessoas a ignorarem a implementação recursiva. Isso tecnicamente vence, mas não faz parte do espírito do concurso.
ATUALIZAÇÃO 2
Como muitas pessoas notaram, o concurso provavelmente teria sido mais interessante se o pré-processador C não fosse permitido. Por isso, gostaria de incentivar as pessoas a postar soluções que não usam comandos de pré-processador. Isso implica no uso de nenhum arquivo de cabeçalho, pois #include
não é permitido!
No que diz respeito ao uso do IDEONE para validar, você pode usar a saída IDEONE diretamente (e o nome da fonte como prog.cpp
), ou pode executar a saída IDEONE através de uma pesquisa global e substituir ( s/prog.cpp/a.cc/
por exemplo) e fingir que conseguiu defina o nome do arquivo diretamente.
ATUALIZAÇÃO 3
Como as pessoas apontaram, o Ideone é um pouco restritivo demais, exigindo ligação e não apenas criação de arquivo de objeto. Como este concurso é apenas para diversão, seja honesto e especifique o que você usou para obter sua pontuação. Use o ideone ou use a versão mais compacta (todos os padrões) do gcc 4.9.2, como você pode reunir. O objetivo do concurso é conscientizar a importância das mensagens de erro do C ++.
fonte
Respostas:
gcc 4.5.2, Pontuação: 8579.15 (ou 14367.49 para o nome de arquivo "aC", pode ser atualizado posteriormente)
O arquivo original, 29 bytes, compila limpo (a.cpp):
Arquivo modificado, 30 bytes:
Erros:
Ponto:
1286873 / (30 * 5) = 8579,15
Cabeça e cauda da saída de erro:
Nota:
- Se
.C
acabar se qualificando como uma extensão válida , a pontuação será 1.206.869 / (28 * 3) = 14.367,49.- Se o segundo #include sugerido por Dennis for adicionado, o nome do arquivo "a.cpp", a pontuação é 80.797.292.934 / (46 * 5) = 351.292.578,97
fonte
#include"a.cpp"
.#include
sozinha. Quanto a ser infinito ... se ainda estiver funcionando quando acordo amanhã de manhã, é infinito o suficiente para mim. Mantê-lo informado, ha (embora, é atualmente tubulação 5,1MB / seg parawc
, então sewc
está usando um contador de 32 bits, pelos meus cálculos algo estranho pode acontecer em cerca de 13 minutos.)gcc 4.9.2, pontuação:
222.898.664663.393.783Isso é fortemente baseado na resposta de @ JasonC , mas ele disse que não queria levar o crédito por essa melhoria.
A saída de erro do código abaixo tem 126.044.818.789 bytes. A pontuação deve ser muito maior em teoria (e tender ao infinito à medida que o número de instruções de inclusão aumenta), mas diminui na prática adicionando mais instruções de inclusão.
Arquivo original (37 bytes)
Arquivo modificado (38 bytes)
fonte
#include
limite de aninhamento de 200 níveis, para que seus#include
s recursivos se tornem efetivamente um contador binário de 200 bits.gcc, 4.9.2, Pontuação: 22.2
Arquivo original: 0 bytes (a.cpp)
Compila limpo:
Arquivo modificado:
Erros:
Ponto
111/1/5 = 22,2
fonte
11.126,95
9.105,442.359,371.645,94266,88pontosMais abuso do pré-processador! Desta vez, estamos fazendo a biblioteca padrão chorar.
Sem erro de digitação:
Com erro de digitação:
Erros:
[RECORTE]
Na minha máquina Ubuntu,
g++-4.9 -std=c++11 -c a.C
gera 1.101.568 bytes de erros gloriosos, para uma pontuação de 1101568/33/3 = 11.126,95.fonte
#define
oferece mais pontos.typedef
port;
. Agora você não apenas quebra todos os usos,typedef
mas também recebe muitos erros "t não nomeia um tipo". Ou%;
para produzir "ID não qualificado esperado antes de% token".#define typename *
e#define int class std
parecia gerar muito mais erros.62,93 pontos
Apenas alguma meta magia negra em C ++, compilada com
g++-4.8 -c -std=c++11 a.cc
:Ungolfed:
O G ++ possui um limite de recursão de 900, portanto, mudar
B<1>
paraB<-1>
um intervalo de 31 bits tem um ... efeito interessante.\n
alguns editores de texto adicionam automaticamente,vim
não o fazem).a.cc
-ftemplate-backtrace-limit=0
troca. Também significaria 3185 pontos para mim!std::unique_ptr
é apenas a classe de modelo que consegue emitir a mensagem de erro mais longa, encontrada por tentativa e erro e conhecimento do STL, gatos e outras coisas.fonte
Pontuação 7.865
A rigor, a resposta de 0 byte NÃO está correta, pois o ideone.com se recusará a compilar o arquivo sem erros. O mesmo acontece com o exemplo
int foo();
- ele não será compilado no ideone.com (não consigo comentar por falta de reputação ...)Portanto, o menor programa possível para compilar sem nenhum
#includes
é o seguinte:Se você alterar isso para o código a seguir, ele falhará com 409 bytes de código de erro (após renomear prog.cpp para a.cc a partir da saída ideone.com):
409 / (13 * 4) = 7,865
Atualize a pergunta de acordo, pois os exemplos dados não respeitam as regras especificadas ...
fonte
C, nomeado como
.cc
Erro de código:
fonte
main(){}
sim, mas não tenho certeza) Além disso, isso não é apenas uma melhoria da resposta acima? Embora você possa certamente manter essa resposta, se foi inspirada pela resposta de @ StefanM, você deve mencionar isso. Finalmente, agora que você tem 50 representantes, pode comentar em qualquer lugar.Pontuação 12.xx (erro APAGANDO um personagem)
Por favor, perdoe a quebra da regra 2 (adicionar ou excluir um personagem do IMHO seria dentro do espírito da regra), mas isso aconteceu comigo acidentalmente (portanto, não usa truques abusivos 'intencionalmente') ao escrever Real Code (TM) - o código de trabalho e o código causador de erros são (ou parecem) simples e diretos, por isso achei interessante o suficiente para incluir aqui. Código original
Código que gera o erro (último '<' excluído, para que pareça uma comparação menor que, mas nãoooooooooooo ...)
São 'apenas' 8241 bytes de mensagens de erro do compilador em ideone.com g ++ 4.3.2.
fonte