[mpich2-dev] [PATCH 1/1] Fix uses of MPI_Aint in mpich2 tests
William Gropp
gropp at mcs.anl.gov
Wed Mar 19 16:44:56 CDT 2008
Hmm, this raises a concern about how making MPI_Aint larger than void
* might impact the user, since users will expect these to be the same.
The use of MPI_Aint was needed to suppress error messages from
compilers that don't like to see casts that truncate (as an (int)
would here).
How feasible is it to use an internal type (e.g., MPIR_Size_t)
instead of MPI_Aint for the datatype/file code, and leave MPI_Aint as
the sizeof void *? Some of the datatype routines won't be able to
return lengths, but that's already true for MPI_Type_size. Will that
be adequate for the file operations?
Bill
On Mar 19, 2008, at 3:37 PM, Douglas Miller wrote:
>
> Fix several problems related to having MPI_Aint larger than (void *).
> 1. In copy_fn() the cast-and-dereference of attribute_val_out will
> overwrite the stack in MPIR_Attr_dup_list() as that function only
> provides a void * for attribute_val_out.
>
> 2. In delete_fn() do not promote values to MPI_Aint for comparing,
> especially since neither are MPI_Aint to begin with.
>
> 3. Also in delete_fn(), the error path will segfault because it tries
> to dereference attribute_val which is not a pointer.
>
> 4. Other uses of MPI_Aint are arbitrary and complicate the test.
> Since attribute values in this program start out as ints and are
> stored as void * within attributes, it seems confusing to be casting
> them to/from MPI_Aint in between. This also avoids 64-bit
> manipulations
> on 32-bit architectures.
>
> -----
>
> diff --git a/lib/mpi/mpich2/test/mpi/attr/attric.c
> b/lib/mpi/mpich2/test/mpi/attr/attric.c
> index 6b87a4e..56738e9 100644
> --- a/lib/mpi/mpich2/test/mpi/attr/attric.c
> +++ b/lib/mpi/mpich2/test/mpi/attr/attric.c
> @@ -41,24 +41,24 @@ int main( int argc, char **argv )
> int copy_fn( MPI_Comm oldcomm, int keyval, void *extra_state,
> void *attribute_val_in, void *attribute_val_out, int
> *flag)
> {
> /* Note that if (sizeof(int) < sizeof(void *), just setting
> the int
> part of attribute_val_out may leave some dirty bits
> */
> - *(MPI_Aint *)attribute_val_out = (MPI_Aint)attribute_val_in;
> + *(void **)attribute_val_out = attribute_val_in;
> *flag = 1;
> return MPI_SUCCESS;
> }
>
> int delete_fn( MPI_Comm comm, int keyval, void *attribute_val,
> void *extra_state)
> {
> int world_rank;
> MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
> - if ((MPI_Aint)attribute_val != (MPI_Aint)world_rank) {
> - printf( "incorrect attribute value %d\n", *(int*)
> attribute_val );
> + if (attribute_val != (void *)world_rank) {
> + printf( "incorrect attribute value %ld\n", (long)
> attribute_val );
> MPI_Abort(MPI_COMM_WORLD, 1005 );
> }
> return MPI_SUCCESS;
> }
>
> int test_communicators( void )
> @@ -68,13 +68,13 @@ int test_communicators( void )
> int flag, world_rank, world_size, key_1, key_3;
> int errs = 0;
> /* integer n, ,
> . key_2
>
> */
> - MPI_Aint value;
> + int value;
> int isLeft;
>
> MPI_Comm_rank( MPI_COMM_WORLD, &world_rank );
> MPI_Comm_size( MPI_COMM_WORLD, &world_size );
> #ifdef DEBUG
> if (world_rank == 0) {
> @@ -105,25 +105,25 @@ int test_communicators( void )
> MPI_Keyval_create(MPI_NULL_COPY_FN, MPI_NULL_DELETE_FN,
> &key_3, &value );
>
> /* This may generate a compilation warning; it is, however, an
> easy way to cache a value instead of a pointer */
> /* printf( "key1 = %x key3 = %x\n", key_1, key_3 ); */
> - MPI_Attr_put(comm, key_1, (void *) (MPI_Aint) world_rank );
> + MPI_Attr_put(comm, key_1, (void *)world_rank );
> /* MPI_Attr_put(lo_comm, key_2, world_size ) */
> MPI_Attr_put(comm, key_3, (void *)0 );
>
> MPI_Comm_dup(comm, &dup_comm );
>
> /* Note that if sizeof(int) < sizeof(void *), we can't use
> (void **)&value to get the value we passed into
> Attr_put. To
> avoid
> problems (e.g., alignment errors), we recover the value
> into
> a (void *) and cast to int. Note that this may generate
> warning
> messages from the compiler. */
> MPI_Attr_get(dup_comm, key_1, (void **)&vvalue, &flag );
> - value = (MPI_Aint)vvalue;
> + value = (int)vvalue;
>
> if (! flag) {
> errs++;
> printf( "dup_comm key_1 not found on %d\n", world_rank );
> fflush( stdout );
> MPI_Abort(MPI_COMM_WORLD, 3004 );
> @@ -148,13 +148,13 @@ int test_communicators( void )
> printf( "dup_comm key_2 value incorrect: %d\n", value );
> fflush( stdout );
> MPI_Abort(MPI_COMM_WORLD, 3007 );
> }
> */
> MPI_Attr_get(dup_comm, key_3, (void **)&vvalue, &flag );
> - value = (MPI_Aint)vvalue;
> + value = (int)vvalue;
> if (flag) {
> errs++;
> printf( "dup_comm key_3 found!\n" );
> fflush( stdout );
> MPI_Abort(MPI_COMM_WORLD, 3008 );
> }
>
William Gropp
Paul and Cynthia Saylor Professor of Computer Science
University of Illinois Urbana-Champaign
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.mcs.anl.gov/mailman/private/mpich2-dev/attachments/20080319/1742a180/attachment.htm>
More information about the mpich2-dev
mailing list