2010-05-16 11 views
14

Cuando uso obtiene función, gcc me da una advertencia:advertencia: se función es peligroso

warning:the `gets' function is dangerous and should not be used. 

Por qué obtiene y función pone peligroso?

+18

Los 'puts()' función de cuenta no es peligroso. ¿Por qué preguntas sobre 'puts()' también? –

Respuesta

45

Si usted tiene un código como éste:

char s[10]; 
gets(s); 

y escribir en más de 10 caracteres cuando se ejecuta el programa, se desborda el búfer, causando un comportamiento indefinido. La función gets() no tiene medios para evitar que escriba los caracteres, por lo que debe evitarse. En su lugar debe usar fgets(), lo que le permite limitar el número de caracteres leídos, por lo que el buffer no se desborde .:

char s[10]; 
fgets(s, 10, stdin); 

Los puts() es perfectamente seguro, proporcionan la cadena que está dando salida está terminado en nulo.

+6

'fgets' no descarta caracteres. Los deja sin leer. Las llamadas posteriores a 'fgets' o cualquier otra función de lectura pueden leer los caracteres restantes. –

+0

@R. Es cierto: voy a editar mi respuesta. Por cierto, R. no es un nombre de usuario de SO bueno o sensible. –

4

Porque gets no restringe la cantidad de datos que lee y, por lo tanto, es vulnerable a los desbordamientos del búfer. La respuesta de @Neil tiene la solución adecuada para esto.

La función puts no es peligrosa, AFAIK, a menos que, por supuesto, se te olvide terminarla sin validez.

1

Obtiene no comprueba saturación del búfer exponer su código para atacar

2

Como Wikipedia's article says, es inherentemente inseguro porque todo lo que necesita es un char * como argumento.

Esto es peligroso porque no hay forma de que el método sepa cuánto espacio se ha asignado a ese char * en cada situación. Por lo tanto, gets se comporta como si tuviera un cheque en blanco para escribir tantos datos como sea posible, lo que podría dar lugar a sobrepasamientos del búfer.

La alternativa es fgets que toma no solo la matriz de caracteres, sino la longitud máxima y el puntero de la secuencia. gets se mantiene solo por compatibilidad con versiones anteriores con código anterior.

2

Los desbordamientos del búfer son peligrosos. Aquí está la definición:

/* Get a line from the stdin stream. */ 
char *gets(char *buffer); 

¿Qué tan grande es la memoria intermedia? Si un usuario escribe más datos que pueden caber en el búfer, el programa podría bloquearse y ser susceptible a ataques de hackers.

1

gets lee datos en el área de memoria dada hasta que se encuentre una nueva línea o un final de archivo. Si la entrada (por ejemplo, como la suministrada por el usuario) contiene una línea más larga que el tamaño del búfer suministrado en gets, se desbordará y se escribirá en la memoria fuera del búfer. En el peor de los casos, esto puede permitir que un usuario malintencionado escriba datos que alteren el comportamiento del programa o incluso que ejecuten código arbitrario con los privilegios de ese programa (por ejemplo, uno que se ejecute en un servidor remoto o con los privilegios de otro usuario). e incluso los desbordamientos accidentales pueden romper el software.

fgets En su lugar, se necesita un argumento adicional para restringir el tamaño de la entrada.

Cuestiones relacionadas