[R] simple Rcpp function produces: "AddressSanitizer: attempting free on address which was not malloc"

Nick Matzke matzke at berkeley.edu
Tue Jul 9 00:05:23 CEST 2013

I have an R package, cladoRcpp, which is up on CRAN.  After 
a minor update, which compiled without errors on R CMD check 
on my machine, I submitted the update.

Brian Ripley got an error that I didn't get:

We still see

 > Rcpp_combn_zerostart(n_to_choose_from=4, k_to_choose=2, 
==14369== ERROR: AddressSanitizer: attempting free on 
address which was not malloc()-ed: 0x0000040541d0
     #0 0x7fe61090caca in ?? ??:0
     #1 0x7fe6138ba858 in 
     #2 0x7fe613896fd4 in cpp_combn_zerostart 
     #3 0x472b5f in do_dotcall 

using AddressSanitizer, as before.

I gather that this is from him using the new gcc4.8 and the 
AddressSanitizer option on compile:



I will attempt to download/install gcc48 and reproduce the 
error, although this is a somewhat major project.

The C++ function, though, is quite simple -- I wonder if 
anyone might be able to spot easily what is going on?

R function which calls C++ function:

Rcpp_combn_zerostart <- function(n_to_choose_from, 
k_to_choose, maxlim=1e+07)
	n = n_to_choose_from
	m = k_to_choose
	predicted_number_of_cells_to_fill = choose(n,m)
	if (predicted_number_of_cells_to_fill > maxlim)
		txt = paste("ERROR: n=", n_to_choose_from, ", k=", 
k_to_choose, ", n choose k=", 
predicted_number_of_cells_to_fill, " > maxlim=", maxlim, 
"\nCalculating something this big may crash your computer!", 
	outarray = .Call("cpp_combn_zerostart", as.integer(n), 
as.integer(m), as.double(maxlim))

	#R_states_list <- matrix(out$res,nrow=m,byrow=F)


C++ function:

RcppExport SEXP cpp_combn_zerostart(SEXP R_n, SEXP R_m, SEXP 
	using namespace std;
	// Convert to plain C++
	int cpp_nval = Rcpp::as<int>(R_n);
	int cpp_mval = Rcpp::as<int>(R_m);
	double cpp_maxval = Rcpp::as<double>(R_maxval);
	// Create pointer variables to hold the addresses to each
	int* n = &cpp_nval;
	int* m = &cpp_mval;
	// Choose n by m; calculate from the values stored at 
addresses n and m
	double Cnm;
	Cnm = nChoosek(*n, *m);
	// Error check
	if (Cnm > cpp_maxval)
		//cout << "\nERROR: n=" << cpp_nval << ", k=" << cpp_mval 
<< ", n choose k=" << Cnm << " > maxval=", cpp_maxval;
		//cout << "\nCalculating something this big may crash your 
computer!  Returning 0.";
		return 0;
	// Declare and populate empty array of addresses to hold 
the combn results
	// Addresses for a 10x3 array; 30 total
	int* combmat;
	combmat = new int[(int)Cnm**(m+0)];
	// Run moncombn_zerostart; this will update the stuff in 
the addresses
	// stored in combmat
	// Write the contents of each of the Cnm times *m addresses 
to cout
	// convert double (float) Cnm to int
	int nrows;
	int ncols;
	nrows = *m;
	ncols = (int)Cnm;
	int vecsize;
	vecsize = nrows * ncols;
	//int combmat_vals[nrows * ncols];
	//Rcpp::NumericVector combmat_vals(vecsize);	// vector of 
size vecsize filled with 0s
	Rcpp::NumericMatrix combmat_vals(nrows,ncols);	// vector of 
size vecsize filled with 0s

	// initialize row & column numbers, and the temporary number	
	int rownum = 0;
	int colnum = 0;
	int tmpnum = 0;
	//cout << nrows << " rows, " << ncols << "cols...\n";
	for (int j = 1; j <= Cnm**(m+0); j++)
		//cout << "\n";
		//cout << *(combmat+j-1) << " ";
		//combmat_vals[rownum][colnum] = *(combmat+j-1);
		//tmpnum = Rcpp::as<int>(*(combmat+j-1));
		tmpnum = *(combmat+j-1);
		//combmat_vals[j-1] = tmpnum;

		//cout << "\n" << rownum << "," << colnum << ", ncols=" << 
ncols << ": " << tmpnum;
		combmat_vals(rownum, colnum) = tmpnum;
		// Increment column
		// Reset column when you reach the end; increment the row.
		// Reset of rows is not necessary
		if (rownum >= (nrows))
			rownum = 0;
		} // end forloop

	// Convert to an int
	//Rcpp::Matrix outcombs(combmat_vals);
	// example use Armadillo matrix
	// http://dirk.eddelbuettel.com/blog/2011/04/23/
	//arma::mat outcombs = Rcpp::as<arma::mat>(combmat_vals);
	return Rcpp::wrap(combmat_vals);

Thanks for any and all help!  These memory errors are tough 
for us biologists!!

Cheers, Nick

Nicholas J. Matzke
Ph.D. Candidate, Graduate Student Researcher

Huelsenbeck Lab
Center for Theoretical Evolutionary Genomics
4151 VLSB (Valley Life Sciences Building)
Department of Integrative Biology
University of California, Berkeley

Graduate Student Instructor, IB200B
Principles of Phylogenetics: Ecology and Evolution

Lab websites:
Dept. personal page: 
Lab personal page: 
Lab phone: 510-643-6299
Dept. fax: 510-643-6264

Cell phone: 510-301-0179
Email: matzke at berkeley.edu

Mailing address:
Department of Integrative Biology
1005 Valley Life Sciences Building #3140
Berkeley, CA 94720-3140

"[W]hen people thought the earth was flat, they were wrong. 
When people thought the earth was spherical, they were 
wrong. But if you think that thinking the earth is spherical 
is just as wrong as thinking the earth is flat, then your 
view is wronger than both of them put together."

Isaac Asimov (1989). "The Relativity of Wrong." The 
Skeptical Inquirer, 14(1), 35-44. Fall 1989.

More information about the R-help mailing list