[Rd] Bug ? mine or ? in R core

Peter Dalgaard BSA p.dalgaard@biostat.ku.dk
01 Apr 2000 20:31:42 +0200


Michael Lapsley <mlapsley@ndirect.co.uk> writes:

[Crashes with the following code]

> PROTECT(ans=NEW_LIST(2)); /*create answer [0] = data, [1]=stat */
> PROTECT(stat=NEW_INTEGER(1)); /* numeric status vector */
> PROTECT(data=NEW_CHARACTER(buffsize));
> while(1){
> 	for (i=1; i<= NCOLS; i++){
> 			offset=((i-1)*maximum)+(j-1);
> 		}
> 	  DBG(2,"writing to data");
> 	  STRING(data)[offset]=COPY_TO_USER_STRING("Some dummy data");
> 		if(offset +NCOLS >= buffsize){
> 			DBG(1,"reallocating space");
> 			length=length(data);
> 			buffsize=length+buffsize;
> 			SET_LENGTH(data,buffsize);
                        ^^^^^^^^^^^^^^^^^^^^^^^^^
> 		}
> 	j++;
> 	if(maximum && j>maximum)
> 		break;
> }	
> 
> /* transpose it */
> DBG(1,"trimming");
> SET_LENGTH(data,j*NCOLS); /* trim down buffer*/
  ^^^^^^^^^^^^^^^^^^^^^^^^

I'm not too well accustomed to these macros (they aren't used in the R
internals), but in Rdefines.h we have

#define SET_LENGTH(x, n)       (x = lengthgets(x, n))

so I wouldn't count on "data" being the same after those operations,
and in particular not expect it to be protected anymore. You probably
need to stick in "UNPROTECT(1); PROTECT(data);" after the SET_LENGTH
operations.

-- 
   O__  ---- Peter Dalgaard             Blegdamsvej 3  
  c/ /'_ --- Dept. of Biostatistics     2200 Cph. N   
 (*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard@biostat.ku.dk)             FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-devel mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-devel-request@stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._