Descripción:
Se ha detectado que el sistema de conteo de referencias (refcnt) implementado para la gestión de memoria en el motor de ejecución colapsa si se manipulan estructuras de datos cíclicas (por ejemplo, una lista o un conjunto que se contiene a sí mismo).
En src/eval/data.c, la función data_mod_refcnt modifica el contador de referencias de forma recursiva para los contenedores LST_R y SET_R:
int data_mod_refcnt(ResNode *node, int add) {
int r = -1;
if(!node) return r;
ResDataN *data = (ResDataN *)node;
switch(data->type) {
case SET_R: case LST_R: {
ResNode *elem = data->elems;
while(elem) {
data_mod_refcnt(elem->data, add); // <--- Llamada recursiva directa
elem = elem->next;
}
} // Fallthrough
...
Pasos para reproducir (Código Aleph):
let a = [1];
a[1] = a; // La lista se referencia a sí misma, creando un ciclo.
Impacto:
Al intentar realizar cualquier asignación o eliminación que involucre incrementar o decrementar el contador de referencias de la estructura cíclica, la recursión no encuentra un caso base y consume todo el espacio de la pila, resultando en un fallo de segmentación (Segmentation Fault / Stack Overflow) inmediato del intérprete.
Solución propuesta:
Implementar una estrategia para evitar la recursión infinita en estructuras cíclicas, como:
- Mantener un registro temporal de nodos ya visitados durante el recorrido de conteo de referencias.
- Evitar la recursión directa profunda o rediseñar el recolector para resolver dependencias cíclicas de forma segura.
Descripción:
Se ha detectado que el sistema de conteo de referencias (
refcnt) implementado para la gestión de memoria en el motor de ejecución colapsa si se manipulan estructuras de datos cíclicas (por ejemplo, una lista o un conjunto que se contiene a sí mismo).En
src/eval/data.c, la funcióndata_mod_refcntmodifica el contador de referencias de forma recursiva para los contenedoresLST_RySET_R:Pasos para reproducir (Código Aleph):
Impacto:
Al intentar realizar cualquier asignación o eliminación que involucre incrementar o decrementar el contador de referencias de la estructura cíclica, la recursión no encuentra un caso base y consume todo el espacio de la pila, resultando en un fallo de segmentación (Segmentation Fault / Stack Overflow) inmediato del intérprete.
Solución propuesta:
Implementar una estrategia para evitar la recursión infinita en estructuras cíclicas, como: