https://gcc.gnu.org/g:26a69f98a06d53087794fa29b029c1767c004ba5
commit r16-6930-g26a69f98a06d53087794fa29b029c1767c004ba5 Author: David Malcolm <[email protected]> Date: Tue Jan 20 12:06:11 2026 -0500 analyzer: fix -Wmaybe-uninitialized of 'edge_sense' gcc/analyzer/ChangeLog: * checker-event.cc (cfg_edge_event::maybe_get_edge_sense): New. * checker-event.h (cfg_edge_event::maybe_get_edge_sense): New decl. * diagnostic-manager.cc (diagnostic_manager::consolidate_conditions): Use the above to ensure that edge_sense is initialized if used, and to simplify the check for a run of conditions. Signed-off-by: David Malcolm <[email protected]> Diff: --- gcc/analyzer/checker-event.cc | 23 +++++++++++++++++++++++ gcc/analyzer/checker-event.h | 2 ++ gcc/analyzer/diagnostic-manager.cc | 27 ++++++--------------------- 3 files changed, 31 insertions(+), 21 deletions(-) diff --git a/gcc/analyzer/checker-event.cc b/gcc/analyzer/checker-event.cc index 97ba59ca9188..d1e9b4429f9d 100644 --- a/gcc/analyzer/checker-event.cc +++ b/gcc/analyzer/checker-event.cc @@ -632,6 +632,29 @@ cfg_edge_event::get_cfg_edge () const return m_sedge->get_any_cfg_edge (); } +/* If this event is for a conditional, write the sense of the + conditional to *OUT and return true. + Otherwise return false. */ + +bool +cfg_edge_event::maybe_get_edge_sense (bool *out) const +{ + if (::edge e = get_cfg_edge ()) + { + if (e->flags & EDGE_TRUE_VALUE) + { + *out = true; + return true; + } + else if (e->flags & EDGE_FALSE_VALUE) + { + *out = false; + return true; + } + } + return false; +} + /* class start_cfg_edge_event : public cfg_edge_event. */ /* Implementation of diagnostics::paths::event::print_desc vfunc for diff --git a/gcc/analyzer/checker-event.h b/gcc/analyzer/checker-event.h index 8094ef607c17..be39a89a7b17 100644 --- a/gcc/analyzer/checker-event.h +++ b/gcc/analyzer/checker-event.h @@ -456,6 +456,8 @@ public: ::edge get_cfg_edge () const; + bool maybe_get_edge_sense (bool *out) const; + protected: cfg_edge_event (enum event_kind kind, const exploded_edge &eedge, diff --git a/gcc/analyzer/diagnostic-manager.cc b/gcc/analyzer/diagnostic-manager.cc index 813f764eb327..8e3aed064200 100644 --- a/gcc/analyzer/diagnostic-manager.cc +++ b/gcc/analyzer/diagnostic-manager.cc @@ -2708,15 +2708,8 @@ diagnostic_manager::consolidate_conditions (checker_path *path) const const start_cfg_edge_event *old_start_cfg_ev = (const start_cfg_edge_event *)old_start_ev; bool edge_sense; - if (::edge e = old_start_cfg_ev->get_cfg_edge ()) - { - if (e->flags & EDGE_TRUE_VALUE) - edge_sense = true; - else if (e->flags & EDGE_FALSE_VALUE) - edge_sense = false; - else - continue; - } + if (!old_start_cfg_ev->maybe_get_edge_sense (&edge_sense)) + continue; /* Find a run of CFG start/end event pairs from [start_idx, next_idx) @@ -2731,19 +2724,11 @@ diagnostic_manager::consolidate_conditions (checker_path *path) const gcc_assert (iter_ev->get_kind () == event_kind::start_cfg_edge); const start_cfg_edge_event *iter_cfg_ev = (const start_cfg_edge_event *)iter_ev; - ::edge e = iter_cfg_ev->get_cfg_edge (); - if (!e) + bool iter_edge_sense; + if (!iter_cfg_ev->maybe_get_edge_sense (&iter_edge_sense)) + break; + if (iter_edge_sense != edge_sense) break; - if (edge_sense) - { - if (!(e->flags & EDGE_TRUE_VALUE)) - break; - } - else - { - if (!(e->flags & EDGE_FALSE_VALUE)) - break; - } next_idx += 2; }
