helper/log: mark 'fmt' argument of alloc_*printf() as not NULL
Even after commit e12ceddd5e ("helper/log: mark `fmt` argument
of `alloc_vprintf()` as format string"), the GCC compiler still
reports that alloc_vprintf() could call vsnprintf() with a NULL
format parameter.
Inform the compiler that alloc_vprintf() cannot accept NULL as
format string.
Add an assert() in alloc_vprintf() so even compilers that do not
use the function attribute 'nonnull' will play safe.
While there, extend the same fixes to alloc_printf() too.
Change-Id: Idfa4fe9c6dfb2acfbf434c392237937ae03f0e8a
Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com>
Reported-by: Parshintsev Anatoly <anatoly.parshintsev@syntacore.com>
Reviewed-on: https://review.openocd.org/c/openocd/+/9166
Tested-by: jenkins
Reviewed-by: Anatoly P <anatoly.parshintsev@syntacore.com>
This commit is contained in:
@@ -354,6 +354,8 @@ char *alloc_vprintf(const char *fmt, va_list ap)
|
|||||||
int len;
|
int len;
|
||||||
char *string;
|
char *string;
|
||||||
|
|
||||||
|
assert(fmt);
|
||||||
|
|
||||||
/* determine the length of the buffer needed */
|
/* determine the length of the buffer needed */
|
||||||
va_copy(ap_copy, ap);
|
va_copy(ap_copy, ap);
|
||||||
len = vsnprintf(NULL, 0, fmt, ap_copy);
|
len = vsnprintf(NULL, 0, fmt, ap_copy);
|
||||||
|
|||||||
+3
-2
@@ -15,6 +15,7 @@
|
|||||||
#define OPENOCD_HELPER_LOG_H
|
#define OPENOCD_HELPER_LOG_H
|
||||||
|
|
||||||
#include <helper/command.h>
|
#include <helper/command.h>
|
||||||
|
#include <helper/compiler.h>
|
||||||
|
|
||||||
/* To achieve C99 printf compatibility in MinGW, gnu_printf should be
|
/* To achieve C99 printf compatibility in MinGW, gnu_printf should be
|
||||||
* used for __attribute__((format( ... ))), with GCC v4.4 or later
|
* used for __attribute__((format( ... ))), with GCC v4.4 or later
|
||||||
@@ -86,9 +87,9 @@ int log_add_callback(log_callback_fn fn, void *priv);
|
|||||||
int log_remove_callback(log_callback_fn fn, void *priv);
|
int log_remove_callback(log_callback_fn fn, void *priv);
|
||||||
|
|
||||||
char *alloc_vprintf(const char *fmt, va_list ap)
|
char *alloc_vprintf(const char *fmt, va_list ap)
|
||||||
__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 1, 0)));
|
__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 1, 0))) __nonnull((1));
|
||||||
char *alloc_printf(const char *fmt, ...)
|
char *alloc_printf(const char *fmt, ...)
|
||||||
__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 1, 2)));
|
__attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 1, 2))) __nonnull((1));
|
||||||
|
|
||||||
const char *find_nonprint_char(const char *buf, unsigned int buf_len);
|
const char *find_nonprint_char(const char *buf, unsigned int buf_len);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user