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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top