[MPIWG Fortran] MPI-3 ticket 349: Fortran question

Dave Goodell (dgoodell) dgoodell at cisco.com
Thu Jan 2 10:36:26 CST 2014

On Dec 24, 2013, at 11:36 AM, Jim Dinan <james.dinan at gmail.com> wrote:

> Given that MPI_Aint will be at least the same size as ptrdiff_t, do we
> actually have a problem with subtracting MPI_Aints to find pointer diffs?
> It seems like this may actually be ok.

There's still a problem.  I don't think that ptrdiff_t has anything to do with it since that normally only comes into play when you subtract two _pointers_, not two integers acting sort of like pointers.

As an example, take a look at this little test program.  It subtracts two plausible addresses from the middle of the address space but underflows the signed arithmetic anyway.  When I compile this with '-ftrapv' under clang then I get a core dump when executing this program.

#include <stdio.h>
#include <limits.h>

typedef long long MPI_Aint;

int main(int argc, char **argv)
    MPI_Aint a = LLONG_MIN; /* 0x8000000000000000LL */
    MPI_Aint b = 0x7ffffffffffffffcLL;
    MPI_Aint c = a - b; /* expect 0x4LL if signed overflow were defined */
    printf("a=%#llx b=%#llx c=%#llx\n", a, b, c);
    return 0;

The overflow occurs because "(a - b)" is really "(-9223372036854775808 - 9223372036854775804)" in signed integer arithmetic.  Note that most implementations will give you the expected value if you don't set '-ftrapv', but that's *undefined behavior* according to the C standard and should not be relied upon (see http://www.airs.com/blog/archives/120).

This is all just the C side of things.  I have no idea whether Fortran integer overflow is defined.


More information about the mpiwg-fortran mailing list