GCC Middle and Back End API Reference
region-model.h
Go to the documentation of this file.
1/* Classes for modeling the state of memory.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_ANALYZER_REGION_MODEL_H
22#define GCC_ANALYZER_REGION_MODEL_H
23
24/* Implementation of the region-based ternary model described in:
25 "A Memory Model for Static Analysis of C Programs"
26 (Zhongxing Xu, Ted Kremenek, and Jian Zhang)
27 http://lcs.ios.ac.cn/~xuzb/canalyze/memmodel.pdf */
28
29#include "bitmap.h"
30#include "stringpool.h"
31#include "attribs.h" // for rdwr_map
32#include "selftest.h"
33#include "analyzer/svalue.h"
34#include "analyzer/region.h"
38
39using namespace ana;
40
41namespace inchash
42{
44} // namespace inchash
45
46namespace ana {
47
48template <typename T>
50{
51 public:
53 void put (T src, T dst);
54 T get_dst_for_src (T src) const;
55 void dump_to_pp (pretty_printer *pp) const;
56 void dump () const;
57 void update (T *) const;
58
59 private:
61 };
62
63/* class one_way_id_map. */
64
65/* one_way_id_map's ctor, which populates the map with dummy null values. */
66
67template <typename T>
69: m_src_to_dst (num_svalues)
70{
71 for (int i = 0; i < num_svalues; i++)
72 m_src_to_dst.quick_push (T::null ());
73}
74
75/* Record that SRC is to be mapped to DST. */
76
77template <typename T>
78inline void
80{
81 m_src_to_dst[src.as_int ()] = dst;
82}
83
84/* Get the new value for SRC within the map. */
85
86template <typename T>
87inline T
89{
90 if (src.null_p ())
91 return src;
92 return m_src_to_dst[src.as_int ()];
93}
94
95/* Dump this map to PP. */
96
97template <typename T>
98inline void
100{
101 pp_string (pp, "src to dst: {");
102 unsigned i;
103 T *dst;
104 FOR_EACH_VEC_ELT (m_src_to_dst, i, dst)
105 {
106 if (i > 0)
107 pp_string (pp, ", ");
108 T src (T::from_int (i));
109 src.print (pp);
110 pp_string (pp, " -> ");
111 dst->print (pp);
112 }
113 pp_string (pp, "}");
114 pp_newline (pp);
115}
116
117/* Dump this map to stderr. */
118
119template <typename T>
120DEBUG_FUNCTION inline void
122{
124 pp.buffer->stream = stderr;
125 dump_to_pp (&pp);
126 pp_flush (&pp);
127}
128
129/* Update *ID from the old value to its new value in this map. */
130
131template <typename T>
132inline void
134{
135 *id = get_dst_for_src (*id);
136}
137
138/* A mapping from region to svalue for use when tracking state. */
139
141{
142public:
144 typedef hash_map_t::iterator iterator;
145
150
151 bool operator== (const region_to_value_map &other) const;
152 bool operator!= (const region_to_value_map &other) const
153 {
154 return !(*this == other);
155 }
156
157 iterator begin () const { return m_hash_map.begin (); }
158 iterator end () const { return m_hash_map.end (); }
159
160 const svalue * const *get (const region *reg) const
161 {
162 return const_cast <hash_map_t &> (m_hash_map).get (reg);
163 }
164 void put (const region *reg, const svalue *sval)
165 {
166 m_hash_map.put (reg, sval);
167 }
168 void remove (const region *reg)
169 {
170 m_hash_map.remove (reg);
171 }
172
173 bool is_empty () const { return m_hash_map.is_empty (); }
174
175 void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
176 void dump (bool simple) const;
177
179
181 region_to_value_map *out) const;
182
183 void purge_state_involving (const svalue *sval);
184
185private:
187};
188
189/* Various operations delete information from a region_model.
190
191 This struct tracks how many of each kind of entity were purged (e.g.
192 for selftests, and for debugging). */
193
212
213/* A base class for visiting regions and svalues, with do-nothing
214 base implementations of the per-subclass vfuncs. */
215
217{
218public:
219 virtual void visit_region_svalue (const region_svalue *) {}
220 virtual void visit_constant_svalue (const constant_svalue *) {}
221 virtual void visit_unknown_svalue (const unknown_svalue *) {}
222 virtual void visit_poisoned_svalue (const poisoned_svalue *) {}
223 virtual void visit_setjmp_svalue (const setjmp_svalue *) {}
224 virtual void visit_initial_svalue (const initial_svalue *) {}
225 virtual void visit_unaryop_svalue (const unaryop_svalue *) {}
226 virtual void visit_binop_svalue (const binop_svalue *) {}
227 virtual void visit_sub_svalue (const sub_svalue *) {}
228 virtual void visit_repeated_svalue (const repeated_svalue *) {}
232 virtual void visit_widening_svalue (const widening_svalue *) {}
233 virtual void visit_compound_svalue (const compound_svalue *) {}
234 virtual void visit_conjured_svalue (const conjured_svalue *) {}
237
238 virtual void visit_region (const region *) {}
239};
240
242
245 const svalue *retval,
247
248/* A region_model encapsulates a representation of the state of memory, with
249 a tree of regions, along with their associated values.
250 The representation is graph-like because values can be pointers to
251 regions.
252 It also stores:
253 - a constraint_manager, capturing relationships between the values, and
254 - dynamic extents, mapping dynamically-allocated regions to svalues (their
255 capacities). */
256
258{
259 public:
261
266
267 bool operator== (const region_model &other) const;
268 bool operator!= (const region_model &other) const
269 {
270 return !(*this == other);
271 }
272
273 hashval_t hash () const;
274
275 void print (pretty_printer *pp) const;
276
277 void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
278 void dump (FILE *fp, bool simple, bool multiline) const;
279 void dump (bool simple) const;
280
281 void debug () const;
282
284
285 void validate () const;
286
288 bool canonicalized_p () const;
289
290 void
291 on_stmt_pre (const gimple *stmt,
294
300 void on_call_post (const gcall *stmt,
303
305
307
309 const svalue *num_bytes_sval);
311 int retval,
312 bool unmergeable);
314 bool unmergeable);
316
320 const svalue *extra_sval,
322
324 void on_setjmp (const gcall *stmt, const exploded_node *enode,
328
332
333 void handle_phi (const gphi *phi, tree lhs, tree rhs,
334 const region_model &old_state,
337
339 const gimple *last_stmt,
341 std::unique_ptr<rejected_constraint> *out);
342
343 void update_for_gcall (const gcall *call_stmt,
345 function *callee = NULL);
346
347 void update_for_return_gcall (const gcall *call_stmt,
349
355 const svalue **out_result,
357 bool eval_return_svalue = true);
358 int get_stack_depth () const;
359 const frame_region *get_frame_at_index (int index) const;
360
365
368 bool add_nonnull_constraint = true) const;
369
371 const region *reg,
372 const bit_range &bits,
374
375 void set_value (const region *lhs_reg, const svalue *rhs_sval,
378 void clobber_region (const region *reg);
379 void purge_region (const region *reg);
380 void fill_region (const region *reg,
381 const svalue *sval,
383 void zero_fill_region (const region *reg,
386 const svalue *num_bytes_sval,
387 const svalue *sval,
391 const svalue *num_bytes_sval,
394 const region *src_reg,
396 const svalue *num_bytes_sval,
399
401 enum tree_code op,
402 const svalue *rhs) const;
404 const region_svalue *ptr) const;
406 const svalue *b) const;
407 tristate structural_equality (const svalue *a, const svalue *b) const;
409 enum tree_code op,
410 tree rhs,
412 bool add_constraint (tree lhs, enum tree_code op, tree rhs,
414 bool add_constraint (tree lhs, enum tree_code op, tree rhs,
416 std::unique_ptr<rejected_constraint> *out);
417
418 const region *
421 bool update_state_machine = false,
422 const call_details *cd = nullptr);
423
427
432 svalue_set *visited) const;
435 svalue_set *visited) const;
436
437 /* For selftests. */
442
443 store *get_store () { return &m_store; }
444 const store *get_store () const { return &m_store; }
445
446 const dynamic_extents_t &
448 {
449 return m_dynamic_extents;
450 }
451 const svalue *get_dynamic_extents (const region *reg) const;
452 void set_dynamic_extents (const region *reg,
453 const svalue *size_in_bytes,
455 void unset_dynamic_extents (const region *reg);
456
462
464 enum poison_kind pkind);
465
467 const program_point &point,
470 const program_state *state_a = NULL,
471 const program_state *state_b = NULL) const;
472
475
477 static void append_regions_cb (const region *base_reg,
479
480 const svalue *get_store_value (const region *reg,
483 const byte_range &bytes,
486 tree expr,
487 const svalue **out_sval,
490 tree expr,
491 const svalue **out_sval,
493
494 bool region_exists_p (const region *reg) const;
495
497
498 const svalue *get_capacity (const region *reg) const;
499
501 const region_model &summary);
502
504 const svalue *copied_sval,
505 const region *src_reg,
507
508 void set_errno (const call_details &cd);
509
510 /* Implemented in sm-fd.cc */
512
513 /* Implemented in sm-malloc.cc */
515 const svalue *old_ptr_sval,
516 const svalue *new_ptr_sval);
517
518 /* Implemented in sm-malloc.cc. */
519 void
521 const svalue *new_ptr_sval);
522
523 /* Implemented in sm-taint.cc. */
524 void mark_as_tainted (const svalue *sval,
526
527 bool add_constraint (const svalue *lhs,
528 enum tree_code op,
529 const svalue *rhs,
531
532 const svalue *check_for_poison (const svalue *sval,
533 tree expr,
534 const region *src_region,
536
538 const svalue *sval_hint,
540
541 const svalue *
543 unsigned idx) const;
544 const svalue *
546 unsigned idx,
548 const svalue **out_sval) const;
549
551 get_builtin_kf (const gcall *call,
553
554 static void
556 {
557 pop_frame_callbacks.safe_push (callback);
558 }
559
560 static void
563 const svalue *retval,
565 {
566 for (auto &callback : pop_frame_callbacks)
567 callback (model, prev_model, retval, ctxt);
568 }
569
570 bool called_from_main_p () const;
571
572private:
575
578 svalue_set *visited) const;
581 svalue_set *visited) const;
582
584 const call_details &cd) const;
586
588 enum tree_code outer_op,
589 const svalue *outer_rhs,
590 bool *out,
592
598 const gcond *cond_stmt,
600 std::unique_ptr<rejected_constraint> *out);
602 const gswitch *switch_stmt,
604 std::unique_ptr<rejected_constraint> *out);
606 const ggoto *goto_stmt,
610 std::unique_ptr<rejected_constraint> *out);
611
613 enum poison_kind pkind);
614
616 bool nonnull,
618
619 const svalue *get_initial_value_for_global (const region *reg) const;
620
622
624 const svalue *size_in_bytes,
628
630 enum access_direction dir,
632
635 bool check_region_access (const region *reg,
636 enum access_direction dir,
637 const svalue *sval_hint,
643
644 /* Implemented in bounds-checking.cc */
646 const svalue *sym_byte_offset,
647 const svalue *num_bytes_sval,
648 const svalue *capacity,
649 enum access_direction dir,
650 const svalue *sval_hint,
652 bool check_region_bounds (const region *reg, enum access_direction dir,
653 const svalue *sval_hint,
655
656 void check_call_args (const call_details &cd) const;
658 tree format_attr) const;
662 rdwr_map &rdwr_idx) const;
671 tree attr);
672 void check_function_attrs (const gcall *call,
675
677 /* Storing this here to avoid passing it around everywhere. */
679
681
682 constraint_manager *m_constraints; // TODO: embed, rather than dynalloc?
683
685
686 /* Map from base region to size in bytes, for tracking the sizes of
687 dynamically-allocated regions.
688 This is part of the region_model rather than the region to allow for
689 memory regions to be resized (e.g. by realloc). */
691};
692
693/* Some region_model activity could lead to warnings (e.g. attempts to use an
694 uninitialized value). This abstract base class encapsulates an interface
695 for the region model to use when emitting such warnings.
696
697 Having this as an abstract base class allows us to support the various
698 operations needed by program_state in the analyzer within region_model,
699 whilst keeping them somewhat modularized. */
700
702{
703 public:
704 /* Hook for clients to store pending diagnostics.
705 Return true if the diagnostic was stored, or false if it was deleted.
706 Optionally provide a custom stmt_finder. */
707 virtual bool warn (std::unique_ptr<pending_diagnostic> d,
708 const stmt_finder *custom_finder = NULL) = 0;
709
710 /* Hook for clients to add a note to the last previously stored
711 pending diagnostic. */
712 virtual void add_note (std::unique_ptr<pending_note> pn) = 0;
713
714 /* Hook for clients to add an event to the last previously stored
715 pending diagnostic. */
716 virtual void add_event (std::unique_ptr<checker_event> event) = 0;
717
718 /* Hook for clients to be notified when an SVAL that was reachable
719 in a previous state is no longer live, so that clients can emit warnings
720 about leaks. */
721 virtual void on_svalue_leak (const svalue *sval) = 0;
722
723 /* Hook for clients to be notified when the set of explicitly live
724 svalues changes, so that they can purge state relating to dead
725 svalues. */
727 const region_model *model) = 0;
728
729 virtual logger *get_logger () = 0;
730
731 /* Hook for clients to be notified when the condition
732 "LHS OP RHS" is added to the region model.
733 This exists so that state machines can detect tests on edges,
734 and use them to trigger sm-state transitions (e.g. transitions due
735 to ptrs becoming known to be NULL or non-NULL, rather than just
736 "unchecked") */
737 virtual void on_condition (const svalue *lhs,
738 enum tree_code op,
739 const svalue *rhs) = 0;
740
741 /* Hook for clients to be notified when the condition that
742 SVAL is within RANGES is added to the region model.
743 Similar to on_condition, but for use when handling switch statements.
744 RANGES is non-empty. */
745 virtual void on_bounded_ranges (const svalue &sval,
746 const bounded_ranges &ranges) = 0;
747
748 /* Hook for clients to be notified when a frame is popped from the stack. */
749 virtual void on_pop_frame (const frame_region *) = 0;
750
751 /* Hooks for clients to be notified when an unknown change happens
752 to SVAL (in response to a call to an unknown function). */
753 virtual void on_unknown_change (const svalue *sval, bool is_mutable) = 0;
754
755 /* Hooks for clients to be notified when a phi node is handled,
756 where RHS is the pertinent argument. */
757 virtual void on_phi (const gphi *phi, tree rhs) = 0;
758
759 /* Hooks for clients to be notified when the region model doesn't
760 know how to handle the tree code of T at LOC. */
762 const dump_location_t &loc) = 0;
763
764 /* Hook for clients to be notified when a function_decl escapes. */
765 virtual void on_escaped_function (tree fndecl) = 0;
766
768
769 /* Hook for clients to purge state involving SVAL. */
770 virtual void purge_state_involving (const svalue *sval) = 0;
771
772 /* Hook for clients to split state with a non-standard path. */
773 virtual void bifurcate (std::unique_ptr<custom_edge_info> info) = 0;
774
775 /* Hook for clients to terminate the standard path. */
776 virtual void terminate_path () = 0;
777
778 virtual const extrinsic_state *get_ext_state () const = 0;
779
780 /* Hook for clients to access the a specific state machine in
781 any underlying program_state. */
782 virtual bool
783 get_state_map_by_name (const char *name,
785 const state_machine **out_sm,
786 unsigned *out_sm_idx,
787 std::unique_ptr<sm_context> *out_sm_context) = 0;
788
789 /* Precanned ways for clients to access specific state machines. */
791 const state_machine **out_sm,
792 unsigned *out_sm_idx,
793 std::unique_ptr<sm_context> *out_sm_context)
794 {
795 return get_state_map_by_name ("file-descriptor", out_smap, out_sm,
797 }
799 const state_machine **out_sm,
800 unsigned *out_sm_idx)
801 {
803 }
805 const state_machine **out_sm,
806 unsigned *out_sm_idx)
807 {
809 }
810
811 bool possibly_tainted_p (const svalue *sval);
812
813 /* Get the current statement, if any. */
814 virtual const gimple *get_stmt () const = 0;
815
816 virtual const exploded_graph *get_eg () const = 0;
817
818 /* Hooks for detecting infinite loops. */
819 virtual void maybe_did_work () = 0;
820 virtual bool checking_for_infinite_loop_p () const = 0;
821 virtual void on_unusable_in_infinite_loop () = 0;
822};
823
824/* A "do nothing" subclass of region_model_context. */
825
827{
828public:
829 bool warn (std::unique_ptr<pending_diagnostic>,
830 const stmt_finder *) override { return false; }
831 void add_note (std::unique_ptr<pending_note>) override;
832 void add_event (std::unique_ptr<checker_event>) override;
833 void on_svalue_leak (const svalue *) override {}
835 const region_model *) override {}
836 logger *get_logger () override { return NULL; }
839 const svalue *rhs ATTRIBUTE_UNUSED) override
840 {
841 }
843 const bounded_ranges &) override
844 {
845 }
846 void on_pop_frame (const frame_region *) override {}
848 bool is_mutable ATTRIBUTE_UNUSED) override
849 {
850 }
851 void on_phi (const gphi *phi ATTRIBUTE_UNUSED,
852 tree rhs ATTRIBUTE_UNUSED) override
853 {
854 }
855 void on_unexpected_tree_code (tree, const dump_location_t &) override {}
856
857 void on_escaped_function (tree) override {}
858
859 uncertainty_t *get_uncertainty () override { return NULL; }
860
861 void purge_state_involving (const svalue *sval ATTRIBUTE_UNUSED) override {}
862
863 void bifurcate (std::unique_ptr<custom_edge_info> info) override;
864 void terminate_path () override;
865
866 const extrinsic_state *get_ext_state () const override { return NULL; }
867
868 bool get_state_map_by_name (const char *,
869 sm_state_map **,
870 const state_machine **,
871 unsigned *,
872 std::unique_ptr<sm_context> *) override
873 {
874 return false;
875 }
876
877 const gimple *get_stmt () const override { return NULL; }
878 const exploded_graph *get_eg () const override { return NULL; }
879 void maybe_did_work () override {}
880 bool checking_for_infinite_loop_p () const override { return false; }
882};
883
884/* A subclass of region_model_context for determining if operations fail
885 e.g. "can we generate a region for the lvalue of EXPR?". */
886
888{
889public:
891
893 final override
894 {
896 }
897
898 bool had_errors_p () const { return m_num_unexpected_codes > 0; }
899
900private:
902};
903
904/* Subclass of region_model_context that wraps another context, allowing
905 for extra code to be added to the various hooks. */
906
908{
909 public:
910 bool warn (std::unique_ptr<pending_diagnostic> d,
911 const stmt_finder *custom_finder) override
912 {
913 if (m_inner)
914 return m_inner->warn (std::move (d), custom_finder);
915 else
916 return false;
917 }
918
919 void add_note (std::unique_ptr<pending_note> pn) override
920 {
921 if (m_inner)
922 m_inner->add_note (std::move (pn));
923 }
924 void add_event (std::unique_ptr<checker_event> event) override;
925
926 void on_svalue_leak (const svalue *sval) override
927 {
928 if (m_inner)
929 m_inner->on_svalue_leak (sval);
930 }
931
933 const region_model *model) override
934 {
935 if (m_inner)
937 }
938
939 logger *get_logger () override
940 {
941 if (m_inner)
942 return m_inner->get_logger ();
943 else
944 return nullptr;
945 }
946
947 void on_condition (const svalue *lhs,
948 enum tree_code op,
949 const svalue *rhs) override
950 {
951 if (m_inner)
952 m_inner->on_condition (lhs, op, rhs);
953 }
954
955 void on_bounded_ranges (const svalue &sval,
956 const bounded_ranges &ranges) override
957 {
958 if (m_inner)
960 }
961
962 void on_pop_frame (const frame_region *frame_reg) override
963 {
964 if (m_inner)
966 }
967
968 void on_unknown_change (const svalue *sval, bool is_mutable) override
969 {
970 if (m_inner)
972 }
973
974 void on_phi (const gphi *phi, tree rhs) override
975 {
976 if (m_inner)
977 m_inner->on_phi (phi, rhs);
978 }
979
981 const dump_location_t &loc) override
982 {
983 if (m_inner)
985 }
986
987 void on_escaped_function (tree fndecl) override
988 {
989 if (m_inner)
991 }
992
994 {
995 if (m_inner)
996 return m_inner->get_uncertainty ();
997 else
998 return nullptr;
999 }
1000
1001 void purge_state_involving (const svalue *sval) override
1002 {
1003 if (m_inner)
1005 }
1006
1007 void bifurcate (std::unique_ptr<custom_edge_info> info) override
1008 {
1009 if (m_inner)
1010 m_inner->bifurcate (std::move (info));
1011 }
1012
1013 void terminate_path () override
1014 {
1015 if (m_inner)
1017 }
1018
1019 const extrinsic_state *get_ext_state () const override
1020 {
1021 if (m_inner)
1022 return m_inner->get_ext_state ();
1023 else
1024 return nullptr;
1025 }
1026
1027 bool get_state_map_by_name (const char *name,
1029 const state_machine **out_sm,
1030 unsigned *out_sm_idx,
1031 std::unique_ptr<sm_context> *out_sm_context)
1032 override
1033 {
1034 if (m_inner)
1037 else
1038 return false;
1039 }
1040
1041 const gimple *get_stmt () const override
1042 {
1043 if (m_inner)
1044 return m_inner->get_stmt ();
1045 else
1046 return nullptr;
1047 }
1048
1049 const exploded_graph *get_eg () const override
1050 {
1051 if (m_inner)
1052 return m_inner->get_eg ();
1053 else
1054 return nullptr;
1055 }
1056
1057 void maybe_did_work () override
1058 {
1059 if (m_inner)
1061 }
1062
1063 bool checking_for_infinite_loop_p () const override
1064 {
1065 if (m_inner)
1067 return false;
1068 }
1070 {
1071 if (m_inner)
1073 }
1074
1075protected:
1077 : m_inner (inner)
1078 {
1079 }
1080
1082};
1083
1084/* Subclass of region_model_context_decorator with a hook for adding
1085 notes/events when saving diagnostics. */
1086
1088{
1089public:
1090 bool warn (std::unique_ptr<pending_diagnostic> d,
1091 const stmt_finder *custom_finder) override
1092 {
1093 if (m_inner)
1094 if (m_inner->warn (std::move (d), custom_finder))
1095 {
1096 add_annotations ();
1097 return true;
1098 }
1099 return false;
1100 }
1101
1102 /* Hook to add new event(s)/note(s) */
1103 virtual void add_annotations () = 0;
1104
1105protected:
1110};
1111
1112/* A bundle of data for use when attempting to merge two region_model
1113 instances to make a third. */
1114
1160
1161/* A record that can (optionally) be written out when
1162 region_model::add_constraint fails. */
1163
1165{
1166public:
1168 virtual void dump_to_pp (pretty_printer *pp) const = 0;
1169
1170 const region_model &get_model () const { return m_model; }
1171
1172protected:
1176
1178};
1179
1181{
1182public:
1184 tree lhs, enum tree_code op, tree rhs)
1186 m_lhs (lhs), m_op (op), m_rhs (rhs)
1187 {}
1188
1189 void dump_to_pp (pretty_printer *pp) const final override;
1190
1194};
1195
1197{
1198public:
1202
1203 void dump_to_pp (pretty_printer *pp) const final override;
1204};
1205
1207{
1208public:
1214
1215 void dump_to_pp (pretty_printer *pp) const final override;
1216
1217private:
1220};
1221
1222/* A bundle of state. */
1223
1241
1242} // namespace ana
1243
1244extern void debug (const region_model &rmodel);
1245
1246namespace ana {
1247
1248#if CHECKING_P
1249
1250namespace selftest {
1251
1252using namespace ::selftest;
1253
1254/* An implementation of region_model_context for use in selftests, which
1255 stores any pending_diagnostic instances passed to it. */
1256
1258{
1259public:
1260 bool warn (std::unique_ptr<pending_diagnostic> d,
1261 const stmt_finder *) final override
1262 {
1263 m_diagnostics.safe_push (d.release ());
1264 return true;
1265 }
1266
1267 unsigned get_num_diagnostics () const { return m_diagnostics.length (); }
1268
1269 void on_unexpected_tree_code (tree t, const dump_location_t &)
1270 final override
1271 {
1272 internal_error ("unhandled tree code: %qs",
1274 }
1275
1276private:
1277 /* Implicitly delete any diagnostics in the dtor. */
1279};
1280
1281/* Attempt to add the constraint (LHS OP RHS) to MODEL.
1282 Verify that MODEL remains satisfiable. */
1283
1284#define ADD_SAT_CONSTRAINT(MODEL, LHS, OP, RHS) \
1285 SELFTEST_BEGIN_STMT \
1286 bool sat = (MODEL).add_constraint (LHS, OP, RHS, NULL); \
1287 ASSERT_TRUE (sat); \
1288 SELFTEST_END_STMT
1289
1290/* Attempt to add the constraint (LHS OP RHS) to MODEL.
1291 Verify that the result is not satisfiable. */
1292
1293#define ADD_UNSAT_CONSTRAINT(MODEL, LHS, OP, RHS) \
1294 SELFTEST_BEGIN_STMT \
1295 bool sat = (MODEL).add_constraint (LHS, OP, RHS, NULL); \
1296 ASSERT_FALSE (sat); \
1297 SELFTEST_END_STMT
1298
1299/* Implementation detail of the ASSERT_CONDITION_* macros. */
1300
1301void assert_condition (const location &loc,
1303 const svalue *lhs, tree_code op, const svalue *rhs,
1305
1306void assert_condition (const location &loc,
1308 tree lhs, tree_code op, tree rhs,
1310
1311/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1312 as "true". */
1313
1314#define ASSERT_CONDITION_TRUE(REGION_MODEL, LHS, OP, RHS) \
1315 SELFTEST_BEGIN_STMT \
1316 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1317 tristate (tristate::TS_TRUE)); \
1318 SELFTEST_END_STMT
1319
1320/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1321 as "false". */
1322
1323#define ASSERT_CONDITION_FALSE(REGION_MODEL, LHS, OP, RHS) \
1324 SELFTEST_BEGIN_STMT \
1325 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1326 tristate (tristate::TS_FALSE)); \
1327 SELFTEST_END_STMT
1328
1329/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1330 as "unknown". */
1331
1332#define ASSERT_CONDITION_UNKNOWN(REGION_MODEL, LHS, OP, RHS) \
1333 SELFTEST_BEGIN_STMT \
1334 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1335 tristate (tristate::TS_UNKNOWN)); \
1336 SELFTEST_END_STMT
1337
1338} /* end of namespace selftest. */
1339
1340#endif /* #if CHECKING_P */
1341
1342} // namespace ana
1343
1344#endif /* GCC_ANALYZER_REGION_MODEL_H */
Definition region-model.h:1088
virtual void add_annotations()=0
annotating_context(region_model_context *inner)
Definition region-model.h:1106
bool warn(std::unique_ptr< pending_diagnostic > d, const stmt_finder *custom_finder) override
Definition region-model.h:1090
Definition svalue.h:1496
Definition svalue.h:722
Definition svalue.h:985
Definition constraint-manager.h:175
Definition analyzer.h:298
Definition call-details.h:29
Definition call-summary.h:68
Definition supergraph.h:446
Definition supergraph.h:515
Definition svalue.h:1276
Definition svalue.h:1401
Definition svalue.h:1635
Definition svalue.h:277
Definition constraint-manager.h:408
Definition region-model.h:1225
known_function_manager * get_known_function_manager()
Definition region-model.h:1230
const supergraph * get_supergraph()
Definition region-model.h:1228
const supergraph * m_sg
Definition region-model.h:1238
region_model_manager * get_model_manager()
Definition region-model.h:1229
engine(const supergraph *sg=NULL, logger *logger=NULL)
void log_stats(logger *logger) const
region_model_manager m_mgr
Definition region-model.h:1239
Definition exploded-graph.h:791
Definition exploded-graph.h:203
Definition program-state.h:29
Definition region.h:306
Definition program-point.h:73
Definition svalue.h:595
Definition known-function-manager.h:41
Definition analyzer.h:278
Definition analyzer-logging.h:34
Definition region-model.h:827
bool get_state_map_by_name(const char *, sm_state_map **, const state_machine **, unsigned *, std::unique_ptr< sm_context > *) override
Definition region-model.h:868
bool checking_for_infinite_loop_p() const override
Definition region-model.h:880
bool warn(std::unique_ptr< pending_diagnostic >, const stmt_finder *) override
Definition region-model.h:829
void maybe_did_work() override
Definition region-model.h:879
uncertainty_t * get_uncertainty() override
Definition region-model.h:859
void on_unexpected_tree_code(tree, const dump_location_t &) override
Definition region-model.h:855
void on_unknown_change(const svalue *sval, bool is_mutable) override
Definition region-model.h:847
void on_pop_frame(const frame_region *) override
Definition region-model.h:846
void on_phi(const gphi *phi, tree rhs) override
Definition region-model.h:851
void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) override
Definition region-model.h:837
void add_event(std::unique_ptr< checker_event >) override
void on_liveness_change(const svalue_set &, const region_model *) override
Definition region-model.h:834
logger * get_logger() override
Definition region-model.h:836
void on_escaped_function(tree) override
Definition region-model.h:857
const exploded_graph * get_eg() const override
Definition region-model.h:878
const gimple * get_stmt() const override
Definition region-model.h:877
void on_unusable_in_infinite_loop() override
Definition region-model.h:881
void on_svalue_leak(const svalue *) override
Definition region-model.h:833
void add_note(std::unique_ptr< pending_note >) override
void purge_state_involving(const svalue *sval) override
Definition region-model.h:861
const extrinsic_state * get_ext_state() const override
Definition region-model.h:866
void on_bounded_ranges(const svalue &, const bounded_ranges &) override
Definition region-model.h:842
void bifurcate(std::unique_ptr< custom_edge_info > info) override
Definition region-model.h:50
void put(T src, T dst)
Definition region-model.h:79
void dump() const
Definition region-model.h:121
T get_dst_for_src(T src) const
Definition region-model.h:88
void dump_to_pp(pretty_printer *pp) const
Definition region-model.h:99
auto_vec< T > m_src_to_dst
Definition region-model.h:60
void update(T *) const
Definition region-model.h:133
one_way_id_map(int num_ids)
Definition region-model.h:68
Definition analyzer.h:154
Definition svalue.h:1120
Definition svalue.h:409
Definition program-point.h:175
const function_point & get_function_point() const
Definition program-point.h:202
Definition program-state.h:203
Definition region-model.h:908
region_model_context * m_inner
Definition region-model.h:1081
const exploded_graph * get_eg() const override
Definition region-model.h:1049
void on_bounded_ranges(const svalue &sval, const bounded_ranges &ranges) override
Definition region-model.h:955
void on_phi(const gphi *phi, tree rhs) override
Definition region-model.h:974
void add_event(std::unique_ptr< checker_event > event) override
const extrinsic_state * get_ext_state() const override
Definition region-model.h:1019
void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) override
Definition region-model.h:947
const gimple * get_stmt() const override
Definition region-model.h:1041
void maybe_did_work() override
Definition region-model.h:1057
void on_pop_frame(const frame_region *frame_reg) override
Definition region-model.h:962
uncertainty_t * get_uncertainty() override
Definition region-model.h:993
void bifurcate(std::unique_ptr< custom_edge_info > info) override
Definition region-model.h:1007
void add_note(std::unique_ptr< pending_note > pn) override
Definition region-model.h:919
void on_svalue_leak(const svalue *sval) override
Definition region-model.h:926
bool checking_for_infinite_loop_p() const override
Definition region-model.h:1063
logger * get_logger() override
Definition region-model.h:939
region_model_context_decorator(region_model_context *inner)
Definition region-model.h:1076
void purge_state_involving(const svalue *sval) override
Definition region-model.h:1001
void on_liveness_change(const svalue_set &live_svalues, const region_model *model) override
Definition region-model.h:932
bool warn(std::unique_ptr< pending_diagnostic > d, const stmt_finder *custom_finder) override
Definition region-model.h:910
void on_unexpected_tree_code(tree t, const dump_location_t &loc) override
Definition region-model.h:980
void on_escaped_function(tree fndecl) override
Definition region-model.h:987
void terminate_path() override
Definition region-model.h:1013
void on_unknown_change(const svalue *sval, bool is_mutable) override
Definition region-model.h:968
void on_unusable_in_infinite_loop() override
Definition region-model.h:1069
bool get_state_map_by_name(const char *name, sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx, std::unique_ptr< sm_context > *out_sm_context) override
Definition region-model.h:1027
Definition region-model.h:702
virtual void on_bounded_ranges(const svalue &sval, const bounded_ranges &ranges)=0
virtual void bifurcate(std::unique_ptr< custom_edge_info > info)=0
virtual void purge_state_involving(const svalue *sval)=0
virtual void on_escaped_function(tree fndecl)=0
virtual bool warn(std::unique_ptr< pending_diagnostic > d, const stmt_finder *custom_finder=NULL)=0
bool get_malloc_map(sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx)
Definition region-model.h:798
virtual void on_pop_frame(const frame_region *)=0
virtual void on_liveness_change(const svalue_set &live_svalues, const region_model *model)=0
bool get_fd_map(sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx, std::unique_ptr< sm_context > *out_sm_context)
Definition region-model.h:790
virtual void add_note(std::unique_ptr< pending_note > pn)=0
virtual logger * get_logger()=0
virtual const extrinsic_state * get_ext_state() const =0
bool possibly_tainted_p(const svalue *sval)
virtual void on_unexpected_tree_code(tree t, const dump_location_t &loc)=0
virtual void on_phi(const gphi *phi, tree rhs)=0
bool get_taint_map(sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx)
Definition region-model.h:804
virtual void on_svalue_leak(const svalue *sval)=0
virtual void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs)=0
virtual void on_unusable_in_infinite_loop()=0
virtual const exploded_graph * get_eg() const =0
virtual void on_unknown_change(const svalue *sval, bool is_mutable)=0
virtual const gimple * get_stmt() const =0
virtual uncertainty_t * get_uncertainty()=0
virtual bool checking_for_infinite_loop_p() const =0
virtual void terminate_path()=0
virtual bool get_state_map_by_name(const char *name, sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx, std::unique_ptr< sm_context > *out_sm_context)=0
virtual void add_event(std::unique_ptr< checker_event > event)=0
virtual void maybe_did_work()=0
Definition region-model-manager.h:32
bounded_ranges_manager * get_range_manager() const
Definition region-model-manager.h:151
known_function_manager * get_known_function_manager()
Definition region-model-manager.h:153
Definition region-model.h:258
void pop_frame(tree result_lvalue, const svalue **out_result, region_model_context *ctxt, bool eval_return_svalue=true)
region_model(const region_model &other)
void impl_deallocation_call(const call_details &cd)
void update_for_phis(const supernode *snode, const cfg_superedge *last_cfg_superedge, region_model_context *ctxt)
void update_for_zero_return(const call_details &cd, bool unmergeable)
bool add_constraint(tree lhs, enum tree_code op, tree rhs, region_model_context *ctxt)
store * get_store()
Definition region-model.h:443
constraint_manager * get_constraints()
Definition region-model.h:438
void update_for_nonzero_return(const call_details &cd)
bool on_call_pre(const gcall *stmt, region_model_context *ctxt)
bool add_constraint(tree lhs, enum tree_code op, tree rhs, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out)
void dump(FILE *fp, bool simple, bool multiline) const
bool replay_call_summary(call_summary_replay &r, const region_model &summary)
void update_for_gcall(const gcall *call_stmt, region_model_context *ctxt, function *callee=NULL)
bool apply_constraints_for_gcond(const cfg_superedge &edge, const gcond *cond_stmt, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out)
bool apply_constraints_for_gswitch(const switch_cfg_superedge &edge, const gswitch *switch_stmt, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out)
void check_region_size(const region *lhs_reg, const svalue *rhs_sval, region_model_context *ctxt) const
void zero_fill_region(const region *reg, region_model_context *ctxt)
path_var get_representative_path_var(const svalue *sval, svalue_set *visited) const
void on_asm_stmt(const gasm *asm_stmt, region_model_context *ctxt)
bool check_region_access(const region *reg, enum access_direction dir, const svalue *sval_hint, region_model_context *ctxt) const
bool can_merge_with_p(const region_model &other_model, const program_point &point, region_model *out_model, const extrinsic_state *ext_state=NULL, const program_state *state_a=NULL, const program_state *state_b=NULL) const
void check_one_function_attr_null_terminated_string_arg(const gcall *call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx, tree attr)
bounded_ranges_manager * get_range_manager() const
Definition region-model.h:458
void dump(bool simple) const
tree get_representative_tree(const region *reg) const
path_var get_representative_path_var(const region *reg, svalue_set *visited) const
static void append_regions_cb(const region *base_reg, struct append_regions_cb_data *data)
const region * deref_rvalue(const svalue *ptr_sval, tree ptr_tree, region_model_context *ctxt, bool add_nonnull_constraint=true) const
void debug() const
void on_realloc_with_move(const call_details &cd, const svalue *old_ptr_sval, const svalue *new_ptr_sval)
constraint_manager * m_constraints
Definition region-model.h:682
const svalue * check_for_null_terminated_string_arg(const call_details &cd, unsigned idx) const
void set_errno(const call_details &cd)
void set_dynamic_extents(const region *reg, const svalue *size_in_bytes, region_model_context *ctxt)
void update_for_return_superedge(const return_superedge &return_edge, region_model_context *ctxt)
void check_region_for_write(const region *dest_reg, const svalue *sval_hint, region_model_context *ctxt) const
const svalue * get_dynamic_extents(const region *reg) const
void clobber_region(const region *reg)
void dump_to_pp(pretty_printer *pp, bool simple, bool multiline) const
void transition_ptr_sval_non_null(region_model_context *ctxt, const svalue *new_ptr_sval)
const svalue * get_rvalue_1(path_var pv, region_model_context *ctxt) const
tristate eval_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) const
const svalue * check_for_null_terminated_string_arg(const call_details &cd, unsigned idx, bool include_terminator, const svalue **out_sval) const
void mark_as_tainted(const svalue *sval, region_model_context *ctxt)
const svalue * get_capacity(const region *reg) const
path_var get_representative_path_var_1(const region *reg, svalue_set *visited) const
bool add_constraint(const svalue *lhs, enum tree_code op, const svalue *rhs, region_model_context *ctxt)
tree get_representative_tree(const svalue *sval) const
void check_function_attrs(const gcall *call, tree callee_fndecl, region_model_context *ctxt)
void on_assignment(const gassign *stmt, region_model_context *ctxt)
tristate symbolic_greater_than(const binop_svalue *a, const svalue *b) const
region_model & operator=(const region_model &other)
const frame_region * get_frame_at_index(int index) const
store m_store
Definition region-model.h:680
void print(pretty_printer *pp) const
const region * create_region_for_alloca(const svalue *size_in_bytes, region_model_context *ctxt)
void purge_region(const region *reg)
void validate() const
bool operator!=(const region_model &other) const
Definition region-model.h:268
const svalue * get_store_value(const region *reg, region_model_context *ctxt) const
const region * get_region_for_poisoned_expr(tree expr) const
hashval_t hash() const
void get_regions_for_current_frame(auto_vec< const decl_region * > *out) const
const svalue * get_rvalue_for_bits(tree type, const region *reg, const bit_range &bits, region_model_context *ctxt) const
const svalue * get_initial_value_for_global(const region *reg) const
tristate compare_initial_and_pointer(const initial_svalue *init, const region_svalue *ptr) const
const function * get_current_function() const
const svalue * get_store_bytes(const region *base_reg, const byte_range &bytes, region_model_context *ctxt) const
static void register_pop_frame_callback(const pop_frame_callback &callback)
Definition region-model.h:555
bool apply_constraints_for_ggoto(const cfg_superedge &edge, const ggoto *goto_stmt, region_model_context *ctxt)
tree get_fndecl_for_call(const gcall *call, region_model_context *ctxt)
void loop_replay_fixup(const region_model *dst_state)
void check_dynamic_size_for_floats(const svalue *size_in_bytes, region_model_context *ctxt) const
bool operator==(const region_model &other) const
bool region_exists_p(const region *reg) const
region_model(region_model_manager *mgr)
const svalue * maybe_get_copy_bounds(const region *src_reg, const svalue *num_bytes_sval)
region_to_value_map dynamic_extents_t
Definition region-model.h:260
tristate eval_condition(tree lhs, enum tree_code op, tree rhs, region_model_context *ctxt) const
const svalue * scan_for_null_terminator_1(const region *reg, tree expr, const svalue **out_sval, region_model_context *ctxt) const
void check_function_attr_null_terminated_string_arg(const gcall *call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx)
bool called_from_main_p() const
bool add_constraints_from_binop(const svalue *outer_lhs, enum tree_code outer_op, const svalue *outer_rhs, bool *out, region_model_context *ctxt)
void set_value(const region *lhs_reg, const svalue *rhs_sval, region_model_context *ctxt)
void on_return(const greturn *stmt, region_model_context *ctxt)
void get_reachable_svalues(svalue_set *out, const svalue *extra_sval, const uncertainty_t *uncertainty)
void update_for_call_superedge(const call_superedge &call_edge, region_model_context *ctxt)
bool apply_constraints_for_exception(const gimple *last_stmt, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out)
tristate structural_equality(const svalue *a, const svalue *b) const
void copy_bytes(const region *dest_reg, const region *src_reg, tree src_ptr_expr, const svalue *num_bytes_sval, region_model_context *ctxt)
const frame_region * get_current_frame() const
Definition region-model.h:352
void on_setjmp(const gcall *stmt, const exploded_node *enode, region_model_context *ctxt)
region_model_manager *const m_mgr
Definition region-model.h:678
const frame_region * m_current_frame
Definition region-model.h:684
void check_region_for_taint(const region *reg, enum access_direction dir, region_model_context *ctxt) const
void on_top_level_param(tree param, bool nonnull, region_model_context *ctxt)
const builtin_known_function * get_builtin_kf(const gcall *call, region_model_context *ctxt=NULL) const
bool maybe_update_for_edge(const superedge &edge, const gimple *last_stmt, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out)
void mark_region_as_unknown(const region *reg, uncertainty_t *uncertainty)
void on_stmt_pre(const gimple *stmt, bool *out_unknown_side_effects, region_model_context *ctxt)
void check_call_format_attr(const call_details &cd, tree format_attr) const
void set_value(tree lhs, tree rhs, region_model_context *ctxt)
bool check_region_for_read(const region *src_reg, region_model_context *ctxt) const
void maybe_complain_about_infoleak(const region *dst_reg, const svalue *copied_sval, const region *src_reg, region_model_context *ctxt)
void handle_unrecognized_call(const gcall *call, region_model_context *ctxt)
region_model_manager * get_manager() const
Definition region-model.h:457
const known_function * get_known_function(tree fndecl, const call_details &cd) const
void handle_phi(const gphi *phi, tree lhs, tree rhs, const region_model &old_state, hash_set< const svalue * > &svals_changing_meaning, region_model_context *ctxt)
path_var get_representative_path_var_1(const svalue *sval, svalue_set *visited) const
void on_call_post(const gcall *stmt, bool unknown_side_effects, region_model_context *ctxt)
void write_bytes(const region *dest_reg, const svalue *num_bytes_sval, const svalue *sval, region_model_context *ctxt)
void unset_dynamic_extents(const region *reg)
const region * push_frame(const function &fun, const vec< const svalue * > *arg_sids, region_model_context *ctxt)
void check_for_writable_region(const region *dest_reg, region_model_context *ctxt) const
const region * get_lvalue_1(path_var pv, region_model_context *ctxt) const
const known_function * get_known_function(enum internal_fn) const
const region * get_lvalue(path_var pv, region_model_context *ctxt) const
void get_referenced_base_regions(auto_bitmap &out_ids) const
void update_for_int_cst_return(const call_details &cd, int retval, bool unmergeable)
const svalue * check_for_poison(const svalue *sval, tree expr, const region *src_region, region_model_context *ctxt) const
int get_stack_depth() const
json::object * to_json() const
bool check_region_bounds(const region *reg, enum access_direction dir, const svalue *sval_hint, region_model_context *ctxt) const
void check_call_args(const call_details &cd) const
void fill_region(const region *reg, const svalue *sval, region_model_context *ctxt)
void check_dynamic_size_for_taint(enum memory_space mem_space, const svalue *size_in_bytes, region_model_context *ctxt) const
bool check_symbolic_bounds(const region *base_reg, const svalue *sym_byte_offset, const svalue *num_bytes_sval, const svalue *capacity, enum access_direction dir, const svalue *sval_hint, region_model_context *ctxt) const
void mark_as_valid_fd(const svalue *sval, region_model_context *ctxt)
void check_function_attr_access(const gcall *call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx) const
const svalue * get_rvalue(path_var pv, region_model_context *ctxt) const
const store * get_store() const
Definition region-model.h:444
static void notify_on_pop_frame(const region_model *model, const region_model *prev_model, const svalue *retval, region_model_context *ctxt)
Definition region-model.h:561
dynamic_extents_t m_dynamic_extents
Definition region-model.h:690
static auto_vec< pop_frame_callback > pop_frame_callbacks
Definition region-model.h:676
int poison_any_pointers_to_descendents(const region *reg, enum poison_kind pkind)
const region * get_lvalue(tree expr, region_model_context *ctxt) const
const svalue * get_gassign_result(const gassign *assign, region_model_context *ctxt)
const svalue * read_bytes(const region *src_reg, tree src_ptr_expr, const svalue *num_bytes_sval, region_model_context *ctxt) const
const svalue * scan_for_null_terminator(const region *reg, tree expr, const svalue **out_sval, region_model_context *ctxt) const
void update_for_return_gcall(const gcall *call_stmt, region_model_context *ctxt)
const region * get_or_create_region_for_heap_alloc(const svalue *size_in_bytes, region_model_context *ctxt, bool update_state_machine=false, const call_details *cd=nullptr)
const svalue * get_rvalue(tree expr, region_model_context *ctxt) const
bool canonicalized_p() const
void purge_state_involving(const svalue *sval, region_model_context *ctxt)
void on_longjmp(const gcall *longjmp_call, const gcall *setjmp_call, int setjmp_stack_depth, region_model_context *ctxt)
void unbind_region_and_descendents(const region *reg, enum poison_kind pkind)
const dynamic_extents_t & get_dynamic_extents() const
Definition region-model.h:447
Definition svalue.h:197
Definition region-model.h:141
void remove(const region *reg)
Definition region-model.h:168
iterator begin() const
Definition region-model.h:157
const svalue *const * get(const region *reg) const
Definition region-model.h:160
hash_map_t::iterator iterator
Definition region-model.h:144
hash_map_t m_hash_map
Definition region-model.h:186
void purge_state_involving(const svalue *sval)
hash_map< const region *, const svalue * > hash_map_t
Definition region-model.h:143
bool operator==(const region_to_value_map &other) const
iterator end() const
Definition region-model.h:158
void put(const region *reg, const svalue *sval)
Definition region-model.h:164
bool is_empty() const
Definition region-model.h:173
region_to_value_map & operator=(const region_to_value_map &other)
region_to_value_map()
Definition region-model.h:146
void dump_to_pp(pretty_printer *pp, bool simple, bool multiline) const
bool operator!=(const region_to_value_map &other) const
Definition region-model.h:152
void dump(bool simple) const
bool can_merge_with_p(const region_to_value_map &other, region_to_value_map *out) const
region_to_value_map(const region_to_value_map &other)
Definition region-model.h:147
json::object * to_json() const
Definition region.h:125
Definition region-model.h:1165
virtual ~rejected_constraint()
Definition region-model.h:1167
virtual void dump_to_pp(pretty_printer *pp) const =0
rejected_constraint(const region_model &model)
Definition region-model.h:1173
const region_model & get_model() const
Definition region-model.h:1170
region_model m_model
Definition region-model.h:1177
Definition region-model.h:1197
void dump_to_pp(pretty_printer *pp) const final override
rejected_default_case(const region_model &model)
Definition region-model.h:1199
Definition region-model.h:1181
tree m_rhs
Definition region-model.h:1193
rejected_op_constraint(const region_model &model, tree lhs, enum tree_code op, tree rhs)
Definition region-model.h:1183
tree m_lhs
Definition region-model.h:1191
void dump_to_pp(pretty_printer *pp) const final override
enum tree_code m_op
Definition region-model.h:1192
Definition region-model.h:1207
void dump_to_pp(pretty_printer *pp) const final override
tree m_expr
Definition region-model.h:1218
const bounded_ranges * m_ranges
Definition region-model.h:1219
rejected_ranges_constraint(const region_model &model, tree expr, const bounded_ranges *ranges)
Definition region-model.h:1209
Definition svalue.h:896
Definition supergraph.h:482
Definition svalue.h:516
Definition program-state.h:75
Definition sm.h:40
Definition exploded-graph.h:1033
Definition store.h:726
Definition svalue.h:817
Definition supergraph.h:314
Definition supergraph.h:109
Definition supergraph.h:235
Definition svalue.h:90
Definition supergraph.h:557
Definition region-model.h:888
int m_num_unexpected_codes
Definition region-model.h:901
bool had_errors_p() const
Definition region-model.h:898
void on_unexpected_tree_code(tree, const dump_location_t &) final override
Definition region-model.h:892
tentative_region_model_context()
Definition region-model.h:890
Definition svalue.h:636
Definition store.h:159
Definition svalue.h:366
Definition svalue.h:1080
Definition region-model.h:217
virtual void visit_unknown_svalue(const unknown_svalue *)
Definition region-model.h:221
virtual void visit_poisoned_svalue(const poisoned_svalue *)
Definition region-model.h:222
virtual void visit_asm_output_svalue(const asm_output_svalue *)
Definition region-model.h:235
virtual void visit_unaryop_svalue(const unaryop_svalue *)
Definition region-model.h:225
virtual void visit_region_svalue(const region_svalue *)
Definition region-model.h:219
virtual void visit_initial_svalue(const initial_svalue *)
Definition region-model.h:224
virtual void visit_sub_svalue(const sub_svalue *)
Definition region-model.h:227
virtual void visit_setjmp_svalue(const setjmp_svalue *)
Definition region-model.h:223
virtual void visit_conjured_svalue(const conjured_svalue *)
Definition region-model.h:234
virtual void visit_placeholder_svalue(const placeholder_svalue *)
Definition region-model.h:231
virtual void visit_binop_svalue(const binop_svalue *)
Definition region-model.h:226
virtual void visit_const_fn_result_svalue(const const_fn_result_svalue *)
Definition region-model.h:236
virtual void visit_compound_svalue(const compound_svalue *)
Definition region-model.h:233
virtual void visit_unmergeable_svalue(const unmergeable_svalue *)
Definition region-model.h:230
virtual void visit_widening_svalue(const widening_svalue *)
Definition region-model.h:232
virtual void visit_bits_within_svalue(const bits_within_svalue *)
Definition region-model.h:229
virtual void visit_constant_svalue(const constant_svalue *)
Definition region-model.h:220
virtual void visit_region(const region *)
Definition region-model.h:238
virtual void visit_repeated_svalue(const repeated_svalue *)
Definition region-model.h:228
Definition svalue.h:1161
Definition bitmap.h:950
Definition vec.h:1802
Definition vec.h:1656
Definition genoutput.cc:147
Definition dumpfile.h:446
Definition genmatch.cc:845
Definition ree.cc:583
Definition hash-map.h:40
bool is_empty() const
Definition hash-map.h:252
iterator begin() const
Definition hash-map.h:302
void remove(const Key &k)
Definition hash-map.h:218
iterator end() const
Definition hash-map.h:303
bool put(const Key &k, const Value &v)
Definition hash-map.h:168
Definition inchash.h:38
Definition json.h:95
FILE * stream
Definition pretty-print.h:120
Definition pretty-print.h:244
output_buffer * buffer
Definition pretty-print.h:256
Definition tristate.h:26
bool debug
Definition collect-utils.cc:34
class edge_def * edge
Definition coretypes.h:342
union tree_node * tree
Definition coretypes.h:97
void internal_error(const char *,...) ATTRIBUTE_GCC_DIAG(1
internal_fn
Definition genmatch.cc:360
tree_code
Definition genmatch.cc:347
T * ggc_alloc(ALONE_CXX_MEM_STAT_INFO)
Definition ggc.h:184
Definition access-diagram.h:30
access_direction
Definition analyzer.h:354
poison_kind
Definition svalue.h:389
void(* pop_frame_callback)(const region_model *model, const region_model *prev_model, const svalue *retval, region_model_context *ctxt)
Definition region-model.h:243
memory_space
Definition region.h:31
Definition fold-const.cc:4229
void add_path_var(path_var pv, hash &hstate)
Definition dump-context.h:31
poly_int< N, C > r
Definition poly-int.h:770
i
Definition poly-int.h:772
Ca const poly_int< N, Cb > & b
Definition poly-int.h:767
Ca & a
Definition poly-int.h:766
void pp_flush(pretty_printer *pp)
Definition pretty-print.cc:1960
void pp_newline(pretty_printer *pp)
Definition pretty-print.cc:2208
void pp_string(pretty_printer *pp, const char *str)
Definition pretty-print.cc:2235
Definition store.h:231
Definition constraint-manager.h:120
Definition store.h:307
Definition region-model.h:1116
const program_point & m_point
Definition region-model.h:1151
const program_state * m_state_a
Definition region-model.h:1155
const region_model * m_model_a
Definition region-model.h:1149
const extrinsic_state * m_ext_state
Definition region-model.h:1154
hash_set< const svalue * > m_svals_changing_meaning
Definition region-model.h:1158
void dump_to_pp(pretty_printer *pp, bool simple) const
model_merger(const region_model *model_a, const region_model *model_b, const program_point &point, region_model *merged_model, const extrinsic_state *ext_state, const program_state *state_a, const program_state *state_b)
Definition region-model.h:1117
const program_state * m_state_b
Definition region-model.h:1156
bool mergeable_svalue_p(const svalue *) const
void dump(bool simple) const
region_model_manager * get_manager() const
Definition region-model.h:1136
void on_widening_reuse(const widening_svalue *widening_sval)
region_model * m_merged_model
Definition region-model.h:1152
void dump(FILE *fp, bool simple) const
const function_point & get_function_point() const
Definition region-model.h:1142
const region_model * m_model_b
Definition region-model.h:1150
Definition region-model.h:195
int m_num_equiv_classes
Definition region-model.h:207
int m_num_bounded_ranges_constraints
Definition region-model.h:209
int m_num_client_items
Definition region-model.h:210
int m_num_svalues
Definition region-model.h:205
purge_stats()
Definition region-model.h:196
int m_num_constraints
Definition region-model.h:208
int m_num_regions
Definition region-model.h:206
Definition function.h:249
Definition gimple.h:550
Definition gimple.h:904
Definition gimple.h:353
Definition gimple.h:858
Definition gimple.h:877
Definition gimple.h:225
Definition gimple.h:462
Definition gimple.h:914
Definition gimple.h:895
Definition gengtype.h:252
Definition vec.h:450
#define NULL
Definition system.h:50
#define DEBUG_FUNCTION
Definition system.h:1242
static bitmap visited
Definition tree-ssa-dce.cc:536
static control_dependences * cd
Definition tree-ssa-dce.cc:102
const char * get_tree_code_name(enum tree_code code)
Definition tree.cc:12775
#define TREE_CODE(NODE)
Definition tree.h:324
tree size_in_bytes(const_tree t)
Definition tree.h:5089
#define FOR_EACH_VEC_ELT(V, I, P)
Definition vec.h:1884