Commit 75038aa6 by David Malcolm

analyzer: introduce namespace to avoid ODR clashes (PR 93307)

PR analyzer/93307 reports that in an LTO bootstrap, there are ODR
violations between:
- the "region" type:
    gcc/analyzer/region-model.h:792
  vs:
    gcc/sched-int.h:1443
- the "constraint" type:
    gcc/analyzer/constraint-manager.h:121
  vs:
    gcc/tree-ssa-structalias.c:533

This patches solves this clash by putting all of the analyzer names
within a namespace.  I chose "ana" as it is short (to save typing).
The analyzer selftests are moved from namespace "selftest" to
"ana::selftest".

There are various places where the namespace has to be closed
and reopened, to allow e.g. for specializations of templates
in the global namespace.

gcc/analyzer/ChangeLog:
	PR analyzer/93307
	* analysis-plan.h: Wrap everything namespace "ana".
	* analyzer-logging.cc: Likewise.
	* analyzer-logging.h: Likewise.
	* analyzer-pass.cc (pass_analyzer::execute): Update for "ana"
	namespace.
	* analyzer-selftests.cc: Wrap everything namespace "ana".
	* analyzer-selftests.h: Likewise.
	* analyzer.h: Likewise for forward decls of types.
	* call-string.h: Likewise.
	* checker-path.cc: Likewise.
	* checker-path.h: Likewise.
	* constraint-manager.cc: Likewise.
	* constraint-manager.h: Likewise.
	* diagnostic-manager.cc: Likewise.
	* diagnostic-manager.h: Likewise.
	* engine.cc: Likewise.
	* engine.h: Likewise.
	* exploded-graph.h: Likewise.
	* function-set.cc: Likewise.
	* function-set.h: Likewise.
	* pending-diagnostic.cc: Likewise.
	* pending-diagnostic.h: Likewise.
	* program-point.cc: Likewise.
	* program-point.h: Likewise.
	* program-state.cc: Likewise.
	* program-state.h: Likewise.
	* region-model.cc: Likewise.
	* region-model.h: Likewise.
	* sm-file.cc: Likewise.
	* sm-malloc.cc: Likewise.
	* sm-pattern-test.cc: Likewise.
	* sm-sensitive.cc: Likewise.
	* sm-signal.cc: Likewise.
	* sm-taint.cc: Likewise.
	* sm.cc: Likewise.
	* sm.h: Likewise.
	* state-purge.h: Likewise.
	* supergraph.cc: Likewise.
	* supergraph.h: Likewise.

gcc/ChangeLog:
	PR analyzer/93307
	* gdbinit.in (break-on-saved-diagnostic): Update for move of
	diagnostic_manager into "ana" namespace.
	* selftest-run-tests.c (selftest::run_tests): Update for move of
	selftest::run_analyzer_selftests to
	ana::selftest::run_analyzer_selftests.
