[Rd] memory misuse in subscript code when rep() is called in odd way

William Dunlap wdunlap at tibco.com
Tue Nov 3 23:28:40 CET 2009


The following odd call to rep()
gives somewhat random results:

> rep(1:4, 1:8, each=2)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> rep(1:4, 1:8, each=2)
Error: only 0's may be mixed with negative subscripts
> rep(1:4, 1:8, each=2)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> rep(1:4, 1:8, each=2)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> rep(1:4, 1:8, each=2)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> rep(1:4, 1:8, each=2)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA  2 NA NA  2 NA NA  2
>  version
               _
platform       i686-pc-linux-gnu
arch           i686
os             linux-gnu
system         i686, linux-gnu
status         Under development (unstable)
major          2
minor          11.0
year           2009
month          10
day            20
svn rev        50178
language       R
version.string R version 2.11.0 Under development (unstable) (2009-10-20
r50178)

valgrind says that the C code is using uninitialized data:
> rep(1:4, 1:8, each=2)
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C557D: integerSubscript (subscript.c:408)
==26459==    by 0x80C5EDC: Rf_vectorSubscript (subscript.c:658)
==26459==    by 0x80C5FFD: Rf_makeSubscript (subscript.c:613)
==26459==    by 0x80C7368: do_subset_dflt (subset.c:158)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C5567: integerSubscript (subscript.c:409)
==26459==    by 0x80C5EDC: Rf_vectorSubscript (subscript.c:658)
==26459==    by 0x80C5FFD: Rf_makeSubscript (subscript.c:613)
==26459==    by 0x80C7368: do_subset_dflt (subset.c:158)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C556E: integerSubscript (subscript.c:411)
==26459==    by 0x80C5EDC: Rf_vectorSubscript (subscript.c:658)
==26459==    by 0x80C5FFD: Rf_makeSubscript (subscript.c:613)
==26459==    by 0x80C7368: do_subset_dflt (subset.c:158)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C558F: integerSubscript (subscript.c:415)
==26459==    by 0x80C5EDC: Rf_vectorSubscript (subscript.c:658)
==26459==    by 0x80C5FFD: Rf_makeSubscript (subscript.c:613)
==26459==    by 0x80C7368: do_subset_dflt (subset.c:158)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C55C1: integerSubscript (subscript.c:387)
==26459==    by 0x80C5EDC: Rf_vectorSubscript (subscript.c:658)
==26459==    by 0x80C5FFD: Rf_makeSubscript (subscript.c:613)
==26459==    by 0x80C7368: do_subset_dflt (subset.c:158)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C60BB: ExtractSubset (subset.c:64)
==26459==    by 0x80C73B9: do_subset_dflt (subset.c:171)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C61F6: ExtractSubset (subset.c:74)
==26459==    by 0x80C73B9: do_subset_dflt (subset.c:171)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
==26459==
==26459== Conditional jump or move depends on uninitialised value(s)
==26459==    at 0x80C61FF: ExtractSubset (subset.c:74)
==26459==    by 0x80C73B9: do_subset_dflt (subset.c:171)
==26459==    by 0x80B4283: do_rep (Rinlinedfuns.h:161)
==26459==    by 0x816491B: Rf_eval (eval.c:464)
==26459==    by 0x805A726: Rf_ReplIteration (main.c:262)
==26459==    by 0x805A95E: R_ReplConsole (main.c:311)
==26459==    by 0x805AFBC: run_Rmainloop (main.c:964)
==26459==    by 0x8058E2B: main (Rmain.c:33)
 [1]  1  1  1  2  2  2  2  2  2  2  3  3  3  3  3  3  3  3  3  3  3  4
4  4  4
[26]  4  4  4  4  4  4  4  4  4  4  4 NA NA NA NA NA NA NA NA NA NA NA
NA NA NA
[51] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
> rle(.Last.value)
Run Length Encoding
  lengths: int [1:40] 3 7 11 15 1 1 1 1 1 1 ...
  values : int [1:40] 1 2 3 4 NA NA NA NA NA NA ...

S+ returns the non-NA part of this output:
S+> rep(1:4, 1:8, each=2)
 [1] 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 4 4 4 4
4 4
S+> rle( rep(1:4, 1:8, each=2))
$lengths:
[1]  3  7 11 15

$values:
[1] 1 2 3 4


Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com 



More information about the R-devel mailing list