https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114408
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Known to work| |12.3.0
Target Milestone|--- |13.3
Assignee|unassigned at gcc dot gnu.org |dmalcolm at gcc dot
gnu.org
Summary|ICE when invoking strcmp |[13/14 Regression] ICE when
|multiple times with |invoking strcmp multiple
|-fsanitize=undefined -O1 |times with
|-fanalyzer -flto |-fsanitize=undefined -O1
| |-fanalyzer -flto
CC| |dmalcolm at gcc dot gnu.org
Status|UNCONFIRMED |NEW
Known to fail| |13.2.1
Component|ipa |analyzer
Ever confirmed|0 |1
Last reconfirmed| |2024-03-21
--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Confirmed also with GCC 13, works with GCC 12.
The diagnostic is because of UBSAN instrumentation, it's already visible
without -flto.
The issue with the ICE is likely that the sanitizer computes dominance info at
IPA time but fails to release it?
I see in sm-malloc.cc:
/* Reject the warning if the deref's BB doesn't dominate that
of the check, so that we don't warn e.g. for shared cleanup
code that checks a pointer for NULL, when that code is sometimes
used before a deref and sometimes after.
Using the dominance code requires setting cfun. */
auto_cfun sentinel (m_deref_enode->get_function ());
calculate_dominance_info (CDI_DOMINATORS);
if (!dominated_by_p (CDI_DOMINATORS,
m_check_enode->get_supernode ()->m_bb,
m_deref_enode->get_supernode ()->m_bb))
return false;
return ctxt.warn ("check of %qE for NULL after already"
" dereferencing it",
m_arg);
but no free_dominance_info anywhere. It would of course be quite expensive
to re-compute all dominance info every time here, so analyzer needs to
loop over all functions releasing dominance info when done.