On Fri, Sep 23, 2016 at 01:53:48PM +0200, Martin Liška wrote:
> 3) -fsanitize=leak is combinable with -fsanitize=address or
>    -fsanitize=thread

Is it really combinable with -fsanitize=thread?  I thought only libasan
or liblsan provides the leak checker.  Anyway, I can't find where in the
patch you change this.

> --- a/gcc/flag-types.h
> +++ b/gcc/flag-types.h
> @@ -203,25 +203,25 @@ enum vect_cost_model {
>  /* Different instrumentation modes.  */
>  enum sanitize_code {
>    /* AddressSanitizer.  */
> -  SANITIZE_ADDRESS = 1 << 0,
> -  SANITIZE_USER_ADDRESS = 1 << 1,
> -  SANITIZE_KERNEL_ADDRESS = 1 << 2,
> +  SANITIZE_ADDRESS = 1UL<< 0,

Formatting, space in between UL and << (many times).

> @@ -1516,11 +1518,18 @@ parse_sanitizer_options (const char *p, location_t 
> loc, int scode,
>                     error_at (loc, "-fsanitize=all option is not valid");
>                 }
>               else
> -               flags |= ~(SANITIZE_USER_ADDRESS | SANITIZE_THREAD
> -                          | SANITIZE_LEAK);
> +               flags |= ~(SANITIZE_THREAD | SANITIZE_LEAK
> +                          | SANITIZE_UNREACHABLE | SANITIZE_RETURN);

This change will turn on -fsanitize-recove=address for -fsanitize-recover=all, 
right?
That is quite a significant behavior change, isn't it?  Have you checked
what clang does here?

>             }
>           else if (value)
> -           flags |= sanitizer_opts[i].flag;
> +           {
> +             flags |= sanitizer_opts[i].flag;
> +             /* Do not enable -fsanitize-recover=unreachable and
> +                -fsanitize-recover=return if -fsanitize-recover=undefined
> +                is selected.  */
> +             if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
> +               flags &= ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);

This looks wrong.  If you want to complain about
-fsanitize-recover=unreachable, the above would be silent about
-fsanitize-recover=unreachable -fsanitize-recover=undefined.
Shouldn't it be instead
  if (sanitizer_opts[i].flag == SANITIZE_UNDEFINED)
    flags |= SANITIZE_UNDEFINED & ~(SANITIZE_UNREACHABLE | SANITIZE_RETURN);
  else
    flags |= sanitizer_opts[i].flag;
?

        Jakub

Reply via email to