bug in __gmp_replacement_vsnprintf

Marc Glisse marc.glisse at inria.fr
Wed Jan 29 21:53:24 CET 2025


On Wed, 12 Oct 2022, Paul Zimmermann wrote:

> The issue is because __gmp_replacement_vsnprintf does not deal with %a not %A.
> Then when calling gmp_printf ("%a", -1.25) for example, we get total_width=3
> initially, we jump to the 'default' case, where the ASSERT(0) does nothing
> in production code, and we go to next, where width=0 and prec=6, thus
> total_width is increased to 9. But we also have len=9 because
> buf='-0x1.4p+0'. Then the assertion ASSERT_ALWAYS (len < total_width) fails.

Hi Paul,

indeed, '%a' does not seem to be handled. Do you know what an appropriate 
upper bound on the size of the output would be?

Trying to guess from the handling of 'f', 'g', etc:
total_width += prec + 5 + floating_sizeof * 2;

*2 because a byte (8 bits) only needs 2 hex (4 bits)
+5 because 'g' as +3 and 'a' has the extra "0x"

?
I would probably write +10 to have more margin, but I'd rather someone who 
understands these things give me the answer...


Other than that, it feels wrong that this replacement function is still 
used on some windows configurations, visual studio has had vsnprintf for a 
long time now. There is also the possibility of using gnulib's version of 
vsnprintf if we don't want to maintain our own, but I think I'd rather 
make configure fail on missing vsnprintf to force users to configure their 
toolchain properly.

-- 
Marc Glisse


More information about the gmp-bugs mailing list