Fix of va_arg aliasing in doprnt.c

This commit is contained in:
igor-m
2014-04-12 01:25:31 +02:00
parent 2afff6f8aa
commit 0220852a66

View File

@@ -53,6 +53,11 @@ static unsigned char mkhex (unsigned char ch);
static int cvt (double number, int prec, int sharpflag, unsigned char *negp, static int cvt (double number, int prec, int sharpflag, unsigned char *negp,
unsigned char fmtch, unsigned char *startp, unsigned char *endp); unsigned char fmtch, unsigned char *startp, unsigned char *endp);
union {
unsigned long u32;
va_list ap32;
} x;
int int
_doprnt (char const *fmt, va_list ap, FILE *stream) _doprnt (char const *fmt, va_list ap, FILE *stream)
{ {
@@ -367,7 +372,9 @@ number: if (sign && ((long) ul != 0L)) {
double d; double d;
unsigned long *l = (unsigned long *) &d; unsigned long *l = (unsigned long *) &d;
if (*(unsigned long*)&ap & 4L) { x.ap32 = ap;
if ( x.u32 & 4) {
l[0]= va_arg(ap, unsigned long); l[0]= va_arg(ap, unsigned long);
l[1]= va_arg(ap, unsigned long); l[1]= va_arg(ap, unsigned long);
} }