Da man 3 assert_perror
:
The purpose of the assert macros is to help programmers find bugs in their programs, things that cannot happen unless there was a coding mistake. However, with system or library calls the situation is rather different, and error returns can happen, and will happen, and should be tested for. Not by an assert, where the test goes away when NDEBUG is defined, but by proper error handling code. Never use this macro.
Trovo difficile comprendere la logica di cui sopra.
Certo, è abbastanza ovvio per i alcuni codici di errore. Ad esempio, secondo man 2 recv
, questa funzione può fallire con EINTR
quando " la ricezione è stata interrotta dall'erogazione di un segnale prima che i dati fossero disponibili ". Per certi versi, l'uso di assert
o assert_perror
per testare questo codice di errore nella maggior parte dei casi sembra essere una pessima idea.
Tuttavia, recv()
può anche fallire con EFAULT
se " il puntatore / i del buffer di ricezione puntano al di fuori dello spazio di indirizzamento del processo ". Una simile situazione chiaramente " non può accadere a meno che non ci sia un errore di codifica ", quindi lo scopo principale di testare questo errore sembra essere " per aiutare i programmatori a trovare bug nei loro programmi ”. Nonostante ciò che dice man 3 assert_perror
, non riesco a vedere come la situazione di recv()
fallendo con EFAULT
possa essere " piuttosto diversa " da qualsiasi altro bug che può essere testato con una macro assert()
.
Certo, in questo caso, proprio come in qualsiasi altra situazione in cui è stato rilevato un bug chiaro in fase di esecuzione, il programma dovrebbe probabilmente interrompersi. Ma questo vale anche per qualsiasi altro bug. Se solleviamo questo argomento contro l'uso di assert_perror
in una situazione del genere, condanniamo automaticamente l'uso di assert()
per qualsiasi test non pesante per il calcolo a favore dell'esecuzione di questo test in fase di esecuzione e terminando il programma in questo test fallire.
Perché dovremmo mai utilizzare la macro assert_perror
o testare le funzioni della libreria che non riescono con determinati codici di errore con la macro assert
?