diff options
author | David Malcolm <dmalcolm@redhat.com> | 2020-10-13 18:49:11 -0400 |
---|---|---|
committer | David Malcolm <dmalcolm@redhat.com> | 2020-10-14 16:38:25 -0400 |
commit | 61a43de58cb6de7212a622060500ad0a0fd94fae (patch) | |
tree | b4e27b67acbfab4227c1a16fd00460db4c98910d /gcc/analyzer/region.cc | |
parent | 12b267cc606a48a2fef809189c35573c4a51d3a5 (diff) | |
download | gcc-61a43de58cb6de7212a622060500ad0a0fd94fae.zip gcc-61a43de58cb6de7212a622060500ad0a0fd94fae.tar.gz gcc-61a43de58cb6de7212a622060500ad0a0fd94fae.tar.bz2 |
analyzer: fix ICE on globals with unknown size [PR93388]
This patch fixes an ICE seen when attempting to build various existing
tests in our testsuite with -fanalyzer, including
gcc.c-torture/compile/980816-1.c.
gcc/analyzer/ChangeLog:
PR analyzer/93388
* region-model.cc (region_model::get_initial_value_for_global):
Fall back to returning an initial_svalue if
decl_region::get_svalue_for_initializer fails.
* region.cc (decl_region::get_svalue_for_initializer): Don't
attempt to create a compound_svalue if the region has an unknown
size.
gcc/testsuite/ChangeLog:
PR analyzer/93388
* gcc.dg/analyzer/data-model-21.c: New test.
Diffstat (limited to 'gcc/analyzer/region.cc')
-rw-r--r-- | gcc/analyzer/region.cc | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/gcc/analyzer/region.cc b/gcc/analyzer/region.cc index 0820893..adf0e2c 100644 --- a/gcc/analyzer/region.cc +++ b/gcc/analyzer/region.cc @@ -927,7 +927,9 @@ decl_region::get_svalue_for_constructor (tree ctor, Get an svalue for the initial value of this region at entry to "main" (either based on DECL_INITIAL, or implicit initialization to - zero. */ + zero. + + Return NULL if there is a problem. */ const svalue * decl_region::get_svalue_for_initializer (region_model_manager *mgr) const @@ -935,12 +937,20 @@ decl_region::get_svalue_for_initializer (region_model_manager *mgr) const tree init = DECL_INITIAL (m_decl); if (!init) { - /* Implicit initialization to zero; use a compound_svalue for it. */ + /* Implicit initialization to zero; use a compound_svalue for it. + Doing so requires that we have a concrete binding for this region, + which can fail if we have a region with unknown size + (e.g. "extern const char arr[];"). */ + const binding_key *binding + = binding_key::make (mgr->get_store_manager (), this, BK_direct); + if (binding->symbolic_p ()) + return NULL; + binding_cluster c (this); c.zero_fill_region (mgr->get_store_manager (), this); return mgr->get_or_create_compound_svalue (TREE_TYPE (m_decl), c.get_map ()); - } + } if (TREE_CODE (init) == CONSTRUCTOR) return get_svalue_for_constructor (init, mgr); |