]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
analyzer: use std::unique_ptr for pending_diagnostic/note
authorDavid Malcolm <dmalcolm@redhat.com>
Thu, 3 Nov 2022 17:47:01 +0000 (13:47 -0400)
committerDavid Malcolm <dmalcolm@redhat.com>
Thu, 3 Nov 2022 17:47:01 +0000 (13:47 -0400)
gcc/analyzer/ChangeLog:
* call-info.cc: Add define of INCLUDE_MEMORY.
* call-summary.cc: Likewise.
* checker-path.cc: Likewise.
* constraint-manager.cc: Likewise.
* diagnostic-manager.cc: Likewise.
(saved_diagnostic::saved_diagnostic): Use std::unique_ptr for
param d and field m_d.
(saved_diagnostic::~saved_diagnostic): Remove explicit delete of m_d.
(saved_diagnostic::add_note): Use std::unique_ptr for
param pn.
(saved_diagnostic::get_pending_diagnostic): Update for conversion
of m_sd.m_d to unique_ptr.
(diagnostic_manager::add_diagnostic): Use std::unique_ptr for
param d.  Remove explicit deletion.
(diagnostic_manager::add_note): Use std::unique_ptr for param pn.
(diagnostic_manager::emit_saved_diagnostic): Update for conversion
of m_sd.m_d to unique_ptr.
(null_assignment_sm_context::warn): Use std::unique_ptr for
param d.  Remove explicit deletion.
* diagnostic-manager.h (saved_diagnostic::saved_diagnostic): Use
std::unique_ptr for param d.
(saved_diagnostic::add_note): Likewise for param pn.
(saved_diagnostic::m_d): Likewise.
(diagnostic_manager::add_diagnostic): Use std::unique_ptr for
param d.
(diagnostic_manager::add_note): Use std::unique_ptr for param pn.
* engine.cc: Include "make-unique.h".
(impl_region_model_context::warn): Update to use std::unique_ptr
for param, removing explicit deletion.
(impl_region_model_context::add_note): Likewise.
(impl_sm_context::warn): Update to use std::unique_ptr
for param.
(impl_region_model_context::on_state_leak): Likewise for result of
on_leak.
(exploded_node::on_longjmp): Use make_unique when creating
pending_diagnostic.
(exploded_graph::process_node): Likewise.
* exploded-graph.h (impl_region_model_context::warn): Update to
use std::unique_ptr for param.
(impl_region_model_context::add_note): Likewise.
* feasible-graph.cc: Add define of INCLUDE_MEMORY.
* pending-diagnostic.cc: Likewise.
* pending-diagnostic.h: Include analyzer.sm.h"
* program-point.cc: Add define of INCLUDE_MEMORY.
* program-state.cc: Likewise.
* region-model-asm.cc: Likewise.
* region-model-impl-calls.cc: Likewise.  Include "make-unique.h".
(region_model::impl_call_putenv): Use make_unique when creating
pending_diagnostic.
* region-model-manager.cc: Add define of INCLUDE_MEMORY.
* region-model-reachability.cc: Likewise.
* region-model.cc: Likewise.  Include "make-unique.h".
(region_model::get_gassign_result): Use make_unique when creating
pending_diagnostic.
(region_model::check_for_poison): Likewise.
(region_model::on_stmt_pre): Likewise.
(region_model::check_symbolic_bounds): Likewise.
(region_model::check_region_bounds): Likewise.
(annotating_ctxt: make_note): Use std::unique_ptr for result.
(region_model::deref_rvalue): Use make_unique when creating
pending_diagnostic.
(region_model::check_for_writable_region): Likewise.
(region_model::check_region_size): Likewise.
(region_model::check_dynamic_size_for_floats): Likewise.
(region_model::maybe_complain_about_infoleak): Likewise.
(noop_region_model_context::add_note): Use std::unique_ptr for
param.  Remove explicit deletion.
* region-model.h: Include "analyzer/pending-diagnostic.h".
(region_model_context::warn): Convert param to std::unique_ptr.
(region_model_context::add_note): Likewise.
(noop_region_model_context::warn): Likewise.
(noop_region_model_context::add_note): Likewise.
(region_model_context_decorator::warn): Likewise.
(region_model_context_decorator::add_note): Likewise.
(note_adding_context::warn): Likewise.
(note_adding_context::make_note): Likewise for return type.
(test_region_model_context::warn): Convert param to
std::unique_ptr.
* region.cc: Add define of INCLUDE_MEMORY.
* sm-fd.cc: Likewise.  Include "make-unique.h".
(fd_state_machine::check_for_fd_attrs): Use make_unique when
creating pending_diagnostics.
(fd_state_machine::on_open): Likewise.
(fd_state_machine::on_creat): Likewise.
(fd_state_machine::check_for_dup): Likewise.
(fd_state_machine::on_close): Likewise.
(fd_state_machine::check_for_open_fd): Likewise.
(fd_state_machine::on_leak): Likewise, converting return type to
std::unique_ptr.
* sm-file.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(fileptr_state_machine::on_stmt): Use make_unique when creating
pending_diagnostic.
(fileptr_state_machine::on_leak): Likewise, converting return type
to std::unique_ptr.
* sm-malloc.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(malloc_state_machine::on_stmt): Use make_unique when creating
pending_diagnostic.
(malloc_state_machine::handle_free_of_non_heap): Likewise.
(malloc_state_machine::on_deallocator_call): Likewise.
(malloc_state_machine::on_realloc_call): Likewise.
(malloc_state_machine::on_leak): Likewise, converting return type
to std::unique_ptr.
* sm-pattern-test.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(pattern_test_state_machine::on_condition): Use make_unique when
creating pending_diagnostic.
* sm-sensitive.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(sensitive_state_machine::warn_for_any_exposure): Use make_unique
when creating pending_diagnostic.
* sm-signal.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(signal_state_machine::on_stmt): Use make_unique when creating
pending_diagnostic.
* sm-taint.cc: Add define of INCLUDE_MEMORY.  Include
"make-unique.h".
(taint_state_machine::check_for_tainted_size_arg): Use make_unique
when creating pending_diagnostic.
(taint_state_machine::check_for_tainted_divisor): Likewise.
(region_model::check_region_for_taint): Likewise.
(region_model::check_dynamic_size_for_taint): Likewise.
* sm.cc: Add define of INCLUDE_MEMORY.  Include
"analyzer/pending-diagnostic.h".
(state_machine::on_leak): Move here from sm.h, changing return
type to std::unique_ptr.
* sm.h (state_machine::on_leak): Change return type to
std::unique_ptr.  Move defn of base impl to sm.cc
(sm_context::warn): Convert param d to std_unique_ptr.
* state-purge.cc: Add define of INCLUDE_MEMORY.
* store.cc: Likewise.
* svalue.cc: Likewise.
* trimmed-graph.cc: Likewise.
* varargs.cc: Likewise.  Include "make-unique.h".
(va_list_state_machine::check_for_ended_va_list): Use make_unique
when creating pending_diagnostic.
(va_list_state_machine::on_leak): Likewise, converting return type
to std::unique_ptr.
(region_model::impl_call_va_arg): Use make_unique when creating
pending_diagnostic.

gcc/testsuite/ChangeLog:
* gcc.dg/plugin/analyzer_gil_plugin.c: Add define of
INCLUDE_MEMORY.  Include "make-unique.h".
(gil_state_machine::check_for_pyobject_in_call): Use make_unique
when creating pending_diagnostic.
(gil_state_machine::on_stmt): Likewise.
(gil_state_machine::check_for_pyobject_usage_without_gil): Likewise.
* gcc.dg/plugin/analyzer_kernel_plugin.c: : Add define of
INCLUDE_MEMORY.
* gcc.dg/plugin/analyzer_known_fns_plugin.c: Likewise.

