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

luke at stat.uiowa.edu luke at stat.uiowa.edu
Fri Jun 12 18:01:42 CEST 2009


On Tue, 2 Jun 2009, luke at stat.uiowa.edu wrote:

> On Tue, 2 Jun 2009, Henrik Bengtsson wrote:
>
>> 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)
>
> Thanks for the report.  The gc proper does not (or should not) do
> anything that could cause allocation or trigger another gc.  The gc
> proper only identifies objects ready for finalization; running the
> finalizers happens outside the gc proper where allocation and gc calls
> should be safe.  This looks like either a missing PROTECT call in the
> code for running finalizers or possibly a more subltle bug in managing
> the lists of objects in different states of finalization. I will look
> more carefully when I get a chance.

This is now fixed in R-devel and the R-patched (it was essentially a
missing PROTECT call).

luke

>
> luke
>
>
>>> 
>>> Cheers,
>>> H.
>>> 
>>> ______________________________________________
>>> R-devel at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-devel
>>> 
>> 
>> ______________________________________________
>> R-devel at r-project.org mailing list
>> https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>
>

-- 
Luke Tierney
Chair, Statistics and Actuarial Science
Ralph E. Wareham Professor of Mathematical Sciences
University of Iowa                  Phone:             319-335-3386
Department of Statistics and        Fax:               319-335-3017
    Actuarial Science
241 Schaeffer Hall                  email:      luke at stat.uiowa.edu
Iowa City, IA 52242                 WWW:  http://www.stat.uiowa.edu


More information about the R-devel mailing list