On Tue, Jan 10, 2017 at 03:02:49PM -0500, David Malcolm wrote:
> +/* Given ARG, an unrecognized sanitizer option, return the best
> + matching sanitizer option, or NULL if there isn't one. */
> +
> +static const char *
> +get_closest_sanitizer_option (const string_fragment &arg)
> +{
> + best_match <const string_fragment &, const char*> bm (arg);
> + for (int i = 0; sanitizer_opts[i].name != NULL; ++i)
> + bm.consider (sanitizer_opts[i].name);
> + return bm.get_best_meaningful_candidate ();
I think we shouldn't suggest invalid option combinations, so that means
passing code to get_closest_sanitizer_option (so that we know if it is
OPT_fsanitize_ or OPT_fsanitize_recover_) and a bool whether it is
the -fno-sanitize* or -fsanitize* (value). Then we shouldn't add to
bm.consider:
1) for -fsanitize= (and not -fno-sanitize=) the "all" option
(sanitizer_opts[i].flag == ~0U && code == OPT_fsanitize_ && value
is a cheap test for that case)
2) for -fsanitize-recover= (and not -fno-sanitize-recover=) the
non-recoverable options
(!sanitizer_opts[i].can_recover && code == OPT_fsanitize_recover_ && value)
Otherwise it looks good to me.
Jakub