Signed-off-by: David Malcolm <dmalcolm@redhat.com>
37 files changed:
gcc/analyzer/call-info.cc
gcc/analyzer/call-summary.cc
gcc/analyzer/checker-path.cc
gcc/analyzer/constraint-manager.cc
gcc/analyzer/diagnostic-manager.cc
gcc/analyzer/diagnostic-manager.h
gcc/analyzer/engine.cc
gcc/analyzer/exploded-graph.h
gcc/analyzer/feasible-graph.cc
gcc/analyzer/pending-diagnostic.cc
gcc/analyzer/pending-diagnostic.h
gcc/analyzer/program-point.cc
gcc/analyzer/program-state.cc
gcc/analyzer/region-model-asm.cc
gcc/analyzer/region-model-impl-calls.cc
gcc/analyzer/region-model-manager.cc
gcc/analyzer/region-model-reachability.cc
gcc/analyzer/region-model.cc
gcc/analyzer/region-model.h
gcc/analyzer/region.cc
gcc/analyzer/sm-fd.cc
gcc/analyzer/sm-file.cc
gcc/analyzer/sm-malloc.cc
gcc/analyzer/sm-pattern-test.cc
gcc/analyzer/sm-sensitive.cc
gcc/analyzer/sm-signal.cc
gcc/analyzer/sm-taint.cc
gcc/analyzer/sm.cc
gcc/analyzer/sm.h
gcc/analyzer/state-purge.cc
gcc/analyzer/store.cc
gcc/analyzer/svalue.cc
gcc/analyzer/trimmed-graph.cc
gcc/analyzer/varargs.cc
gcc/testsuite/gcc.dg/plugin/analyzer_gil_plugin.c
gcc/testsuite/gcc.dg/plugin/analyzer_kernel_plugin.c
gcc/testsuite/gcc.dg/plugin/analyzer_known_fns_plugin.c

index 56059ac5cf4af2276d7f78ed7621d705c25c6796..3572e06d14bf0d6a0493555fe146317159d3c841 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 12ef82d18d6c997f1ad105cc8b7115ce44776928..ebc7b5028ec6d13d76d1460e8a2af7cb8809313e 100644 (file)
@@ -18,6 +18,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 371111b288d9f724af80d9fb9dfa548e01ca77c4..4cf28c2af86325c2c58e1a34804dd9d0a1c238af 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 96ae073841955a98f8a523d959cf531418580576..b4e51b089432fc1f5c9b060d9375524101c4caf5 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 695bde5bee1b57d6abb97fe1fb2cd311f319bb82..0444e52258c367583bea0d4bc157f408124aa1c0 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
@@ -638,14 +639,14 @@ saved_diagnostic::saved_diagnostic (const state_machine *sm,
                                    tree var,
                                    const svalue *sval,
                                    state_machine::state_t state,
-                                   pending_diagnostic *d,
+                                   std::unique_ptr<pending_diagnostic> d,
                                    unsigned idx)
 : m_sm (sm), m_enode (enode), m_snode (snode), m_stmt (stmt),
  /* stmt_finder could be on-stack; we want our own copy that can
     outlive that.  */
   m_stmt_finder (stmt_finder ? stmt_finder->clone () : NULL),
   m_var (var), m_sval (sval), m_state (state),
-  m_d (d), m_trailing_eedge (NULL),
+  m_d (std::move (d)), m_trailing_eedge (NULL),
   m_idx (idx),
   m_best_epath (NULL), m_problem (NULL),
   m_notes ()
@@ -662,7 +663,6 @@ saved_diagnostic::saved_diagnostic (const state_machine *sm,
 saved_diagnostic::~saved_diagnostic ()
 {
   delete m_stmt_finder;
-  delete m_d;
   delete m_best_epath;
   delete m_problem;
 }
@@ -689,10 +689,10 @@ saved_diagnostic::operator== (const saved_diagnostic &other) const
 /* Add PN to this diagnostic, taking ownership of it.  */
 
 void
-saved_diagnostic::add_note (pending_note *pn)
+saved_diagnostic::add_note (std::unique_ptr<pending_note> pn)
 {
   gcc_assert (pn);
-  m_notes.safe_push (pn);
+  m_notes.safe_push (pn.release ());
 }
 
 /* Return a new json::object of the form
@@ -896,7 +896,7 @@ public:
 
   pending_diagnostic *get_pending_diagnostic () const
   {
-    return m_sd.m_d;
+    return m_sd.m_d.get ();
   }
 
   bool reachable_from_p (const exploded_node *src_enode) const
@@ -955,8 +955,7 @@ diagnostic_manager::diagnostic_manager (logger *logger, engine *eng,
 }
 
 /* Queue pending_diagnostic D at ENODE for later emission.
-   Return true/false signifying if the diagnostic was actually added.
-   Take ownership of D (or delete it).  */
+   Return true/false signifying if the diagnostic was actually added.  */
 
 bool
 diagnostic_manager::add_diagnostic (const state_machine *sm,
@@ -966,7 +965,7 @@ diagnostic_manager::add_diagnostic (const state_machine *sm,
                                    tree var,
                                    const svalue *sval,
                                    state_machine::state_t state,
-                                   pending_diagnostic *d)
+                                   std::unique_ptr<pending_diagnostic> d)
 {
   LOG_FUNC (get_logger ());
 
@@ -987,7 +986,6 @@ diagnostic_manager::add_diagnostic (const state_machine *sm,
          if (get_logger ())
            get_logger ()->log ("rejecting disabled warning %qs",
                                d->get_kind ());
-         delete d;
          m_num_disabled_diagnostics++;
          return false;
        }
@@ -995,13 +993,13 @@ diagnostic_manager::add_diagnostic (const state_machine *sm,
 
   saved_diagnostic *sd
     = new saved_diagnostic (sm, enode, snode, stmt, finder, var, sval,
-                           state, d, m_saved_diagnostics.length ());
+                           state, std::move (d), m_saved_diagnostics.length ());
   m_saved_diagnostics.safe_push (sd);
   enode->add_diagnostic (sd);
   if (get_logger ())
     log ("adding saved diagnostic %i at SN %i to EN %i: %qs",
         sd->get_index (),
-        snode->m_index, enode->m_index, d->get_kind ());
+        snode->m_index, enode->m_index, sd->m_d->get_kind ());
   return true;
 }
 
@@ -1013,17 +1011,17 @@ bool
 diagnostic_manager::add_diagnostic (exploded_node *enode,
                                    const supernode *snode, const gimple *stmt,
                                    stmt_finder *finder,
-                                   pending_diagnostic *d)
+                                   std::unique_ptr<pending_diagnostic> d)
 {
   gcc_assert (enode);
   return add_diagnostic (NULL, enode, snode, stmt, finder, NULL_TREE,
-                        NULL, 0, d);
+                        NULL, 0, std::move (d));
 }
 
 /* Add PN to the most recent saved_diagnostic.  */
 
 void
-diagnostic_manager::add_note (pending_note *pn)
+diagnostic_manager::add_note (std::unique_ptr<pending_note> pn)
 {
   LOG_FUNC (get_logger ());
   gcc_assert (pn);
@@ -1031,7 +1029,7 @@ diagnostic_manager::add_note (pending_note *pn)
   /* Get most recent saved_diagnostic.  */
   gcc_assert (m_saved_diagnostics.length () > 0);
   saved_diagnostic *sd = m_saved_diagnostics[m_saved_diagnostics.length () - 1];
-  sd->add_note (pn);
+  sd->add_note (std::move (pn));
 }
 
 /* Return a new json::object of the form
@@ -1386,13 +1384,13 @@ diagnostic_manager::emit_saved_diagnostic (const exploded_graph &eg,
 
   emission_path.inject_any_inlined_call_events (get_logger ());
 
-  emission_path.prepare_for_emission (sd.m_d);
+  emission_path.prepare_for_emission (sd.m_d.get ());
 
   location_t loc
     = get_emission_location (sd.m_stmt, sd.m_snode->m_fun, *sd.m_d);
 
   /* Allow the pending_diagnostic to fix up the locations of events.  */
-  emission_path.fixup_locations (sd.m_d);
+  emission_path.fixup_locations (sd.m_d.get ());
 
   gcc_rich_location rich_loc (loc);
   rich_loc.set_path (&emission_path);
@@ -1783,14 +1781,12 @@ struct null_assignment_sm_context : public sm_context
   }
 
   void warn (const supernode *, const gimple *,
-            tree, pending_diagnostic *d) final override
+            tree, std::unique_ptr<pending_diagnostic>) final override
   {
-    delete d;
   }
   void warn (const supernode *, const gimple *,
-            const svalue *, pending_diagnostic *d) final override
+            const svalue *, std::unique_ptr<pending_diagnostic>) final override
   {
-    delete d;
   }
 
   tree get_diagnostic_tree (tree expr) final override
