¿Pueden los compiladores e intérpretes tener errores, y qué podemos hacer (como usuarios) para tratar con ellos? [cerrado]


28

Si el trabajo de un compilador es esencialmente traducir el código fuente al código de nivel de máquina, ¿puede haber algún problema en un compilador, es decir, una "traducción" defectuosa?

Lo mismo ocurre con un intérprete: ¿puede fallar a veces el contenido requerido?

No he oído hablar de ningún error en los compiladores / intérpretes, pero ¿existen?


66
en desarrollo, definitivamente existirán solo mire el rastreador de errores en cualquier compilador de código abierto
frenético de trinquete

77
No he oído hablar de ningún error en los compiladores / intérpretes, pero ¿existen? Encontré la lista de correo para errores en el compilador de gcc: gcc.gnu.org/ml/gcc-bugs
FrustratedWithFormsDesigner

47
Esta no es una muy buena pregunta, solo hace algo con sentido común.

12
Ninguno de los comentarios o respuestas hasta ahora aborda la probabilidad de encontrar un error del compilador. Asegúrese de descartar primero los errores en su propio código.
Dan Pichelman

66
Respuesta corta: definitivamente. Si bien los IDE y los compiladores generalmente se ejercen dentro de una pulgada de sus vidas antes de que vean el mundo exterior, siempre hay un caso de esquina en algún lugar que encontrarán un desarrollador demasiado inteligente.
KeithS

Respuestas:


51

Tiende a encontrarlos más en idiomas que se están desarrollando activamente que en aquellos que son relativamente maduros (y, por lo tanto, no ven muchos cambios con frecuencia). Esta es probablemente la razón por la cual la mayoría de los idiomas se lanzan en varias 'etapas' de estabilidad. Una compilación nocturna es mucho menos probable que sea estable que un candidato de lanzamiento , que en sí mismo es menos probable que sea estable que una versión completamente lanzada y utilizada activamente.

Afortunadamente, la mayoría de estos idiomas (especialmente los de código abierto) tendrán un sistema público de seguimiento de errores al que puede enviar informes.

En mi propia experiencia, me encontré con un error bastante oscuro pero grave en Scala en Windows . Envié mis hallazgos al rastreador de errores y el problema se solucionó con bastante rapidez. En ese caso, los desarrolladores del lenguaje fueron lo suficientemente inteligentes como para incluir una nota útil en la salida del registro de errores, sugiriendo que lo que me había encontrado era un error del compilador y me dijeron dónde enviar el informe.


Espero que no te importe; Agregué un nuevo párrafo (pendiente de aprobación) que pensé que podría ser relevante. Un compilador no solo puede contener errores, sino que también puede contener código malicioso.
Andy

@ Andy parece que uno de los moderadores lo rechazó como algo que debería ser un comentario o una respuesta por separado.
KChaloux

No solo "sí", sino "¡demonios sí!" :-)
Hellion

C es maduro y desarrollado activamente. También lo es C ++. Así es Java. etc ..
djechlin

100

En palabras simples:

Todos los programas pueden tener errores.

Los compiladores son programas.

Ergo, los compiladores pueden tener errores.


55
Más preocupante: los depuradores son programas. Por lo tanto, los depuradores tienen errores.
Daniel Gratzer

19
@jozefg: Entonces, ¿cómo se depura el depurador? ¿Quién mira a los observadores?
FrustratedWithFormsDesigner

16
@FrustratedWithFormsDesigner The Watcher Watchers, duh.
Jimmy Hoffa

9
@JoelFan Desde que escribí "can have", esa excepción está cubierta. Si dice "tener", debe especificar que se refiere únicamente a programas no triviales. Al decir "puede tener", no tiene que hacerlo.
Tulains Córdova

8
Los programas "Hello world" pueden tener errores si se cumple con un compilador con errores.
wtsang02



4

Por supuesto, porque los compiladores son software.

En 2005, tuve una falla en una pieza de código en una pieza de software muy crítica que había escrito para una gran empresa. Como le costó a la compañía literalmente millones de dólares rectificar, por supuesto lanzaron una investigación de gran envergadura.

Afortunadamente (desde mi perspectiva), el problema resultó ser un problema de compilación en Delphi. En el bloque try finalmente, el valor de retorno de una función se destruyó y resultó en resultados absolutamente aleatorios para la persona que llama. Esto fue documentado y reconocido por Borland.

.NET era conocido por tener literalmente cientos de fugas de memoria diferentes, particularmente en sus primeras implementaciones.

Yo diría que no existe el software sin errores. Los compiladores no son la excepción. Sin embargo, se prueban más a fondo que la mayoría del software empresarial y son consumidos por personas inteligentes, críticas y contenciosas, por lo que su historial ha sido bastante bueno en general.


