I've been chasing some random crashes in a program I'm writing. I was able to 
reduce the problem to the small program below.
    
    
    type
      Vector = ref array[2, float64]
      Matrix = ref array[2, Vector]
    
    proc newVector(): Vector =
      new(result)
    
    proc newMatrix(): Matrix =
      new(result)
      for ix in 0 .. 1:
        result[ix] = newVector()
    
    let m = newMatrix()
    
    m[0][0] = 1.0
    echo "m[0][0] = ", m[0][0]
    
    GC_fullCollect()
    
    m[0][0] = 2.0
    echo "m[0][0] = ", m[0][0]
    

This program crashes during the garbage collection with a
    
    
    SIGSEGV: Illegal storage access. (Attempt to read from nil?)
    

It looks like the vectors in the **m** matrix are being garbage collected at 
the first collection. This obviously creates problems.

Replacing
    
    
    for ix in 0 .. 1:
      result[ix] = newVector()
    

in **newMatrix** with 
    
    
    for v in result[].mitems:
      v = newVector()
    

does work.

I'm not very sure what is going on. I think that the original version should 
work. Am I wrong in thinking that ? Or did I make a mistake ? Or is this a GC 
bug ?

Reply via email to