summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2017-04-22 17:48:37 -0400
committerRich Felker <dalias@aerifal.cx>2017-04-22 17:48:37 -0400
commit58e2396a9aa23c132faf4198ca4d779c84955b38 (patch)
treec44110554d20ffaefe7a286aac5842999fd29d81
parente1232f5b5185e8f337806841018369407e32e77d (diff)
downloadmusl-58e2396a9aa23c132faf4198ca4d779c84955b38.tar.gz
musl-58e2396a9aa23c132faf4198ca4d779c84955b38.tar.bz2
musl-58e2396a9aa23c132faf4198ca4d779c84955b38.tar.xz
musl-58e2396a9aa23c132faf4198ca4d779c84955b38.zip
remove va_arg hacks in printf core with undefined behavior
the code being removed was written to optimize for size assuming the compiler cannot collapse code paths for different types with the same underlying representation. modern compilers sometimes succeed in making this optimization themselves, but either way it's a small size difference and not worth the source-level complexity or the UB involved in this hack. some incorrect use of va_arg still remains, particularly use of void * where the actual argument has a different pointer type. fixing this requires some actual code additions, rather than just removing cruft, so I'm leaving it to be done later as a separate commit.
-rw-r--r--src/stdio/vfprintf.c27
1 files changed, 1 insertions, 26 deletions
diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
index 60da14d8..8c81efc2 100644
--- a/src/stdio/vfprintf.c
+++ b/src/stdio/vfprintf.c
@@ -4,6 +4,7 @@
#include <limits.h>
#include <string.h>
#include <stdarg.h>
+#include <stddef.h>
#include <wchar.h>
#include <inttypes.h>
#include <math.h>
@@ -26,14 +27,6 @@
#define FLAGMASK (ALT_FORM|ZERO_PAD|LEFT_ADJ|PAD_POS|MARK_POS|GROUPED)
-#if UINT_MAX == ULONG_MAX
-#define LONG_IS_INT
-#endif
-
-#if SIZE_MAX != ULONG_MAX || UINTMAX_MAX != ULLONG_MAX
-#define ODD_TYPES
-#endif
-
/* State machine to accept length modifiers + conversion specifiers.
* Result is 0 on failure, or an argument type to pop on success. */
@@ -42,23 +35,9 @@ enum {
ZTPRE, JPRE,
STOP,
PTR, INT, UINT, ULLONG,
-#ifndef LONG_IS_INT
LONG, ULONG,
-#else
-#define LONG INT
-#define ULONG UINT
-#endif
SHORT, USHORT, CHAR, UCHAR,
-#ifdef ODD_TYPES
LLONG, SIZET, IMAX, UMAX, PDIFF, UIPTR,
-#else
-#define LLONG ULLONG
-#define SIZET ULONG
-#define IMAX LLONG
-#define UMAX ULLONG
-#define PDIFF LONG
-#define UIPTR ULONG
-#endif
DBL, LDBL,
NOARG,
MAXSTATE
@@ -134,23 +113,19 @@ static void pop_arg(union arg *arg, int type, va_list *ap)
case PTR: arg->p = va_arg(*ap, void *);
break; case INT: arg->i = va_arg(*ap, int);
break; case UINT: arg->i = va_arg(*ap, unsigned int);
-#ifndef LONG_IS_INT
break; case LONG: arg->i = va_arg(*ap, long);
break; case ULONG: arg->i = va_arg(*ap, unsigned long);
-#endif
break; case ULLONG: arg->i = va_arg(*ap, unsigned long long);
break; case SHORT: arg->i = (short)va_arg(*ap, int);
break; case USHORT: arg->i = (unsigned short)va_arg(*ap, int);
break; case CHAR: arg->i = (signed char)va_arg(*ap, int);
break; case UCHAR: arg->i = (unsigned char)va_arg(*ap, int);
-#ifdef ODD_TYPES
break; case LLONG: arg->i = va_arg(*ap, long long);
break; case SIZET: arg->i = va_arg(*ap, size_t);
break; case IMAX: arg->i = va_arg(*ap, intmax_t);
break; case UMAX: arg->i = va_arg(*ap, uintmax_t);
break; case PDIFF: arg->i = va_arg(*ap, ptrdiff_t);
break; case UIPTR: arg->i = (uintptr_t)va_arg(*ap, void *);
-#endif
break; case DBL: arg->f = va_arg(*ap, double);
break; case LDBL: arg->f = va_arg(*ap, long double);
}