From 52a247b93aec7d761fdfe0ae5a6f8e0a354442b8 Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Tue, 20 Apr 2021 22:50:10 +0800 Subject: [PATCH] Change all va_list type argument to va_list* to more compatible with AMD64 platform: https://stackoverflow.com/questions/8047362/is-gcc-mishandling-a-pointer-to-a-va-list-passed-to-a-function Signed-off-by: Xiang Xiao Change-Id: Id711591dece832bd3941e91ae23e272905b72a8e --- append.c | 46 +++++++++++++++++++++++----------------------- append.h | 8 ++++---- error.c | 2 +- error.h | 2 +- user_malloc.c | 4 ++-- user_malloc.h | 2 +- 6 files changed, 32 insertions(+), 32 deletions(-) diff --git a/append.c b/append.c index 815c68b5..f88e4550 100644 --- a/append.c +++ b/append.c @@ -261,7 +261,7 @@ char *append_pointer(char *dest, char *limit, PNT_ARITH_TYPE value, int base) * characters added will be returned. No \0 character will be added. */ char *append_vformat(char *dest, char *limit, const char *format, - va_list args) + va_list *args) { const char *format_p = format; char value_buf[64]; @@ -309,9 +309,9 @@ char *append_vformat(char *dest, char *limit, const char *format, trunc = 1; } else if (ch == '*') { if (trunc) { - trunc_len = va_arg(args, int); + trunc_len = va_arg(*args, int); } else { - width_len = va_arg(args, int); + width_len = va_arg(*args, int); } } else if (ch >= '0' && ch <= '9') { if (trunc) { @@ -338,20 +338,20 @@ char *append_vformat(char *dest, char *limit, const char *format, const char *value; if (ch == 'c') { - value_buf[0] = (char)va_arg(args, int); + value_buf[0] = (char)va_arg(*args, int); value_buf[1] = '\0'; value = value_buf; } else if (ch == 'd') { long num; if (long_arg) { - num = va_arg(args, long); + num = va_arg(*args, long); } else { - num = va_arg(args, int); + num = va_arg(*args, int); } handle_decimal(value_buf, value_limit, num, 10); value = value_buf; } else if (ch == 'f') { - double num = va_arg(args, double); + double num = va_arg(*args, double); if (trunc_len < 0) { handle_float(value_buf, value_limit, num, DEFAULT_DECIMAL_PRECISION, 1); } else { @@ -363,9 +363,9 @@ char *append_vformat(char *dest, char *limit, const char *format, } else if (ch == 'o') { long num; if (long_arg) { - num = va_arg(args, long); + num = va_arg(*args, long); } else { - num = va_arg(args, int); + num = va_arg(*args, int); } handle_decimal(value_buf, value_limit, num, 8); value = value_buf; @@ -374,7 +374,7 @@ char *append_vformat(char *dest, char *limit, const char *format, prefix_len = 1; } } else if (ch == 'p') { - DMALLOC_PNT pnt = va_arg(args, DMALLOC_PNT); + DMALLOC_PNT pnt = va_arg(*args, DMALLOC_PNT); PNT_ARITH_TYPE num = (PNT_ARITH_TYPE)pnt; handle_pointer(value_buf, value_limit, num, 16); value = value_buf; @@ -382,13 +382,13 @@ char *append_vformat(char *dest, char *limit, const char *format, prefix = "0x"; prefix_len = 2; } else if (ch == 's') { - value = va_arg(args, char *); + value = va_arg(*args, char *); } else if (ch == 'u') { unsigned long num; if (long_arg) { - num = va_arg(args, unsigned long); + num = va_arg(*args, unsigned long); } else { - num = va_arg(args, unsigned int); + num = va_arg(*args, unsigned int); } char *value_buf_p = value_buf; value_buf_p = append_ulong(value_buf_p, value_limit, num, 10); @@ -397,9 +397,9 @@ char *append_vformat(char *dest, char *limit, const char *format, } else if (ch == 'x') { long num; if (long_arg) { - num = va_arg(args, long); + num = va_arg(*args, long); } else { - num = va_arg(args, int); + num = va_arg(*args, int); } handle_decimal(value_buf, value_limit, num, 16); if (format_prefix) { @@ -469,7 +469,7 @@ char *append_format(char *dest, char *limit, const char *format, ...) char *dest_p; va_start(args, format); - dest_p = append_vformat(dest, limit, format, args); + dest_p = append_vformat(dest, limit, format, &args); va_end(args); return dest_p; @@ -496,7 +496,7 @@ char *append_null(char *dest, char *limit) * causing the library to go recursive. */ int loc_vsnprintf(char *buf, const int size, const char *format, - va_list args) + va_list *args) { char *limit, *buf_p; limit = buf + size; @@ -516,7 +516,7 @@ int loc_snprintf(char *buf, const int size, const char *format, ...) int len; va_start(args, format); - len = loc_vsnprintf(buf, size, format, args); + len = loc_vsnprintf(buf, size, format, &args); va_end(args); return len; @@ -529,7 +529,7 @@ void loc_printf(const char *format, ...) { va_list args; va_start(args, format); - loc_vfprintf(stdout, format, args); + loc_vfprintf(stdout, format, &args); va_end(args); } @@ -540,14 +540,14 @@ void loc_fprintf(FILE *file, const char *format, ...) { va_list args; va_start(args, format); - loc_vfprintf(file, format, args); + loc_vfprintf(file, format, &args); va_end(args); } /* * Local implementation of vfprintf so we can use %p and other non-standard formats. */ -void loc_vfprintf(FILE *file, const char *format, va_list args) +void loc_vfprintf(FILE *file, const char *format, va_list *args) { // these are simple messages so this limit is ok char buf[256]; @@ -565,14 +565,14 @@ void loc_dprintf(int fd, const char *format, ...) { va_list args; va_start(args, format); - loc_vdprintf(fd, format, args); + loc_vdprintf(fd, format, &args); va_end(args); } /* * Local implementation of vdprintf so we can use %p and other non-standard formats. */ -void loc_vdprintf(int fd, const char *format, va_list args) +void loc_vdprintf(int fd, const char *format, va_list *args) { // these are simple messages so this limit is ok char buf[256]; diff --git a/append.h b/append.h index 2ff5dc43..ee382b3b 100644 --- a/append.h +++ b/append.h @@ -74,7 +74,7 @@ char *append_pointer(char *dest, char *limit, PNT_ARITH_TYPE value, int base); */ extern char *append_vformat(char *dest, char *limit, const char *format, - va_list args); + va_list *args); /* * Append a varargs format to destination. Pointer to the end of the @@ -98,7 +98,7 @@ char *append_null(char *dest, char *limit); */ extern int loc_vsnprintf(char *buf, const int size, const char *format, - va_list args); + va_list *args); /* * Local implementation of snprintf. We are doing this trying to not @@ -124,7 +124,7 @@ void loc_fprintf(FILE *file, const char *format, ...); * Local implementation of vfprintf so we can use %p and other non-standard formats. */ extern -void loc_vfprintf(FILE *file, const char *format, va_list args); +void loc_vfprintf(FILE *file, const char *format, va_list *args); /* * Local implementation of dprintf so we can use %p and other non-standard formats. @@ -136,7 +136,7 @@ void loc_dprintf(int fd, const char *format, ...); * Local implementation of vdprintf so we can use %p and other non-standard formats. */ extern -void loc_vdprintf(int fd, const char *format, va_list args); +void loc_vdprintf(int fd, const char *format, va_list *args); /*<<<<<<<<<< This is end of the auto-generated output from fillproto. */ diff --git a/error.c b/error.c index 7947927a..b5009ce5 100644 --- a/error.c +++ b/error.c @@ -435,7 +435,7 @@ char *_dmalloc_ptime(const TIME_TYPE *time_p, char *buf, const int buf_size, * * args -> Already converted pointer to a stdarg list. */ -void _dmalloc_vmessage(const char *format, va_list args) +void _dmalloc_vmessage(const char *format, va_list *args) { char *str_p, *bounds_p; int len; diff --git a/error.h b/error.h index 96f4ac47..2f15e8f6 100644 --- a/error.h +++ b/error.h @@ -164,7 +164,7 @@ char *_dmalloc_ptime(const TIME_TYPE *time_p, char *buf, const int buf_size, * args -> Already converted pointer to a stdarg list. */ extern -void _dmalloc_vmessage(const char *format, va_list args); +void _dmalloc_vmessage(const char *format, va_list *args); /* * void _dmalloc_die diff --git a/user_malloc.c b/user_malloc.c index 18954530..a5e70870 100644 --- a/user_malloc.c +++ b/user_malloc.c @@ -1824,7 +1824,7 @@ void dmalloc_log_changed(const unsigned long mark, const int not_freed_b, * * args -> Already converted pointer to a stdarg list. */ -void dmalloc_vmessage(const char *format, va_list args) +void dmalloc_vmessage(const char *format, va_list *args) { _dmalloc_vmessage(format, args); } @@ -1847,7 +1847,7 @@ void dmalloc_message(const char *format, ...) va_list args; va_start(args, format); - _dmalloc_vmessage(format, args); + _dmalloc_vmessage(format, &args); va_end(args); } diff --git a/user_malloc.h b/user_malloc.h index 1ffbeccc..abfc99fb 100644 --- a/user_malloc.h +++ b/user_malloc.h @@ -643,7 +643,7 @@ void dmalloc_log_changed(const unsigned long mark, const int not_freed_b, * args -> Already converted pointer to a stdarg list. */ extern -void dmalloc_vmessage(const char *format, va_list args); +void dmalloc_vmessage(const char *format, va_list *args); /* * void dmalloc_message