Some option types cannot use an argument --- boolean options that would set a bit or flag or increment a counter, for example. If configured in the flag word to accept an argument anyway, the result is an argument that is advertised in "program -h" output only to be rejected by parse-options::get_value. Luckily all current users of these option types use PARSE_OPT_NOARG and do not use PARSE_OPT_OPTARG. Add a check to ensure that that remains true. Signed-off-by: Jonathan Nieder <jrnieder@xxxxxxxxx> --- New patch, preparing for patch 2. Maybe the check should be implemented elsewhere (ideally compile time) so all flags can be checked rather than just the flags that happen to be used in a given test run. parse-options.c | 22 ++++++++++++++++++++++ 1 files changed, 22 insertions(+), 0 deletions(-) diff --git a/parse-options.c b/parse-options.c index 0fa79bc..1806bb3 100644 --- a/parse-options.c +++ b/parse-options.c @@ -44,6 +44,26 @@ static void fix_filename(const char *prefix, const char **file) *file = xstrdup(prefix_filename(prefix, strlen(prefix), *file)); } +static void check_flags(const struct option *opt) +{ + switch (opt->type) { + case OPTION_BOOLEAN: + case OPTION_BIT: + case OPTION_NEGBIT: + case OPTION_SET_INT: + case OPTION_SET_PTR: + case OPTION_NUMBER: + break; + default: /* (usually accepts an argument) */ + return; + } + if ((opt->flags & (PARSE_OPT_OPTARG | PARSE_OPT_NOARG)) == PARSE_OPT_NOARG) + return; + die("BUG: option '-%c%s' should not accept an argument", + !opt->short_name ? '-' : opt->short_name, + !opt->short_name ? opt->long_name : ""); +} + static int get_value(struct parse_opt_ctx_t *p, const struct option *opt, int flags) { @@ -51,6 +71,8 @@ static int get_value(struct parse_opt_ctx_t *p, const int unset = flags & OPT_UNSET; int err; + check_flags(opt); + if (unset && p->opt) return opterror(opt, "takes no value", flags); if (unset && (opt->flags & PARSE_OPT_NONEG)) -- 1.7.2.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html