2008-10-11 17 views
19

Todos (al menos todos los que usan un lenguaje compilado) se han enfrentado a errores de compilación, pero ¿cuántas veces se bloquea realmente el compilador?¿Alguna vez ha bloqueado el compilador?

He tenido mi parte justa de "errores de compilador interno" pero la mayoría desaparecieron con solo volver a compilar. ¿Tiene una pieza (mínima) de código que bloquea el compilador?

+0

Por supuesto, sucede a veces, considere que un compilador también es un software. Da más miedo cuando el depurador muere. – unexist

Respuesta

60

Escribo el compilador que usamos, por lo que a veces falla.

2

Sí, especialmente cuando se trata de un compilador antiguo o poco mantenido (GCC 2.95, Tendra en modo C++). Aunque no guardo las piezas de código.

0

VC++ se ha estrellado en mi cuando compilé C++ si el uso de la plantilla está mal (por ejemplo, me falta un ">" de cierre).

3

He visto algunos errores de compilación en el compilador de C# (todos los casos extremos, todos informados adecuadamente) y confirmó algunos bloqueos provocados por otras personas.

El error más temible del compilador (de una clase) que he encontrado es un error JIT en una versión de Java. Fue bastante reproducible, pero causó que el VM cayera. Agregando una declaración bastante no-op (no puedo recordar exactamente lo que de improviso - posiblemente solo declarando una variable local adicional con un valor inicial) lo alejó del caso de esquina que resultó ser - y se corrigió en una versión posterior.

+0

Un colega se topó con un error en .net JIT con 3.5 SP1 que fue verificado por MS - un uso bastante simple de genéricos fue suficiente para hacerlo morir en algunas plataformas - deberíamos preocuparnos de que nuestras aplicaciones sean propensas a errores de optimización de JIT introducido por los paquetes de servicio en la máquina de los usuarios? (Creo que el paquete familiar lo solucionó) – morechilli

+0

Tan solo como debería preocuparle que los service packs también puedan romper partes de la API de Win32 o la funcionalidad del sistema operativo principal. Es más o menos lo mismo, de verdad. –

0

Lo hice. Algunas versiones de Delphi (digamos # 4) se bloquearon muy a menudo con mensajes de error crípticos.

Las versiones más nuevas (2006 y más) son estables, pero no sólidas. (7 fue excelente en ese caso).

Los bloqueos del compilador a menudo se producen con ediciones grandes y sesiones de depuración de proyectos complejos (muchos dll). La mayoría de las veces un reinicio de la ide es suficiente. Pero a veces es necesario reiniciar la PC.

O y una vez se estrelló OS2 junto con el compilador porque el archivo de intercambio creció demasiado.

4

ActionScript 3.0:

switch(on_some_variable) 
{ 
} 

interruptor de vacío = Kaboom!

+0

No bloqueo el compilador Flash IDE ni FlashDevelop (utilizando Flex Compiler Shell desde SDK 3.0.1.1732). Tal vez fue un error en una versión anterior? –

2

Visual C++ 5. 'Nuff dijo.

23

fácil.

// -*- C++ -*- 

template <int n> 
class Foo : public Foo<n+1> 
{ 

}; 

int main(int, char*[]) 
{ 
    Foo<0> x; 
    return 0; 
}; 


[email protected]:~/tmp$ g++ -ftemplate-depth-1000000 -Wall foo.cpp -o foo 
g++: Internal error: Segmentation fault (program cc1plus) 
Please submit a full bug report. 
See `<URL:http://gcc.gnu.org/bugs.html>` for instructions. 
For Debian GNU/Linux specific bug reporting instructions, see 
`<URL:file:///usr/share/doc/gcc-4.2/README.Bugs>`. 
+0

Meh; usar plantillas es barato. ;-) –

+3

Heh, el uso de C++ es barato ;-) ;-) – mfx

+0

No se bloquea para mí para g ++ 4.2 en Mac nunca más. – kennytm

9

VC coge con gracia, pero a mediados de la década de los 90, esto sería estrellado tanto Microsoft C++ y Borland C++ compiladores:

struct MyClass 
{ 
    MyClass operator->() { return *this; } 
}; 


int main(int argc, char* argv[]) 
{ 
    MyClass A; 
    A->x; 
} 

Una sobrecarga del operador> es intrínsecamente recursiva. Se espera que la función devuelva un puntero, al cual se aplica de nuevo oper->. Este fragmento hizo la generación de código infinitamente recursiva.

0

Una vez, cuando utilicé el ejemplo de generadores de los documentos de Python, rompió la versión de Python que estábamos usando. La misma semana, uno de mis colegas se las arregló para hacer un uso incorrecto de la FFI de modo que cualquier cálculo que implique el número 3 interrumpiría Python.

