Erro de digitação de 1 caractere, gerando a maioria das mensagens de erro da compilação C ++

51

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

  1. O arquivo de origem original deve ser compilado com o gcc 4.9.2 para codificar o objeto sem erros.

  2. Um caractere ASCII é adicionado ao código-fonte para criar um erro de digitação, aumentando o tamanho do arquivo em 1 byte.

  3. O compilador é executado com opções padrão. Opções necessárias como -ce -std=c++11são permitidas, opções como -Wallnão são.

  4. Métrica é

        number of bytes of generated error messages
        -----------------------------------------------------------------------
        (bytes of source code with typo) (length of filename passed to compiler)
    
  5. As respostas serão validadas com http://ideone.com/ C ++ 4.9.2.

Exemplo:

O nome do arquivo é a.cpp5 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 #includenã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 ++.

Mark Lakata
fonte
Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo . Como alternativa, para discussões sobre o que deve ou não contar como duplicado , leve a discussão para meta .
Martin Ender
Três problemas com o uso de ideone para validar: Força o nome do arquivo de origem para "prog.cpp", trunca a saída de erro do compilador para 64kB e vincula, adicionando erros extras. Portanto, não será uma boa ferramenta de validação.
Jason C
Estou usando o GCC 4.9.2 no repositório Ubuntu de teste de cadeia de ferramentas.
N15:
O que são opções padrão? Tanto quanto eu sei, você pode configurar as opções padrão do gcc em tempo de compilação.
FUZxxl
2
Traz memórias para trás: a partir de por volta de 1975 o nosso professor de física publicou um anuais "a maioria dos erros de 10 (mão) perfurados cartões de Fortran" competição ...
TripeHound

Respostas:

45

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):

#if 0
#include"a.cpp"
#endif

Arquivo modificado, 30 bytes:

#iff 0
#include"a.cpp"
#endif

Erros:

$ gcc -c a.cpp 2>&1 | wc -c
1286873

Ponto:

1286873 / (30 * 5) = 8579,15

Cabeça e cauda da saída de erro:

a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:

... And so on, backing out with second error after max include depth:

a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0:
a.cpp:3:2: error: #endif without #if
a.cpp:3:2: error: #endif without #if

Nota:
- Se .Cacabar 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

Jason C
fonte
2
A pergunta diz para adicionar um personagem, não para substituí-lo.
Dennis
3
@ Dennis Oh cara. Eu tenho esse. Assista a esta segunda edição. Seu comentário foi uma bênção disfarçada.
Jason C
11
@JasonC Eu não posso aprovar isso muitas vezes.
Isaacg
9
Eu acho que você pode reivindicar uma pontuação infinita se adicionar um segundo #include"a.cpp".
Dennis
3
@ Dennis Whoa, que bom! Vou deixar a resposta como está, pois não pensei em adicionar um segundo #includesozinha. 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 para wc, então se wcestá usando um contador de 32 bits, pelos meus cálculos algo estranho pode acontecer em cerca de 13 minutos.)
Jason C
31

gcc 4.9.2, pontuação: 222.898.664 663.393.783

Isso é 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)

/*#
#include"w.cpp"
#include"w.cpp"*/
$ gcc -c w.cpp
$

Arquivo modificado (38 bytes)

/
*#
#include"w.cpp"
#include"w.cpp"*/
$ gcc -c w.cpp
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3,
                 from w.cpp:3:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3,
                 from w.cpp:3,
                 from w.cpp:3:
⋮
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
w.cpp:3:0: error: #include nested too deeply
 #include"w.cpp"
 ^
w.cpp:4:0: warning: extra tokens at end of #include directive
 #include"w.cpp"*/
 ^