index 266eed8f9cb554620986ae3a25efb365f00cd5e7..fdab038d7a1aa78c28b75d88271199c557015257 100644 (file)
@@ -36,13 +36,13 @@ public:
                    stmt_finder *stmt_finder,
                    tree var, const svalue *sval,
                    state_machine::state_t state,
-                   pending_diagnostic *d,
+                   std::unique_ptr<pending_diagnostic> d,
                    unsigned idx);
   ~saved_diagnostic ();
 
   bool operator== (const saved_diagnostic &other) const;
 
-  void add_note (pending_note *pn);
+  void add_note (std::unique_ptr<pending_note> pn);
 
   json::object *to_json () const;
 
@@ -76,7 +76,7 @@ public:
   tree m_var;
   const svalue *m_sval;
   state_machine::state_t m_state;
-  pending_diagnostic *m_d; // owned
+  std::unique_ptr<pending_diagnostic> m_d;
   const exploded_edge *m_trailing_eedge;
 
 private:
@@ -117,14 +117,14 @@ public:
                       tree var,
                       const svalue *sval,
                       state_machine::state_t state,
-                      pending_diagnostic *d);
+                      std::unique_ptr<pending_diagnostic> d);
 
   bool add_diagnostic (exploded_node *enode,
                       const supernode *snode, const gimple *stmt,
                       stmt_finder *finder,
-                      pending_diagnostic *d);
+                      std::unique_ptr<pending_diagnostic> d);
 
-  void add_note (pending_note *pn);
+  void add_note (std::unique_ptr<pending_note> pn);
 
   void emit_saved_diagnostics (const exploded_graph &eg);
 
index 52978dd0d37a96e8f2c3a6e895143604bb2b2011..fd532b1384dff1f3317219da0d63988805030887 100644 (file)
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
 #define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "fold-const.h"
 #include "gcc-rich-location.h"
@@ -114,35 +115,29 @@ impl_region_model_context (program_state *state,
 }
 
 bool
-impl_region_model_context::warn (pending_diagnostic *d)
+impl_region_model_context::warn (std::unique_ptr<pending_diagnostic> d)
 {
   LOG_FUNC (get_logger ());
   if (m_stmt == NULL && m_stmt_finder == NULL)
     {
       if (get_logger ())
        get_logger ()->log ("rejecting diagnostic: no stmt");
-      delete d;
       return false;
     }
   if (m_eg)
     return m_eg->get_diagnostic_manager ().add_diagnostic
       (m_enode_for_diag, m_enode_for_diag->get_supernode (),
-       m_stmt, m_stmt_finder, d);
+       m_stmt, m_stmt_finder, std::move (d));
   else
-    {
-      delete d;
-      return false;
-    }
+    return false;
 }
 
 void
-impl_region_model_context::add_note (pending_note *pn)
+impl_region_model_context::add_note (std::unique_ptr<pending_note> pn)
 {
   LOG_FUNC (get_logger ());
   if (m_eg)
-    m_eg->get_diagnostic_manager ().add_note (pn);
-  else
-    delete pn;
+    m_eg->get_diagnostic_manager ().add_note (std::move (pn));
 }
 
 void
@@ -401,10 +396,11 @@ public:
   }
 
   void warn (const supernode *snode, const gimple *stmt,
-            tree var, pending_diagnostic *d) final override
+            tree var,
+            std::unique_ptr<pending_diagnostic> d) final override
   {
     LOG_FUNC (get_logger ());
-    gcc_assert (d); // take ownership
+    gcc_assert (d);
     impl_region_model_context old_ctxt
       (m_eg, m_enode_for_diag, m_old_state, m_new_state, NULL, NULL, NULL);
 
@@ -416,14 +412,15 @@ public:
         : m_old_smap->get_global_state ());
     m_eg.get_diagnostic_manager ().add_diagnostic
       (&m_sm, m_enode_for_diag, snode, stmt, m_stmt_finder,
-       var, var_old_sval, current, d);
+       var, var_old_sval, current, std::move (d));
   }
 
   void warn (const supernode *snode, const gimple *stmt,
-            const svalue *sval, pending_diagnostic *d) final override
+            const svalue *sval,
+            std::unique_ptr<pending_diagnostic> d) final override
   {
     LOG_FUNC (get_logger ());
-    gcc_assert (d); // take ownership
+    gcc_assert (d);
     impl_region_model_context old_ctxt
       (m_eg, m_enode_for_diag, m_old_state, m_new_state, NULL, NULL, NULL);
 
@@ -433,7 +430,7 @@ public:
         : m_old_smap->get_global_state ());
     m_eg.get_diagnostic_manager ().add_diagnostic
       (&m_sm, m_enode_for_diag, snode, stmt, m_stmt_finder,
-       NULL_TREE, sval, current, d);
+       NULL_TREE, sval, current, std::move (d));
   }
 
   /* Hook for picking more readable trees for SSA names of temporaries,
@@ -864,12 +861,12 @@ impl_region_model_context::on_state_leak (const state_machine &sm,
     }
 
   tree leaked_tree_for_diag = fixup_tree_for_diagnostic (leaked_tree);
-  pending_diagnostic *pd = sm.on_leak (leaked_tree_for_diag);
+  std::unique_ptr<pending_diagnostic> pd = sm.on_leak (leaked_tree_for_diag);
   if (pd)
     m_eg->get_diagnostic_manager ().add_diagnostic
       (&sm, m_enode_for_diag, m_enode_for_diag->get_supernode (),
        m_stmt, &stmt_finder,
-       leaked_tree_for_diag, sval, state, pd);
+       leaked_tree_for_diag, sval, state, std::move (pd));
 }
 
 /* Implementation of region_model_context::on_condition vfunc.
@@ -1845,7 +1842,9 @@ exploded_node::on_longjmp (exploded_graph &eg,
   /* Verify that the setjmp's call_stack hasn't been popped.  */
   if (!valid_longjmp_stack_p (longjmp_point, setjmp_point))
     {
-      ctxt->warn (new stale_jmp_buf (setjmp_call, longjmp_call, setjmp_point));
+      ctxt->warn (make_unique<stale_jmp_buf> (setjmp_call,
+                                             longjmp_call,
+                                             setjmp_point));
       return;
     }
 
@@ -4243,7 +4242,7 @@ exploded_graph::process_node (exploded_node *node)
                        const svalue *fn_ptr_sval
                          = model->get_rvalue (fn_ptr, &ctxt);
                        if (fn_ptr_sval->all_zeroes_p ())
