c++ - trabajo - ¿Estoy malinterpretando el uso de asertivo()?
derechos asertivos pdf (3)
Estaba mirando la página de referencia de assert()
y me quedé atascado mientras leía el ejemplo dado:
/* assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
En este ejemplo, asert se usa para abortar la ejecución del programa si el archivo de datos se compara con 0, lo que sucede cuando la llamada anterior a fopen no tuvo éxito.
Estoy totalmente de acuerdo en que si fopen()
falla, assert()
abortará la ejecución. Sin embargo, me preocupa la corrección de este ejemplo:
En mi opinión, assert()
está ahí para detectar casos que normalmente no pueden ocurrir (como pasar un puntero NULL
a una función cuya documentación indica que está prohibido).
En este ejemplo, no abrir un archivo no es algo que normalmente no puede suceder . De hecho, puedo ver docenas de razones por las cuales esto podría fallar. El archivo no podría existir, el programa podría ejecutarse sin los privilegios requeridos, etc.
Preferiría haber hecho algo como:
/* not longer an assert example */
#include <stdio.h>
#include <assert.h>
int main ()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
if (datafile != NULL)
{
// Do something, whatever.
fclose (datafile);
} else
{
// Report the error somehow.
}
return 0;
}
¿Mi comprensión de cómo se debería usar assert()
es incorrecta?
EDITAR Y BUENAS NOTICIAS!
Parece que el sitio referido está gobernado por personas rigurosas. Aquí está el correo que recibí de uno de los mantenedores del sitio:
Hola Julien, estoy de acuerdo, el código de ejemplo fue mal elegido. Ahora ha sido reescrito a algo más apropiado.
Muchas gracias por señalarlo, y disculpe las molestias que esto pueda haberle causado.
Atentamente,
Y el ejemplo actualizado:
/* assert example */
#include <stdio.h>
#include <assert.h>
void print_number(int* myInt) {
assert (myInt!=NULL);
printf ("%d/n",*myInt);
}
int main ()
{
int a=10;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (b);
print_number (c);
return 0;
}
Me alegra ver que algunas personas hacen bien su trabajo en Internet. ;)
De hecho tienes razón. Como otras personas ya han señalado, assert()
será más que probablemente compilado en la versión de lanzamiento (he visto gente forzar a que las declaraciones se queden para la versión de lanzamiento).
Solo quería agregar una historia de terror relacionada con esta pregunta que he visto en una base de código:
assert(do_something() == NO_ERR);
A algunas personas no se les debe permitir usar un teclado.
Notificación menor: sería mejor si escribes ...
FILE * datafile = NULL;
Además, afirmar que solo funciona en modo de depuración ... para que su método sea mejor.
Tienes toda la razón, señor. Este es un mal uso de assert
.