analyzer: fix hashing of bit_range_region::key_t [PR104452]
authorDavid Malcolm <dmalcolm@redhat.com>
Tue, 8 Feb 2022 21:37:08 +0000 (16:37 -0500)
committerDavid Malcolm <dmalcolm@redhat.com>
Wed, 9 Feb 2022 02:27:12 +0000 (21:27 -0500)
gcc/analyzer/ChangeLog:
PR analyzer/104452
* region-model.cc (selftest::test_bit_range_regions): New.
(selftest::analyzer_region_model_cc_tests): Call it.
* region.h (bit_range_region::key_t::hash): Fix hashing of m_bits
to avoid using uninitialized data.

gcc/testsuite/ChangeLog:
PR analyzer/104452
* gcc.dg/analyzer/pr104452.c: New test.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
gcc/analyzer/region-model.cc
gcc/analyzer/region.h
gcc/testsuite/gcc.dg/analyzer/pr104452.c [new file with mode: 0644]

index 6e7a21d..f8f1976 100644 (file)
@@ -4710,6 +4710,23 @@ test_descendent_of_p ()
   ASSERT_TRUE (cast_reg->descendent_of_p (x_reg));
 }
 
+/* Verify that bit_range_region works as expected.  */
+
+static void
+test_bit_range_regions ()
+{
+  tree x = build_global_decl ("x", integer_type_node);
+  region_model_manager mgr;
+  const region *x_reg = mgr.get_region_for_global (x);
+  const region *byte0
+    = mgr.get_bit_range (x_reg, char_type_node, bit_range (0, 8));
+  const region *byte1
+    = mgr.get_bit_range (x_reg, char_type_node, bit_range (8, 8));
+  ASSERT_TRUE (byte0->descendent_of_p (x_reg));
+  ASSERT_TRUE (byte1->descendent_of_p (x_reg));
+  ASSERT_NE (byte0, byte1);
+}
+
 /* Verify that simple assignments work as expected.  */
 
 static void
@@ -6009,6 +6026,7 @@ analyzer_region_model_cc_tests ()
   test_binop_svalue_folding ();
   test_sub_svalue_folding ();
   test_descendent_of_p ();
+  test_bit_range_regions ();
   test_assignment ();
   test_compound_assignment ();
   test_stack_frames ();
index 206b157..5311217 100644 (file)
@@ -1156,7 +1156,8 @@ public:
       inchash::hash hstate;
       hstate.add_ptr (m_parent);
       hstate.add_ptr (m_type);
-      hstate.add (&m_bits, sizeof (m_bits));
+      hstate.add_wide_int (m_bits.m_start_bit_offset);
+      hstate.add_wide_int (m_bits.m_size_in_bits);
       return hstate.end ();
     }
 
diff --git a/gcc/testsuite/gcc.dg/analyzer/pr104452.c b/gcc/testsuite/gcc.dg/analyzer/pr104452.c
new file mode 100644 (file)
index 0000000..85eb82d
--- /dev/null
@@ -0,0 +1,10 @@
+/* { dg-additional-options "-O" } */
+
+void
+test_1 (void)
+{
+  int __attribute__((__vector_size__ (16))) x;
+  for (unsigned i = 0; i < 4;)
+    if (x[i]) /* { dg-warning "use of uninitialized value" } */
+      __builtin_abort ();
+}