From c9467688b459b9478cb9faca47ed0b049cfbaeaa Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin (Intel)" Date: Thu, 30 Jul 2020 17:30:20 -0700 Subject: [PATCH] Add [v]printf_func() attributes where appropriate Add a new macro vprintf_func() for vprintf-style functions, and add printf_func() and vprintf_func() attribute arguments whereever meaningful. Signed-off-by: H. Peter Anvin (Intel) --- asm/listing.c | 2 +- include/compiler.h | 2 ++ include/error.h | 4 ++-- include/nasmlib.h | 4 ++-- include/strlist.h | 2 +- output/outieee.c | 8 ++++---- 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/asm/listing.c b/asm/listing.c index f6ef6d1b..3bb31ef6 100644 --- a/asm/listing.c +++ b/asm/listing.c @@ -337,7 +337,7 @@ static void list_downlevel(int type) } } -static void list_error(errflags severity, const char *fmt, ...) +static void printf_func(2, 3) list_error(errflags severity, const char *fmt, ...) { va_list ap; diff --git a/include/compiler.h b/include/compiler.h index b4fd3a89..c5bac6e5 100644 --- a/include/compiler.h +++ b/include/compiler.h @@ -326,6 +326,8 @@ static inline void *mempcpy(void *dst, const void *src, size_t n) */ #define printf_func(fmt, list) format_func3(printf,fmt,list) #define printf_func_ptr(fmt, list) format_func3_ptr(printf,fmt,list) +#define vprintf_func(fmt) format_func3(printf,fmt,0) +#define vprintf_func_ptr(fmt) format_func3_ptr(printf,fmt,0) /* Determine probabilistically if something is a compile-time constant */ #ifdef HAVE___BUILTIN_CONSTANT_P diff --git a/include/error.h b/include/error.h index d5dc65da..2e16b92c 100644 --- a/include/error.h +++ b/include/error.h @@ -72,8 +72,8 @@ fatal_func printf_func(2, 3) nasm_panicf(errflags flags, const char *fmt, ...); fatal_func nasm_panic_from_macro(const char *file, int line); #define panic() nasm_panic_from_macro(__FILE__, __LINE__); -void nasm_verror(errflags severity, const char *fmt, va_list ap); -fatal_func nasm_verror_critical(errflags severity, const char *fmt, va_list ap); +void vprintf_func(2) nasm_verror(errflags severity, const char *fmt, va_list ap); +fatal_func vprintf_func(2) nasm_verror_critical(errflags severity, const char *fmt, va_list ap); /* * These are the error severity codes which get passed as the first diff --git a/include/nasmlib.h b/include/nasmlib.h index e9bfbccf..438178d7 100644 --- a/include/nasmlib.h +++ b/include/nasmlib.h @@ -83,9 +83,9 @@ char * safe_alloc end_with_null nasm_strcatn(const char *one, ...); * this additional storage. */ char * safe_alloc printf_func(1, 2) nasm_asprintf(const char *fmt, ...); -char * safe_alloc nasm_vasprintf(const char *fmt, va_list ap); +char * safe_alloc vprintf_func(1) nasm_vasprintf(const char *fmt, va_list ap); void * safe_alloc printf_func(2, 3) nasm_axprintf(size_t extra, const char *fmt, ...); -void * safe_alloc nasm_vaxprintf(size_t extra, const char *fmt, va_list ap); +void * safe_alloc vprintf_func(2) nasm_vaxprintf(size_t extra, const char *fmt, va_list ap); /* * nasm_last_string_len() returns the length of the last string allocated diff --git a/include/strlist.h b/include/strlist.h index 25681c59..faf70e27 100644 --- a/include/strlist.h +++ b/include/strlist.h @@ -81,7 +81,7 @@ struct strlist * safe_alloc strlist_alloc(bool uniq); const struct strlist_entry *strlist_add(struct strlist *list, const char *str); const struct strlist_entry * printf_func(2, 3) strlist_printf(struct strlist *list, const char *fmt, ...); -const struct strlist_entry * +const struct strlist_entry * vprintf_func(2) strlist_vprintf(struct strlist *list, const char *fmt, va_list ap); const struct strlist_entry * strlist_find(const struct strlist *list, const char *str); diff --git a/output/outieee.c b/output/outieee.c index 4cc0f0f5..6d6d4b25 100644 --- a/output/outieee.c +++ b/output/outieee.c @@ -1128,15 +1128,15 @@ static void ieee_write_dword(struct ieeeSection *seg, int32_t data) ieee_write_byte(seg, (data >> 16) & 0xFF); ieee_write_byte(seg, (data >> 24) & 0xFF); } -static void ieee_putascii(char *format, ...) +static void printf_func(1, 2) ieee_putascii(char *format, ...) { char buffer[256]; - int i, l; + size_t i, l; va_list ap; va_start(ap, format); - vsnprintf(buffer, sizeof(buffer), format, ap); - l = strlen(buffer); + l = vsnprintf(buffer, sizeof(buffer), format, ap); + nasm_assert(l < sizeof(buffer)); for (i = 0; i < l; i++) if ((uint8_t)buffer[i] > 31) checksum += buffer[i];