You are on page 1of 4

TEXTO TITULO 11 Errores Volver al principio (rescribir el cdigo)

ANUNCIO
Abril de 2008

La verdadera prueba de fuego del programador se presenta cuando lanza la orden de compilar y enlazar su programa. Todos los mdulos involucrados en los pasos anteriores, compilador, analizador sintctico y enlazador pueden detectar errores en nuestro cdigo y mostrar los mensajes correspondientes. 11.1 Tipos de errores En cuanto al momento en que se producen, son bsicamente de tres tipos: * De tiempo de compilacin. Se engloban aqu los errores detectados por preprocesador, el analizador sintctico y el propio compilador. Los hay meramente sintcticos, por ejemplo un parntesis no cerrado; tambin de tipo lgico, por ejemplo la referencia a una variable no declarada previamente, etc. etc. * De tiempo de enlazado. Son detectados por el enlazador. Por ejemplo una llamada a funcin cuya definicin no aparece por ninguna parte (el enlazador no es capaz de encontrarla en los directorios que tiene asignados como "normales" para buscar); tambin la inversa: dos funciones del mismo nombre situadas en dos mdulos (fuentes) distintos (la referencia aparece duplicada). * De tiempo de ejecucin (runtime). Existe finalmente una ltima clase de errores: los que se producen cuando se ejecuta el programa; son precisamente los ms difciles de diagnosticar y verificar, sobre todo en aplicaciones grandes (los relativos a "prdidas misteriosas" de memoria y punteros descontrolados son especialmente temibles). 11.2 Gravedad de los errores Los errores producidos durante la compilacin son de dos tipos, segn su gravedad: * Errores fatales ("Errors"): Son errores graves, el proceso no puede continuar y es detenido despus de mostrar la informacin pertinente. * Advertencias ("Warnings"): No son errores graves pero si circunstancias sospechosas o inusuales de las que el compilador entiende que merecen una advertencia por si es algo que se nos ha escapado inadvertidamente (por ejemplo: Una variable declarada que no se utiliza para nada ms). En estos casos, el proceso continua y si no hay errores graves se construye un ejecutable. En todos los casos el aviso incluye indicacin del fichero ("fuente" .C/.CPP), el nmero de lnea, y el nombre de la funcin donde se produce el error, as como una explicacin ms o menos clara de su motivo. En principio pueden ser cuestiones banales, como haber olvidado poner un punto y coma ; al final de una sentencia (muy corriente en los que estamos acostumbrados a programar en otros
ESTRUCTURA DEL LENGUAJE DE PROGRAMACIN C++ ( NIVEL I)! DANIEL F. GONZALEZ P. Tutor Virtual

TEXTO TITULO

ANUNCIO
Abril de 2008

lenguajes). En otros casos los mensajes son especialmente crpticos, sobre todo para el profano, pero poco a poco los entendemos mejor y podemos aprender mucho de ellos si prestamos la debida atencin y entendemos su "porqu". Recordar que todos los compiladores disponen de opciones para modificar el nmero y tipo de los errores y advertencias ("Warnings") que aparecen. Respecto a los primeros, puede instruirse al compilador para que suspenda la actividad al aparecer el primer error, o que contine hasta que aparezca un nmero determinado de ellos. Respecto a los avisos, puede ordenarse que no muestre ninguno, o que sea ms o menos benevolente en determinados aspectos. Por ejemplo, puede indicarse que la comprobacin siga estrictamente el estndar C++ y que avise de cualquier desviacin al respecto (los compiladores suelen permitir ciertas "peculiaridades" que no son estndar). Nota: La descripcin e informacin acerca del error o advertencia, dependen de la plataforma, pero hemos de sealar que existen notables diferencias en cuanto al grado de desarrollo de los diversos compiladores, en especial respecto a los "Warnings". Por ejemplo, en este sentido el Compilador Borland C++ 5.5 es mucho menos riguroso que el producto homlogo de Microsoft, cuyo sistema de verificacin es con mucho superior al del primero, de forma que no es infrecuente que advertencias ms o menos serias e incluso algunos errores advertidos por Visual C++ 6.0 sean totalmente ignorados por Builder. A su vez los errores y advertencias sealados por el compilador GNU Cpp suelen ser ms explicativos que los sealados por Borland o Visual (que en este sentido son ms crpticos). 11.3 Generalidades sobre los errores de compilacin Respecto a los errores de compilacin, es importante hacer una advertencia al nefito: Con frecuencia el compilador nos informa de error en una lnea ms abajo de donde est verdaderamente. Por ejemplo, olvidar un punto y coma de final de sentencia puede dar lugar a que el compilador nos informe de un error incomprensible dos o tres lnea ms abajo. Cuando se realizan modificaciones en fuentes grandes y no se tiene mucha prctica, es preferible realizar cambios pequeos y compilar sistemticamente despus de cada uno. As sabremos que el error corresponde a lo ltimo que hemos tocado. Hay veces en que quitar una simple coma en una sentencia produce un listado de 15 o 20 errores en lneas siguientes. !Sbitamente nada tiene sentido para el compilador !!. [5] En las asignaciones del tipo: Rvalue = Lvalue;

ESTRUCTURA DEL LENGUAJE DE PROGRAMACIN C++ ( NIVEL I)!

DANIEL F. GONZALEZ P. Tutor Virtual

TEXTO TITULO

ANUNCIO
Abril de 2008