+0

resultó en una "suffusion of yellow" – Tanj

1

En un proyecto en el que estaba trabajando, algunos usos específicos de Boost Lambda expresiones podrían hacer que el compilador de Visual C++ se bloquee.(Estábamos usando Visual Studio 2003)
El compilador solo se bloqueaba durante la compilación de lanzamiento, una compilación de depuración funcionaría bien.

Hubo una guerra religiosa que enfureció a través del equipo sobre el uso apropiado de las bibliotecas lambda, estaba casi agradecido de que el compilador lo resolviera por nosotros. :-)

16

no he hecho GHC (un compilador de Haskell) accidente todavía, pero he conseguido a error a cabo con un

My brain just exploded. 
I can't handle pattern bindings for existentially-quantified constructors. 

Es bastante fácil de solucionar, y no golpea esto a menos que tenga un diseño complicado (y generalmente incorrecto), pero probablemente gane como el mejor mensaje de error del compilador.

+0

En Ada, una queja sobre un "homophone co-residente" es mi favorita. – Dave

0

El compilador de Microsoft Xbox 360 se puede colgar fácilmente. Me dieron el código fuente con comentarios japoneses y, cuando lo convertí en texto regular, uno de los últimos caracteres en la línea era un '\' por lo que continuó el comentario en la siguiente línea. Si la siguiente línea era un comando de cambio, el compilador falla.

//wierd japanese characters here %^$$\ 
switch(n) 
{ 
case 0: 
    ..... 
break; 
case 1: 
    ..... 
break; 
} 
1

En la versión 1.2.x del Mono compilador de C# se estrellaría con un poco complicado código (si no recuerdo mal, delegados anónimos anidados). Afortunadamente con la versión 2.x, no he visto ningún bloqueo.

+0

He golpeado este también, varias veces. Cualquier cosa que use delegados anónimos puede ser un problema. –

1

En mi trabajo anterior teníamos un simulador que era conocido por ser capaz de bloquear compilaciones (ICE) o hacer que generaran código incorrecto. Y cuando el código realmente se generó correctamente, después del compilador tomó 15 minutos para un solo archivo fuente. Visual Studio nunca fue (siempre y cuando yo trabajara allí) capaz de compilar el núcleo del simulador.

El núcleo se generó automáticamente a partir de una DSL, y el código generado a menudo empujó al compilador a sus límites.

La actualización a una nueva versión de GCC a menudo causa una gran nervosidad: ¿funcionará la nueva versión?

+0

Sé lo que quieres decir :) – jakobengblom2

0

He colgado varias veces Delphi 7 pidiéndole que compilara dos códigos heredados.

El principal culpable parece ser cualquier calificación de algo como estar en la unidad del sistema. Esto no siempre lo explotará, pero cuando explota, reviso y reescribo cualquier cosa que requiera tal anulación y el problema desaparece.

Las explosiones son 100% reproducibles pero nunca he logrado hacer una simple prueba. En realidad, no bloquea el compilador la mayor parte del tiempo, generalmente se obtiene un error que no tiene nada que ver con el problema y puede haber cientos de líneas a partir de él. El entorno está desestabilizado, guardar y salir está bien, pero no pienses en hacer nada más.

De vuelta en la edad de piedra con Borland Pascal 7 (la última versión dos) lo rompí muchas veces. Sin fallas, solo emisión de código incorrecta e inconsistente. Finalmente aprendí a mantener .EXE (sin contar la información de depuración) por debajo de 3mb. Cuanto más allá de eso me fui, más inestable se volvió.

0

He bloqueado VC++ varias veces, generalmente con código de plantilla. Pero esa no es la caída más interesante ...

Colisioné el compilador del sistema VS2005 Team con la opción/analyze compilando mi biblioteca de códigos compartidos que se compiló sin error sin el conmutador, y en VS2008 con y sin el conmutador.Por supuesto, MS no estaba muy interesado porque era un error en la versión anterior del compilador, pero pensé que era bastante interesante.

3

Esto se estrelló el C64 BÁSICO:

PRINT 0 + "" +- 0 
4

Visual C++ 9.0 SP1

este simplemente pasó a mí

------ Build started: Project: pdfp, Configuration: Debug Win32 ------ 
Compiling... 
reader.cpp 
xref.cpp 
c:\projects\pdfp\xref.cpp(52) : fatal error C1001: An internal error has occurred in the compiler. 
(compiler file 'f:\dd\vctools\compiler\cxxfe\sl\p1\c\toil.c', line 8569) 
To work around this problem, try simplifying or changing the program near the locations listed above. 
Please choose the Technical Support command on the Visual C++ 
Help menu, or open the Technical Support help file for more information 
Generating Code... 
Build log was saved at "file://c:\Projects\pdfp\Debug\BuildLog.htm" 
pdfp - 1 error(s), 0 warning(s) 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 
+0