w.cpp:4:0: error: #include nested too deeply
w.cpp:2: confused by earlier errors, bailing out
The bug is not reproducible, so it is likely a hardware or OS problem.
Dennis
fonte
6
Tecnicamente, isso não produzirá uma saída infinita , embora, com a tecnologia de computador atual (ou previsível), você não viva o suficiente para vê-la parar. Basicamente, o GCC tem um #includelimite de aninhamento de 200 níveis, para que seus #includes recursivos se tornem efetivamente um contador binário de 200 bits.
Ilmari Karonen
3
Basta adicionar mais linhas de inclusão para obter uma pontuação infinita. O tamanho da saída cresce mais rápido que o código.
jimmy23013
Poderia igualmente ter sido baseado em uma das respostas de uma pergunta anterior .
Peter Taylor
2
Ele fez terminar esta manhã, com algum número enorme que começou com um 8, e eu acidentalmente fechou a janela antes de copiar o número , porque eu sou impressionante. Estou executando novamente.
Jason C
3
@JasonC Também executei e obtive uma saída de 77.877.399.160 bytes. Isso é muito menos infinito do que eu esperava, então vou executá-lo novamente com um nome de arquivo mais curto.
Dennis
25

gcc, 4.9.2, Pontuação: 22.2

Arquivo original: 0 bytes (a.cpp)

Compila limpo:

$ gcc -c a.cpp |& wc -c
0

Arquivo modificado:

(

Erros:

$ gcc -c a.cpp |& wc -c
111

Ponto

111/1/5 = 22,2

Mark Lakata
fonte
4
Você já fez isso com força bruta? Quero dizer, essa é a pontuação mais alta para um arquivo inicial de 0 byte?
Thomas Weller
Não, eu não forcei isso. Eu apenas tentei 3 ou 4 caracteres diferentes. Este foi apenas uma resposta semente para as pessoas interessadas no concurso :)
Mark Lakata
23

11.126,95 9.105,44 2.359,37 1.645,94 266,88 pontos

Mais abuso do pré-processador! Desta vez, estamos fazendo a biblioteca padrão chorar.

Sem erro de digitação:

#define typedf
#include<fstream>

Com erro de digitação:

#define typedef
#include<fstream>

Erros:

In file included from /usr/include/c++/4.9/iosfwd:39:0,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/c++/4.9/bits/stringfwd.h:62:33: error: aggregate ‘std::basic_string<char> std::string’ has incomplete type and cannot be defined
   typedef basic_string<char>    string;   
                                 ^
/usr/include/c++/4.9/bits/stringfwd.h:68:33: error: aggregate ‘std::basic_string<wchar_t> std::wstring’ has incomplete type and cannot be defined
   typedef basic_string<wchar_t> wstring;   
                                 ^
/usr/include/c++/4.9/bits/stringfwd.h:78:34: error: aggregate ‘std::basic_string<char16_t> std::u16string’ has incomplete type and cannot be defined
   typedef basic_string<char16_t> u16string; 
                                  ^
/usr/include/c++/4.9/bits/stringfwd.h:81:34: error: aggregate ‘std::basic_string<char32_t> std::u32string’ has incomplete type and cannot be defined
   typedef basic_string<char32_t> u32string; 
                                  ^
In file included from /usr/include/wchar.h:36:0,
                 from /usr/include/c++/4.9/cwchar:44,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/stdio.h:48:25: error: aggregate ‘_IO_FILE FILE’ has incomplete type and cannot be defined
 typedef struct _IO_FILE FILE;
                         ^
/usr/include/stdio.h:64:25: error: aggregate ‘_IO_FILE __FILE’ has incomplete type and cannot be defined
 typedef struct _IO_FILE __FILE;
                         ^
In file included from /usr/include/c++/4.9/cwchar:44:0,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/wchar.h:106:9: error: ‘__mbstate_t’ does not name a type
 typedef __mbstate_t mbstate_t;
         ^
/usr/include/wchar.h:151:38: error: ‘size_t’ is not a type
     const wchar_t *__restrict __src, size_t __n)
                                      ^
/usr/include/wchar.h:159:38: error: ‘size_t’ is not a type
     const wchar_t *__restrict __src, size_t __n)
                                      ^
/usr/include/wchar.h:166:63: error: ‘size_t’ is not a type
 extern int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
                                                               ^
/usr/include/wchar.h:176:4: error: ‘size_t’ is not a type
    size_t __n) __THROW;
    ^
