[GenABEL-dev] [Genabel-commits] r1898 - in pkg/OmicABEL: . src

L.C. Karssen lennart at karssen.org
Sun Dec 21 23:31:29 CET 2014


Hi Diego,


On 21-12-14 15:15, noreply at r-forge.r-project.org wrote:
> Author: dfabregat
> Date: 2014-12-21 15:14:59 +0100 (Sun, 21 Dec 2014)
> New Revision: 1898
> 
> Modified:
>    pkg/OmicABEL/make.inc
>    pkg/OmicABEL/src/GWAS.c
>    pkg/OmicABEL/src/databel.c
>    pkg/OmicABEL/src/double_buffering.c
>    pkg/OmicABEL/src/fgls_chol.c
>    pkg/OmicABEL/src/fgls_eigen.c
>    pkg/OmicABEL/src/ooc_BLAS.c
>    pkg/OmicABEL/src/utils.c
> Log:
> Fixed a bug (and other potential sources of bugs) due to overflows of integers when not using castings to size_t.
> Thanks to Maksim Struchalin for pointing it out.
> 
> 

Thank you for fixing the bug! And thanks indeed to Maksim for reporting it.


> 
> Modified: pkg/OmicABEL/make.inc
> ===================================================================
> --- pkg/OmicABEL/make.inc	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/make.inc	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -2,4 +2,4 @@
>  CFLAGS = -D_FILE_OFFSET_BITS=64 -pthread -fopenmp -DGOTO -DLINUX
>  
>  LDFLAGS =
> -LDLIBS = -llapack -lblas -lgfortran -gfortranbegin -lpthread -lrt
> +LDLIBS = /home/dfabregat/libs/lapack/lapack_LINUX.a /home/dfabregat/libs/GotoBLAS2/libgoto2.a -lgfortran -gfortranbegin -lpthread -lrt
> 

I guess the changes in make.inc inadvertently entered the commit as they
point to your local installation. Could you roll back this file?


Thanks a lot,

Lennart.