Bueno, parece que el formateador de rebajas acaba de estrellar mi lectura allí. – jokoon

4

Bueno, esto en realidad no bloquee el compilador - - Fue simplemente un error si VC++ no aceptara un código perfectamente bueno. (details provided here).

Lo extraño de esto fue que solo se activó cuando se cumplieron tres condiciones bastante oscuras. Mover una línea de código era todo lo que se necesitaba para una solución efectiva. Y una de las condiciones previas necesarias fue "usar namespace std"; que es ampliamente desaconsejado en el código de producción.

Sin embargo, los mensajes que preguntaban cómo solucionar el problema eran un elemento básico en los grupos de noticias de Microsoft VC++. No pude entender cómo tanta gente tropezó con un error oscuro. Entonces, finalmente, pregunté a alguien .....

El código exacto necesario para activar el error era un ejemplo en "de Stroustrup The C++ Programming Langauge". (*)

(*) Nota, no digo que lo haya hecho a propósito. Estoy seguro de que lo probó en una variante UNIX de C++, y no me constaba por completo de su efecto en VC++.

+0

Creo que se refería a "un elemento básico" – stannius

+0

Veo que Microsoft siempre ha estado en el negocio de hacer compiladores de calidad.^_^ –

1

Gracias a @Nick, este cuelga VS2005.

template<typename Res, typename T> 
Res operator_cast(const T& t) 
{ 
    return t.operator Res(); 
} 

int main() 
{ 
    return operator_cast<int>(0); 
} 
0

Pude segfault el intérprete de Python. Por supuesto, estaba trabajando en una extensión C en ese momento y no lo estaba del todo bien.

2

Vaya, olvidé una 'e' en typedef y colapsé el compilador.

typdef struct kGUIColor GameColor; 

c:\source\kgui\samples\space\space.cpp(35) : fatal error C1001: INTERNAL COMPILER ERROR 
     (compiler file 'msc1.cpp', line 2708) 
     Please choose the Technical Support command on the Visual C++ 
     Help menu, or open the Technical Support help file for more information 
0

no sucede tanto como lo que solía, pero en ocasiones el precompilador ASP.net tiene problemas - no he visto personalmente, pero he fijado un problema en otro proyecto, una vez donde tenían los conflictos de nombres porque no estaban utilizando espacios de nombres correctamente (causaron fallas del compilador) durante la compilación previa.

En los buenos viejos tiempos (MSVC++ no administrado) teníamos la falla del compilador debido a la vinculación en clases externas estáticas de win32 (.lib) y un par de bits de código ocasionalmente ocasionaban problemas, pero estos fueron recogidos muy rápidamente.

1

He colgado un compilador antes al ejecutarlo sin memoria.

Proporcione un compilador de DOS de aproximadamente 0.5mb de código fuente. Crujido.

0

No sé si yo lo llamaría estrellarse, pero SDCC (Small Device C Compiler) falla al compilar código formado de una manera particular:

  • Objetivo: 8051
  • Código tuvo que ejecutar en un 512 caché de bytes carga desde un medidor externo
  • probador está en control y almacena el código - caché no puede recuperar la siguiente página
  • no hay llamadas de función permitidos - el PC (contador de programa) saltaría a un lugar no residente en memoria caché ; macros del preprocesador se utilizaron para llevar a cabo la práctica de codificación modular
  • Saltos (ramificación) permitida si no salta fuera de la caché
  • No hay valores const - en la sección de datos del código de programa que hace que el código en caché para buscar algo no en la memoria caché - constante del preprocesador (#define) OK aquí

Las macros del preprocesador se desenrollan resultando en código plano, pero grande - todo en main(); la ejecución salta el código de inicio (la creación de la pila, etc) y comienza al principio de main()

parte relevante de esta respuesta:

De vez en cuando, SDCC se negaría a compilar el código sintácticamente correcta, con un mensaje sobre quedarse sin memoria. Esto incluso sucedió compilando en cajas de 64 bits con 8 GB de RAM.

La solución en estos casos fue dividir el firmware en piezas separadas y compilarlas por separado y ejecutarlas por separado. Es posible que las piezas se hayan podido volver a vincular, pero en ese momento no importó.

No lo intenté, pero el compilador 8051 Keil probablemente podría haber manejado el código problemático.

0

He logrado bloquear el compilador F # un montón de veces; pero eso no es justo ya que fue un compilador beta/alpha/research/etc.

1

Al llegar un mensaje de "error catastrófico" usted sabe que está tratando ....

Michael

0

nunca he intentado a chocar el compilador, pero el compilador de VB/depurador salía varias veces al día sobre mí. A pesar de que es VB, ¿eso cuenta?

+0

Solo si explica cómo lo hizo. – recursive

0

Mi equipo a menudo tenía errores de compilador internos aleatorios con el compilador csharp en nuestras máquinas de compilación. Resolvimos el problema limpiando todas las carpetas bin/obj entre la compilación de cada objetivo.

0

He bloqueado VVIS al compilar un mapa para el motor de origen.

¿Eso cuenta?

2

Hoy VS2003SP1 me dio un C1001 (Error interno del compilador) que se queja del archivo compilador 'msc1.CPP,' alinea 2708) debido a esto:

struct PATTERN { 
    … 
}; 

Resulta que el problema era que el nombre de la estructura que estaba tratando de definir (patrón) ya era un typedef en el IDG para un tipo de cepillo. Sin embargo, en lugar de decirme que el símbolo ya está definido (como para la mayoría de las otras cosas), no solo no apuntó a la estructura como el problema: reduje el problema al comentar selectivamente los bloques hasta que desapareció el error. Pero también me dio el error críptico antes mencionado que no tiene nada que ver con el archivo especificado, que ni siquiera puedo encontrar para examinar la línea en cuestión. : |


que era capaz de reproducirla con el siguiente código:

typedef int SOMETHINGOROTHER; 
    struct SOMETHINGOROTHER {}; 

> fatal error C1001: INTERNAL COMPILER ERROR
> (compiler file 'msc1.cpp', line 2708) …


Mientras que el código siguiente da el mensaje de error esperado:

struct SOMETHINGOROTHER {}; 
    typedef int SOMETHINGOROTHER; 

> 'SOMETHINGOROTHER' : redefinition; different basic types


Es evidente que el problema es en la rutina de manipulación de la estructura del compilador.

me pregunto si VS2005 + hacer mejor ...

0

Hace mucho tiempo, trabajé en COBOL en un ordenador de datos de control. (Si eso suena raro, lo es. Control Data era conocido por sus sistemas informáticos científicos de alto rendimiento, y el compilador de COBOL fue una idea de último momento.) No recuerdo los detalles, pero tenía un programa que estaba intentando para llevar a una versión más nueva. Probé las cosas de varias formas y descubrí que podía elegir entre colgar el compilador o ponerlo en un ciclo infinito.

1

Uso tanto pcc como gcc para compilar mi viejo proyecto de SO.

Encontré un error con la forma en que tanto pcc como gcc manejan un código no trivial y se cuelga el pcc. (caracteres se firman en mi plataforma)

struct{ 
    char myvalue:1; 
}mystruct; 

PCC se estrelló debido a que todos los valores del campo de bits deben ser int embargo, por lo que es realmente más defectuoso, pero gcc lo maneja mal. Mira, si lo piensas bien, está firmado, pero solo tiene espacio para un bit. Por lo tanto, solo puede almacenar 0 y -1. Bueno, gcc lo maneja mal almacenando 0 o 1.

0

No es el compilador, pero el enlazador en Visual Studio 2008 se cuelga varias veces al día en Windows 7 de 64 bits. Inmediatamente volver a construir siempre funciona sin interrupciones. Microsoft no parece importarle ...

No es realmente una respuesta a su pregunta, porque no es el propio código causando, pero siempre estoy dispuesto a despotricar sobre este tema en particular :-)

0

Plantilla el soporte en GCC 2.95 (aunque podría estar recordando erróneamente la versión) tenía errores. Varios constructos causarían su bloqueo. No puedo encontrar el caso de prueba, pero creo que las clases internas de plantillas (o clases internas que eran plantillas) eran una forma de obtener un error de compilación.

0

que tenía algo más interesante: error interno Enlazador ...

¿Conoce cómo hacer que?

2

Aquí hay una manera de bloquear el compilador VS220 C++.

typedef map<int,int> Tmap; 
private: Tmap; * m_map; 

Esto dará lugar a un choque y el siguiente mensaje de error

error grave C1001: ERROR interno del compilador (archivo del compilador 'msc1.cpp', línea de 2708) Por favor, seleccione el técnico comando soporte en el Visual C++ Ayuda menú o abra el Soporte Técnico archivo de ayuda para obtener más información

Elimine el punto y coma inmediatamente después de Tmap (segunda línea que define m_map) para eliminar el error.

0

Una vez escribí un programa en C que haría que la computadora se reiniciara espontáneamente. Una desventaja es que realmente no tenía nada que ver con mergesort que estaba tratando de implementar en ese momento.

Afortunadamente desapareció una vez que descubrí los errores de mi puntero.

Cuestiones relacionadas