In file included from /usr/include/wchar.h:180:0,
                 from /usr/include/c++/4.9/cwchar:44,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/xlocale.h:42:9: error: ‘__locale_t’ does not name a type
 typedef __locale_t locale_t;
         ^
In file included from /usr/include/c++/4.9/cwchar:44:0,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/wchar.h:183:5: error: ‘__locale_t’ is not a type
     __locale_t __loc) __THROW;
     ^
/usr/include/wchar.h:186:6: error: ‘size_t’ is not a type
      size_t __n, __locale_t __loc) __THROW;
      ^
/usr/include/wchar.h:186:18: error: ‘__locale_t’ is not a type
      size_t __n, __locale_t __loc) __THROW;
                  ^
/usr/include/wchar.h:196:8: error: ‘size_t’ does not name a type
 extern size_t wcsxfrm (wchar_t *__restrict __s1,
        ^
/usr/include/wchar.h:207:9: error: ‘__locale_t’ is not a type
         __locale_t __loc) __THROW;
         ^
/usr/include/wchar.h:212:8: error: ‘size_t’ does not name a type
 extern size_t wcsxfrm_l (wchar_t *__s1, const wchar_t *__s2,
        ^
/usr/include/wchar.h:252:8: error: ‘size_t’ does not name a type
 extern size_t wcscspn (const wchar_t *__wcs, const wchar_t *__reject)
        ^
/usr/include/wchar.h:256:8: error: ‘size_t’ does not name a type
 extern size_t wcsspn (const wchar_t *__wcs, const wchar_t *__accept)
        ^
/usr/include/wchar.h:287:8: error: ‘size_t’ does not name a type
 extern size_t wcslen (const wchar_t *__s) __THROW __attribute_pure__;
        ^
/usr/include/wchar.h:306:8: error: ‘size_t’ does not name a type
 extern size_t wcsnlen (const wchar_t *__s, size_t __maxlen)
        ^

[RECORTE]

/usr/include/c++/4.9/bits/fstream.tcc:934:35: error: ‘cur’ is not a member of ‘std::ios_base’
    __testvalid = this->seekoff(0, ios_base::cur, _M_mode)
                                   ^
/usr/include/c++/4.9/bits/fstream.tcc:934:50: error: ‘_M_mode’ was not declared in this scope
    __testvalid = this->seekoff(0, ios_base::cur, _M_mode)
                                                  ^
/usr/include/c++/4.9/bits/fstream.tcc:941:25: error: ‘_M_state_last’ was not declared in this scope
    + _M_codecvt->length(_M_state_last, _M_ext_buf,
                         ^
/usr/include/c++/4.9/bits/fstream.tcc:944:15: error: ‘streamsize’ does not name a type
         const streamsize __remainder = _M_ext_end - _M_ext_next;
               ^
/usr/include/c++/4.9/bits/fstream.tcc:945:13: error: ‘__remainder’ was not declared in this scope
         if (__remainder)
             ^
/usr/include/c++/4.9/bits/fstream.tcc:949:35: error: ‘__remainder’ was not declared in this scope
         _M_ext_end = _M_ext_buf + __remainder;
                                   ^
/usr/include/c++/4.9/bits/fstream.tcc:951:25: error: ‘_M_state_cur’ was not declared in this scope
         _M_state_last = _M_state_cur = _M_state_beg;
                         ^
/usr/include/c++/4.9/bits/fstream.tcc:951:40: error: ‘_M_state_beg’ was not declared in this scope
         _M_state_last = _M_state_cur = _M_state_beg;
                                        ^
/usr/include/c++/4.9/bits/fstream.tcc:960:2: error: ‘_M_codecvt’ was not declared in this scope
  _M_codecvt = _M_codecvt_tmp;
  ^
/usr/include/c++/4.9/bits/fstream.tcc:960:15: error: ‘_M_codecvt_tmp’ was not declared in this scope
  _M_codecvt = _M_codecvt_tmp;
               ^
/usr/include/c++/4.9/bits/fstream.tcc:962:2: error: ‘_M_codecvt’ was not declared in this scope
  _M_codecvt = 0;
  ^

Na minha máquina Ubuntu, g++-4.9 -std=c++11 -c a.Cgera 1.101.568 bytes de erros gloriosos, para uma pontuação de 1101568/33/3 = 11.126,95.

nneonneo
fonte
7
Você deve escrever um programa para analisar todos os cabeçalhos std e determinar qual deles #defineoferece mais pontos.
Jason C
11
Você pode piorar ainda mais substituindo typedefpor t;. Agora você não apenas quebra todos os usos, typedefmas também recebe muitos erros "t não nomeia um tipo". Ou %;para produzir "ID não qualificado esperado antes de% token".
MSalters
11
#define typename *e #define int class stdparecia gerar muito mais erros.
jimmy23013
11

62,93 pontos

Apenas alguma meta magia negra em C ++, compilada com g++-4.8 -c -std=c++11 a.cc:

#include<memory>
template<int n>class B:std::unique_ptr<B<n-1>>{};template<>class B<0>{};B<-1>x;

Ungolfed:

#include <memory>

template<int n>
class B: std::unique_ptr<B<n-1>> {};

template<>
class B<0> {};

B<-1>x;

O G ++ possui um limite de recursão de 900, portanto, mudar B<1>para B<-1>um intervalo de 31 bits tem um ... efeito interessante.

  • 96 bytes de código (sem contar a final que \nalguns editores de texto adicionam automaticamente, vimnão o fazem).
  • Nome do arquivo com 4 letras, a.cc
  • 24165 bytes de mensagem de erro e está truncado. A mensagem de erro completa possui 1235889 bytes de conteúdo. Isso exigiria a -ftemplate-backtrace-limit=0troca. 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.

Stefano Sanfilippo
fonte
2
Mas ... como posso me livrar de 6 espaços em branco quando tenho apenas 3 no código, @JasonC!
Stefano Sanfilippo
7

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:

int main(){}

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):

int main(){[}

409 / (13 * 4) = 7,865

Atualize a pergunta de acordo, pois os exemplos dados não respeitam as regras especificadas ...

Stefan M
fonte
11
A coisa toda ideológica é todo tipo de pateta.
Jason C
Concordo, segui a regra das ideônias após a publicação da pergunta e as primeiras respostas. Cat está meio fora da bolsa agora.
Mark Lakata
1

C, nomeado como .cc

main(){constexprs a(){*(int*)0=f;}a(0)}

Erro de código:

.code.tio.cpp: In function ‘int main()’:
.code.tio.cpp:1:8: error: ‘constexprs’ was not declared in this scope
 main(){constexprs int a(f){*(int*)0=f;}a(0);}
        ^~~~~~~~~~
.code.tio.cpp:1:8: note: suggested alternative: ‘__cpp_constexpr’
 main(){constexprs int a(f){*(int*)0=f;}a(0);}
        ^~~~~~~~~~
        __cpp_constexpr
.code.tio.cpp:1:40: error: ‘a’ was not declared in this scope
 main(){constexprs int a(f){*(int*)0=f;}a(0);}
user75200
fonte
Olá de novo! Qual é o programa original que não erro? (Presumo que 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.
NoOneIsHere
Eu acho que isso é muito próximo da resposta de Stefan M.; Eu publicaria isso como uma melhoria recomendada para essa solução. Dito isto, respostas duplicadas são permitidas. Por favor, coloque o original aqui embora e mencionar quaisquer inspirações (embora seja possível que você veio com essa forma independente, também)
HyperNeutrino
1

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

#include <iostream>
using namespace std;
int main ()
{
cout<<"test"<<endl;
}

Código que gera o erro (último '<' excluído, para que pareça uma comparação menor que, mas nãoooooooooooo ...)

#include <iostream>
using namespace std;
int main ()
{
cout<<"test"<endl;
}

São 'apenas' 8241 bytes de mensagens de erro do compilador em ideone.com g ++ 4.3.2.

user7291
fonte
11
Mesmo que pareça estar no espírito do desafio (já que o título diz "erro de digitação de um personagem"), isso não segue a regra 2, que diz que você só pode adicionar um personagem, não excluir ou alterar.
Jo King