> Am 07.05.2024 um 17:54 schrieb Jakub Jelinek <ja...@redhat.com>:
> 
> Hi!
> 
> In r9-5742 we've started allowing to inline always_inline functions into
> functions which have disabled e.g. address sanitization even when the
> always_inline function is implicitly from command line options sanitized.
> 
> This mostly works fine because most of the asan instrumentation is done only
> late after ipa, but as the following testcase the .ASAN_MARK ifn calls
> gimplifier adds can result in ICEs.
> 
> Fixed by dropping those during inlining, similarly to how we drop
> .TSAN_FUNC_EXIT calls.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok

Richard 

> 2024-05-07  Jakub Jelinek  <ja...@redhat.com>
> 
>    PR sanitizer/114956
>    * tree-inline.cc: Include asan.h.
>    (copy_bb): Remove also .ASAN_MARK calls if id->dst_fn has asan/hwasan
>    sanitization disabled.
> 
>    * gcc.dg/asan/pr114956.c: New test.
> 
> --- gcc/tree-inline.cc.jj    2024-05-03 09:44:21.199055899 +0200
> +++ gcc/tree-inline.cc    2024-05-06 10:45:37.231349328 +0200
> @@ -65,6 +65,7 @@ along with GCC; see the file COPYING3.
> #include "symbol-summary.h"
> #include "symtab-thunks.h"
> #include "symtab-clones.h"
> +#include "asan.h"
> 
> /* I'm not real happy about this, but we need to handle gimple and
>    non-gimple trees.  */
> @@ -2226,13 +2227,26 @@ copy_bb (copy_body_data *id, basic_block
>        }
>      else if (call_stmt
>           && id->call_stmt
> -           && gimple_call_internal_p (stmt)
> -           && gimple_call_internal_fn (stmt) == IFN_TSAN_FUNC_EXIT)
> -        {
> -          /* Drop TSAN_FUNC_EXIT () internal calls during inlining.  */
> -          gsi_remove (&copy_gsi, false);
> -          continue;
> -        }
> +           && gimple_call_internal_p (stmt))
> +        switch (gimple_call_internal_fn (stmt))
> +          {
> +          case IFN_TSAN_FUNC_EXIT:
> +        /* Drop .TSAN_FUNC_EXIT () internal calls during inlining.  */
> +        gsi_remove (&copy_gsi, false);
> +        continue;
> +          case IFN_ASAN_MARK:
> +        /* Drop .ASAN_MARK internal calls during inlining into
> +           no_sanitize functions.  */
> +        if (!sanitize_flags_p (SANITIZE_ADDRESS, id->dst_fn)
> +            && !sanitize_flags_p (SANITIZE_HWADDRESS, id->dst_fn))
> +          {
> +            gsi_remove (&copy_gsi, false);
> +            continue;
> +          }
> +        break;
> +          default:
> +        break;
> +          }
> 
>      /* Statements produced by inlining can be unfolded, especially
>         when we constant propagated some operands.  We can't fold
> --- gcc/testsuite/gcc.dg/asan/pr114956.c.jj    2024-05-06 10:54:52.601892840 
> +0200
> +++ gcc/testsuite/gcc.dg/asan/pr114956.c    2024-05-06 10:54:33.920143734 
> +0200
> @@ -0,0 +1,26 @@
> +/* PR sanitizer/114956 */
> +/* { dg-do compile } */
> +/* { dg-options "-O2 -fsanitize=address,null" } */
> +
> +int **a;
> +void qux (int *);
> +
> +__attribute__((always_inline)) static inline int *
> +foo (void)
> +{
> +  int b[1];
> +  qux (b);
> +  return a[1];
> +}
> +
> +__attribute__((no_sanitize_address)) void
> +bar (void)
> +{
> +  *a = foo ();
> +}
> +
> +void
> +baz (void)
> +{
> +  bar ();
> +}
> 
>    Jakub
> 

Reply via email to