Home | History | Annotate | Line # | Download | only in analyzer
      1  1.1  mrg /* Finding reachable regions and values.
      2  1.1  mrg    Copyright (C) 2020-2022 Free Software Foundation, Inc.
      3  1.1  mrg    Contributed by David Malcolm <dmalcolm (at) redhat.com>.
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify it
      8  1.1  mrg under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful, but
     13  1.1  mrg WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15  1.1  mrg General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #ifndef GCC_ANALYZER_REGION_MODEL_REACHABILITY_H
     22  1.1  mrg #define GCC_ANALYZER_REGION_MODEL_REACHABILITY_H
     23  1.1  mrg 
     24  1.1  mrg namespace ana {
     25  1.1  mrg 
     26  1.1  mrg /* A class for determining which regions and svalues are reachable.
     27  1.1  mrg 
     28  1.1  mrg    Used by region_model::handle_unrecognized_call for keeping
     29  1.1  mrg    track of all regions that are reachable, and, of those, which are
     30  1.1  mrg    mutable.
     31  1.1  mrg 
     32  1.1  mrg    Used by program_state::detect_leaks
     33  1.1  mrg    (via region_model::get_reachable_svalues) for detecting leaks.  */
     34  1.1  mrg 
     35  1.1  mrg class reachable_regions
     36  1.1  mrg {
     37  1.1  mrg public:
     38  1.1  mrg   reachable_regions (region_model *model);
     39  1.1  mrg 
     40  1.1  mrg   /* Callback called for each cluster when initializing this object.  */
     41  1.1  mrg   static void init_cluster_cb (const region *base_reg,
     42  1.1  mrg 			       reachable_regions *this_ptr);
     43  1.1  mrg 
     44  1.1  mrg   /* Called for each cluster when initializing this object.  */
     45  1.1  mrg   void init_cluster (const region *base_reg);
     46  1.1  mrg 
     47  1.1  mrg   /* Lazily mark the cluster containing REG as being reachable, recursively
     48  1.1  mrg      adding clusters reachable from REG's cluster.  */
     49  1.1  mrg   void add (const region *reg, bool is_mutable);
     50  1.1  mrg 
     51  1.1  mrg   static void handle_sval_cb (const svalue *sval,
     52  1.1  mrg 			      reachable_regions *this_ptr);
     53  1.1  mrg 
     54  1.1  mrg   /* Add SVAL.  If it is a pointer, add the pointed-to region.  */
     55  1.1  mrg   void handle_sval (const svalue *sval);
     56  1.1  mrg 
     57  1.1  mrg   /* Add SVAL.  If it is a pointer, add the pointed-to region.
     58  1.1  mrg      Use PARAM_TYPE for determining mutability.  */
     59  1.1  mrg   void handle_parm (const svalue *sval, tree param_type);
     60  1.1  mrg 
     61  1.1  mrg   /* Update the store to mark the clusters that were found to be mutable
     62  1.1  mrg      as having escaped.
     63  1.1  mrg      Notify CTXT about escaping function_decls.  */
     64  1.1  mrg   void mark_escaped_clusters (region_model_context *ctxt);
     65  1.1  mrg 
     66  1.1  mrg   /* Iteration over reachable base regions.  */
     67  1.1  mrg   hash_set<const region *>::iterator begin ()
     68  1.1  mrg   {
     69  1.1  mrg     return m_reachable_base_regs.begin ();
     70  1.1  mrg   }
     71  1.1  mrg   hash_set<const region *>::iterator end ()
     72  1.1  mrg   {
     73  1.1  mrg     return m_reachable_base_regs.end ();
     74  1.1  mrg   }
     75  1.1  mrg 
     76  1.1  mrg   svalue_set::iterator begin_reachable_svals ()
     77  1.1  mrg   {
     78  1.1  mrg     return m_reachable_svals.begin ();
     79  1.1  mrg   }
     80  1.1  mrg   svalue_set::iterator end_reachable_svals ()
     81  1.1  mrg   {
     82  1.1  mrg     return m_reachable_svals.end ();
     83  1.1  mrg   }
     84  1.1  mrg   svalue_set::iterator begin_mutable_svals ()
     85  1.1  mrg   {
     86  1.1  mrg     return m_mutable_svals.begin ();
     87  1.1  mrg   }
     88  1.1  mrg   svalue_set::iterator end_mutable_svals ()
     89  1.1  mrg   {
     90  1.1  mrg     return m_mutable_svals.end ();
     91  1.1  mrg   }
     92  1.1  mrg   hash_set<const region *>::iterator begin_mutable_base_regs ()
     93  1.1  mrg   {
     94  1.1  mrg     return m_mutable_base_regs.begin ();
     95  1.1  mrg   }
     96  1.1  mrg   hash_set<const region *>::iterator end_mutable_base_regs ()
     97  1.1  mrg   {
     98  1.1  mrg     return m_mutable_base_regs.end ();
     99  1.1  mrg   }
    100  1.1  mrg 
    101  1.1  mrg   void dump_to_pp (pretty_printer *pp) const;
    102  1.1  mrg 
    103  1.1  mrg   DEBUG_FUNCTION void dump () const;
    104  1.1  mrg 
    105  1.1  mrg private:
    106  1.1  mrg   region_model *m_model;
    107  1.1  mrg   store *m_store;
    108  1.1  mrg 
    109  1.1  mrg   /* The base regions already seen.  */
    110  1.1  mrg   hash_set<const region *> m_reachable_base_regs;
    111  1.1  mrg 
    112  1.1  mrg   /* The base regions that can be changed (accessed via non-const pointers).  */
    113  1.1  mrg   hash_set<const region *> m_mutable_base_regs;
    114  1.1  mrg 
    115  1.1  mrg   /* svalues that were passed as const pointers, so e.g. couldn't have
    116  1.1  mrg      been freed (but could have e.g. had "close" called on them if an
    117  1.1  mrg      int file-descriptor).  */
    118  1.1  mrg   svalue_set m_reachable_svals;
    119  1.1  mrg   /* svalues that were passed as non-const pointers, so e.g. could have
    120  1.1  mrg      been freed.  */
    121  1.1  mrg   svalue_set m_mutable_svals;
    122  1.1  mrg };
    123  1.1  mrg 
    124  1.1  mrg } // namespace ana
    125  1.1  mrg 
    126  1.1  mrg #endif /* GCC_ANALYZER_REGION_MODEL_REACHABILITY_H */
    127