Obtiene

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 7 de septiembre de 2017; las comprobaciones requieren 7 ediciones .

gets - una función incluida en la biblioteca estándar de C , declarada en el archivo de encabezado stdio.h , que lee una línea de entrada estándar y la coloca en el búfer creado por la función de llamada. Si arroja un error, ahora se debe usar gets_s para llamarlo.

Implementación

Se puede implementar de la siguiente manera (usando getchar):

char * obtiene ( char * s ) { /*borrar el búfer de entrada */ fflush ( entrada estándar ); int i , k = getchar (); /* Devuelve NULL si no se ingresa nada */ si ( k == EOF ) devuelve NULL ; /* Leer y copiar caracteres al búfer hasta llegar al final de la línea o archivo */ para ( i = 0 ; k != EOF && k != '\n' ; ++ i ) { s [ yo ] = k ; k = obtener char (); /* Si ocurre un error, el búfer resultante no es válido */ if ( k == EOF && ! feof ( stdin )) devuelve NULL ; } /* Terminar en nulo y devolver el búfer en caso de éxito. El carácter de avance de línea no se almacena en el búfer. */ s [ i ] = '\0' ; devolver s ; }

El programador debe conocer el número máximo de caracteres que se leerán getspara asegurarse de que se asigna un búfer de tamaño suficiente. Esto no es posible sin información sobre los datos. Este problema puede generar errores y abre la puerta a brechas de seguridad informática a través de desbordamientos de búfer . Muchas fuentes aconsejan a los programadores que nunca lo usen getsen nuevos programas [1] [2] [3] .

La aplicación getsestá muy obsoleta. La función se deja en los estándares C89 y C99 para compatibilidad con versiones anteriores . Muchas herramientas de desarrollo de software , como GNU ld , emiten advertencias si se encuentran al vincular código usando gets.

Alternativas

En su lugar gets, se pueden utilizar otras funciones de entrada de cadenas para evitar errores de desbordamiento del búfer. La opción más sencilla sería fgets. Al reemplazar el código de vista

búfer de caracteres [ BUFFERSIZE ] ; obtiene ( búfer );

ver código

búfer de caracteres [ BUFFERSIZE ] ; fgets ( búfer , tamaño de ( búfer ), entrada estándar );

tenga en cuenta que la llamada fgets(buffer, sizeof buffer, stdin)difiere gets(buffer)no solo de la protección contra desbordamiento de búfer, sino también en que fgets(buffer, sizeof buffer, stdin)conserva el carácter de nueva línea de terminación (si la entrada de línea termina con un carácter de nueva línea) mientras gets(buffer)lo descarta.

Seguridad de uso

El uso seguro getsrequiere que el programador se asegure de que los desbordamientos del búfer no se conviertan en un problema. El estándar del lenguaje C no garantiza esto; sin embargo, existen varias formas relativamente sofisticadas de probar esto, con diversos grados de portabilidad. Una opción es una página de guardia para proteger la memoria. En combinación con controladores de excepciones como SIGSEGVy sigaction, una página de protección puede ayudar con el manejo de errores .

Notas

  1. GNU. Biblioteca GNU C - Entrada de cadena (enlace descendente) . - "La función es muy peligrosa , ya que no proporciona ninguna protección contra el desbordamiento de línea . La biblioteca GNU lo incluye solo por motivos de compatibilidad. Siempre debe usar o en lugar de .". Consultado el 2 de agosto de 2008. Archivado desde el original el 19 de marzo de 2012. gets sfgetsgetline
  2. ¿Por qué todo el mundo dice que no se use gets()? (enlace no disponible) . comp.lang.c Preguntas frecuentes . Consultado el 2 de agosto de 2008. Archivado desde el original el 19 de marzo de 2012. 
  3. gets(3) -  Página del manual de funciones de la biblioteca GNU/Linux   -  "Nunca use . gets()Dado que es imposible saber, sin saber nada acerca de los datos, cuántos caracteres se leerán gets()y, por lo tanto gets(), seguirá poniendo caracteres en el búfer después de que esté lleno, lo cual es muy peligroso de usar. Esto puede violar la protección de la información de un sistema informático.

Enlaces