gmp_printf and mingw for stdint format macros

Emmanuel Thomé Emmanuel.Thome at inria.fr
Thu Jan 8 13:42:27 UTC 2015


Hi,

I've come across a bug, while porting some software to mingw. Mingw
has an obsolete gmp-5.1.2 package, but I expect the behaviour would be
identical with gmp-6.0.0.

The following code crashes with a segfault:

    #include <stdio.h>
    #include <stdint.h>
    #include <inttypes.h>
    #include <gmp.h>
    int main()
    {
            uint64_t a = 42;
            mpz_t b;
            mpz_init_set_str(b, "17", 0);
            gmp_printf("%" PRIu64" %Zd\n", a, b);       /* SEGV */
            mpz_clear(b);
            printf("Hi!\n");
            return 0;
    }

(compiled with gcc-4.8.1, with -std=c99)

The reason is along the following lines. PRIu64 gets substituted to the
microsoft-specific "I64u". This is undefined behaviour in ISO C.
gmp_printf is not aware of this specificity, and steps over this
unrecognized "%I64u" silently (line 600 in doprnt.c, since the ASSERT(0)
expands to nothing). It then tries to print as an mpz the next non-format
argument it finds. Since a hasn't been consumed by a recognized format
specifier at this point, mpz_get_str is attempted with a instead of b.
Bang, you're dead.

It's not clear to me whether there is something to change, and what.
Maybe allowing gmp_printf("%" PRIu64" %Zd\n", a, b) to work correctly
would be a reasonable goal, although this would mean special-casing the
mingw platform. This sort of fix may also be more appropriate as specific
to the mingw package itself.

Best regards,

E.


More information about the gmp-bugs mailing list