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.
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.
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.
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 .