Função [RESOLVIDO]

1. Função [RESOLVIDO]

Lucas
~luJJc4

(usa Ubuntu)

Enviado em 21/11/2011 - 06:47h

Olá pessoa, alguem poderia me informar se há algum tipo de problema em usar a função "gets"
ao compilar um simples codigo apareçeu a seguinte menssagem :

" /tmp/ccdYdy8In.o: In function 'main':
LerString.c:(.text+0x24): warning: the 'gets' function is dangerous and should not be used. "


queria saber porque eu deveria evitar está função.. que tipo de problema poderia ocorrer com seu uso..
abaixo segue o codigo em que foi usada:



 #include <stdio.h>
int main ()
{
char string[5];
printf ("\n Digite 4 Digitos: ");
gets (string);
printf ("\n Voce digitou %s", string);
return (0);
}



OBS: Apesar de tudo funcionou corretamente (;


  


2. Re: Função [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 21/11/2011 - 08:23h

Cara, não tem problema nenhum, só que a função gets() é a melhor coisa pra buffer overflows. Ela não faz checagem de quantos caracteres está lendo e armazenando no buffer, então, se você declarar uma string,

char str[20];

E usar:


gets(str);


Você pode colocar quantos caracteres quiser nessa string, até acontecer um Segmentation Fault ou uma Illegal Instruction, que quando explorada de maneira certa, pode levar a uma shell do seu sistema.

Ou seja, falha de segurança.... :)

Funções igualmente falhas são strcat() e strcpy() por exemplo.

No caso do gets, usa o primo bonito dele, o fgets().



#include <stdio.h>

#define STRSIZE 10

int main()
{
char str[ STRSIZE ];

fgets( str, STRSIZE, stdin );

printf( "%s\n", str );

return 0;
}


3. Re: Função [RESOLVIDO]

Lucas
~luJJc4

(usa Ubuntu)

Enviado em 21/11/2011 - 09:07h

EnzoFerber escreveu:

Cara, não tem problema nenhum, só que a função gets() é a melhor coisa pra buffer overflows. Ela não faz checagem de quantos caracteres está lendo e armazenando no buffer, então, se você declarar uma string,

char str[20];

E usar:


gets(str);


Você pode colocar quantos caracteres quiser nessa string, até acontecer um Segmentation Fault ou uma Illegal Instruction, que quando explorada de maneira certa, pode levar a uma shell do seu sistema.

Ou seja, falha de segurança.... :)

Funções igualmente falhas são strcat() e strcpy() por exemplo.

No caso do gets, usa o primo bonito dele, o fgets().



#include <stdio.h>

#define STRSIZE 10

int main()
{
char str[ STRSIZE ];

fgets( str, STRSIZE, stdin );

printf( "%s\n", str );

return 0;
}


Muito Obrigado Enzo, entendi perfeitamente agora :]
como eu sou iniciante em C tenho muita coisa a aprender ainda..
valeu :]


4. Re: Função [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 22/11/2011 - 09:55h

Agora diz ai,

Como você colocou seu código identado aqui no fórum do VOL?

Alguma TAG?


5. Re: Função [RESOLVIDO]

Lucas
~lujjc4

(usa Ubuntu)

Enviado em 22/11/2011 - 11:36h

eu uso a tag [*code]....[*/code] ( sem * )



Enzo, a respeito desse codigo que você me mostrou:


#include <stdio.h>

#define STRSIZE 10

int main()
{
char str[ STRSIZE ];

fgets( str, STRSIZE, stdin );

printf( "%s\n", str );

return 0;
}


/* O que seria */
#define STRSIZE 10 ?

/* poderia me explicar essa linha? */
fgets (str, STRSIZE, stdin );




6. Re: Função [RESOLVIDO]

Enzo de Brito Ferber
EnzoFerber

(usa FreeBSD)

Enviado em 24/11/2011 - 20:47h

Opa!

O código é pra exemplificar o uso da função fgets().


#define STRSIZE 10


Isso é simplesmente uma DEFINIÇÃO para o compilador. Toda vez que ele encontrar a string 'STRSIZE' no seu arquivo .c, ele vai trocar por 10.


fgets (str, STRSIZE, stdin );


A função propriamente dita, o escopo dela é:


char fgets (char * restrict str, int size, FILE * restrict stream);


O primeiro argumento, 'str', é o ponteiro para string onde você vai armazenar a informação.

O segundo, size, é o tamanho MÁXIMO que ele pode ler e armazenar na string apontada por 'str'.

E o terceiro e ultimo, 'stream', é o descritor de arquivo do qual ele vai ler. A entrada padrão do shell (stdin), a saida(stdout), saida de erro(strerr) ou qualquer outro descritor de arquivo, como um ponteiro para um aquivo local aberto, ou mesmo um socket.

Espero ter ajudado,
Qualquer dúvida posta denovo,
Enzo Ferber
[]'s






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts