HomePhabricator

[libcxx] Don't use an undefined '+' in unsigned/octal/hexal print formats

Authored by mstorsjo on Jun 1 2021, 2:04 AM.

Description

[libcxx] Don't use an undefined '+' in unsigned/octal/hexal print formats

If building code like this:

unsigned long val = 1000;
snprintf(buf, sizeof(buf), "%+lu", val);

with clang, clang warns

warning: flag '+' results in undefined behavior with 'u' conversion specifier [-Wformat]

Therefore, don't construct such undefined format strings. (There's
no compiler warnings here, as the compiler can't inspect dynamically
assembled format strings.)

This fixes number formatting in mingw-w64 if built with
__USE_MINGW_ANSI_STDIO defined (there, the '+' flag causes a
leading plus to be printed when formatting unsigned numbers too,
while the '+' flag doesn't cause any extra leading plus in other
stdio implementations).

Differential Revision: https://reviews.llvm.org/D103444