-                         ctxt.warn (new jump_through_null (call));
+                         ctxt.warn (make_unique<jump_through_null> (call));
                      }
 
                    /* An unknown function or a special function was called
index 5996252f1fbc3aa566c7ecc09586d3c611346b4a..dae73daf54a83428f8322e949e8ae83695a49ce3 100644 (file)
@@ -56,8 +56,8 @@ class impl_region_model_context : public region_model_context
                             uncertainty_t *uncertainty,
                             logger *logger = NULL);
 
-  bool warn (pending_diagnostic *d) final override;
-  void add_note (pending_note *pn) final override;
+  bool warn (std::unique_ptr<pending_diagnostic> d) final override;
+  void add_note (std::unique_ptr<pending_note> pn) final override;
   void on_svalue_leak (const svalue *) override;
   void on_liveness_change (const svalue_set &live_svalues,
                           const region_model *model) final override;
index a946e4c5a35a98c79bfc56d8865972ece3987bfb..c5b0d6202434a361f7a963239f989289aab928bc 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 50a8afc6afd6f7d5f18f783912fd51e077c237e1..a21c86f37b57e15cedb045f59b9621ad86aaefe9 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 4ea469e18791d20c05ec2fce9b859f16e206a7e4..6ca8ab9f4aad73b2759bfc5b654a113bfd716fe5 100644 (file)
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
 #define GCC_ANALYZER_PENDING_DIAGNOSTIC_H
 
 #include "diagnostic-path.h"
+#include "analyzer/sm.h"
 
 namespace ana {
 
index cfa4dda14df4a8c169ab061a87f39eecea392557..23635a18de1ea4a41e07dde46724e27cfd1a3067 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 7537dc03e41f72fcdf23b34cb6bf501306ddbfed..d00fd5ebe0b932a51e3c11e5a878665d5776a6bf 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index b4c1f9195ec7b8edc8de515e86f6f7c036337304..171b2496f588f08b17e14d987d5c75c19ecaf218 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 52c4205cbeb52cb0cc54c984e15adafa81ab1309..790dc64945edf72d4d5e59b5ea8ad05c225b94da 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
@@ -54,6 +55,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "diagnostic-path.h"
 #include "analyzer/pending-diagnostic.h"
 #include "gimple-pretty-print.h"
+#include "make-unique.h"
 
 #if ENABLE_ANALYZER
 
@@ -745,7 +747,7 @@ region_model::impl_call_putenv (const call_details &cd)
       break;
     case MEMSPACE_STACK:
       if (ctxt)
-       ctxt->warn (new putenv_of_auto_var (fndecl, reg));
+       ctxt->warn (make_unique<putenv_of_auto_var> (fndecl, reg));
       break;
     }
 }
index f5999e64d016eca3a551a6af3be1eefddee17922..de01627bdb6c6750d00081c04f537ad4c0a3dff3 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index be1372c9e80045118bb88aba31462c7f2b36c61a..6d2711a01812a10abd3ec4508fe0128002470aa5 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 4713f0d25191c4aaf5497154befb47f43ff209b9..37b113fc978eb868708b356b580df202923a08ed 100644 (file)
@@ -22,6 +22,7 @@ along with GCC; see the file COPYING3.  If not see
 #define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -813,14 +814,17 @@ region_model::get_gassign_result (const gassign *assign,
              if (TREE_CODE (rhs2_cst) == INTEGER_CST)
                {
                  if (tree_int_cst_sgn (rhs2_cst) < 0)
-                   ctxt->warn (new shift_count_negative_diagnostic
-                                 (assign, rhs2_cst));
+                   ctxt->warn
+                     (make_unique<shift_count_negative_diagnostic>
+                        (assign, rhs2_cst));
                  else if (compare_tree_int (rhs2_cst,
                                             TYPE_PRECISION (TREE_TYPE (rhs1)))
                           >= 0)
-                   ctxt->warn (new shift_count_overflow_diagnostic
-                                 (assign, TYPE_PRECISION (TREE_TYPE (rhs1)),
-                                  rhs2_cst));
+                   ctxt->warn
+                     (make_unique<shift_count_overflow_diagnostic>
+                        (assign,
+                         int (TYPE_PRECISION (TREE_TYPE (rhs1))),
+                         rhs2_cst));
                }
          }
 
@@ -1038,8 +1042,9 @@ region_model::check_for_poison (const svalue *sval,
       const region *src_region = NULL;
       if (pkind == POISON_KIND_UNINIT)
        src_region = get_region_for_poisoned_expr (expr);
-      if (ctxt->warn (new poisoned_value_diagnostic (diag_arg, pkind,
-                                                    src_region)))
+      if (ctxt->warn (make_unique<poisoned_value_diagnostic> (diag_arg,
+                                                             pkind,
+                                                             src_region)))
        {
          /* We only want to report use of a poisoned value at the first
             place it gets used; return an unknown value to avoid generating
@@ -1228,7 +1233,7 @@ region_model::on_stmt_pre (const gimple *stmt,
          {
            /* Handle the builtin "__analyzer_dump_path" by queuing a
               diagnostic at this exploded_node.  */
-           ctxt->warn (new dump_path_diagnostic ());
+           ctxt->warn (make_unique<dump_path_diagnostic> ());
          }
        else if (is_special_named_call_p (call, "__analyzer_dump_region_model",
                                          0))
@@ -1784,16 +1789,18 @@ void region_model::check_symbolic_bounds (const region *base_reg,
          gcc_unreachable ();
          break;
        case DIR_READ:
-         ctxt->warn (new symbolic_buffer_overread (base_reg, diag_arg,
-                                                   offset_tree,
-                                                   num_bytes_tree,
-                                                   capacity_tree));
+         ctxt->warn (make_unique<symbolic_buffer_overread> (base_reg,
+                                                            diag_arg,
+                                                            offset_tree,
+                                                            num_bytes_tree,
+                                                            capacity_tree));
          break;
        case DIR_WRITE:
-         ctxt->warn (new symbolic_buffer_overflow (base_reg, diag_arg,
-                                                   offset_tree,
-                                                   num_bytes_tree,
-                                                   capacity_tree));
+         ctxt->warn (make_unique<symbolic_buffer_overflow> (base_reg,
+                                                            diag_arg,
+                                                            offset_tree,
+                                                            num_bytes_tree,
+                                                            capacity_tree));
          break;
        }
     }
@@ -1884,10 +1891,10 @@ region_model::check_region_bounds (const region *reg,
          gcc_unreachable ();
          break;
        case DIR_READ:
-         ctxt->warn (new buffer_underread (reg, diag_arg, out));
+         ctxt->warn (make_unique<buffer_underread> (reg, diag_arg, out));
          break;
        case DIR_WRITE:
-         ctxt->warn (new buffer_underflow (reg, diag_arg, out));
+         ctxt->warn (make_unique<buffer_underflow> (reg, diag_arg, out));
          break;
        }
     }
@@ -1912,10 +1919,12 @@ region_model::check_region_bounds (const region *reg,
          gcc_unreachable ();
          break;
        case DIR_READ:
-         ctxt->warn (new buffer_overread (reg, diag_arg, out, byte_bound));
+         ctxt->warn (make_unique<buffer_overread> (reg, diag_arg,
+                                                   out, byte_bound));
          break;
        case DIR_WRITE:
-         ctxt->warn (new buffer_overflow (reg, diag_arg, out, byte_bound));
+         ctxt->warn (make_unique<buffer_overflow> (reg, diag_arg,
+                                                   out, byte_bound));
          break;
        }
     }
@@ -2564,9 +2573,10 @@ check_external_function_for_access_attr (const gcall *call,
              m_access (access)
            {
            }
-           pending_note *make_note () final override
+           std::unique_ptr<pending_note> make_note () final override
            {
-             return new reason_attr_access (m_callee_fndecl, m_access);
+             return make_unique<reason_attr_access>
+               (m_callee_fndecl, m_access);
            }
          private:
            tree m_callee_fndecl;
@@ -3374,7 +3384,8 @@ region_model::deref_rvalue (const svalue *ptr_sval, tree ptr_tree,
                const poisoned_svalue *poisoned_sval
                  = as_a <const poisoned_svalue *> (ptr_sval);
                enum poison_kind pkind = poisoned_sval->get_poison_kind ();
-               ctxt->warn (new poisoned_value_diagnostic (ptr, pkind, NULL));
+               ctxt->warn (make_unique<poisoned_value_diagnostic>
+                             (ptr, pkind, NULL));
              }
          }
       }
@@ -3531,14 +3542,16 @@ region_model::check_for_writable_region (const region* dest_reg,
       {
        const function_region *func_reg = as_a <const function_region *> (base_reg);
        tree fndecl = func_reg->get_fndecl ();
-       ctxt->warn (new write_to_const_diagnostic (func_reg, fndecl));
+       ctxt->warn (make_unique<write_to_const_diagnostic>
+                     (func_reg, fndecl));
       }
       break;
     case RK_LABEL:
       {
        const label_region *label_reg = as_a <const label_region *> (base_reg);
        tree label = label_reg->get_label ();
-       ctxt->warn (new write_to_const_diagnostic (label_reg, label));
+       ctxt->warn (make_unique<write_to_const_diagnostic>
+                     (label_reg, label));
       }
       break;
     case RK_DECL:
@@ -3551,11 +3564,11 @@ region_model::check_for_writable_region (const region* dest_reg,
           "this" param is "T* const").  */
        if (TREE_READONLY (decl)
            && is_global_var (decl))
-         ctxt->warn (new write_to_const_diagnostic (dest_reg, decl));
+         ctxt->warn (make_unique<write_to_const_diagnostic> (dest_reg, decl));
       }
       break;
     case RK_STRING:
-      ctxt->warn (new write_to_string_literal_diagnostic (dest_reg));
+      ctxt->warn (make_unique<write_to_string_literal_diagnostic> (dest_reg));
       break;
     }
 }
