https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70541

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2016-04-05
                 CC|                            |marxin at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
At -O0 indeed the dereferences in function argument list are not instrumented:
  [ab.c:24:3] _7 = f ([ab.c:24:3] *psimple_3);
doesn't have corresponding ASAN_CHECK added.
At -O2, everything is reported, but there is another issue, we lose the
location
of the first read - before einline we have:
  [ab.c:24:3] _7 = f ([ab.c:24:3] *psimple_3);
  [ab.c:24:3] __builtin_printf ([ab.c:24:21] "%d\n", _7);
but after einline:
  simple = [ab.c:24:3] *psimple_3;
  [ab.c:8:16] _14 = [ab.c:8:16] simple.value;
  _18 = _14;
  [ab.c:24:3] _7 = _18;
  [ab.c:24:3] __builtin_printf ([ab.c:24:21] "%d\n", _7);
as the simple = *psimple_3; statement has gimple_location UNKNOWN_LOCATION,
we actually end up reporting it at the spot of the second invalid memory access
(because it inherits the location from the previous statement, which is the
other __asan_report_store4 call).  In this case, we could either also look at
EXPR_LOCATION of the MEM_REF if gimple_location is UNKNOWN_LOCATION, or we'd
need to look at the inliner and figure out what location we want for the
parameter read.

Reply via email to