> Modified: pkg/OmicABEL/src/GWAS.c
> ===================================================================
> --- pkg/OmicABEL/src/GWAS.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/GWAS.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -118,7 +118,7 @@
>  	// Sanity check (Phi)
>  	checkNoNans(cf->n * cf->n, cf->Phi, "[ERROR] NaNs not allowed in Phi\n");
>  	cf->XL   = (double *) fgls_malloc ( cf->n * cf->wXL * sizeof(double) );
> -	load_file ( cf->XL_data_path,   "rb", cf->XL,   cf->n * cf->wXL );
> +	load_file ( cf->XL_data_path, "rb", cf->XL, cf->n * cf->wXL );
>  	// Sanity check (XL)
>  	average( cf->XL, cf->n, cf->wXL, cf->threshold, "Covariate", 
>  			&cf->XL_fvi->fvi_data[cf->n*NAMELENGTH], NAMELENGTH, 1, cf->num_threads );
> 
> Modified: pkg/OmicABEL/src/databel.c
> ===================================================================
> --- pkg/OmicABEL/src/databel.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/databel.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -39,7 +39,7 @@
>  	// Header
>  	fread( &fvi->fvi_header, sizeof(databel_fvi_header), 1, f );
>  	// Labels
> -	data_size = (fvi->fvi_header.numVariables +fvi->fvi_header.numObservations ) * 
> +	data_size = ((size_t)fvi->fvi_header.numVariables + fvi->fvi_header.numObservations ) * 
>  		         fvi->fvi_header.namelength * sizeof(char);
>  	fvi->fvi_data = (char *) fgls_malloc ( data_size );
>  	// Load labels
> 
> Modified: pkg/OmicABEL/src/double_buffering.c
> ===================================================================
> --- pkg/OmicABEL/src/double_buffering.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/double_buffering.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -161,7 +161,7 @@
>  	// Which buffer
>  	/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
>  	// Still buff_size available?
> -	size_t nbytes = (to - from + 1) * cf->n * sizeof(double);
> +	size_t nbytes = (size_t)(to - from + 1) * cf->n * sizeof(double);
>  	// Number of chunks to read
>  	/*int chunks_to_read = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
>  	// offset
> @@ -181,7 +181,7 @@
>  	// Which buffer
>  	/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
>  	// Still buff_size available?
> -	size_t nbytes = (to - from + 1) * cf->n * cf->wXR * sizeof(double);
> +	size_t nbytes = (size_t)(to - from + 1) * cf->n * cf->wXR * sizeof(double);
>  	// Number of chunks to read
>  	/*int chunks_to_read = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
>  	// offset
> @@ -203,7 +203,7 @@
>  	// Which buffer
>  	/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
>  	// Still buff_size available?
> -	size_t nbytes = (to_i - from_i + 1) * size_one_b *
> +	size_t nbytes = (size_t)(to_i - from_i + 1) * size_one_b *
>  	                (to_j - from_j + 1) * sizeof(double);
>  	// Number of chunks to write
>  	/*int chunks_to_write = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
> @@ -225,7 +225,7 @@
>  	// Which buffer
>  	/*aiocb_list *buff = wh_buff == IO_BUFF ? b->io_l : b->comp_l;*/
>  	// Still buff_size available?
> -	size_t nbytes = ((to_i - from_i + 1) * cf->p * cf->p *
> +	size_t nbytes = (size_t)((to_i - from_i + 1) * cf->p * cf->p *
>  	                 (to_j - from_j + 1)) * sizeof(double);
>  	// Number of chunks to write
>  	/*int chunks_to_write = size_t_ceil( nbytes, (size_t)MAX_AIO_SIZE );*/
> 
> Modified: pkg/OmicABEL/src/fgls_chol.c
> ===================================================================
> --- pkg/OmicABEL/src/fgls_chol.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/fgls_chol.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -188,7 +188,7 @@
>          beta  = res_sigma[j] * (1 - h2[j]);
>          dscal_(&nn, &alpha, M, &iONE);
>          for ( i = 0; i < n; i++ )
> -            M[i*n + i] = M[i*n + i] + beta;
> +            M[i*n + i] = M[i*n + i] + beta; // size_t?
>  
>          /* L * L' = M */
>          dpotrf_(LOWER, &n, M, &n, &info);
> @@ -234,7 +234,7 @@
>              VT_USER_START("READ_X");
>  #endif
>              /* Read next block of XR's */
> -			size_t next_x_from = ((size_t)ib + x_b) >= m ?  0 : (size_t)ib + x_b;
> +			size_t next_x_from = ((size_t)ib + x_b) >= m ?  0 : (size_t)ib + (size_t)x_b;
>  			size_t next_x_to   = ((size_t)ib + x_b) >= m ? MIN( (size_t)x_b, (size_t)m ) - 1 : 
>  				                                           next_x_from + MIN( (size_t)x_b, (size_t)m - next_x_from ) - 1;
>  			double_buffering_read_XR( &db_XR, IO_BUFF, next_x_from, next_x_to );
> @@ -424,7 +424,7 @@
>  		   *tmp;
>  	int i, j;
>  
> -	tmp = fgls_malloc( n * n * sizeof(double) );
> +    tmp = fgls_malloc( (size_t)n * n * sizeof(double) );
>  
>  	// tmp = Z * W
>  	for ( j = 0; j < n; j++ )
> 
> Modified: pkg/OmicABEL/src/fgls_eigen.c
> ===================================================================
> --- pkg/OmicABEL/src/fgls_eigen.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/fgls_eigen.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -102,7 +102,6 @@
>  
>  void ooc_loops( eigen_loops_t *loops_t ) 
>  {
> -	/*eigen_loops_t *loops_t = ( eigen_loops_t* ) in;*/
>      FGLS_config_t *cf = loops_t->cf;
>    
>      /* Dimensions of the problem */
> @@ -292,7 +291,7 @@
>  									for ( l = 0; l < n; l++ )
>  										XR_copy[ l ] = XR_comp[ i * n + l ] * Winv[j*n + l];
>  							
> -								Bij = &B_comp[ j*size_one_b_record*x_inc   + i*size_one_b_record];
> +								Bij = &B_comp[ j*size_one_b_record*x_inc + i*size_one_b_record];
>  			  
>  								/* Building B */
>  								// Copy B_T
> @@ -442,11 +441,11 @@
>      loops->oneB = ( double * ) fgls_malloc ( cf->p * cf->num_threads * sizeof(double) );
>      loops->oneV = ( double * ) fgls_malloc ( cf->p * cf->p * cf->num_threads * sizeof(double) );
>  
> -	double_buffering_init( &loops->db_XR, (size_t)cf->n * cf->wXR * cf->x_b * sizeof(double),
> +	double_buffering_init( &loops->db_XR, cf->n * cf->wXR * cf->x_b * sizeof(double),
>  			                cf->ZtXR, cf ); // _fp
> -	double_buffering_init( &loops->db_Y,  (size_t)cf->n * cf->y_b * sizeof(double),
> +	double_buffering_init( &loops->db_Y,  cf->n * cf->y_b * sizeof(double),
>  			                cf->ZtY,  cf );
> -	double_buffering_init( &loops->db_B,  (size_t)size_one_b_record * cf->x_b * cf->y_b * sizeof(double),
> +	double_buffering_init( &loops->db_B,  size_one_b_record * cf->x_b * cf->y_b * sizeof(double),
>  			                cf->B,  cf );
>  
>  	loops->cf = cf;
> 
> Modified: pkg/OmicABEL/src/ooc_BLAS.c
> ===================================================================
> --- pkg/OmicABEL/src/ooc_BLAS.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/ooc_BLAS.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -67,9 +67,9 @@
>      /* Asynchronous IO data structures */
>  	double *in_comp, *out_comp;
>  	double_buffering db_in, db_out; // B, C
> -	double_buffering_init( &db_in, ooc_b * m * sizeof(double),
> +	double_buffering_init( &db_in, (size_t)ooc_b * m * sizeof(double),
>  			                fp_in, NULL ); // _fp, cf not needed in this case
> -	double_buffering_init( &db_out, ooc_b * m * sizeof(double),
> +	double_buffering_init( &db_out, (size_t)ooc_b * m * sizeof(double),
>  			                fp_out, NULL ); // _fp, cf not needed in this case
>  
>      /* BLAS constants */
> @@ -86,7 +86,7 @@
>      for ( i = 0; i < n; i += ooc_b ) 
>      {
>          /* Read next piece of "in" */
> -        size_t nbytes = i + ooc_b > n ? 1 : MIN( ooc_b * m, ( n - (size_t)( i + ooc_b ) ) * m ) * sizeof(double);
> +        size_t nbytes = i + ooc_b > n ? 1 : MIN( (size_t)ooc_b * m, ( n - (size_t)( i + ooc_b ) ) * m ) * sizeof(double);
>  		off_t  offset = i + ooc_b > n ? 0 : (off_t)(i + ooc_b) * m * sizeof(double);
>          double_buffering_read( &db_in, IO_BUFF, nbytes, offset );
>  
> @@ -123,7 +123,7 @@
>  
>          /* Write current piece of "out" */
>  		double_buffering_write( &db_out, COMP_BUFF,
> -				                MIN( ooc_b * m, (size_t)(n - i) * m ) * sizeof(double),
> +				                MIN( (size_t)ooc_b * m, (size_t)(n - i) * m ) * sizeof(double),
>                                  (off_t)i * m * sizeof(double) );
>  
>          /* Swap buffers */
> 
> Modified: pkg/OmicABEL/src/utils.c
> ===================================================================
> --- pkg/OmicABEL/src/utils.c	2014-12-05 11:30:19 UTC (rev 1897)
> +++ pkg/OmicABEL/src/utils.c	2014-12-21 14:14:59 UTC (rev 1898)
> @@ -328,6 +328,7 @@
>  	double sum, avg;
>  	int nans, infs;
>  
> +    // size_t n and n_cols?
>  	#pragma omp parallel for private(j, sum, nans, infs, i, avg) schedule(static, 4) num_threads(nths)
>  	for ( j = 0; j < ncols; j++ )
>  	{
> 
> _______________________________________________
> Genabel-commits mailing list
> Genabel-commits at lists.r-forge.r-project.org
> https://lists.r-forge.r-project.org/cgi-bin/mailman/listinfo/genabel-commits
> 

-- 
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
L.C. Karssen
Utrecht
The Netherlands

lennart at karssen.org
http://blog.karssen.org
GPG key ID: A88F554A
-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 213 bytes
Desc: OpenPGP digital signature
URL: <http://lists.r-forge.r-project.org/pipermail/genabel-devel/attachments/20141221/4b640b26/attachment.sig>


More information about the genabel-devel mailing list