não é possível salvar o valor de retorno strlen
-
28-10-2019 - |
Pergunta
Estou usando a função strlen da biblioteca de strings c. Passei um NULL string a ele e encontrei um resultado misterioso. Eu sei que não devo passar string NULL, mas preciso de uma explicação para isso. O código é parecido com este
main()
{
int k;
char *s=NULL;
strlen(s);
// k = strlen(s);
}
No meu compilador gcc, ele funciona bem com o comentário.
mas se você remover o comentário da linha
k=strlen(s);
ele produz falha de segmentação. Alguma explicação?
Solução
Este é o código assembler sem atribuição à variável int
movq $0, -16(%rbp)
movl $0, %eax
leave
ret
o compilador não chama _strlen porque o valor não será usado
Outras dicas
A primeira chamada 'strlen' que não está atribuindo seu valor de retorno provavelmente está sendo otimizada pelo seu compilador.
Passar um ponteiro nulo para strlen
resulta em indefinido behvaiour . Tudo pode acontecer. Incluindo seg-faults.E não incluindo falhas de seg.
Se quiser saber o motivo exato, você precisará examinar o código assembler que o seu compilador gera.Mas isso não dirá nada de útil.