@@ -4031,8 +4044,8 @@ region_model::check_region_size (const region *lhs_reg, const svalue *rhs_sval,
        if (TREE_CODE (cst_cap) == INTEGER_CST
            && !capacity_compatible_with_type (cst_cap, pointee_size_tree,
                                               is_struct))
-         ctxt->warn (new dubious_allocation_size (lhs_reg, rhs_reg,
-                                                  cst_cap));
+         ctxt->warn (make_unique <dubious_allocation_size> (lhs_reg, rhs_reg,
+                                                            cst_cap));
       }
       break;
     default:
@@ -4043,8 +4056,9 @@ region_model::check_region_size (const region *lhs_reg, const svalue *rhs_sval,
            if (!v.get_result ())
              {
                tree expr = get_representative_tree (capacity);
-               ctxt->warn (new dubious_allocation_size (lhs_reg, rhs_reg,
-                           expr));
+               ctxt->warn (make_unique <dubious_allocation_size> (lhs_reg,
+                                                                  rhs_reg,
+                                                                  expr));
              }
          }
       break;
@@ -5766,7 +5780,7 @@ region_model::check_dynamic_size_for_floats (const svalue *size_in_bytes,
   if (const svalue *float_sval = v.get_svalue_to_report ())
        {
          tree diag_arg = get_representative_tree (float_sval);
-         ctxt->warn (new float_as_size_arg (diag_arg));
+         ctxt->warn (make_unique<float_as_size_arg> (diag_arg));
        }
 }
 
@@ -6389,17 +6403,16 @@ region_model::maybe_complain_about_infoleak (const region *dst_reg,
 {
   /* Check for exposure.  */
   if (contains_uninit_p (copied_sval))
-    ctxt->warn (new exposure_through_uninit_copy (src_reg,
-                                                 dst_reg,
-                                                 copied_sval));
+    ctxt->warn (make_unique<exposure_through_uninit_copy> (src_reg,
+                                                          dst_reg,
+                                                          copied_sval));
 }
 
 /* class noop_region_model_context : public region_model_context.  */
 
 void
-noop_region_model_context::add_note (pending_note *pn)
+noop_region_model_context::add_note (std::unique_ptr<pending_note>)
 {
-  delete pn;
 }
 
 void
index 19e8043daa404c36355b99cf10684abcc0f6ee3d..91b17ce2ad9543f8857a558662f201e4f2d1a1d1 100644 (file)
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "analyzer/region.h"
 #include "analyzer/known-function-manager.h"
 #include "analyzer/region-model-manager.h"
+#include "analyzer/pending-diagnostic.h"
 
 using namespace ana;
 
@@ -671,11 +672,11 @@ class region_model_context
  public:
   /* Hook for clients to store pending diagnostics.
      Return true if the diagnostic was stored, or false if it was deleted.  */
-  virtual bool warn (pending_diagnostic *d) = 0;
+  virtual bool warn (std::unique_ptr<pending_diagnostic> d) = 0;
 
-  /* Hook for clients to add a note to the last previously stored pending diagnostic.
-     Takes ownership of the pending_node (or deletes it).  */
-  virtual void add_note (pending_note *pn) = 0;
+  /* Hook for clients to add a note to the last previously stored
+     pending diagnostic.  */
+  virtual void add_note (std::unique_ptr<pending_note> pn) = 0;
 
   /* Hook for clients to be notified when an SVAL that was reachable
      in a previous state is no longer live, so that clients can emit warnings
@@ -774,8 +775,8 @@ class region_model_context
 class noop_region_model_context : public region_model_context
 {
 public:
-  bool warn (pending_diagnostic *) override { return false; }
-  void add_note (pending_note *pn) override;
+  bool warn (std::unique_ptr<pending_diagnostic>) override { return false; }
+  void add_note (std::unique_ptr<pending_note>) override;
   void on_svalue_leak (const svalue *) override {}
   void on_liveness_change (const svalue_set &,
                           const region_model *) override {}
@@ -847,14 +848,14 @@ private:
 class region_model_context_decorator : public region_model_context
 {
  public:
-  bool warn (pending_diagnostic *d) override
+  bool warn (std::unique_ptr<pending_diagnostic> d) override
   {
-    return m_inner->warn (d);
+    return m_inner->warn (std::move (d));
   }
 
-  void add_note (pending_note *pn) override
+  void add_note (std::unique_ptr<pending_note> pn) override
   {
-    m_inner->add_note (pn);
+    m_inner->add_note (std::move (pn));
   }
 
   void on_svalue_leak (const svalue *sval) override
@@ -961,9 +962,9 @@ protected:
 class note_adding_context : public region_model_context_decorator
 {
 public:
-  bool warn (pending_diagnostic *d) override
+  bool warn (std::unique_ptr<pending_diagnostic> d) override
   {
-    if (m_inner->warn (d))
+    if (m_inner->warn (std::move (d)))
       {
        add_note (make_note ());
        return true;
@@ -973,7 +974,7 @@ public:
   }
 
   /* Hook to make the new note.  */
-  virtual pending_note *make_note () = 0;
+  virtual std::unique_ptr<pending_note> make_note () = 0;
 
 protected:
   note_adding_context (region_model_context *inner)
@@ -1116,9 +1117,9 @@ using namespace ::selftest;
 class test_region_model_context : public noop_region_model_context
 {
 public:
-  bool warn (pending_diagnostic *d) final override
+  bool warn (std::unique_ptr<pending_diagnostic> d) final override
   {
-    m_diagnostics.safe_push (d);
+    m_diagnostics.safe_push (d.release ());
     return true;
   }
 
index da5a13ec0bee3489aef32933ddc165c4ca9ec3cf..4bc191848a41737b6030c74923c4004bcda7cfe1 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index ae846cd6ec839b13b79df214eeafbbe9fe7a6d79..da0e92b511379da38f59d0446c7c49974e7f45dd 100644 (file)
@@ -19,8 +19,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -110,7 +112,7 @@ public:
                     const svalue *rhs) const final override;
 
   bool can_purge_p (state_t s) const final override;
-  pending_diagnostic *on_leak (tree var) const final override;
+  std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
 
   bool is_unchecked_fd_p (state_t s) const;
   bool is_valid_fd_p (state_t s) const;
@@ -885,9 +887,10 @@ fd_state_machine::check_for_fd_attrs (
            {
 
              sm_ctxt->warn (node, stmt, arg,
-                            new fd_use_after_close (*this, diag_arg,
-                                                    callee_fndecl, attr_name,
-                                                    arg_idx));
+                            make_unique<fd_use_after_close>
+                              (*this, diag_arg,
+                               callee_fndecl, attr_name,
+                               arg_idx));
              continue;
            }
 
@@ -895,9 +898,10 @@ fd_state_machine::check_for_fd_attrs (
            {
              if (!is_constant_fd_p (state))
                sm_ctxt->warn (node, stmt, arg,
-                              new fd_use_without_check (*this, diag_arg,
-                                                       callee_fndecl, attr_name,
-                                                       arg_idx));
+                              make_unique<fd_use_without_check>
+                                (*this, diag_arg,
+                                 callee_fndecl, attr_name,
+                                 arg_idx));
            }
 
          switch (fd_attr_access_dir)
@@ -910,8 +914,11 @@ fd_state_machine::check_for_fd_attrs (
                {
                  sm_ctxt->warn (
                      node, stmt, arg,
-                     new fd_access_mode_mismatch (*this, diag_arg, DIRS_WRITE,
-                                                  callee_fndecl, attr_name, arg_idx));
+                     make_unique<fd_access_mode_mismatch> (*this, diag_arg,
+                                                           DIRS_WRITE,
+                                                           callee_fndecl,
+                                                           attr_name,
+                                                           arg_idx));
                }
 
              break;
@@ -921,8 +928,11 @@ fd_state_machine::check_for_fd_attrs (
                {
                  sm_ctxt->warn (
                      node, stmt, arg,
-                     new fd_access_mode_mismatch (*this, diag_arg, DIRS_READ,
-                                                  callee_fndecl, attr_name, arg_idx));
+                     make_unique<fd_access_mode_mismatch> (*this, diag_arg,
+                                                           DIRS_READ,
+                                                           callee_fndecl,
+                                                           attr_name,
+                                                           arg_idx));
                }
 
              break;
@@ -963,7 +973,8 @@ fd_state_machine::on_open (sm_context *sm_ctxt, const supernode *node,
     }
   else
     {
-      sm_ctxt->warn (node, stmt, NULL_TREE, new fd_leak (*this, NULL_TREE));
+      sm_ctxt->warn (node, stmt, NULL_TREE,
+                    make_unique<fd_leak> (*this, NULL_TREE));
     }
 }
 
