Está en la página 1de 4

Ejercicio adicional:

“Fortalecer” la codificación del proyecto Polinomio para hacerlo “resistente” a posibles malos usos (p.ej.,
intento de definir un polinomio de grado negativo) y errores de ejecución (p.ej., fallo de asignación de
memoria dinámica con calloc()).
Cuando una llamada al sistema o algunas funciones básicas no pueden realizar correctamente su cometido
informan del fallo devolviendo un valor adecuado (típicamente -1) y estableciendo en la variable global
del sistema, errno, un código particular asociado al tipo de error producido. La función strerror(int
codigo) nos da una explicación verbal del código de error que se le suministra como argumento.
Para “robustecer” el programa utilizar las siguientes funciones:
#include <assert.h>
void assert(int expr);
En caso de que el valor de expr sea 0 (“falso” en interpretación de C) mostrará por la salida de error
estándar (stderr) un mensaje que indica la localización de la sentencia en el programa y repetirá la
expresión que ha motivado el mensaje. El programa será abortado.
Si el valor de expr es distinto de 0, no hace nada y el programa continúa.
Esta función sirve para asegurar que, en ejecución, se cumplen ciertos “invariantes” del programa. Se
emplea sobre todo en fase de depuración y para evitar tener que suprimir las líneas que contienen assert()
cuando el código depurado ya es correcto, tales funciones solo se compilan si NO está definida la macro
NDEBUG, gracias a lo cual un mismo código puede protegerse con assert's o no empleando una u otra
variante de sentencia de compilación
gcc -c programa.c # compila las funciones assert
gcc -D NDEBUG programa.c # NO compila las funciones assert

#include <err.h>
void err(int codigo, “formato”,...);
void errx(int codigo, “formato”,...);
void warn(“formato”,...);
void warn(“formato”,...);
Todas estas funciones escriben por la salida de error estándar (stderr) el mensaje especificado como
argumento, antecedido por el nombre del programa y “dos puntos”.
err() y warn() muestran a continuación un mensaje de error, el obtenido con strerror(errno);
err() y errx() hacen que finalice el programa como si hubiera ejecutado exit(codigo);
warn() y warnx() regresan y permiten continuar la ejecución.
Comprobar su comportamiento usando como ejemplo el siguiente trozo de código:

FILE *fhandle;

fhandle = fopen(“noExiste”, “r”);


assert(fhandle != NULL);
if (fhandle == NULL) {
warnx(“Mensaje warnx”);
warn(“Mensaje de warn”);
err(1, “Mensaje de err”);
errx(1, “Mensaje de errx”);
}
Detalles adicionales del uso de la utilidad make

CC variable cuyo valor designa al compilador de C


CFLAGS variable cuyo valor designa las opciones de invocación del compilador de C
LDFLAGS variable cuyo valor designa las opciones de invocación del enlazador

$@ sustituye al objetivo actual


$< sustituye al primer pre-requisito
$* sustituye al primer pre-requisito sin sufijo
$? sustituye a la lista de pre-requisitos más recientes que el objetivo
$^ sustituye a toda la lista de pre-requisitos (sin repeticiones)
$+ sustituye a toda la lista de pre-requisitos (con repeticiones)

@orden no muestra la línea de orden antes de ejecutarla


-orden el proceso “make” continua aun cuando la ejecución de la orden dé error (ignora errores)

.c.o introducción a la regla de dependencia de los ficheros .o respecto de los ficheros .c


\_ continuación de línea (donde _ es un carácter “salto de línea”)

`orden` sustituye la salida estándar de la ejecución de la orden

make -s silenciosos: no muestra las ordenes que ejecuta ni los mensajes de error
make -k continua si es posible tras un error
make -C dir cambia a un nuevo directorio
make -n muestra lo que haría pero no lo hace
make -f fichero procesa “fichero” en vez de “makefile”
make -t toca los objetivos (actualiza fecha) sin ejecutar las ordenes

La opción -MM de gcc genera una lista de dependencias en forma adecuada para make
gcc -MM prog.c

También podría gustarte