en las que intentamos asignar un valor Lvalue ( 2.1 que puede ser el resultado de una expresin) a un Rvalue ( 2.1), son muy frecuentes los errores en que el compilador produce un mensaje del siguiente aspecto: Error .... Cannot convert 'xxxxx' to 'yyyyy' in function .... Lo importante a resear aqu, es que las expresiones xxxxx e yyyyy informan sobre el tipo de objeto que hay en cada lado de la expresin de asignacin. Nota: En el captulo dedicado a los tipos de datos ( 2.2) se describe detalladamente como el compilador clasifica los objetos segn su tipo. En las asignaciones, el Rvalue debe recibir un valor de su mismo tipo. Si el tipo del Lvalue no concuerda con l, el compilador puede intentar adecuarlo, pero si esto no es posible, se produce un error como el sealado. En l se nos indica que el tipo xxxxx, que corresponde al Lvalue (el resultado de la expresin a la derecha del operador = ), no puede ser convertido al tipo yyyyy del Rvalue. Hay que advertir que las expresiones xxxxx e yyyyy estn codificadas. Cada compilador utiliza un algoritmo interno para designar cada uno de los innumerables tipos que puede existir en C++. En concreto, la designacin utilizada en estos mensajes es la misma que utiliza en el operador typeid ( 4.9.14). En situaciones difciles, es mucha la informacin que puede obtenerse de estas expresiones si se observan detenidamente. Aunque la comprobacin esttica de tipos, y del cumplimiento de las reglas sintcticas realizada por el compilador, resultan muy eficientes en lo que respecta a la deteccin de errores, en realidad, el trabajo dista de ser completo y suficiente. Existen multitud de circunstancias potencialmente errneas que son pasadas por alto. En especial las relacionadas con prdidas de memoria; existencia de punteros descolgados; bucles infinitos; objetos declarados pero no utilizados, y un largo etctera. Algunos de estos errores pueden permanecer agazapados en el cdigo y solo aparecer en circunstancias muy especiales, incluso despus de que la aplicacin haya sido rodada largo tiempo sin contratiempos. Muchas de estas circunstancias pueden evitarse, o al menos mitigarse, siguiendo ciertas pautas y recomendaciones "de buena prctica", muchas de las cuales estn contenidas en la obra TC++PL de Stroustrup; la mayora en forma de advertencias sobre cosas que "no" debe hacerse. Sin embargo, el problema persiste, mxime en un lenguaje como C++ plagados de peligros potenciales que acechan en el arcn, y con el que es posible "volarse la pierna completa". 11.4 Errores de ejecucin Para los errores de tiempo de ejecucin se requieren estrategias especiales. En principio, durante la fase de comprobacin inicial, se tienen las ofrecidas por el depurador
ESTRUCTURA DEL LENGUAJE DE PROGRAMACIN C++ ( NIVEL I)! DANIEL F. GONZALEZ P. Tutor Virtual

TEXTO TITULO

ANUNCIO
Abril de 2008

. Prcticamente todos los entornos de desarrollo disponen de un depurador ms o menos potente y sofisticado. Puede afirmarse que el depurador es otra herramienta que no debe faltar en el arsenal de cualquier programador profesional, en especial porque hay errores que son prcticamente imposibles de diagnosticar y corregir sin su ayuda. Como se ha indicado, el depurador incluye en el ejecutable un cdigo especial que realiza las funciones de depuracin deseadas, pero aparte de los que podramos denominar estndar (cuyos mdulos son incluidos en durante la fase de enlazado del ejecutable), existen herramientas especficas que analizan el ejecutable y son capaces de detectar determinados errores e inconsistencias. Estas herramientas realizan su trabajo durante la ejecucin, para lo que modifican el cdigo a analizar incluyendo determinados mdulos que les permiten controlar el desarrollo de la ejecucin (se dice que "instrumentan" el cdigo). La forma de realizar esta "instrumentacin" depende de la herramienta: puede realizarse durante la compilacin ("compile-time"), aadiendo cdigo que no aparece en el fuente; durante el enlazado ("link-time"); durante la carga ("load-time"), cuando el ejecutable es acomodado en memoria, o antes de la carga, sobre cualquier ejecutable listo para ser usado. Generalmente estas herramientas controlan la ejecucin, toman nota de las incidencias, y finalmente proporcionan un informe de las mismas cuando la ejecucin finaliza. Nota: no existe una denominacin unificada para este tipo de productos. Quizs el ms conocido es es BoundsChecker, de Numega www.numega.com (actualmente aparece como Compuware). Tambin puede intentar una bsqueda en Google bajo el epgrafe "Memory debugger". Despus de todas las medidas preventivas ya reseadas, cuando finalmente, despus de las pruebas de "laboratorio" damos por bueno el programa, este queda merced a si mismo; a la calidad de su propio mecanismo de defensa. Como errar es humano, los diseadores del C++ pensaron que a pesar de la programacin ms cuidadosa, siempre pueden presentarse circunstancias excepcionales o imprevistas. Para poder hacerles frente, dotaron al lenguaje de opciones especiales con las que tratar este tipo de situaciones, de forma que pudiese seguir todo bajo control; estos recursos especficos se exponen con detalle en el captulo dedicado al Tratamiento de Excepciones ( 1.6). Bibliografa: http://www.zator.com/Cpp/E1_4.htm

ESTRUCTURA DEL LENGUAJE DE PROGRAMACIN C++ ( NIVEL I)!

DANIEL F. GONZALEZ P. Tutor Virtual