Skip to content

Desbordamiento de pila (Stack Overflow) por recursión infinita en conteo de referencias con estructuras cíclicas #7

Description

@CrysoK

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:

  1. Mantener un registro temporal de nodos ya visitados durante el recorrido de conteo de referencias.
  2. Evitar la recursión directa profunda o rediseñar el recolector para resolver dependencias cíclicas de forma segura.

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