sisoputnfrba / foro

Foro de consultas para el trabajo práctico
147 stars 6 forks source link

STDIN_READ y MEMORIA #3965

Closed rood8592 closed 3 months ago

rood8592 commented 3 months ago

Buenas, Tenemos una duda con respecto al STDIN_READ al cual nosotros le indicamos por parámetro el tamaño de la cadena de texto que se va ingresar ¿Cómo se manejan el tema de si el usuario ingres más caracteres o menos de los que indicó en el pseudocodigo?

En nuestro tp sucede lo siguiente: cuando tiramos un stdin_read o write, cpu hace todos los cálculos con el tamaño que le hayas dicho, de ahí pasa a kernel y kernel se lo manda a la IO para que posteriormente esta ultima se comunique con memoria directamente. Tenemos páginas de 4 bytes y 512 de memoria. Creamos un único proceso con pseudocódigo en el cual hacemos un IO_STDIN_READ y le indicamos tamaño 18 y dirección logica 2. La mmu en cpu le devuelve lo siguiente a kernel:

Lista calculos = [0,2,2 ; 2,4,4 ; .... ] y asi hasta completar los 18 bytes. El primer numero es la base o inicio, el segundo el tamaño, el 3ro la dirección física.

Cuando la IO lo recibe de kernel, le manda a memoria una por una en un paquete (dato_ingresado, base, tamaño, direccion_fisica). El dato ingresado se lo manda completo, por eso esta el parámetro base, para que sepa memoria desde donde copiar y hasta donde lo sabe por el tamaño. A partir de acá suceden 2 cosas en nuestro TP dependiendo de la longitud de la cadena ingresada:

-- Si se ingresan mas caracteres de los que se indicaron en el pseudocodigo, solo se guardara hasta el 18 en memoria. Con memcheck no sucede ningún error.

-- Si se ingresan menos caracteres ocurre un invalid read of size con memcheck. Al principio no sabíamos por que sucedía esto, y creemos que es por lo siguiente: si se le ingresa por consola, por ejemplo, "ho" de longitud 2 habiendole indicado en el pseudocodigo longitud 18, la IO en un momento le mandara a memoria el siguiente calculo: base=2, tamaño=4 y direccionFisica=4 y el "ho". Lo que pasa acá es que cuando memoria hace memcpy, la misma se quiere parar a partir de la base 2 del dato a guardar y a partir de ahí en adelante guardar los 4 bytes que le siguen. El problema es que "ho" solo tiene 2 bytes, si le decimos que empiece a leer desde base=2 ya nos estamos parando por fuera del dato y ni hablar si le digo que lea a partir de ahi 4bytes para posteriormente guardarlos.

Se nos ocurren tres soluciones:

1- Añadir un aviso en la IO que comprueba la longitud de la cadena ingresada para comprobar si es la que se indico en el pseudocodigo y si no es, pedirle que reingrese la cadena. Esta sería la más fácil de implementar. 2- Recalcular en la IO dependiendo de la longitud ingresada por el usuario. 3- Ignorar el problema, considerarlo "error de usuario", como cuando nosotros hacemos char* cadena = malloc(4) y despues queremos escribir algo en el cadena[4].

FredeHG commented 3 months ago

Hola buenas!

No es algo que queramos probar, la más permisiva con el error humano es la 1 para no tener comportamientos no esperados. Por lo que yo implementaría esa

Saludos!

rood8592 commented 3 months ago

Implementaremos esa verificación entonces, gracias!