sisoputnfrba / foro

Foro de consultas para el trabajo práctico
151 stars 7 forks source link

Problemas de memoria al formatear un string (commons) #4392

Closed tperezr closed 2 days ago

tperezr commented 2 days ago

🖋️ Descripción

Hola, buenas noches! Estoy teniendo un problema medio raro. Estoy probando el modulo de memoria con la herramienta Valgrind. Cuando recibo un proceso o hilo a ejecutar, a veces, me formatea mal el string con la funcion de la commons string_from_format con el previo logueo de informacion, en este caso la conexion de kernel. (agrego una porcion minima de codigo)

Me tira muchos warnings Valgrind a la hora de usar log_xxxx pero no entiendo porque me afectaria a la funcion string_from_format.

Gracias!

PD: Este error solo me sucedio (hasta ahora) ejecutando el modulo con Valgrind

📚 Búsqueda en documentación/foros

No response

📄 Código relevante

char *absolute_path = string_from_format("%s%s%s", memoria_config->path_instrucciones, SEPARATOR_PATH, path_pseudocodigo);
log_debug(memoria_logger, "Leyendo instrucciones de: %s", absolute_path);
hilo_paquete->instrucciones = leer_archivo_por_linea(absolute_path, memoria_logger);

🐛 Cómo reproducir el error

No response

💻 Logs

ERROR

[INFO] 00:49:09:489 Memoria/(26769:27509): ## Kernel Conectado - FD del socket: 7
[DEBUG] 00:49:09:492 Memoria/(26769:27509): Leyendo instrucciones de: /home/utnso/tp-2024-2c-Task-Managers/Pruebas_pseudocodigo/PLANI_THREADnectado - FD del soc
[ERROR] 00:49:09:498 Memoria/(26769:27509): Error al abrir el archivo: /home/utnso/tp-2024-2c-Task-Managers/Pruebas_pseudocodigo/PLANI_THREADnectado - FD del soc
[INFO] 00:49:09:498 Memoria/(26769:27509): ## Hilo Creacion - (PID:TID) - (0:2)

OK

[DEBUG] 00:49:07:472 Memoria/(26769:26769): Nueva conexión recibida, esperando a que se identifique el cliente
[INFO] 00:49:07:476 Memoria/(26769:27508): ## Kernel Conectado - FD del socket: 8
[DEBUG] 00:49:07:477 Memoria/(26769:27508): Leyendo instrucciones de: /home/utnso/tp-2024-2c-Task-Managers/Pruebas_pseudocodigo/PLANI_THREAD
[INFO] 00:49:07:480 Memoria/(26769:27508): ## Hilo Creacion - (PID:TID) - (0:1)

📝 Normas del foro

iago64 commented 2 days ago

Buenas! cómo va?

Podrías subir un archivo con los logs de valgrind? Porque asi como lo planteas no termino de ver el posible problema, pero si viene por manejo de punteros fuera de las 3 líneas que posteas es imposible que lo vea.

Saludos.-

tperezr commented 2 days ago

Buenas, encontre el problema. Me faltaba agregar al final de la variable path_pseudocodigo el final de la cadena.

int pseudocodigo_len = buffer->size - offset;
char *path_pseudocodigo = malloc(pseudocodigo_len);
memcpy(path_pseudocodigo, buffer->stream + offset, pseudocodigo_len);
path_pseudocodigo[pseudocodigo_len] = '\0';

//Leo el path y el archivo, guardando el contenido en la lista de instrucciones
char *absolute_path = string_from_format("%s%s%s", memoria_config->path_instrucciones, SEPARATOR_PATH, path_pseudocodigo);
log_debug(memoria_logger, "Leyendo instrucciones de: %s", absolute_path);
hilo_paquete->instrucciones = leer_archivo_por_linea(absolute_path, memoria_logger);

Gracias

RaniAgus commented 2 days ago

¡Buenas! Cuidado que están reservando una cierta cantidad de bytes:

char *path_pseudocodigo = malloc(pseudocodigo_len);

Y luego están accediendo una posición por afuera de ese array:

path_pseudocodigo[pseudocodigo_len] = '\0';

Por ejemplo, si pseudocodigo_len vale 4, están reservando 4 bytes y luego accediendo a la 5ta posición (ya que el indexado de arrays arranca en 0).

Esto en Valgrind probablemente lo vean como un invalid write of size 1.

Saludos

tperezr commented 2 days ago

Hola, Si, justo estaba viendo eso, que me esta tirando ese error/warning Valgrind.

Gracias por la aclaracion!