[gcc r16-6930] analyzer: fix -Wmaybe-uninitialized of 'edge_sense'

David Malcolm dmalcolm@gcc.gnu.org
Tue Jan 20 17:11:05 GMT 2026


https://gcc.gnu.org/g:26a69f98a06d53087794fa29b029c1767c004ba5

commit r16-6930-g26a69f98a06d53087794fa29b029c1767c004ba5
Author: David Malcolm <dmalcolm@redhat.com>
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 <dmalcolm@redhat.com>

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;
 	    }


More information about the Gcc-cvs mailing list