Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

reebr

gets() e fflush(stdin)

Recommended Posts

Sempre vejo o pessoal dizendo para NÃO USAR essas funções. Sobre a fflush eu já entendi o motivo, mas porque não se deve usar a gets() para ler strings?

 

Quais funções podem ser usadas para substituir o que uso destas?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tanto o gets quanto scanf não possuem controle sobre o tamanho de caracteres lidos, permitindo que esse limite seja ultrapassado, invadindo outras áreas de memória.

 

Em sistemas operacionais mais antigos, isso poderia significar área de outros programas. Nos sistemas atuais, isso ficará limitado à área de memória da aplicação, mas não significa que não ocorra a invasão. Alguns vírus utilizam essa vulnerabilidade para atuarem com injeção de códigos maliciosos.

 

O adequado é usar sempre a leitura com limitação, no caso, o fgets, ou então, melhor ainda é usar a leitura de caracter por caracter. Nesse último caso, você ainda pode restringir os caracteres (Ex: leitura de CPF).

Sem contar que, fazendo da forma correta, você SEMPRE evitará problema desse tipo.

 

Um exemplo simples para testar esse "bug", seria: fazer a leitura de duas variáveis diferentes, na sequência. Se a segunda variável tiver estourado o espaço, a primeira será sobrescrita pela parte excedente da segunda.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    char frase[10] = {'\0'};
    char frase2[10] = {'\0'};

    gets(frase);
    gets(frase2);

    printf("Tamanho: %d - Frase: %s\n", strlen(frase), frase);
    printf("Tamanho: %d - Frase: %s\n", strlen(frase2), frase2);

    return 0;
}

Valores de entrada, ultrapassando o limite apenas na segunda variável:

qwertyuio
asdfghjklzxcvb

A saída no windows foi:

Tamanho: 4 - Frase: xcvb
Tamanho: 14 - Frase: asdfghjklzxcvb

Podemos ver que ocorreu a bagunça por causa dos limites ultrapassados. Os 4 últimos caracteres da segunda variável, sobrescreveram a primeira variável.

Se a segunda variável tivesse como entrada apenas o 9 caracteres, onde está a letra 'z', seria o terminador de string. A partir dela, começaria o conteúdo da primeira variável.

 

Em programas pequenos, isso é detectado facilmente, porém, em projetos grandes, pode se tornar um pesadelo para o programador, já que esse tipo de erro não é acusado pelo compilador.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.