Hay software "formalmente verificado". Está matemáticamente probado que funciona. Ocasionalmente, incluso el código verificado formalmente tiene errores. La implementación rápida del IIRC Java fue verificada formalmente, pero eso no tuvo en cuenta los desbordamientos.
David Plumpton

1
¿Cuál fue el software? Vamos :)
Rocklan

2

No solo errores, sino también malware deliberado.

El troyano "login" implementado por Brian Kernighan en el compilador original de Unix C es el más conocido de estos; El artículo http://cm.bell-labs.com/who/ken/trust.html tiene algunos antecedentes sobre esto.


1
¿Está claro que eso se implementó realmente?
Keith Thompson

Este es un tema bastante interesante, pero nada relacionado con esta pregunta.

@delnan no estoy de acuerdo; El núcleo de la pregunta parece ser "¿cuánto puedo confiar en mi compilador?
Andy

1

Sí, por supuesto, como cualquier compilador de software tiene errores, por ejemplo, la lista de errores de gcc está aquí


0

Sí.

Además, no solo con compiladores, sino también con intérpretes / depuradores y cualquier herramienta de software de terceros.

Actualmente estamos utilizando algún software de terceros y hemos tenido algunos problemas. A veces nos agradecen por encontrar y reportar un error. :)

Algunos de ellos también tienen algunas pérdidas de memoria, lo que lleva a un bloqueo. La pregunta importante aquí podría ser, ¿cómo determinar si la herramienta de terceros o el compilador tiene errores para que su aplicación funcione correctamente?


Su pregunta importante lo llevará nuevamente al problema de detención
wtsang02

0

El compilador es un programa que lee un programa escrito en un idioma (el idioma de origen) y lo traduce a otro programa equivalente en otro idioma (el idioma de destino), principalmente lenguaje de máquina.

Hay diferentes fases del compilador a través de las cuales se escanea el código del idioma fuente línea por línea. Hay una tabla de símbolos que mantiene el seguimiento de todas las palabras clave que se escanean en el código de idioma fuente.

Fase 1: Analizador léxico: lee todos los caracteres en el programa fuente y forma la separación lógica de tokens (int, char, float, if-else, for, while, etc.)

Fase 2: Analizador de sintaxis: analiza la estructura del flujo de tokens. Análisis jerárquico de expresiones que incluye postfix / prefix, etc. (a = b + c * d)

Fase 3: Analizador semántico: verificación de tipos de tokens (entero a real, flotante, etc.) y muchas cosas como la precedencia del operador, etc.

Fase 4: Generador de código intermedio - a = b + c * de (temp1 = c * d, temp2 = temp1 + b, temp3 = temp2-e)

Fase 5: Optimización del código: varios análisis (flujo de control, flujo de datos, transformaciones)
que elimina: código de redundancia, propagación de constantes, código muerto parcial, subexpresión común, código invariante de bucle

Fase 6: Generación de código: generación de código de destino (principalmente lenguaje ensamblador) poniendo valores en registros

Todas estas fases no son más que programas bien escritos y podría haber un número N de fallas en eso ...


-1

Por supuesto, los compiladores son solo programas y sus autores también son idiotas :). Incluso la especificación del idioma puede tener un error. Ejemplo: c # + foreach + lambda .

O en Python, error en el intérprete: la compilación del mal ast bloquea al intérprete .

Bueno, si quieres buscar errores en el compilador / interpeter -> mira php. Hay un error famoso con desbordamiento de enteros. El primer arreglo comenzó desde if (size > INT_MAX) return NULL;. Continuación de la historia .


Los escritores compiladores no son idiotas. Como los compiladores son bastante complicados, la barrera para ingresar al campo también es sustancialmente mayor. Por lo tanto, podemos esperar que las personas que los escriben no cometan errores como lo hacen los chicos promedio.
jszpilewski

El foreach / lambda no es un error, se reduce a una decisión de diseño específica y de conciencia tomada antes de que se agregaran lambdas.
Andy

@Andy, como sé, nadie ha sabido qué problemas causará esta decisión. ¿Por qué no error?
Viktor Lova

@jszpilewski, ¿ves una sonrisa después de ese mensaje?
Viktor Lova

1
Le sugiero que vuelva a leer el OP, ya que su pregunta no se trata de si las especificaciones pueden tener errores, sino de si los COMPILADORES pueden tener errores. Como el compilador de C # coincidía con la especificación, el compilador no tenía un error. También le sugiero que vuelva a leer su propia cita de Wikipedia "Un error de software es un error, falla, falla o falla en un programa de computadora"
Andy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.