Parece que los cambios simples en un archivo C ++, especialmente con plantillas, pueden generar páginas de errores. Este concurso es para ver cuál es la mayor "explosión de dinero", es decir, la salida de error más detallada con el menor cambio en el código fuente (adición de 1 carácter).
Debido a que otros lenguajes son más sanos, esto se limitará a C ++ y gcc versión 4.x.
Reglas
El archivo fuente original debe compilarse con gcc 4.9.2 al código objeto sin error.
Se agrega un carácter ASCII al código fuente para crear un error tipográfico, aumentando el tamaño del archivo en 1 byte.
El compilador se ejecuta con opciones predeterminadas. Las opciones necesarias como
-c
y-std=c++11
están permitidas, las opciones como-Wall
no.Métrica es
number of bytes of generated error messages ----------------------------------------------------------------------- (bytes of source code with typo) (length of filename passed to compiler)
Las respuestas se validarán con http://ideone.com/ C ++ 4.9.2.
Ejemplo:
El nombre del archivo es a.cpp
, que tiene 5 bytes de longitud.
int foo();
Compilación de trabajo
gcc -c a.cpp
Código fuente dañado:
in t foo();
Compilación fallida
$ 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
Puntuación: 64/12/5 = 1.0666
Mejor intento: insertar {
entre padres defoo()
$ gcc -c a.cpp |& wc -c
497
Nueva puntuación: 497/12/5 = 8.283
¡Buena suerte!
ACTUALIZAR
Animo a las personas a ignorar la implementación recursiva. Eso técnicamente gana pero no está en el espíritu del concurso.
ACTUALIZACIÓN 2
Como muchas personas han notado, el concurso probablemente habría sido más interesante si el preprocesador C no estuviera permitido. Por lo tanto, me gustaría alentar a las personas a publicar soluciones que no utilizan comandos de preprocesador en absoluto. ¡Eso no implica el uso de ningún archivo de encabezado, ya #include
que no está permitido!
En cuanto a usar IDEONE para validar, puede usar la salida de IDEONE directamente (y el nombre de la fuente como prog.cpp
), o puede ejecutar la salida de IDEONE a través de una búsqueda y reemplazo global ( s/prog.cpp/a.cc/
por ejemplo) y pretender que pudo establecer el nombre del archivo directamente.
ACTUALIZACIÓN 3
Como señalaron las personas, Ideone es un poco demasiado restrictivo, requiere vinculación, no solo la creación de archivos de objetos. Como este concurso es puramente divertido, sea honesto y especifique lo que utilizó para obtener su puntaje. Use ideone o use la versión más vainilla (todos los valores predeterminados) de gcc 4.9.2 como pueda reunir. El concurso está destinado a dar a conocer la horror de los mensajes de error de C ++.
fuente
Respuestas:
gcc 4.5.2, Puntuación: 8579.15 (o 14367.49 para el nombre de archivo "aC", puede actualizar más tarde)
Archivo original, 29 bytes, compila limpio (a.cpp):
Archivo modificado, 30 bytes:
Errores:
Puntuación:
1286873 / (30 * 5) = 8579.15
Cabeza y cola de salida de error:
Nota:
- Si
.C
termina calificando como una extensión válida , el puntaje es 1,206,869 / (28 * 3) = 14,367.49.- Si se agrega el segundo #include sugerido por Dennis, nombre de archivo "a.cpp", el puntaje es 80,797,292,934 / (46 * 5) = 351,292,578.97
fuente
#include"a.cpp"
.#include
por mi cuenta. En cuanto a que es infinito ... si todavía está funcionando cuando me levanto mañana por la mañana, es lo suficientemente infinito para mí. Los mantendré informados, ja (aunque, actualmente, está canalizando 5.1MB / segwc
, por lo que si estoywc
usando un contador de 32 bits, según mis cálculos, algo extraño puede suceder en aproximadamente 13 minutos)gcc 4.9.2, puntaje:
222,898,664663,393,783Esto se basa en gran medida en la respuesta de @ JasonC , pero dijo que no quería tomar el crédito por esta mejora.
La salida de error del código siguiente es de 126,044,818,789 bytes de longitud. La puntuación debería ser mucho más alta en teoría (y tender a infinito a medida que aumenta el número de declaraciones de inclusión), pero disminuye en la práctica al agregar más declaraciones de inclusión.
Archivo original (37 bytes)
Archivo modificado (38 bytes)
fuente
#include
límite de anidamiento de 200 niveles, por lo que sus recursivos se#include
convierten efectivamente en un contador binario de 200 bits.gcc, 4.9.2, Puntuación: 22.2
Archivo original: 0 bytes (a.cpp)
Compila limpio:
Archivo modificado:
Errores:
Puntuación
111/1/5 = 22.2
fuente
11,126.95
9,105.442,359.371,645.94266.88puntos¡Más abuso del preprocesador! Esta vez, estamos haciendo llorar a la biblioteca estándar.
Sin error tipográfico:
Con error tipográfico:
Errores:
[RECORTE]
En mi máquina Ubuntu,
g++-4.9 -std=c++11 -c a.C
genera 1,101,568 gloriosos bytes de errores, para un puntaje de 1101568/33/3 = 11,126.95.fuente
#define
le da más puntos.typedef
port;
. Ahora no solo interrumpe cada uso,typedef
sino que también recibe una tonelada de errores "t no nombra un tipo". O%;
para producir el "id. No calificado esperado antes del token%".#define typename *
y#define int class std
parecía generar muchos más errores.62,93 puntos
Solo un poco de C ++ meta black magic, compilado con
g++-4.8 -c -std=c++11 a.cc
:Sin golf:
G ++ tiene un límite de recursión de 900, por lo que cambiar
B<1>
aB<-1>
un rango de 31 bits tiene un ... efecto interesante.\n
algunos editores de texto agregan automáticamente,vim
no lo hace).a.cc
-ftemplate-backtrace-limit=0
cambio. ¡También significaría 3185 puntos para mí!std::unique_ptr
es solo la clase de plantilla que logra emitir el mensaje de error más largo, encontrado por prueba y error y conocimiento del STL y gatos y demás.fuente
Puntuación 7.865
Estrictamente hablando, la respuesta de 0 bytes NO es correcta, ya que ideone.com se negará a compilar el archivo sin error. Lo mismo ocurre con el ejemplo
int foo();
: no se compilará en ideone.com (no puedo comentar debido a la falta de reputación ...)Entonces, el programa más pequeño posible para compilar sin ninguno
#includes
es este:Si cambia esto al siguiente código, fallará con 409 bytes de código de error (después de cambiar el nombre de prog.cpp a a.cc desde la salida de ideone.com):
409 / (13 * 4) = 7.865
Actualice la pregunta en consecuencia, ya que los ejemplos dados no respetan las reglas dadas ...
fuente
C, nombrado como
.cc
Código de error:
fuente
main(){}
, pero no estoy seguro) Además, ¿no es esto solo una mejora de la respuesta anterior? Si bien ciertamente puede mantener esta respuesta, si se inspiró en la respuesta de @ StefanM, debe mencionar eso. Finalmente, ahora que tiene 50 repeticiones, puede comentar en cualquier lugar.Puntuación 12.xx (error al BORRAR un personaje)
Perdone la ruptura de la Regla 2 (en mi humilde opinión, agregar o eliminar un carácter estaría en el espíritu de la regla), pero esto me sucedió accidentalmente (por lo tanto, no utiliza ningún truco abusivo 'intencionalmente') al escribir Real Code (TM) - tanto el código que funciona como el que causa errores son (o parecen) simples y directos, así que pensé que era lo suficientemente ordenado como para incluirlos aquí. Código original
Código que genera el error (último '<' eliminado, por lo que parece una comparación menor que, pero noooooooooooo ...)
Son "solo" 8241 bytes de mensajes de error del compilador en ideone.com g ++ 4.3.2.
fuente