Skip to content

Conversión insegura de tipo puntero a entero de 32 bits en la función integrada id() #8

Description

@CrysoK

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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions