non è possibile salvare il valore restituito da strlen
-
28-10-2019 - |
Domanda
Sto usando la funzione strlen della libreria di stringhe c. Ho passato un NULL e ho trovato un risultato misterioso. So che non dovrei passare una stringa NULL ma ho bisogno di una spiegazione. Il codice ha un aspetto simile a questo
main()
{
int k;
char *s=NULL;
strlen(s);
// k = strlen(s);
}
Sul mio compilatore gcc, funziona bene con il commento.
ma se rimuoverai il commento nella riga
k=strlen(s);
produce un errore di segmentazione. Qualche spiegazione?
Soluzione
Questo è il codice assembler senza assegnazione alla variabile int
movq $0, -16(%rbp)
movl $0, %eax
leave
ret
il compilatore non chiama _strlen perché il valore non verrà utilizzato
Altri suggerimenti
La prima chiamata "strlen" che non assegna il valore di ritorno è probabilmente stata ottimizzata dal tuo compilatore.
Passando un puntatore nullo a strlen
risulta undefined behvaiour . Potrebbe succedere di tutto. Compresi i guasti di segretezza.E senza errori di segretezza.
Se vuoi conoscere il motivo esatto, dovrai guardare il codice assembler che genera il tuo compilatore.Ma questo non ti dirà nulla di utile.