[Rd] formal argument "envir" matched by multiple actual arguments

Henrik Bengtsson hb at maths.lth.se
Tue Jun 2 10:25:13 CEST 2009


Nice case - I think you're onto something. /Henrik

2009/6/2  <hpages at fhcrc.org>:
> In fact reg.finalizer() looks like a dangerous feature.
>
> If the finalizer itself triggers (implicitely or
> explicitely) garbage collection, then bad things happen.
> In the following example, garbage collection is triggered
> explicitely (using R-2.9.0):
>
>   setClass("B", representation(bb="environment"))
>
>   newB <- function()
>   {
>     ans <- new("B", bb=new.env())
>     reg.finalizer(ans at bb,
>                   function(e)
>                   {
>                       gc()
>                       cat("cleaning", class(ans), "object...\n")
>                   }
>     )
>     return(ans)
>   }
>
>   > for (i in 1:500) {cat(i, "\n"); b1 <- newB()}
>   1
>   2
>   3
>   4
>   5
>   6
>   ...
>   13
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   14
>   ...
>   169
>   170
>   171
>   Error: not a weak reference
>   Error: not a weak reference
>   [repeat the above line thousands of times]
>   ...
>   Error: not a weak reference
>   Error: not a weak reference
>   cleaning B object...
>   Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'
>   Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'
>   [repeat the above line thousands of times]
>   ...
>   Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'
>   Error: SET_VECTOR_ELT() can only be applied to a 'list', not a 'integer'
>   172
>   ...
>   246
>   247
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>   cleaning B object...
>
>    *** caught segfault ***
>   address 0x41, cause 'memory not mapped'
>
>   Traceback:
>    1: gc()
>    2: function (e) {    gc()    cat("cleaning", class(ans),
> "object...\n")}(<environment>)
>
>   Possible actions:
>   1: abort (with core dump, if enabled)
>   2: normal R exit
>   3: exit R without saving workspace
>   4: exit R saving workspace
>   Selection: 2
>   Save workspace image? [y/n/c]: n
>   Segmentation fault
>
> So apparently, if the finalizer triggers garbage collection,
> then we can end up with a corrupted session. Then anything can
> happen, from the strange 'formal argument "envir" matched by
> multiple actual arguments' error I reported in the previous post,
> to a segfault. In the worse case, nothing apparently happens but
> the output produced by the code is wrong.
>
> Maybe garbage collection requests should be ignored during the
> execution of the finalizer? (and more generally during garbbage
> collection itself)
>
> Cheers,
> H.
>
> ______________________________________________
> R-devel at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
>



More information about the R-devel mailing list