parent 68cbbe7c
2020-01-22 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93307
* gdbinit.in (break-on-saved-diagnostic): Update for move of
diagnostic_manager into "ana" namespace.
* selftest-run-tests.c (selftest::run_tests): Update for move of
selftest::run_analyzer_selftests to
ana::selftest::run_analyzer_selftests.
2020-01-22 Richard Sandiford <richard.sandiford@arm.com> 2020-01-22 Richard Sandiford <richard.sandiford@arm.com>
* cfgexpand.c (union_stack_vars): Update the size. * cfgexpand.c (union_stack_vars): Update the size.
......
2020-01-22 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93307
* analysis-plan.h: Wrap everything namespace "ana".
* analyzer-logging.cc: Likewise.
* analyzer-logging.h: Likewise.
* analyzer-pass.cc (pass_analyzer::execute): Update for "ana"
namespace.
* analyzer-selftests.cc: Wrap everything namespace "ana".
* analyzer-selftests.h: Likewise.
* analyzer.h: Likewise for forward decls of types.
* call-string.h: Likewise.
* checker-path.cc: Likewise.
* checker-path.h: Likewise.
* constraint-manager.cc: Likewise.
* constraint-manager.h: Likewise.
* diagnostic-manager.cc: Likewise.
* diagnostic-manager.h: Likewise.
* engine.cc: Likewise.
* engine.h: Likewise.
* exploded-graph.h: Likewise.
* function-set.cc: Likewise.
* function-set.h: Likewise.
* pending-diagnostic.cc: Likewise.
* pending-diagnostic.h: Likewise.
* program-point.cc: Likewise.
* program-point.h: Likewise.
* program-state.cc: Likewise.
* program-state.h: Likewise.
* region-model.cc: Likewise.
* region-model.h: Likewise.
* sm-file.cc: Likewise.
* sm-malloc.cc: Likewise.
* sm-pattern-test.cc: Likewise.
* sm-sensitive.cc: Likewise.
* sm-signal.cc: Likewise.
* sm-taint.cc: Likewise.
* sm.cc: Likewise.
* sm.h: Likewise.
* state-purge.h: Likewise.
* supergraph.cc: Likewise.
* supergraph.h: Likewise.
2020-01-21 David Malcolm <dmalcolm@redhat.com> 2020-01-21 David Malcolm <dmalcolm@redhat.com>
PR analyzer/93352 PR analyzer/93352
......
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_ANALYSIS_PLAN_H #ifndef GCC_ANALYZER_ANALYSIS_PLAN_H
#define GCC_ANALYZER_ANALYSIS_PLAN_H #define GCC_ANALYZER_ANALYSIS_PLAN_H
namespace ana {
/* A class to encapsulate decisions about how the analysis should happen. /* A class to encapsulate decisions about how the analysis should happen.
Examples: Examples:
- the order in which functions should be analyzed, so that function - the order in which functions should be analyzed, so that function
...@@ -53,4 +55,6 @@ private: ...@@ -53,4 +55,6 @@ private:
auto_vec<int> m_index_by_uid; auto_vec<int> m_index_by_uid;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_ANALYSIS_PLAN_H */ #endif /* GCC_ANALYZER_ANALYSIS_PLAN_H */
...@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -30,6 +30,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Implementation of class logger. */ /* Implementation of class logger. */
/* ctor for logger. */ /* ctor for logger. */
...@@ -221,4 +223,6 @@ log_user::set_logger (logger *logger) ...@@ -221,4 +223,6 @@ log_user::set_logger (logger *logger)
m_logger = logger; m_logger = logger;
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -23,6 +23,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -23,6 +23,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef ANALYZER_LOGGING_H #ifndef ANALYZER_LOGGING_H
#define ANALYZER_LOGGING_H #define ANALYZER_LOGGING_H
namespace ana {
/* A logger encapsulates a logging stream: a way to send /* A logger encapsulates a logging stream: a way to send
lines of pertinent information to a FILE *. */ lines of pertinent information to a FILE *. */
...@@ -257,4 +259,6 @@ log_user::exit_scope (const char *scope_name) ...@@ -257,4 +259,6 @@ log_user::exit_scope (const char *scope_name)
#define LOG_FUNC_4(LOGGER, FMT, A0, A1, A2, A3) \ #define LOG_FUNC_4(LOGGER, FMT, A0, A1, A2, A3) \
log_scope s (LOGGER, __func__, FMT, A0, A1, A2, A3) log_scope s (LOGGER, __func__, FMT, A0, A1, A2, A3)
} // namespace ana
#endif /* ANALYZER_LOGGING_H */ #endif /* ANALYZER_LOGGING_H */
...@@ -81,7 +81,7 @@ unsigned int ...@@ -81,7 +81,7 @@ unsigned int
pass_analyzer::execute (function *) pass_analyzer::execute (function *)
{ {
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
run_checkers (); ana::run_checkers ();
#else #else
sorry ("%qs was not enabled in this build of GCC" sorry ("%qs was not enabled in this build of GCC"
" (missing configure-time option %qs)", " (missing configure-time option %qs)",
......
...@@ -29,6 +29,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -29,6 +29,8 @@ along with GCC; see the file COPYING3. If not see
#if CHECKING_P #if CHECKING_P
namespace ana {
namespace selftest { namespace selftest {
/* Build a VAR_DECL named NAME of type TYPE, simulating a file-level /* Build a VAR_DECL named NAME of type TYPE, simulating a file-level
...@@ -61,4 +63,6 @@ run_analyzer_selftests () ...@@ -61,4 +63,6 @@ run_analyzer_selftests ()
} /* end of namespace selftest. */ } /* end of namespace selftest. */
} // namespace ana
#endif /* #if CHECKING_P */ #endif /* #if CHECKING_P */
...@@ -23,6 +23,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -23,6 +23,8 @@ along with GCC; see the file COPYING3. If not see
#if CHECKING_P #if CHECKING_P
namespace ana {
namespace selftest { namespace selftest {
extern tree build_global_decl (const char *name, tree type); extern tree build_global_decl (const char *name, tree type);
...@@ -40,7 +42,9 @@ extern void analyzer_region_model_cc_tests (); ...@@ -40,7 +42,9 @@ extern void analyzer_region_model_cc_tests ();
extern void analyzer_sm_file_cc_tests (); extern void analyzer_sm_file_cc_tests ();
extern void analyzer_sm_signal_cc_tests (); extern void analyzer_sm_signal_cc_tests ();
} /* end of namespace selftest. */ } /* end of namespace ana::selftest. */
} // namespace ana
#endif /* #if CHECKING_P */ #endif /* #if CHECKING_P */
......
...@@ -24,6 +24,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -24,6 +24,9 @@ along with GCC; see the file COPYING3. If not see
/* Forward decls of common types, with indentation to show inheritance. */ /* Forward decls of common types, with indentation to show inheritance. */
class graphviz_out; class graphviz_out;
namespace ana {
class supergraph; class supergraph;
class supernode; class supernode;
class superedge; class superedge;
...@@ -68,6 +71,8 @@ class state_purge_per_ssa_name; ...@@ -68,6 +71,8 @@ class state_purge_per_ssa_name;
class state_change; class state_change;
class rewind_info_t; class rewind_info_t;
} // namespace ana
extern bool is_special_named_call_p (const gcall *call, const char *funcname, extern bool is_special_named_call_p (const gcall *call, const char *funcname,
unsigned int num_args); unsigned int num_args);
extern bool is_named_call_p (tree fndecl, const char *funcname); extern bool is_named_call_p (tree fndecl, const char *funcname);
......
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_CALL_STRING_H #ifndef GCC_ANALYZER_CALL_STRING_H
#define GCC_ANALYZER_CALL_STRING_H #define GCC_ANALYZER_CALL_STRING_H
namespace ana {
class supergraph; class supergraph;
class call_superedge; class call_superedge;
class return_superedge; class return_superedge;
...@@ -73,4 +75,6 @@ private: ...@@ -73,4 +75,6 @@ private:
auto_vec<const return_superedge *> m_return_edges; auto_vec<const return_superedge *> m_return_edges;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_CALL_STRING_H */ #endif /* GCC_ANALYZER_CALL_STRING_H */
...@@ -61,6 +61,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -61,6 +61,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Get a string for EK. */ /* Get a string for EK. */
const char * const char *
...@@ -954,4 +956,6 @@ checker_path::add_final_event (const state_machine *sm, ...@@ -954,4 +956,6 @@ checker_path::add_final_event (const state_machine *sm,
add_event (end_of_path); add_event (end_of_path);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_CHECKER_PATH_H #ifndef GCC_ANALYZER_CHECKER_PATH_H
#define GCC_ANALYZER_CHECKER_PATH_H #define GCC_ANALYZER_CHECKER_PATH_H
namespace ana {
/* An enum for discriminating between the concrete subclasses of /* An enum for discriminating between the concrete subclasses of
checker_event. */ checker_event. */
...@@ -519,4 +521,6 @@ private: ...@@ -519,4 +521,6 @@ private:
hash_map <const exploded_node *, diagnostic_event_id_t> m_setjmp_event_ids; hash_map <const exploded_node *, diagnostic_event_id_t> m_setjmp_event_ids;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_CHECKER_PATH_H */ #endif /* GCC_ANALYZER_CHECKER_PATH_H */
...@@ -45,6 +45,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -45,6 +45,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* One of the end-points of a range. */ /* One of the end-points of a range. */
struct bound struct bound
...@@ -2257,4 +2259,6 @@ analyzer_constraint_manager_cc_tests () ...@@ -2257,4 +2259,6 @@ analyzer_constraint_manager_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_CONSTRAINT_MANAGER_H #ifndef GCC_ANALYZER_CONSTRAINT_MANAGER_H
#define GCC_ANALYZER_CONSTRAINT_MANAGER_H #define GCC_ANALYZER_CONSTRAINT_MANAGER_H
namespace ana {
class constraint_manager; class constraint_manager;
/* Abstract base class for specifying how state should be purged. */ /* Abstract base class for specifying how state should be purged. */
...@@ -243,4 +245,6 @@ public: ...@@ -243,4 +245,6 @@ public:
equiv_class_id rhs_id); equiv_class_id rhs_id);
}; };
} // namespace ana
#endif /* GCC_ANALYZER_CONSTRAINT_MANAGER_H */ #endif /* GCC_ANALYZER_CONSTRAINT_MANAGER_H */
...@@ -58,6 +58,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -58,6 +58,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* class saved_diagnostic. */ /* class saved_diagnostic. */
/* saved_diagnostic's ctor. /* saved_diagnostic's ctor.
...@@ -1274,4 +1276,6 @@ diagnostic_manager::finish_pruning (checker_path *path) const ...@@ -1274,4 +1276,6 @@ diagnostic_manager::finish_pruning (checker_path *path) const
} }
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_DIAGNOSTIC_MANAGER_H #ifndef GCC_ANALYZER_DIAGNOSTIC_MANAGER_H
#define GCC_ANALYZER_DIAGNOSTIC_MANAGER_H #define GCC_ANALYZER_DIAGNOSTIC_MANAGER_H
namespace ana {
/* A to-be-emitted diagnostic stored within diagnostic_manager. */ /* A to-be-emitted diagnostic stored within diagnostic_manager. */
class saved_diagnostic class saved_diagnostic
...@@ -121,4 +123,6 @@ private: ...@@ -121,4 +123,6 @@ private:
const int m_verbosity; const int m_verbosity;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_DIAGNOSTIC_MANAGER_H */ #endif /* GCC_ANALYZER_DIAGNOSTIC_MANAGER_H */
...@@ -62,6 +62,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -62,6 +62,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
static int readability_comparator (const void *p1, const void *p2); static int readability_comparator (const void *p1, const void *p2);
/* class impl_region_model_context : public region_model_context. */ /* class impl_region_model_context : public region_model_context. */
...@@ -882,6 +884,8 @@ exploded_node::dump (const extrinsic_state &ext_state) const ...@@ -882,6 +884,8 @@ exploded_node::dump (const extrinsic_state &ext_state) const
dump (stderr, ext_state); dump (stderr, ext_state);
} }
} // namespace ana
/* Return true if FNDECL has a gimple body. */ /* Return true if FNDECL has a gimple body. */
// TODO: is there a pre-canned way to do this? // TODO: is there a pre-canned way to do this?
...@@ -898,6 +902,8 @@ fndecl_has_gimple_body_p (tree fndecl) ...@@ -898,6 +902,8 @@ fndecl_has_gimple_body_p (tree fndecl)
return n->has_gimple_body_p (); return n->has_gimple_body_p ();
} }
namespace ana {
/* A pending_diagnostic subclass for implementing "__analyzer_dump_path". */ /* A pending_diagnostic subclass for implementing "__analyzer_dump_path". */
class dump_path_diagnostic class dump_path_diagnostic
...@@ -2930,6 +2936,8 @@ struct function_call_string ...@@ -2930,6 +2936,8 @@ struct function_call_string
call_string m_cs; call_string m_cs;
}; };
} // namespace ana
template <> struct default_hash_traits<function_call_string> template <> struct default_hash_traits<function_call_string>
: public pod_hash_traits<function_call_string> : public pod_hash_traits<function_call_string>
{ {
...@@ -2975,6 +2983,8 @@ pod_hash_traits<function_call_string>::is_empty (value_type v) ...@@ -2975,6 +2983,8 @@ pod_hash_traits<function_call_string>::is_empty (value_type v)
return v.m_fun == reinterpret_cast<function *> (NULL); return v.m_fun == reinterpret_cast<function *> (NULL);
} }
namespace ana {
/* Top-level cluster for generating .dot output for exploded graphs, /* Top-level cluster for generating .dot output for exploded graphs,
handling the functionless nodes, and grouping the remaining nodes by handling the functionless nodes, and grouping the remaining nodes by
callstring. */ callstring. */
...@@ -3631,4 +3641,6 @@ run_checkers () ...@@ -3631,4 +3641,6 @@ run_checkers ()
fclose (dump_fout); fclose (dump_fout);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,10 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,10 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_ENGINE_H #ifndef GCC_ANALYZER_ENGINE_H
#define GCC_ANALYZER_ENGINE_H #define GCC_ANALYZER_ENGINE_H
namespace ana {
extern void run_checkers (); extern void run_checkers ();
} // namespace ana
#endif /* GCC_ANALYZER_ENGINE_H */ #endif /* GCC_ANALYZER_ENGINE_H */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_EXPLODED_GRAPH_H #ifndef GCC_ANALYZER_EXPLODED_GRAPH_H
#define GCC_ANALYZER_EXPLODED_GRAPH_H #define GCC_ANALYZER_EXPLODED_GRAPH_H
namespace ana {
/* Concrete implementation of region_model_context, wiring it up to the /* Concrete implementation of region_model_context, wiring it up to the
rest of the analysis engine. */ rest of the analysis engine. */
...@@ -828,4 +830,6 @@ public: ...@@ -828,4 +830,6 @@ public:
// TODO: split the above up? // TODO: split the above up?
} // namespace ana
#endif /* GCC_ANALYZER_EXPLODED_GRAPH_H */ #endif /* GCC_ANALYZER_EXPLODED_GRAPH_H */
...@@ -27,6 +27,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -27,6 +27,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Return true if NAME is within this set. */ /* Return true if NAME is within this set. */
bool bool
...@@ -188,4 +190,6 @@ analyzer_function_set_cc_tests () ...@@ -188,4 +190,6 @@ analyzer_function_set_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_FUNCTION_SET_H #ifndef GCC_ANALYZER_FUNCTION_SET_H
#define GCC_ANALYZER_FUNCTION_SET_H #define GCC_ANALYZER_FUNCTION_SET_H
namespace ana {
/* A set of names. */ /* A set of names. */
class function_set class function_set
...@@ -43,4 +45,6 @@ private: ...@@ -43,4 +45,6 @@ private:
size_t m_count; size_t m_count;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_FUNCTION_SET_H */ #endif /* GCC_ANALYZER_FUNCTION_SET_H */
...@@ -35,6 +35,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -35,6 +35,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Generate a label_text by printing FMT. /* Generate a label_text by printing FMT.
Use a clone of the global_dc for formatting callbacks. Use a clone of the global_dc for formatting callbacks.
...@@ -76,4 +78,6 @@ pending_diagnostic::same_tree_p (tree t1, tree t2) ...@@ -76,4 +78,6 @@ pending_diagnostic::same_tree_p (tree t1, tree t2)
return simple_cst_equal (t1, t2) == 1; return simple_cst_equal (t1, t2) == 1;
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_PENDING_DIAGNOSTIC_H #ifndef GCC_ANALYZER_PENDING_DIAGNOSTIC_H
#define GCC_ANALYZER_PENDING_DIAGNOSTIC_H #define GCC_ANALYZER_PENDING_DIAGNOSTIC_H
namespace ana {
/* Various bundles of information used for generating more precise /* Various bundles of information used for generating more precise
messages for events within a diagnostic_path, for passing to the messages for events within a diagnostic_path, for passing to the
various "describe_*" vfuncs of pending_diagnostic. See those various "describe_*" vfuncs of pending_diagnostic. See those
...@@ -267,4 +269,6 @@ class pending_diagnostic_subclass : public pending_diagnostic ...@@ -267,4 +269,6 @@ class pending_diagnostic_subclass : public pending_diagnostic
} }
}; };
} // namespace ana
#endif /* GCC_ANALYZER_PENDING_DIAGNOSTIC_H */ #endif /* GCC_ANALYZER_PENDING_DIAGNOSTIC_H */
...@@ -55,6 +55,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -55,6 +55,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Get a string for PK. */ /* Get a string for PK. */
const char * const char *
...@@ -551,4 +553,6 @@ analyzer_program_point_cc_tests () ...@@ -551,4 +553,6 @@ analyzer_program_point_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_PROGRAM_POINT_H #ifndef GCC_ANALYZER_PROGRAM_POINT_H
#define GCC_ANALYZER_PROGRAM_POINT_H #define GCC_ANALYZER_PROGRAM_POINT_H
namespace ana {
class exploded_graph; class exploded_graph;
/* An enum for distinguishing the various kinds of program_point. */ /* An enum for distinguishing the various kinds of program_point. */
...@@ -307,4 +309,6 @@ public: ...@@ -307,4 +309,6 @@ public:
call_string m_call_string; call_string m_call_string;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_PROGRAM_POINT_H */ #endif /* GCC_ANALYZER_PROGRAM_POINT_H */
...@@ -57,6 +57,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -57,6 +57,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* class sm_state_map. */ /* class sm_state_map. */
/* sm_state_map's ctor. */ /* sm_state_map's ctor. */
...@@ -1396,4 +1398,6 @@ analyzer_program_state_cc_tests () ...@@ -1396,4 +1398,6 @@ analyzer_program_state_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,8 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_PROGRAM_STATE_H #ifndef GCC_ANALYZER_PROGRAM_STATE_H
#define GCC_ANALYZER_PROGRAM_STATE_H #define GCC_ANALYZER_PROGRAM_STATE_H
namespace ana {
/* Data shared by all program_state instances. */ /* Data shared by all program_state instances. */
class extrinsic_state class extrinsic_state
...@@ -47,6 +49,8 @@ public: ...@@ -47,6 +49,8 @@ public:
auto_delete_vec <state_machine> &m_checkers; auto_delete_vec <state_machine> &m_checkers;
}; };
} // namespace ana
template <> struct default_hash_traits<svalue_id> template <> struct default_hash_traits<svalue_id>
: public pod_hash_traits<svalue_id> : public pod_hash_traits<svalue_id>
{ {
...@@ -92,6 +96,8 @@ pod_hash_traits<svalue_id>::is_empty (value_type v) ...@@ -92,6 +96,8 @@ pod_hash_traits<svalue_id>::is_empty (value_type v)
return v.null_p (); return v.null_p ();
} }
namespace ana {
/* Map from svalue_id to state machine state, also capturing the origin of /* Map from svalue_id to state machine state, also capturing the origin of
each state. */ each state. */
...@@ -362,4 +368,6 @@ class state_change ...@@ -362,4 +368,6 @@ class state_change
auto_vec<sm_change> m_sm_changes; auto_vec<sm_change> m_sm_changes;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_PROGRAM_STATE_H */ #endif /* GCC_ANALYZER_PROGRAM_STATE_H */
...@@ -62,6 +62,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -62,6 +62,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Dump T to PP in language-independent form, for debugging/logging/dumping /* Dump T to PP in language-independent form, for debugging/logging/dumping
purposes. */ purposes. */
...@@ -6906,6 +6908,8 @@ canonicalization::dump () const ...@@ -6906,6 +6908,8 @@ canonicalization::dump () const
dump (stderr); dump (stderr);
} }
} // namespace ana
/* Update HSTATE with a hash of SID. */ /* Update HSTATE with a hash of SID. */
void void
...@@ -6930,6 +6934,8 @@ debug (const region_model &rmodel) ...@@ -6930,6 +6934,8 @@ debug (const region_model &rmodel)
rmodel.dump (false); rmodel.dump (false);
} }
namespace ana {
#if CHECKING_P #if CHECKING_P
namespace selftest { namespace selftest {
...@@ -7984,4 +7990,6 @@ analyzer_region_model_cc_tests () ...@@ -7984,4 +7990,6 @@ analyzer_region_model_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -31,6 +31,10 @@ along with GCC; see the file COPYING3. If not see ...@@ -31,6 +31,10 @@ along with GCC; see the file COPYING3. If not see
recursive callstack. */ recursive callstack. */
// TODO: would this be better as a new tree code? // TODO: would this be better as a new tree code?
using namespace ana;
namespace ana {
class path_var class path_var
{ {
public: public:
...@@ -52,12 +56,16 @@ public: ...@@ -52,12 +56,16 @@ public:
int m_stack_depth; // or -1 for globals? int m_stack_depth; // or -1 for globals?
}; };
} // namespace ana
namespace inchash namespace inchash
{ {
extern void add_path_var (path_var pv, hash &hstate); extern void add_path_var (path_var pv, hash &hstate);
} // namespace inchash } // namespace inchash
namespace ana {
/* A region_model is effectively a graph of regions and symbolic values. /* A region_model is effectively a graph of regions and symbolic values.
We store per-model IDs rather than pointers to make it easier to clone We store per-model IDs rather than pointers to make it easier to clone
and to compare graphs. */ and to compare graphs. */
...@@ -549,6 +557,8 @@ public: ...@@ -549,6 +557,8 @@ public:
region_id m_rid; region_id m_rid;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -557,6 +567,8 @@ is_a_helper <region_svalue *>::test (svalue *sval) ...@@ -557,6 +567,8 @@ is_a_helper <region_svalue *>::test (svalue *sval)
return sval->get_kind () == SK_REGION; return sval->get_kind () == SK_REGION;
} }
namespace ana {
/* Concrete subclass of svalue representing a specific constant value. */ /* Concrete subclass of svalue representing a specific constant value. */
class constant_svalue : public svalue class constant_svalue : public svalue
...@@ -606,6 +618,8 @@ public: ...@@ -606,6 +618,8 @@ public:
tree m_cst_expr; tree m_cst_expr;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -614,6 +628,8 @@ is_a_helper <constant_svalue *>::test (svalue *sval) ...@@ -614,6 +628,8 @@ is_a_helper <constant_svalue *>::test (svalue *sval)
return sval->get_kind () == SK_CONSTANT; return sval->get_kind () == SK_CONSTANT;
} }
namespace ana {
/* Concrete subclass of svalue representing a unique but unknown value. /* Concrete subclass of svalue representing a unique but unknown value.
Comparisons of variables that share the same unknown value are known Comparisons of variables that share the same unknown value are known
to be equal, even if we don't know what the value is. */ to be equal, even if we don't know what the value is. */
...@@ -690,6 +706,8 @@ public: ...@@ -690,6 +706,8 @@ public:
enum poison_kind m_kind; enum poison_kind m_kind;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -698,6 +716,8 @@ is_a_helper <poisoned_svalue *>::test (svalue *sval) ...@@ -698,6 +716,8 @@ is_a_helper <poisoned_svalue *>::test (svalue *sval)
return sval->get_kind () == SK_POISONED; return sval->get_kind () == SK_POISONED;
} }
namespace ana {
/* Concrete subclass of svalue representing setjmp buffers, so that /* Concrete subclass of svalue representing setjmp buffers, so that
longjmp can potentially "return" to an entirely different function. */ longjmp can potentially "return" to an entirely different function. */
...@@ -876,6 +896,8 @@ public: ...@@ -876,6 +896,8 @@ public:
region_id m_active_view_rid; region_id m_active_view_rid;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -884,6 +906,8 @@ is_a_helper <region *>::test (region *) ...@@ -884,6 +906,8 @@ is_a_helper <region *>::test (region *)
return true; return true;
} }
namespace ana {
/* Concrete region subclass for storing "primitive" types (integral types, /* Concrete region subclass for storing "primitive" types (integral types,
pointers, etc). */ pointers, etc). */
...@@ -972,6 +996,8 @@ public: ...@@ -972,6 +996,8 @@ public:
map_t m_map; map_t m_map;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -980,6 +1006,8 @@ is_a_helper <map_region *>::test (region *reg) ...@@ -980,6 +1006,8 @@ is_a_helper <map_region *>::test (region *reg)
return (reg->dyn_cast_map_region () != NULL); return (reg->dyn_cast_map_region () != NULL);
} }
namespace ana {
/* Abstract subclass representing a region with fields /* Abstract subclass representing a region with fields
(either a struct or a union). */ (either a struct or a union). */
...@@ -996,6 +1024,8 @@ public: ...@@ -996,6 +1024,8 @@ public:
bool compare_fields (const struct_or_union_region &other) const; bool compare_fields (const struct_or_union_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1005,6 +1035,8 @@ is_a_helper <struct_or_union_region *>::test (region *reg) ...@@ -1005,6 +1035,8 @@ is_a_helper <struct_or_union_region *>::test (region *reg)
|| reg->get_kind () == RK_UNION); || reg->get_kind () == RK_UNION);
} }
namespace ana {
/* Concrete region subclass. A map_region representing a struct, using /* Concrete region subclass. A map_region representing a struct, using
FIELD_DECLs for its keys. */ FIELD_DECLs for its keys. */
...@@ -1024,6 +1056,8 @@ public: ...@@ -1024,6 +1056,8 @@ public:
bool compare_fields (const struct_region &other) const; bool compare_fields (const struct_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1032,6 +1066,8 @@ is_a_helper <struct_region *>::test (region *reg) ...@@ -1032,6 +1066,8 @@ is_a_helper <struct_region *>::test (region *reg)
return reg->get_kind () == RK_STRUCT; return reg->get_kind () == RK_STRUCT;
} }
namespace ana {
/* Concrete region subclass. A map_region representing a union, using /* Concrete region subclass. A map_region representing a union, using
FIELD_DECLs for its keys. */ FIELD_DECLs for its keys. */
...@@ -1051,6 +1087,8 @@ public: ...@@ -1051,6 +1087,8 @@ public:
bool compare_fields (const union_region &other) const; bool compare_fields (const union_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1059,6 +1097,8 @@ is_a_helper <union_region *>::test (region *reg) ...@@ -1059,6 +1097,8 @@ is_a_helper <union_region *>::test (region *reg)
return reg->get_kind () == RK_UNION; return reg->get_kind () == RK_UNION;
} }
namespace ana {
/* Abstract map_region subclass for accessing decls, used as a base class /* Abstract map_region subclass for accessing decls, used as a base class
for function frames and for the globals region. */ for function frames and for the globals region. */
...@@ -1117,6 +1157,8 @@ public: ...@@ -1117,6 +1157,8 @@ public:
int m_depth; int m_depth;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1125,6 +1167,8 @@ is_a_helper <frame_region *>::test (region *reg) ...@@ -1125,6 +1167,8 @@ is_a_helper <frame_region *>::test (region *reg)
return reg->get_kind () == RK_FRAME; return reg->get_kind () == RK_FRAME;
} }
namespace ana {
/* Concrete region subclass, to hold global variables (data and bss). */ /* Concrete region subclass, to hold global variables (data and bss). */
class globals_region : public scope_region class globals_region : public scope_region
...@@ -1149,6 +1193,8 @@ class globals_region : public scope_region ...@@ -1149,6 +1193,8 @@ class globals_region : public scope_region
bool compare_fields (const globals_region &other) const; bool compare_fields (const globals_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1157,6 +1203,8 @@ is_a_helper <globals_region *>::test (region *reg) ...@@ -1157,6 +1203,8 @@ is_a_helper <globals_region *>::test (region *reg)
return reg->get_kind () == RK_GLOBALS; return reg->get_kind () == RK_GLOBALS;
} }
namespace ana {
/* Concrete region subclass. A map_region representing the code, using /* Concrete region subclass. A map_region representing the code, using
FUNCTION_DECLs for its keys. */ FUNCTION_DECLs for its keys. */
...@@ -1185,6 +1233,8 @@ public: ...@@ -1185,6 +1233,8 @@ public:
bool compare_fields (const code_region &other) const; bool compare_fields (const code_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1193,6 +1243,8 @@ is_a_helper <code_region *>::test (region *reg) ...@@ -1193,6 +1243,8 @@ is_a_helper <code_region *>::test (region *reg)
return reg->get_kind () == RK_CODE; return reg->get_kind () == RK_CODE;
} }
namespace ana {
/* Concrete region subclass. A map_region representing the code for /* Concrete region subclass. A map_region representing the code for
a particular function, using LABEL_DECLs for its keys. */ a particular function, using LABEL_DECLs for its keys. */
...@@ -1223,6 +1275,8 @@ public: ...@@ -1223,6 +1275,8 @@ public:
bool compare_fields (const function_region &other) const; bool compare_fields (const function_region &other) const;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1231,6 +1285,8 @@ is_a_helper <function_region *>::test (region *reg) ...@@ -1231,6 +1285,8 @@ is_a_helper <function_region *>::test (region *reg)
return reg->get_kind () == RK_FUNCTION; return reg->get_kind () == RK_FUNCTION;
} }
namespace ana {
/* Concrete region subclass representing an array (or an array-like view /* Concrete region subclass representing an array (or an array-like view
of a parent region of memory. of a parent region of memory.
This can't be a map_region as we can't use trees as the keys: there's This can't be a map_region as we can't use trees as the keys: there's
...@@ -1325,6 +1381,8 @@ public: ...@@ -1325,6 +1381,8 @@ public:
map_t m_map; map_t m_map;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1333,6 +1391,8 @@ is_a_helper <array_region *>::test (region *reg) ...@@ -1333,6 +1391,8 @@ is_a_helper <array_region *>::test (region *reg)
return reg->get_kind () == RK_ARRAY; return reg->get_kind () == RK_ARRAY;
} }
namespace ana {
/* Concrete region subclass representing a stack, containing all stack /* Concrete region subclass representing a stack, containing all stack
frames, and implicitly providing a POISON_KIND_UNINIT value to all frames, and implicitly providing a POISON_KIND_UNINIT value to all
child regions by default. */ child regions by default. */
...@@ -1387,6 +1447,8 @@ public: ...@@ -1387,6 +1447,8 @@ public:
auto_vec<region_id> m_frame_rids; auto_vec<region_id> m_frame_rids;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1395,6 +1457,8 @@ is_a_helper <stack_region *>::test (region *reg) ...@@ -1395,6 +1457,8 @@ is_a_helper <stack_region *>::test (region *reg)
return reg->get_kind () == RK_STACK; return reg->get_kind () == RK_STACK;
} }
namespace ana {
/* Concrete region subclass: a region within which regions can be /* Concrete region subclass: a region within which regions can be
dynamically allocated. */ dynamically allocated. */
...@@ -1421,6 +1485,8 @@ public: ...@@ -1421,6 +1485,8 @@ public:
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1429,6 +1495,8 @@ is_a_helper <heap_region *>::test (region *reg) ...@@ -1429,6 +1495,8 @@ is_a_helper <heap_region *>::test (region *reg)
return reg->get_kind () == RK_HEAP; return reg->get_kind () == RK_HEAP;
} }
namespace ana {
/* Concrete region subclass. The root region, containing all regions /* Concrete region subclass. The root region, containing all regions
(either directly, or as descendents). (either directly, or as descendents).
Unique within a region_model. */ Unique within a region_model. */
...@@ -1497,6 +1565,8 @@ private: ...@@ -1497,6 +1565,8 @@ private:
region_id m_heap_rid; region_id m_heap_rid;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -1505,6 +1575,8 @@ is_a_helper <root_region *>::test (region *reg) ...@@ -1505,6 +1575,8 @@ is_a_helper <root_region *>::test (region *reg)
return reg->get_kind () == RK_ROOT; return reg->get_kind () == RK_ROOT;
} }
namespace ana {
/* Concrete region subclass: a region to use when dereferencing an unknown /* Concrete region subclass: a region to use when dereferencing an unknown
pointer. */ pointer. */
...@@ -1941,6 +2013,8 @@ struct canonicalization ...@@ -1941,6 +2013,8 @@ struct canonicalization
int m_next_sid_int; int m_next_sid_int;
}; };
} // namespace ana
namespace inchash namespace inchash
{ {
extern void add (svalue_id sid, hash &hstate); extern void add (svalue_id sid, hash &hstate);
...@@ -1949,10 +2023,14 @@ namespace inchash ...@@ -1949,10 +2023,14 @@ namespace inchash
extern void debug (const region_model &rmodel); extern void debug (const region_model &rmodel);
namespace ana {
#if CHECKING_P #if CHECKING_P
namespace selftest { namespace selftest {
using namespace ::selftest;
/* An implementation of region_model_context for use in selftests, which /* An implementation of region_model_context for use in selftests, which
stores any pending_diagnostic instances passed to it. */ stores any pending_diagnostic instances passed to it. */
...@@ -2068,4 +2146,6 @@ void assert_condition (const location &loc, ...@@ -2068,4 +2146,6 @@ void assert_condition (const location &loc,
#endif /* #if CHECKING_P */ #endif /* #if CHECKING_P */
} // namespace ana
#endif /* GCC_ANALYZER_REGION_MODEL_H */ #endif /* GCC_ANALYZER_REGION_MODEL_H */
...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* A state machine for detecting misuses of <stdio.h>'s FILE * API. */ /* A state machine for detecting misuses of <stdio.h>'s FILE * API. */
...@@ -434,4 +436,6 @@ analyzer_sm_file_cc_tests () ...@@ -434,4 +436,6 @@ analyzer_sm_file_cc_tests ()
#endif /* CHECKING_P */ #endif /* CHECKING_P */
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -38,6 +38,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -38,6 +38,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* A state machine for detecting misuses of the malloc/free API. /* A state machine for detecting misuses of the malloc/free API.
...@@ -794,4 +796,6 @@ make_malloc_state_machine (logger *logger) ...@@ -794,4 +796,6 @@ make_malloc_state_machine (logger *logger)
return new malloc_state_machine (logger); return new malloc_state_machine (logger);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* A state machine for use in DejaGnu tests, to check that /* A state machine for use in DejaGnu tests, to check that
...@@ -149,4 +151,6 @@ make_pattern_test_state_machine (logger *logger) ...@@ -149,4 +151,6 @@ make_pattern_test_state_machine (logger *logger)
return new pattern_test_state_machine (logger); return new pattern_test_state_machine (logger);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* An experimental state machine, for tracking exposure of sensitive /* An experimental state machine, for tracking exposure of sensitive
...@@ -245,4 +247,6 @@ make_sensitive_state_machine (logger *logger) ...@@ -245,4 +247,6 @@ make_sensitive_state_machine (logger *logger)
return new sensitive_state_machine (logger); return new sensitive_state_machine (logger);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -61,6 +61,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -61,6 +61,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* An experimental state machine, for tracking calls to async-signal-unsafe /* An experimental state machine, for tracking calls to async-signal-unsafe
...@@ -367,5 +369,7 @@ analyzer_sm_signal_cc_tests () ...@@ -367,5 +369,7 @@ analyzer_sm_signal_cc_tests ()
} // namespace selftest } // namespace selftest
} // namespace ana
#endif /* CHECKING_P */ #endif /* CHECKING_P */
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -39,6 +39,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
namespace { namespace {
/* An experimental state machine, for tracking "taint": unsanitized uses /* An experimental state machine, for tracking "taint": unsanitized uses
...@@ -325,4 +327,6 @@ make_taint_state_machine (logger *logger) ...@@ -325,4 +327,6 @@ make_taint_state_machine (logger *logger)
return new taint_state_machine (logger); return new taint_state_machine (logger);
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -61,6 +61,8 @@ any_pointer_p (tree var) ...@@ -61,6 +61,8 @@ any_pointer_p (tree var)
return POINTER_TYPE_P (TREE_TYPE (var)); return POINTER_TYPE_P (TREE_TYPE (var));
} }
namespace ana {
/* Add a state with name NAME to this state_machine. /* Add a state with name NAME to this state_machine.
The string is required to outlive the state_machine. The string is required to outlive the state_machine.
...@@ -119,4 +121,6 @@ make_checkers (auto_delete_vec <state_machine> &out, logger *logger) ...@@ -119,4 +121,6 @@ make_checkers (auto_delete_vec <state_machine> &out, logger *logger)
} }
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -26,6 +26,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -26,6 +26,8 @@ along with GCC; see the file COPYING3. If not see
extern tree is_zero_assignment (const gimple *stmt); extern tree is_zero_assignment (const gimple *stmt);
extern bool any_pointer_p (tree var); extern bool any_pointer_p (tree var);
namespace ana {
class state_machine; class state_machine;
class sm_context; class sm_context;
class pending_diagnostic; class pending_diagnostic;
...@@ -175,4 +177,6 @@ extern state_machine *make_sensitive_state_machine (logger *logger); ...@@ -175,4 +177,6 @@ extern state_machine *make_sensitive_state_machine (logger *logger);
extern state_machine *make_signal_state_machine (logger *logger); extern state_machine *make_signal_state_machine (logger *logger);
extern state_machine *make_pattern_test_state_machine (logger *logger); extern state_machine *make_pattern_test_state_machine (logger *logger);
} // namespace ana
#endif /* GCC_ANALYZER_SM_H */ #endif /* GCC_ANALYZER_SM_H */
...@@ -68,6 +68,8 @@ pod_hash_traits<function_point>::is_empty (value_type v) ...@@ -68,6 +68,8 @@ pod_hash_traits<function_point>::is_empty (value_type v)
return v.get_kind () == PK_EMPTY; return v.get_kind () == PK_EMPTY;
} }
namespace ana {
/* The result of analyzing which SSA names can be purged from state at /* The result of analyzing which SSA names can be purged from state at
different points in the program, so that we can simplify program_state different points in the program, so that we can simplify program_state
objects, in the hope of reducing state-blowup. */ objects, in the hope of reducing state-blowup. */
...@@ -159,4 +161,6 @@ private: ...@@ -159,4 +161,6 @@ private:
const state_purge_map *m_map; const state_purge_map *m_map;
}; };
} // namespace ana
#endif /* GCC_ANALYZER_STATE_PURGE_H */ #endif /* GCC_ANALYZER_STATE_PURGE_H */
...@@ -54,6 +54,8 @@ along with GCC; see the file COPYING3. If not see ...@@ -54,6 +54,8 @@ along with GCC; see the file COPYING3. If not see
#if ENABLE_ANALYZER #if ENABLE_ANALYZER
namespace ana {
/* Get the cgraph_edge, but only if there's an underlying function body. */ /* Get the cgraph_edge, but only if there's an underlying function body. */
cgraph_edge * cgraph_edge *
...@@ -976,4 +978,6 @@ callgraph_superedge::map_expr_from_callee_to_caller (tree callee_expr, ...@@ -976,4 +978,6 @@ callgraph_superedge::map_expr_from_callee_to_caller (tree callee_expr,
return NULL_TREE; return NULL_TREE;
} }
} // namespace ana
#endif /* #if ENABLE_ANALYZER */ #endif /* #if ENABLE_ANALYZER */
...@@ -21,6 +21,10 @@ along with GCC; see the file COPYING3. If not see ...@@ -21,6 +21,10 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_ANALYZER_SUPERGRAPH_H #ifndef GCC_ANALYZER_SUPERGRAPH_H
#define GCC_ANALYZER_SUPERGRAPH_H #define GCC_ANALYZER_SUPERGRAPH_H
using namespace ana;
namespace ana {
/* Forward decls, using indentation to show inheritance. */ /* Forward decls, using indentation to show inheritance. */
class supergraph; class supergraph;
...@@ -372,6 +376,8 @@ class callgraph_superedge : public superedge ...@@ -372,6 +376,8 @@ class callgraph_superedge : public superedge
cgraph_edge *const m_cedge; cgraph_edge *const m_cedge;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -382,6 +388,8 @@ is_a_helper <const callgraph_superedge *>::test (const superedge *sedge) ...@@ -382,6 +388,8 @@ is_a_helper <const callgraph_superedge *>::test (const superedge *sedge)
|| sedge->get_kind () == SUPEREDGE_RETURN); || sedge->get_kind () == SUPEREDGE_RETURN);
} }
namespace ana {
/* A subclass of superedge representing an interprocedural call. */ /* A subclass of superedge representing an interprocedural call. */
class call_superedge : public callgraph_superedge class call_superedge : public callgraph_superedge
...@@ -416,6 +424,8 @@ class call_superedge : public callgraph_superedge ...@@ -416,6 +424,8 @@ class call_superedge : public callgraph_superedge
} }
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -424,6 +434,8 @@ is_a_helper <const call_superedge *>::test (const superedge *sedge) ...@@ -424,6 +434,8 @@ is_a_helper <const call_superedge *>::test (const superedge *sedge)
return sedge->get_kind () == SUPEREDGE_CALL; return sedge->get_kind () == SUPEREDGE_CALL;
} }
namespace ana {
/* A subclass of superedge represesnting an interprocedural return. */ /* A subclass of superedge represesnting an interprocedural return. */
class return_superedge : public callgraph_superedge class return_superedge : public callgraph_superedge
...@@ -453,6 +465,8 @@ class return_superedge : public callgraph_superedge ...@@ -453,6 +465,8 @@ class return_superedge : public callgraph_superedge
} }
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -461,6 +475,8 @@ is_a_helper <const return_superedge *>::test (const superedge *sedge) ...@@ -461,6 +475,8 @@ is_a_helper <const return_superedge *>::test (const superedge *sedge)
return sedge->get_kind () == SUPEREDGE_RETURN; return sedge->get_kind () == SUPEREDGE_RETURN;
} }
namespace ana {
/* A subclass of superedge that corresponds to a CFG edge. */ /* A subclass of superedge that corresponds to a CFG edge. */
class cfg_superedge : public superedge class cfg_superedge : public superedge
...@@ -487,6 +503,8 @@ class cfg_superedge : public superedge ...@@ -487,6 +503,8 @@ class cfg_superedge : public superedge
const ::edge m_cfg_edge; const ::edge m_cfg_edge;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -495,6 +513,8 @@ is_a_helper <const cfg_superedge *>::test (const superedge *sedge) ...@@ -495,6 +513,8 @@ is_a_helper <const cfg_superedge *>::test (const superedge *sedge)
return sedge->get_kind () == SUPEREDGE_CFG_EDGE; return sedge->get_kind () == SUPEREDGE_CFG_EDGE;
} }
namespace ana {
/* A subclass for edges from switch statements, retaining enough /* A subclass for edges from switch statements, retaining enough
information to identify the pertinent case, and for adding labels information to identify the pertinent case, and for adding labels
when rendering via graphviz. */ when rendering via graphviz. */
...@@ -526,6 +546,8 @@ class switch_cfg_superedge : public cfg_superedge { ...@@ -526,6 +546,8 @@ class switch_cfg_superedge : public cfg_superedge {
const int m_idx; const int m_idx;
}; };
} // namespace ana
template <> template <>
template <> template <>
inline bool inline bool
...@@ -534,6 +556,8 @@ is_a_helper <const switch_cfg_superedge *>::test (const superedge *sedge) ...@@ -534,6 +556,8 @@ is_a_helper <const switch_cfg_superedge *>::test (const superedge *sedge)
return sedge->dyn_cast_switch_cfg_superedge () != NULL; return sedge->dyn_cast_switch_cfg_superedge () != NULL;
} }
namespace ana {
/* Base class for adding additional content to the .dot output /* Base class for adding additional content to the .dot output
for a supergraph. */ for a supergraph. */
...@@ -551,4 +575,6 @@ class dot_annotator ...@@ -551,4 +575,6 @@ class dot_annotator
extern cgraph_edge *supergraph_call_edge (function *fun, gimple *stmt); extern cgraph_edge *supergraph_call_edge (function *fun, gimple *stmt);
} // namespace ana
#endif /* GCC_ANALYZER_SUPERGRAPH_H */ #endif /* GCC_ANALYZER_SUPERGRAPH_H */
...@@ -291,11 +291,11 @@ command-line options). ...@@ -291,11 +291,11 @@ command-line options).
end end
define break-on-saved-diagnostic define break-on-saved-diagnostic
break diagnostic_manager::add_diagnostic break ana::diagnostic_manager::add_diagnostic
end end
document break-on-saved-diagnostic document break-on-saved-diagnostic
Put a breakpoint on diagnostic_manager::add_diagnostic, called within Put a breakpoint on ana::diagnostic_manager::add_diagnostic, called within
the analyzer whenever a diagnostic is saved for later de-duplication and the analyzer whenever a diagnostic is saved for later de-duplication and
possible emission. possible emission.
end end
......
...@@ -119,7 +119,7 @@ selftest::run_tests () ...@@ -119,7 +119,7 @@ selftest::run_tests ()
lang_hooks.run_lang_selftests (); lang_hooks.run_lang_selftests ();
/* Run the analyzer selftests (if enabled). */ /* Run the analyzer selftests (if enabled). */
run_analyzer_selftests (); ana::selftest::run_analyzer_selftests ();
/* Force a GC at the end of the selftests, to shake out GC-related /* Force a GC at the end of the selftests, to shake out GC-related
issues. For example, if any GC-managed items have buggy (or missing) issues. For example, if any GC-managed items have buggy (or missing)
......
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