ALTAVOZ 1: Vamos a escribir un programa que para crear una cadena del usuario sin utilizando el CS50 Biblioteca de funcionar GetString. Para ello, vamos a seguir adelante y utilizar scanf, la función que el GetString función utiliza realmente debajo de la capucha. Pero yo voy a hacer esto deliberadamente de manera buggy. Yo voy a hacer de una manera que creo sería correcto, pero resulta que mi suposición de que va a ser muy, muy deficiente. Y, de hecho, muy peligroso. Debido a errores como el que yo estoy a punto de hacer que puede ser explotada por los adversarios de tal manera que su máquina o su programa puede asumir el control potencialmente. Vamos a comenzar de la siguiente manera. Primero vamos a declarar nuestra cadena, de otro modo conocido ahora como una estrella de char, y llamar a que s. Permite siguiente solicita al usuario una cadena, al igual que con "string por favor." Y ahora vamos a obtener la cadena del usuario usando scanf, entre comillas, "% s". En Es decir, vamos a informar a scanf que no, de hecho, esperan conseguir una cadena desde el usuario. Pero ahora tenemos que decirle a scanf una cosa más - dónde colocar la cadena que el usuario proporciona. Bueno, yo voy a empezar simplemente con comas s, especificando que me gustaría scanf para poner la cadena allí. Estoy al lado va a imprimir algo como "gracias printf para el% s barra invertida n coma. "Y como siempre, estoy va a pasar en la cadena, s. Ahora vamos a guardar, compilar y ejecutar este programa, y ​​ver si no podemos inducir el problema que predijo. Hacer scanf-1. ./scanf-1. Cadena por favor. Vamos a proporcionar algo como, "hola." "Gracias por la nula". Hmm, eso no es lo que yo esperaba. Entonces, ¿qué está pasando aquí? Bueno, resulta que ya declaramos s como una estrella de caracteres pero no lo hicimos efectivamente almacenada en s la dirección de un pedazo real de memoria, scanf no lo hizo tener en cualquier lugar de poner la cadena que el usuario escribió pulg De hecho, si el usuario tuviera que ahora escriba una cadena mucho más larga que "hola" por ejemplo, varias líneas de texto o varios párrafos de texto, es bastante posible que podamos inducir una llamado fallo de segmentación. Debido a scanf no va a saber que En realidad no he puesto una dirección interior de s. Más bien, se va a ver algún valor s, en un patrón de bits que puede muy bien ser un valor basura, no sólo por casualidad. Y scanf todavía va a tratar de escribir la cadena de usuario a esa dirección, incluso si es un valor de basura, la cual de hecho, podría inducir un choque. Entonces, ¿cómo vamos a arreglar esto?