Now that all types have their own checking functions, the signature of the methods can be simplified and the wrappers removed. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- verify-format.c | 86 +++++++------------------------------------------ 1 file changed, 12 insertions(+), 74 deletions(-) diff --git a/verify-format.c b/verify-format.c index fdfe9c22e858..753e59c167ce 100644 --- a/verify-format.c +++ b/verify-format.c @@ -54,10 +54,7 @@ enum length_mod { struct format_type { const char *format; - int (*test)(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff); + const char* (*test)(struct format_type *fmt, struct symbol *source); struct symbol *type; }; @@ -149,27 +146,11 @@ static const char *check_printf_sint(struct format_type *fmt, struct symbol *sou return check_printf_int(fmt, source, 1); } -static int printf_fmt_sint(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_sint(fmt, ctype)); -} - static const char *check_printf_uint(struct format_type *fmt, struct symbol *source) { return check_printf_int(fmt, source, 0); } -static int printf_fmt_uint(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_uint(fmt, ctype)); -} - static const char *check_printf_float(struct format_type *fmt, struct symbol *source) { const char *typediff = "different base types"; @@ -183,14 +164,6 @@ static const char *check_printf_float(struct format_type *fmt, struct symbol *so return typediff; } -static int printf_fmt_float(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_float(fmt, ctype)); -} - // For 's' & 'S' specifiers static const char *check_printf_string(struct format_type *fmt, struct symbol *source) { @@ -223,15 +196,6 @@ static const char *check_printf_string(struct format_type *fmt, struct symbol *s return typediff; } -static int printf_fmt_string(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_string(fmt, ctype)); -} - - #define MOD_IGN (MOD_QUALIFIER | MOD_FUN_ATTR) static inline const char *compare_pointer(struct symbol *target, struct symbol *source) { @@ -258,14 +222,6 @@ static const char *check_printf_length(struct format_type *fmt, struct symbol *s return compare_pointer(target, source); } -static int printf_fmt_length(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_length(fmt, ctype)); -} - // For 'p' specifiers static const char *check_printf_pointer(struct format_type *fmt, struct symbol *source) { @@ -278,20 +234,6 @@ static const char *check_printf_pointer(struct format_type *fmt, struct symbol * return NULL; } -static int printf_fmt_pointer(struct format_type *fmt, - struct expression **expr, - struct symbol *ctype, - const char **typediff) -{ - return !(*typediff = check_printf_pointer(fmt, ctype)); -} - -static struct format_type printf_fmt_ptr_ref = { - .format = "p", - .test = printf_fmt_pointer, - .type = &const_ptr_ctype, -}; - static struct format_type *parse_printf_get_fmt(struct format_type *type, const char *msg, const char **msgout) { @@ -338,7 +280,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, switch (*ptr++) { case 'd': case 'i': - type->test = printf_fmt_sint; + type->test = check_printf_sint; switch (szmod) { case LEN_hh: case LEN_h: @@ -366,7 +308,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, } break; case 'u': case 'o': case 'x': case 'X': - type->test = printf_fmt_uint; + type->test = check_printf_uint; switch (szmod) { case LEN_hh: case LEN_h: @@ -387,6 +329,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, type->type = size_t_ctype; break; case LEN_t: + type->test = check_printf_sint; type->type = ptrdiff_ctype; break; default: @@ -395,7 +338,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, break; case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': case 'a': case 'A': - type->test = printf_fmt_float; + type->test = check_printf_float; switch (szmod) { case LEN_none: type->type = &double_ctype; @@ -408,7 +351,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, } break; case 'c': - type->test = printf_fmt_sint; // FIXME: need its own check? + type->test = check_printf_sint; switch (szmod) { case LEN_none: type->type = &int_ctype; @@ -422,7 +365,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, } break; case 's': - type->test = printf_fmt_string; + type->test = check_printf_string; switch (szmod) { case LEN_none: type->type = &const_string_ctype; @@ -436,7 +379,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, } break; case 'p': - type->test = printf_fmt_pointer; + type->test = check_printf_pointer; type->type = &const_ptr_ctype; /* check for pointer being printed as hex explicitly */ if (*ptr == 'x' || *ptr == 'X') { @@ -450,7 +393,7 @@ static struct format_type *parse_printf_get_fmt(struct format_type *type, /* pointer to an de-referenced int/etc */ // todo - we should construct pointer to int/etc // // also should not have any flags or widths for this - type->test = printf_fmt_length; + type->test = check_printf_length; type->type = &const_ptr_ctype; break; default: @@ -612,14 +555,9 @@ static int parse_format_printf(const char **fmtstring, } type = parse_printf_get_fmt(&ftype, fmt, &fmtpost); - - if (!type && fmt[0] == 'p') - type = &printf_fmt_ptr_ref; /* probably some extension */ - if (type) { struct symbol *ctype; - const char *typediff = "different types"; - int ret; + const char *typediff; *fmtstring = fmtpost; expr = get_nth_expression(args, pos-1); @@ -633,8 +571,8 @@ static int parse_format_printf(const char **fmtstring, if (!ctype) return -3; - ret = type->test(type, &expr, ctype, &typediff); - if (ret == 0) { + typediff = ftype.test(&ftype, ctype); + if (typediff) { warning(expr->pos, "incorrect type in argument %d (%s)", pos, typediff); info(expr->pos, " expected %s", show_typename(type->type)); info(expr->pos, " got %s", show_typename(ctype)); -- 2.28.0