no se puede guardar el valor de retorno strlen
-
28-10-2019 - |
Pregunta
Estoy usando la función strlen de la biblioteca de cadenas c. Pasé un NULL y encontré un resultado misterioso. Sé que se supone que no debo pasar una cadena NULL pero necesito una explicación. El código se parece a esto
main()
{
int k;
char *s=NULL;
strlen(s);
// k = strlen(s);
}
En mi compilador gcc, funciona bien con el comentario.
pero si quita el comentario en la línea
k=strlen(s);
produce falla de segmentación. ¿Alguna explicación?
Solución
Este es el código ensamblador sin asignación a la variable int
movq $0, -16(%rbp)
movl $0, %eax
leave
ret
el compilador no llama a _strlen porque el valor no se usará
Otros consejos
La primera llamada 'strlen' que no asigna su valor de retorno probablemente esté siendo optimizada por su compilador.
Pasar un puntero nulo a strlen
da como resultado comportamiento indefinido . Puede pasar cualquier cosa. Incluyendo seg-faults.Y sin incluir seg-faults.
Si desea saber el motivo exacto, deberá mirar el código ensamblador que genera su compilador.Pero esto no te dirá nada útil.