@@ -975,7 +986,8 @@ fd_state_machine::on_creat (sm_context *sm_ctxt, const supernode *node,
   if (lhs)
     sm_ctxt->on_transition (node, stmt, lhs, m_start, m_unchecked_write_only);
   else
-    sm_ctxt->warn (node, stmt, NULL_TREE, new fd_leak (*this, NULL_TREE));
+    sm_ctxt->warn (node, stmt, NULL_TREE,
+                  make_unique<fd_leak> (*this, NULL_TREE));
 }
 
 void
@@ -1021,7 +1033,8 @@ fd_state_machine::check_for_dup (sm_context *sm_ctxt, const supernode *node,
        {
          sm_ctxt->warn (
              node, stmt, arg_2,
-             new fd_use_without_check (*this, diag_arg_2, callee_fndecl));
+             make_unique<fd_use_without_check> (*this, diag_arg_2,
+                                                callee_fndecl));
          return;
        }
       /* dup2 returns value of its second argument on success.But, the
@@ -1059,7 +1072,8 @@ fd_state_machine::on_close (sm_context *sm_ctxt, const supernode *node,
 
   if (is_closed_fd_p (state))
     {
-      sm_ctxt->warn (node, stmt, arg, new fd_double_close (*this, diag_arg));
+      sm_ctxt->warn (node, stmt, arg,
+                    make_unique<fd_double_close> (*this, diag_arg));
       sm_ctxt->set_next_state (stmt, arg, m_stop);
     }
 }
@@ -1091,7 +1105,8 @@ fd_state_machine::check_for_open_fd (
   if (is_closed_fd_p (state))
     {
       sm_ctxt->warn (node, stmt, arg,
-                    new fd_use_after_close (*this, diag_arg, callee_fndecl));
+                    make_unique<fd_use_after_close> (*this, diag_arg,
+                                                     callee_fndecl));
     }
 
   else
@@ -1101,7 +1116,8 @@ fd_state_machine::check_for_open_fd (
          if (!is_constant_fd_p (state))
            sm_ctxt->warn (
                node, stmt, arg,
-               new fd_use_without_check (*this, diag_arg, callee_fndecl));
+               make_unique<fd_use_without_check> (*this, diag_arg,
+                                                  callee_fndecl));
        }
       switch (callee_fndecl_dir)
        {
@@ -1112,7 +1128,7 @@ fd_state_machine::check_for_open_fd (
            {
              tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
              sm_ctxt->warn (node, stmt, arg,
-                            new fd_access_mode_mismatch (
+                            make_unique<fd_access_mode_mismatch> (
                                 *this, diag_arg, DIRS_WRITE, callee_fndecl));
            }
 
@@ -1123,7 +1139,7 @@ fd_state_machine::check_for_open_fd (
            {
              tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
              sm_ctxt->warn (node, stmt, arg,
-                            new fd_access_mode_mismatch (
+                            make_unique<fd_access_mode_mismatch> (
                                 *this, diag_arg, DIRS_READ, callee_fndecl));
            }
          break;
@@ -1195,10 +1211,10 @@ fd_state_machine::can_purge_p (state_t s) const
     return true;
 }
 
-pending_diagnostic *
+std::unique_ptr<pending_diagnostic>
 fd_state_machine::on_leak (tree var) const
 {
-  return new fd_leak (*this, var);
+  return make_unique<fd_leak> (*this, var);
 }
 } // namespace
 
index 13f2507f7c79db5c3e1724f122c8434eeca81dc4..cbd17887e93f89f0b751f7d9cccfc009c1457541 100644 (file)
@@ -19,8 +19,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -79,7 +81,7 @@ public:
                     const svalue *rhs) const final override;
 
   bool can_purge_p (state_t s) const final override;
-  pending_diagnostic *on_leak (tree var) const final override;
+  std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
 
   /* State for a FILE * returned from fopen that hasn't been checked for
      NULL.
@@ -404,7 +406,7 @@ fileptr_state_machine::on_stmt (sm_context *sm_ctxt,
              {
                tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
                sm_ctxt->warn (node, stmt, arg,
-                              new double_fclose (*this, diag_arg));
+                              make_unique<double_fclose> (*this, diag_arg));
                sm_ctxt->set_next_state (stmt, arg, m_stop);
              }
            return true;
@@ -471,10 +473,10 @@ fileptr_state_machine::can_purge_p (state_t s) const
    fileptr_state_machine, for complaining about leaks of FILE * in
    state 'unchecked' and 'nonnull'.  */
 
-pending_diagnostic *
+std::unique_ptr<pending_diagnostic>
 fileptr_state_machine::on_leak (tree var) const
 {
-  return new file_leak (*this, var);
+  return make_unique<file_leak> (*this, var);
 }
 
 } // anonymous namespace
index fef6e63e1d7569791098940f5f70b8f9716bf909..d050ef83eeb0c6742cc14fa04c80db78c7689241 100644 (file)
@@ -19,8 +19,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -383,7 +385,7 @@ public:
                     const svalue *rhs) const final override;
 
   bool can_purge_p (state_t s) const final override;
-  pending_diagnostic *on_leak (tree var) const final override;
+  std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
 
   bool reset_when_passed_to_unknown_fn_p (state_t s,
                                          bool is_mutable) const final override;
@@ -1726,9 +1728,8 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
                        {
                          tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
                          sm_ctxt->warn (node, stmt, arg,
-                                        new possible_null_arg (*this, diag_arg,
-                                                               callee_fndecl,
-                                                               i));
+                                        make_unique<possible_null_arg>
+                                          (*this, diag_arg, callee_fndecl, i));
                          const allocation_state *astate
                            = as_a_allocation_state (state);
                          sm_ctxt->set_next_state (stmt, arg,
@@ -1738,8 +1739,8 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
                        {
                          tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
                          sm_ctxt->warn (node, stmt, arg,
-                                        new null_arg (*this, diag_arg,
-                                                      callee_fndecl, i));
+                                        make_unique<null_arg>
+                                          (*this, diag_arg, callee_fndecl, i));
                          sm_ctxt->set_next_state (stmt, arg, m_stop);
                        }
                    }
@@ -1781,7 +1782,8 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
            {
              tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
              sm_ctxt->warn (node, stmt, arg,
-                            new possible_null_deref (*this, diag_arg));
+                            make_unique<possible_null_deref> (*this,
+                                                              diag_arg));
              const allocation_state *astate = as_a_allocation_state (state);
              sm_ctxt->set_next_state (stmt, arg, astate->get_nonnull ());
            }
@@ -1789,7 +1791,7 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
            {
              tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
              sm_ctxt->warn (node, stmt, arg,
-                            new null_deref (*this, diag_arg));
+                            make_unique<null_deref> (*this, diag_arg));
              sm_ctxt->set_next_state (stmt, arg, m_stop);
            }
          else if (freed_p (state))
@@ -1797,8 +1799,8 @@ malloc_state_machine::on_stmt (sm_context *sm_ctxt,
              tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
              const allocation_state *astate = as_a_allocation_state (state);
              sm_ctxt->warn (node, stmt, arg,
-                            new use_after_free (*this, diag_arg,
-                                                astate->m_deallocator));
+                            make_unique<use_after_free>
+                              (*this, diag_arg, astate->m_deallocator));
              sm_ctxt->set_next_state (stmt, arg, m_stop);
            }
        }
@@ -1850,8 +1852,8 @@ malloc_state_machine::handle_free_of_non_heap (sm_context *sm_ctxt,
       freed_reg = old_model->deref_rvalue (ptr_sval, arg, NULL);
     }
   sm_ctxt->warn (node, call, arg,
-                new free_of_non_heap (*this, diag_arg, freed_reg,
-                                      d->m_name));
+                make_unique<free_of_non_heap>
+                  (*this, diag_arg, freed_reg, d->m_name));
   sm_ctxt->set_next_state (call, arg, m_stop);
 }
 
