Commit 5e10b9a2 by David Malcolm

analyzer: fix ICE merging models containing label pointers (PR 93546)

PR analyzer/93546 reports an ICE within region_model::add_region_for_type
when merging two region_models each containing a label pointer.  The
two labels are stored as pointers to symbolic_regions, but these regions
were created with NULL type, leading to an assertion failure when a
merged copy is created.

The labels themselves have void (but not NULL) type.

This patch updates make_region_for_type to use the type of the decl when
creating such regions, rather than implicitly setting the region's type
to NULL, fixing the ICE.

gcc/analyzer/ChangeLog:
	PR analyzer/93546
	* region-model.cc (region_model::on_call_pre): Update for new
	param of symbolic_region ctor.
	(region_model::deref_rvalue): Likewise.
	(region_model::add_new_malloc_region): Likewise.
	(make_region_for_type): Likewise, preserving type.
	* region-model.h (symbolic_region::symbolic_region): Add "type"
	param and pass it to base class ctor.

gcc/testsuite/ChangeLog:
	PR analyzer/93546
	* gcc.dg/analyzer/pr93546.c: New test.
parent 287ccd3b
2020-02-03 David Malcolm <dmalcolm@redhat.com> 2020-02-03 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93546
* region-model.cc (region_model::on_call_pre): Update for new
param of symbolic_region ctor.
(region_model::deref_rvalue): Likewise.
(region_model::add_new_malloc_region): Likewise.
(make_region_for_type): Likewise, preserving type.
* region-model.h (symbolic_region::symbolic_region): Add "type"
param and pass it to base class ctor.
2020-02-03 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93547 PR analyzer/93547
* constraint-manager.cc * constraint-manager.cc
(constraint_manager::get_or_add_equiv_class): Ensure types are (constraint_manager::get_or_add_equiv_class): Ensure types are
......
...@@ -4163,7 +4163,7 @@ region_model::on_call_pre (const gcall *call, region_model_context *ctxt) ...@@ -4163,7 +4163,7 @@ region_model::on_call_pre (const gcall *call, region_model_context *ctxt)
{ {
region_id frame_rid = get_current_frame_id (); region_id frame_rid = get_current_frame_id ();
region_id new_rid region_id new_rid
= add_region (new symbolic_region (frame_rid, false)); = add_region (new symbolic_region (frame_rid, NULL_TREE, false));
if (!lhs_rid.null_p ()) if (!lhs_rid.null_p ())
{ {
svalue_id ptr_sid svalue_id ptr_sid
...@@ -5113,7 +5113,7 @@ region_model::deref_rvalue (svalue_id ptr_sid, region_model_context *ctxt) ...@@ -5113,7 +5113,7 @@ region_model::deref_rvalue (svalue_id ptr_sid, region_model_context *ctxt)
We don't know if it on the heap, stack, or a global, We don't know if it on the heap, stack, or a global,
so use the root region as parent. */ so use the root region as parent. */
region_id new_rid region_id new_rid
= add_region (new symbolic_region (m_root_rid, false)); = add_region (new symbolic_region (m_root_rid, NULL_TREE, false));
/* We need to write the region back into the pointer, /* We need to write the region back into the pointer,
or we'll get a new, different region each time. or we'll get a new, different region each time.
...@@ -5455,7 +5455,7 @@ region_model::add_new_malloc_region () ...@@ -5455,7 +5455,7 @@ region_model::add_new_malloc_region ()
{ {
region_id heap_rid region_id heap_rid
= get_root_region ()->ensure_heap_region (this); = get_root_region ()->ensure_heap_region (this);
return add_region (new symbolic_region (heap_rid, true)); return add_region (new symbolic_region (heap_rid, NULL_TREE, true));
} }
/* Attempt to return a tree that represents SID, or return NULL_TREE. /* Attempt to return a tree that represents SID, or return NULL_TREE.
...@@ -6006,7 +6006,7 @@ make_region_for_type (region_id parent_rid, tree type) ...@@ -6006,7 +6006,7 @@ make_region_for_type (region_id parent_rid, tree type)
/* If we have a void *, make a new symbolic region. */ /* If we have a void *, make a new symbolic region. */
if (VOID_TYPE_P (type)) if (VOID_TYPE_P (type))
return new symbolic_region (parent_rid, false); return new symbolic_region (parent_rid, type, false);
gcc_unreachable (); gcc_unreachable ();
} }
......
...@@ -1606,8 +1606,8 @@ namespace ana { ...@@ -1606,8 +1606,8 @@ namespace ana {
class symbolic_region : public region class symbolic_region : public region
{ {
public: public:
symbolic_region (region_id parent_rid, bool possibly_null) symbolic_region (region_id parent_rid, tree type, bool possibly_null)
: region (parent_rid, svalue_id::null (), NULL_TREE), : region (parent_rid, svalue_id::null (), type),
m_possibly_null (possibly_null) m_possibly_null (possibly_null)
{} {}
symbolic_region (const symbolic_region &other); symbolic_region (const symbolic_region &other);
......
2020-02-03 David Malcolm <dmalcolm@redhat.com> 2020-02-03 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93546
* gcc.dg/analyzer/pr93546.c: New test.
2020-02-03 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93547 PR analyzer/93547
* gcc.dg/analyzer/pr93547.c: New test. * gcc.dg/analyzer/pr93547.c: New test.
......
/* { dg-do compile } */
void
ch (int x1)
{
({ bx: &&bx; });
while (x1 == 0)
{
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment