Descripción:
En el archivo src/eval/ifn.c, dentro de la implementación de la función integrada id(), se realiza una conversión directa de la dirección del puntero sym->value a un entero de tipo long para ser empaquetado en el nodo de resultado:
ResNode *eval_id(void) {
DBG_FN_START;
Symbol *sym = scope_get_sym("x", str_hash("x"));
if(!sym) return RAISE("Interno", S("Error al obtener 'x'"));
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wint-conversion"
return res_new_return(res_new_int((sym->value))); // <--- Conversión de puntero a entero
#pragma GCC diagnostic pop
}
Para evitar que el compilador lance advertencias de tipo, se ha utilizado una directiva #pragma para silenciar -Wint-conversion.
Impacto:
Esto introduce problemas de portabilidad y comportamiento indefinido. En plataformas con modelo de datos LLP64 (como Windows de 64 bits), el tipo long mide 32 bits, mientras que las direcciones de memoria (punteros) miden 64 bits. Al realizar esta conversión, la dirección del puntero se trunca, perdiendo los 32 bits superiores del puntero real, lo que hace que la función id() retorne un identificador incompleto e incorrecto.
Solución propuesta:
Utilizar tipos portables de longitud garantizada como uintptr_t (definido en <stdint.h>) para almacenar de forma segura la dirección del puntero antes de convertirlo al tipo entero interno de Aleph, eliminando la necesidad de suprimir las advertencias del compilador.
Descripción:
En el archivo
src/eval/ifn.c, dentro de la implementación de la función integradaid(), se realiza una conversión directa de la dirección del punterosym->valuea un entero de tipolongpara ser empaquetado en el nodo de resultado:Para evitar que el compilador lance advertencias de tipo, se ha utilizado una directiva
#pragmapara silenciar-Wint-conversion.Impacto:
Esto introduce problemas de portabilidad y comportamiento indefinido. En plataformas con modelo de datos LLP64 (como Windows de 64 bits), el tipo
longmide 32 bits, mientras que las direcciones de memoria (punteros) miden 64 bits. Al realizar esta conversión, la dirección del puntero se trunca, perdiendo los 32 bits superiores del puntero real, lo que hace que la funciónid()retorne un identificador incompleto e incorrecto.Solución propuesta:
Utilizar tipos portables de longitud garantizada como
uintptr_t(definido en<stdint.h>) para almacenar de forma segura la dirección del puntero antes de convertirlo al tipo entero interno de Aleph, eliminando la necesidad de suprimir las advertencias del compilador.