@@ -1879,11 +1881,11 @@ malloc_state_machine::on_deallocator_call (sm_context *sm_ctxt,
        {
          /* Wrong allocator.  */
          tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
-         pending_diagnostic *pd
-           = new mismatching_deallocation (*this, diag_arg,
-                                           astate->m_deallocators,
-                                           d);
-         sm_ctxt->warn (node, call, arg, pd);
+         sm_ctxt->warn (node, call, arg,
+                        make_unique<mismatching_deallocation>
+                          (*this, diag_arg,
+                           astate->m_deallocators,
+                           d));
        }
       sm_ctxt->set_next_state (call, arg, d->m_freed);
     }
@@ -1895,7 +1897,7 @@ malloc_state_machine::on_deallocator_call (sm_context *sm_ctxt,
       /* freed -> stop, with warning.  */
       tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
       sm_ctxt->warn (node, call, arg,
-                    new double_free (*this, diag_arg, d->m_name));
+                    make_unique<double_free> (*this, diag_arg, d->m_name));
       sm_ctxt->set_next_state (call, arg, m_stop);
     }
   else if (state == m_non_heap)
@@ -1933,11 +1935,10 @@ malloc_state_machine::on_realloc_call (sm_context *sm_ctxt,
        {
          /* Wrong allocator.  */
          tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
-         pending_diagnostic *pd
-           = new mismatching_deallocation (*this, diag_arg,
-                                           astate->m_deallocators,
-                                           d);
-         sm_ctxt->warn (node, call, arg, pd);
+         sm_ctxt->warn (node, call, arg,
+                        make_unique<mismatching_deallocation>
+                          (*this, diag_arg,
+                           astate->m_deallocators, d));
          sm_ctxt->set_next_state (call, arg, m_stop);
          if (path_context *path_ctxt = sm_ctxt->get_path_context ())
            path_ctxt->terminate_path ();
@@ -1948,7 +1949,7 @@ malloc_state_machine::on_realloc_call (sm_context *sm_ctxt,
       /* freed -> stop, with warning.  */
       tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
       sm_ctxt->warn (node, call, arg,
-                    new double_free (*this, diag_arg, "free"));
+                    make_unique<double_free> (*this, diag_arg, "free"));
       sm_ctxt->set_next_state (call, arg, m_stop);
       if (path_context *path_ctxt = sm_ctxt->get_path_context ())
        path_ctxt->terminate_path ();
@@ -2030,10 +2031,10 @@ malloc_state_machine::can_purge_p (state_t s) const
    (for complaining about leaks of pointers in state 'unchecked' and
    'nonnull').  */
 
-pending_diagnostic *
+std::unique_ptr<pending_diagnostic>
 malloc_state_machine::on_leak (tree var) const
 {
-  return new malloc_leak (*this, var);
+  return make_unique<malloc_leak> (*this, var);
 }
 
 /* Implementation of state_machine::reset_when_passed_to_unknown_fn_p vfunc
index 3208132882ef6659fb05860090cf4e45b8bb1dc3..704f628f5b7511b544476d22aaa12b08a5b0d543 100644 (file)
@@ -21,8 +21,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -139,8 +141,8 @@ pattern_test_state_machine::on_condition (sm_context *sm_ctxt,
 
   if (tree lhs_expr = sm_ctxt->get_diagnostic_tree (lhs))
     {
-      pending_diagnostic *diag = new pattern_match (lhs_expr, op, rhs_cst);
-      sm_ctxt->warn (node, stmt, lhs_expr, diag);
+      sm_ctxt->warn (node, stmt, lhs_expr,
+                    make_unique<pattern_match> (lhs_expr, op, rhs_cst));
     }
 }
 
index cb5f8595b1f79c41dc80046c6ffc95ae9143c23d..d19765fc4a9890d1d82fac7cc5830963beb1829e 100644 (file)
@@ -20,8 +20,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -181,7 +183,8 @@ sensitive_state_machine::warn_for_any_exposure (sm_context *sm_ctxt,
     {
       tree diag_arg = sm_ctxt->get_diagnostic_tree (arg);
       sm_ctxt->warn (node, stmt, arg,
-                    new exposure_through_output_file (*this, diag_arg));
+                    make_unique<exposure_through_output_file> (*this,
+                                                               diag_arg));
     }
 }
 
index e3b08c38b30dcdbaea1611f6f07ad50058d2412c..737ec4a8ad53bb81a8349492f475af8b3e5bef88 100644 (file)
@@ -21,8 +21,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -351,8 +353,8 @@ signal_state_machine::on_stmt (sm_context *sm_ctxt,
          if (signal_unsafe_p (callee_fndecl))
            if (sm_ctxt->get_global_state () == m_in_signal_handler)
              sm_ctxt->warn (node, stmt, NULL_TREE,
-                            new signal_unsafe_call (*this, call,
-                                                    callee_fndecl));
+                            make_unique<signal_unsafe_call>
+                              (*this, call, callee_fndecl));
     }
 
   return false;
index bc27533256fdb91c28ed91904f0b966432c14683..d4ee6c435b8f54a214be78258c55a9564fdc584b 100644 (file)
@@ -21,8 +21,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -1163,10 +1165,11 @@ taint_state_machine::check_for_tainted_size_arg (sm_context *sm_ctxt,
            TREE_STRING_POINTER (access->to_external_string ());
          tree diag_size = sm_ctxt->get_diagnostic_tree (size_arg);
          sm_ctxt->warn (node, call, size_arg,
-                        new tainted_access_attrib_size (*this, diag_size, b,
-                                                        callee_fndecl,
-                                                        access->sizarg,
-                                                        access_str));
+                        make_unique<tainted_access_attrib_size>
+                          (*this, diag_size, b,
+                           callee_fndecl,
+                           access->sizarg,
+                           access_str));
        }
     }
 }
@@ -1201,7 +1204,7 @@ taint_state_machine::check_for_tainted_divisor (sm_context *sm_ctxt,
 
       tree diag_divisor = sm_ctxt->get_diagnostic_tree (divisor_expr);
       sm_ctxt->warn (node, assign, divisor_expr,
-                    new tainted_divisor (*this, diag_divisor, b));
+                    make_unique <tainted_divisor> (*this, diag_divisor, b));
       sm_ctxt->set_next_state (assign, divisor_sval, m_stop);
     }
 }
@@ -1264,7 +1267,7 @@ region_model::check_region_for_taint (const region *reg,
            if (taint_sm.get_taint (state, index->get_type (), &b))
            {
              tree arg = get_representative_tree (index);
-             ctxt->warn (new tainted_array_index (taint_sm, arg, b));
+             ctxt->warn (make_unique<tainted_array_index> (taint_sm, arg, b));
            }
          }
          break;
@@ -1286,7 +1289,7 @@ region_model::check_region_for_taint (const region *reg,
            if (taint_sm.get_taint (state, effective_type, &b))
              {
                tree arg = get_representative_tree (offset);
-               ctxt->warn (new tainted_offset (taint_sm, arg, b));
+               ctxt->warn (make_unique<tainted_offset> (taint_sm, arg, b));
              }
          }
          break;
@@ -1311,7 +1314,7 @@ region_model::check_region_for_taint (const region *reg,
            if (taint_sm.get_taint (state, size_sval->get_type (), &b))
              {
                tree arg = get_representative_tree (size_sval);
-               ctxt->warn (new tainted_size (taint_sm, arg, b));
+               ctxt->warn (make_unique<tainted_size> (taint_sm, arg, b));
              }
          }
          break;
@@ -1357,7 +1360,8 @@ region_model::check_dynamic_size_for_taint (enum memory_space mem_space,
   if (taint_sm.get_taint (state, size_in_bytes->get_type (), &b))
     {
       tree arg = get_representative_tree (size_in_bytes);
-      ctxt->warn (new tainted_allocation_size (taint_sm, arg, b, mem_space));
+      ctxt->warn (make_unique<tainted_allocation_size>
+                   (taint_sm, arg, b, mem_space));
     }
 }
 
index 1ab4c21fa1d5127c70b3d88ad82bf2fa52ee1246..1f329cb11d07fe6b802e4504559a47f861d6ae92 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
@@ -39,6 +40,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "analyzer/store.h"
 #include "analyzer/svalue.h"
 #include "analyzer/program-state.h"
+#include "analyzer/pending-diagnostic.h"
 
 #if ENABLE_ANALYZER
 
@@ -121,6 +123,14 @@ state_machine::get_state_by_name (const char *name) const
   gcc_unreachable ();
 }
 
+/* Base implementation of state_machine::on_leak.  */
+
+std::unique_ptr<pending_diagnostic>
+state_machine::on_leak (tree var ATTRIBUTE_UNUSED) const
+{
+  return NULL;
+}
+
 /* Dump a multiline representation of this state machine to PP.  */
 
 void
index 87ab11cc9620629cbf343b07edf676ce261330c6..0171474e4b92161894b7609eaa1f2b4b29986fd4 100644 (file)
@@ -123,10 +123,8 @@ public:
   virtual bool can_purge_p (state_t s) const = 0;
 
   /* Called when VAR leaks (and !can_purge_p).  */
-  virtual pending_diagnostic *on_leak (tree var ATTRIBUTE_UNUSED) const
-  {
-    return NULL;
-  }
+  virtual std::unique_ptr<pending_diagnostic>
+  on_leak (tree var ATTRIBUTE_UNUSED) const;
 
   /* Return true if S should be reset to "start" for values passed (or reachable
      from) calls to unknown functions.  IS_MUTABLE is true for pointers as
@@ -250,9 +248,11 @@ public:
   /* Called by state_machine in response to pattern matches:
      issue a diagnostic D using NODE and STMT for location information.  */
   virtual void warn (const supernode *node, const gimple *stmt,
-                    tree var, pending_diagnostic *d) = 0;
+                    tree var,
+                    std::unique_ptr<pending_diagnostic> d) = 0;
   virtual void warn (const supernode *node, const gimple *stmt,
-                    const svalue *var, pending_diagnostic *d) = 0;
+                    const svalue *var,
+                    std::unique_ptr<pending_diagnostic> d) = 0;
 
   /* For use when generating trees when creating pending_diagnostics, so that
      rather than e.g.
index d3f516a671c338e4f76e974c7552590ba274d1d2..6fac18a2bbc0ff229e3b7e2686529b32f7544030 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 2631ea255593c18625cb66ec9880663916fbafcd..c0f5ed104e1eba44c3ca80903da55d5ad8952b74 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 4b00a81b31d01c5aeb4c729d6ba3a1561a26185c..aa03b049724da8ff17797e1991a21a015229840b 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index 9fdb4a9e240ad0d4f61bfc54e2591e42372bf2d3..9a42248e6fa05c6f780eead0434fe347a0e4fc5a 100644 (file)
@@ -19,6 +19,7 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
 #include "tree.h"
index e4dbad79f424bfd9beddad6a7946e0e36b9b5531..8b1d8091e17ebb54a5ce1f92be706506f2b4f4fb 100644 (file)
@@ -19,8 +19,10 @@ along with GCC; see the file COPYING3.  If not see
 <http://www.gnu.org/licenses/>.  */
 
 #include "config.h"
