From 422cfab65ec0e6d6cd53322b46c230bc697a1a5e Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Tue, 19 May 2020 16:41:58 -0400 Subject: [PATCH 158/179] FIXME: fix bogus 'leak' detection on INIT_VAL --- gcc/analyzer/program-state.cc | 12 ++++++++++++ gcc/analyzer/region-model2.cc | 6 +++++- 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/gcc/analyzer/program-state.cc b/gcc/analyzer/program-state.cc index 00bceec934c..1e2177ef34a 100644 --- a/gcc/analyzer/program-state.cc +++ b/gcc/analyzer/program-state.cc @@ -1995,6 +1995,18 @@ program_state::detect_leaks2 (const program_state &src_state, const svalue2 *sval = (*iter); if (!dest_svalues.contains (sval)) { + /* If src_svalues contains a use of INIT_VAL(REGION) and + dest_svalues doesn't, we don't want to complain if + the region still implicitly has that value. */ + if (const initial_svalue2 *init_sval + = sval->dyn_cast_initial_svalue2 ()) + { + const region2 *reg = init_sval->get_region (); + const svalue2 *reg_sval + = dest_state.m_region_model2->get_store_value (reg); + if (reg_sval == init_sval) + continue; + } #if 0 pretty_printer pp1, pp2, pp3; pp_format_decoder (&pp1) = default_tree_printer; diff --git a/gcc/analyzer/region-model2.cc b/gcc/analyzer/region-model2.cc index d4297db959c..7915ab21e50 100644 --- a/gcc/analyzer/region-model2.cc +++ b/gcc/analyzer/region-model2.cc @@ -5361,7 +5361,11 @@ region_model2::get_store_value (const region2 *reg) const svalue2 *sval = m_store.get_any_binding (m_mgr->get_store2_manager (), reg); if (sval) - return m_mgr->get_or_create_cast (reg->get_type (), sval); + { + if (reg->get_type ()) + sval = m_mgr->get_or_create_cast (reg->get_type (), sval); + return sval; + } /* Special-case: read at a constant index within a STRING_CST. */ if (const offset_region2 *offset_reg = reg->dyn_cast_offset_region2 ()) -- 2.21.0