+#define INCLUDE_MEMORY
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "tree.h"
 #include "function.h"
 #include "basic-block.h"
@@ -212,7 +214,7 @@ public:
   {
     return s != m_started;
   }
-  pending_diagnostic *on_leak (tree var) const final override;
+  std::unique_ptr<pending_diagnostic> on_leak (tree var) const final override;
 
   /* State for a va_list that the result of a va_start or va_copy.  */
   state_t m_started;
@@ -553,8 +555,8 @@ va_list_state_machine::check_for_ended_va_list (sm_context *sm_ctxt,
 {
   if (sm_ctxt->get_state (call, arg) == m_ended)
     sm_ctxt->warn (node, call, arg,
-                  new va_list_use_after_va_end (*this, arg, NULL_TREE,
-                                                usage_fnname));
+                  make_unique<va_list_use_after_va_end>
+                    (*this, arg, NULL_TREE, usage_fnname));
 }
 
 /* Get the svalue with associated va_list_state_machine state for
@@ -629,10 +631,10 @@ va_list_state_machine::on_va_end (sm_context *sm_ctxt,
 /* Implementation of state_machine::on_leak vfunc for va_list_state_machine
    (for complaining about leaks of values in state 'started').  */
 
-pending_diagnostic *
+std::unique_ptr<pending_diagnostic>
 va_list_state_machine::on_leak (tree var) const
 {
-  return new va_list_leak (*this, NULL, var);
+  return make_unique<va_list_leak> (*this, NULL, var);
 }
 
 } // anonymous namespace
@@ -1000,17 +1002,19 @@ region_model::impl_call_va_arg (const call_details &cd)
                  else
                    {
                      if (ctxt)
-                       ctxt->warn (new va_arg_type_mismatch (va_list_tree,
-                                                             arg_reg,
-                                                             lhs_type,
-                                                             arg_type));
+                       ctxt->warn (make_unique <va_arg_type_mismatch>
+                                     (va_list_tree,
+                                      arg_reg,
+                                      lhs_type,
+                                      arg_type));
                      saw_problem = true;
                    }
                }
              else
                {
                  if (ctxt)
-                   ctxt->warn (new va_list_exhausted (va_list_tree, arg_reg));
+                   ctxt->warn (make_unique <va_list_exhausted> (va_list_tree,
+                                                                arg_reg));
                  saw_problem = true;
                }
            }
index 2a8bf11b3e9291223845f165a14e5bb927c14468..cf0baa5670d1e35ca93897de5cf5a97fb4087c61 100644 (file)
@@ -4,10 +4,12 @@
 */
 /* { dg-options "-g" } */
 
+#define INCLUDE_MEMORY
 #include "gcc-plugin.h"
 #include "config.h"
 #include "system.h"
 #include "coretypes.h"
+#include "make-unique.h"
 #include "diagnostic.h"
 #include "tree.h"
 #include "gimple.h"
@@ -309,9 +311,9 @@ gil_state_machine::check_for_pyobject_in_call (sm_context *sm_ctxt,
       if (type_based_on_pyobject_p (type))
        {
          sm_ctxt->warn (node, call, NULL_TREE,
-                        new fncall_without_gil (*this, call,
-                                                callee_fndecl,
-                                                i));
+                        make_unique<fncall_without_gil> (*this, call,
+                                                         callee_fndecl,
+                                                         i));
          sm_ctxt->set_global_state (m_stop);
        }
     }
@@ -337,7 +339,7 @@ gil_state_machine::on_stmt (sm_context *sm_ctxt,
              if (global_state == m_released_gil)
                {
                  sm_ctxt->warn (node, stmt, NULL_TREE,
-                                new double_save_thread (*this, call));
+                                make_unique<double_save_thread> (*this, call));
                  sm_ctxt->set_global_state (m_stop);
                }
              else
@@ -393,7 +395,7 @@ gil_state_machine::check_for_pyobject_usage_without_gil (sm_context *sm_ctxt,
   if (type_based_on_pyobject_p (type))
     {
       sm_ctxt->warn (node, stmt, NULL_TREE,
-                    new pyobject_usage_without_gil (*this, op));
+                    make_unique<pyobject_usage_without_gil> (*this, op));
       sm_ctxt->set_global_state (m_stop);
     }
 }
index 6ec08bff73cfcc946fe31049392afbedda711299..d1c29132e6765bc85ea3372663fb2511e899b231 100644 (file)
@@ -1,6 +1,7 @@
 /* Proof-of-concept of a -fanalyzer plugin for the Linux kernel.  */
 /* { dg-options "-g" } */
 
+#define INCLUDE_MEMORY
 #include "gcc-plugin.h"
 #include "config.h"
 #include "system.h"
index 060a3082fd68886692c067eae70baff0753f2d7e..ccf69ed83389c7d3c1264dfdc5107d826cd1fc81 100644 (file)
@@ -1,6 +1,7 @@
 /* Proof-of-concept of a -fanalyzer plugin to handle known functions.  */
 /* { dg-options "-g" } */
 
+#define INCLUDE_MEMORY
 #include "gcc-plugin.h"
 #include "config.h"
 #include "system.h"