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-2026 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"
39#include "text-art/widget.h"
40#include "text-art/dump.h"
41
42using namespace ana;
43
44namespace inchash
45{
46 extern void add_path_var (path_var pv, hash &hstate);
47} // namespace inchash
48
49namespace ana {
50
51template <typename T>
53{
54 public:
55 one_way_id_map (int num_ids);
56 void put (T src, T dst);
57 T get_dst_for_src (T src) const;
58 void dump_to_pp (pretty_printer *pp) const;
59 void dump () const;
60 void update (T *) const;
61
62 private:
64 };
65
66/* class one_way_id_map. */
67
68/* one_way_id_map's ctor, which populates the map with dummy null values. */
69
70template <typename T>
71inline one_way_id_map<T>::one_way_id_map (int num_svalues)
72: m_src_to_dst (num_svalues)
73{
74 for (int i = 0; i < num_svalues; i++)
75 m_src_to_dst.quick_push (T::null ());
76}
77
78/* Record that SRC is to be mapped to DST. */
79
80template <typename T>
81inline void
83{
84 m_src_to_dst[src.as_int ()] = dst;
85}
86
87/* Get the new value for SRC within the map. */
88
89template <typename T>
90inline T
92{
93 if (src.null_p ())
94 return src;
95 return m_src_to_dst[src.as_int ()];
96}
97
98/* Dump this map to PP. */
99
100template <typename T>
101inline void
103{
104 pp_string (pp, "src to dst: {");
105 unsigned i;
106 T *dst;
108 {
109 if (i > 0)
110 pp_string (pp, ", ");
111 T src (T::from_int (i));
112 src.print (pp);
113 pp_string (pp, " -> ");
114 dst->print (pp);
115 }
116 pp_string (pp, "}");
117 pp_newline (pp);
118}
119
120/* Dump this map to stderr. */
121
122template <typename T>
123DEBUG_FUNCTION inline void
125{
127 pp.set_output_stream (stderr);
128 dump_to_pp (&pp);
129 pp_flush (&pp);
130}
131
132/* Update *ID from the old value to its new value in this map. */
133
134template <typename T>
135inline void
137{
138 *id = get_dst_for_src (*id);
139}
140
141/* A mapping from region to svalue for use when tracking state. */
142
144{
145public:
147 typedef hash_map_t::iterator iterator;
148
153
154 bool operator== (const region_to_value_map &other) const;
155 bool operator!= (const region_to_value_map &other) const
156 {
157 return !(*this == other);
158 }
159
160 iterator begin () const { return m_hash_map.begin (); }
161 iterator end () const { return m_hash_map.end (); }
162
163 const svalue * const *get (const region *reg) const
164 {
165 return const_cast <hash_map_t &> (m_hash_map).get (reg);
166 }
167 void put (const region *reg, const svalue *sval)
168 {
169 m_hash_map.put (reg, sval);
170 }
171 void remove (const region *reg)
172 {
173 m_hash_map.remove (reg);
174 }
175
176 bool is_empty () const { return m_hash_map.is_empty (); }
177
178 void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
179 void dump (bool simple) const;
180
181 std::unique_ptr<json::object> to_json () const;
182
183 std::unique_ptr<text_art::tree_widget>
185
187 region_to_value_map *out) const;
188
189 void purge_state_involving (const svalue *sval);
190
191private:
193};
194
195/* Various operations delete information from a region_model.
196
197 This struct tracks how many of each kind of entity were purged (e.g.
198 for selftests, and for debugging). */
199
218
219/* A base class for visiting regions and svalues, with do-nothing
220 base implementations of the per-subclass vfuncs. */
221
223{
224public:
225 virtual void visit_region_svalue (const region_svalue *) {}
226 virtual void visit_constant_svalue (const constant_svalue *) {}
227 virtual void visit_unknown_svalue (const unknown_svalue *) {}
228 virtual void visit_poisoned_svalue (const poisoned_svalue *) {}
229 virtual void visit_setjmp_svalue (const setjmp_svalue *) {}
230 virtual void visit_initial_svalue (const initial_svalue *) {}
231 virtual void visit_unaryop_svalue (const unaryop_svalue *) {}
232 virtual void visit_binop_svalue (const binop_svalue *) {}
233 virtual void visit_sub_svalue (const sub_svalue *) {}
234 virtual void visit_repeated_svalue (const repeated_svalue *) {}
238 virtual void visit_widening_svalue (const widening_svalue *) {}
239 virtual void visit_compound_svalue (const compound_svalue *) {}
240 virtual void visit_conjured_svalue (const conjured_svalue *) {}
243
244 virtual void visit_region (const region *) {}
245};
246
247struct append_regions_cb_data;
248
249/* Roughly equivalent to a struct __cxa_exception, except we store a std::vector
250 rather than a linked list. */
251
253{
254 exception_node (const svalue *exception_sval,
255 const svalue *typeinfo_sval,
256 const svalue *destructor_sval)
257 : m_exception_sval (exception_sval),
258 m_typeinfo_sval (typeinfo_sval),
259 m_destructor_sval (destructor_sval)
260 {
261 }
262
263 bool operator== (const exception_node &other) const;
264
265 void dump_to_pp (pretty_printer *pp, bool simple) const;
266 void dump (FILE *fp, bool simple) const;
267 void dump (bool simple) const;
268 void dump () const;
269
270 std::unique_ptr<json::object> to_json () const;
271
272 std::unique_ptr<text_art::tree_widget>
274
276
278
282};
283
284/* A region_model encapsulates a representation of the state of memory, with
285 a tree of regions, along with their associated values.
286 The representation is graph-like because values can be pointers to
287 regions.
288 It also stores:
289 - a constraint_manager, capturing relationships between the values, and
290 - dynamic extents, mapping dynamically-allocated regions to svalues (their
291 capacities). */
292
294{
295 public:
297
302
303 bool operator== (const region_model &other) const;
304 bool operator!= (const region_model &other) const
305 {
306 return !(*this == other);
307 }
308
309 hashval_t hash () const;
310
311 void print (pretty_printer *pp) const;
312
313 void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
314 void dump (FILE *fp, bool simple, bool multiline) const;
315 void dump (bool simple) const;
316 void dump () const;
317
318 void debug () const;
319
320 std::unique_ptr<json::object> to_json () const;
321
322 std::unique_ptr<text_art::tree_widget>
324
325 void validate () const;
326
328 bool canonicalized_p () const;
329
330 void
332 bool *out_unknown_side_effects,
334
336 const svalue *get_gassign_result (const gassign *assign,
338 void on_asm_stmt (const gasm *asm_stmt, region_model_context *ctxt);
340 void on_call_post (const gcall &stmt,
341 bool unknown_side_effects,
343
345
347
348 const svalue *maybe_get_copy_bounds (const region *src_reg,
349 const svalue *num_bytes_sval);
351 int retval,
352 bool unmergeable);
354 bool unmergeable);
356
360 const svalue *extra_sval,
361 const uncertainty_t *uncertainty);
362
364 void on_setjmp (const gcall &stmt,
365 const exploded_node &enode,
366 const superedge &sedge,
368 void on_longjmp (const gcall &longjmp_call, const gcall &setjmp_call,
369 int setjmp_stack_depth, region_model_context *ctxt);
370
371 void update_for_gcall (const gcall &call_stmt,
373 function *callee = nullptr);
374
375 void update_for_return_gcall (const gcall &call_stmt,
377
378 const region *push_frame (const function &fun,
379 const gcall *call_stmt,
380 const vec<const svalue *> *arg_sids,
384 void pop_frame (tree result_lvalue,
385 const svalue **out_result,
387 const gcall *call_stmt,
388 bool eval_return_svalue = true);
389 int get_stack_depth () const;
390 const frame_region *get_frame_at_index (int index) const;
391
396
397 const region *deref_rvalue (const svalue *ptr_sval, tree ptr_tree,
399 bool add_nonnull_constraint = true) const;
400
402 const region *reg,
403 const bit_range &bits,
404 region_model_context *ctxt) const;
405
406 void set_value (const region *lhs_reg, const svalue *rhs_sval,
408 void set_value (tree lhs, tree rhs, region_model_context *ctxt);
409 void clobber_region (const region *reg);
410 void purge_region (const region *reg);
411 void fill_region (const region *reg,
412 const svalue *sval,
414 void zero_fill_region (const region *reg,
416 void write_bytes (const region *dest_reg,
417 const svalue *num_bytes_sval,
418 const svalue *sval,
420 const svalue *read_bytes (const region *src_reg,
421 tree src_ptr_expr,
422 const svalue *num_bytes_sval,
423 region_model_context *ctxt) const;
424 void copy_bytes (const region *dest_reg,
425 const region *src_reg,
426 tree src_ptr_expr,
427 const svalue *num_bytes_sval,
429 void mark_region_as_unknown (const region *reg, uncertainty_t *uncertainty);
430
432 enum tree_code op,
433 const svalue *rhs) const;
435 const region_svalue *ptr) const;
437 const svalue *b) const;
438 tristate structural_equality (const svalue *a, const svalue *b) const;
440 enum tree_code op,
441 tree rhs,
442 region_model_context *ctxt) const;
443 bool add_constraint (tree lhs, enum tree_code op, tree rhs,
445 bool add_constraint (tree lhs, enum tree_code op, tree rhs,
447 std::unique_ptr<rejected_constraint> *out);
448
449 const region *
452 bool update_state_machine = false,
453 const call_details *cd = nullptr);
454
458
460 logger *logger = nullptr) const;
462 logger *logger = nullptr) const;
466 logger *logger) const;
470 logger *logger) const;
471
472 /* For selftests. */
477
478 store *get_store () { return &m_store; }
479 const store *get_store () const { return &m_store; }
480
481 const dynamic_extents_t &
483 {
484 return m_dynamic_extents;
485 }
486 const svalue *get_dynamic_extents (const region *reg) const;
487 void set_dynamic_extents (const region *reg,
488 const svalue *size_in_bytes,
490 void unset_dynamic_extents (const region *reg);
491
494 {
495 return m_mgr->get_range_manager ();
496 }
497
499 enum poison_kind pkind);
500
501 bool can_merge_with_p (const region_model &other_model,
502 const program_point &point,
503 region_model *out_model,
504 const extrinsic_state *ext_state = nullptr,
505 const program_state *state_a = nullptr,
506 const program_state *state_b = nullptr) const;
507
510
512 static void append_regions_cb (const region *base_reg,
513 struct append_regions_cb_data *data);
514
515 const svalue *get_store_value (const region *reg,
516 region_model_context *ctxt) const;
517 const svalue *get_store_bytes (const region *base_reg,
518 const byte_range &bytes,
519 region_model_context *ctxt) const;
521 tree expr,
522 const svalue **out_sval,
523 region_model_context *ctxt) const;
525 tree expr,
526 const svalue **out_sval,
527 region_model_context *ctxt) const;
528
529 bool region_exists_p (const region *reg) const;
530
531 void loop_replay_fixup (const region_model *dst_state);
532
533 const svalue *get_capacity (const region *reg) const;
534
536 const region_model &summary);
537
539 const svalue *copied_sval,
540 const region *src_reg,
542
543 void set_errno (const call_details &cd);
544
545 /* Implemented in sm-fd.cc */
547
548 /* Implemented in sm-malloc.cc */
550 const svalue *old_ptr_sval,
551 const svalue *new_ptr_sval);
552
553 /* Implemented in sm-malloc.cc. */
554 void
556 const svalue *new_ptr_sval);
557
558 /* Implemented in sm-taint.cc. */
559 void mark_as_tainted (const svalue *sval,
561
562 bool add_constraint (const svalue *lhs,
563 enum tree_code op,
564 const svalue *rhs,
566
567 const svalue *check_for_poison (const svalue *sval,
568 tree expr,
569 const region *src_region,
570 region_model_context *ctxt) const;
571
572 void check_region_for_write (const region *dest_reg,
573 const svalue *sval_hint,
574 region_model_context *ctxt) const;
575
576 const svalue *
578 unsigned idx) const;
579 const svalue *
581 unsigned idx,
582 bool include_terminator,
583 const svalue **out_sval) const;
584
586 get_builtin_kf (const gcall &call,
587 region_model_context *ctxt = nullptr) const;
588
589 bool called_from_main_p () const;
590
592 {
594 }
596 {
597 if (m_thrown_exceptions_stack.empty ())
598 return nullptr;
599 return &m_thrown_exceptions_stack.back ();
600 }
602 {
604 const exception_node retval = m_thrown_exceptions_stack.back ();
605 m_thrown_exceptions_stack.pop_back ();
606 return retval;
607 }
608
610 {
612 }
614 {
615 if (m_caught_exceptions_stack.empty ())
616 return nullptr;
617 return &m_caught_exceptions_stack.back ();
618 }
620 {
622 const exception_node retval = m_caught_exceptions_stack.back ();
623 m_caught_exceptions_stack.pop_back ();
624 return retval;
625 }
626
627private:
630
634 logger *logger) const;
638 logger *logger) const;
639
641 const call_details &cd) const;
643
644 bool add_constraints_from_binop (const svalue *outer_lhs,
645 enum tree_code outer_op,
646 const svalue *outer_rhs,
647 bool *out,
649
651 enum poison_kind pkind);
652
654 bool nonnull,
656
657 const svalue *get_initial_value_for_global (const region *reg) const;
658
660
662 const svalue *size_in_bytes,
663 region_model_context *ctxt) const;
665 region_model_context *ctxt) const;
666
668 enum access_direction dir,
669 region_model_context *ctxt) const;
670
671 void check_for_writable_region (const region* dest_reg,
672 region_model_context *ctxt) const;
673 bool check_region_access (const region *reg,
674 enum access_direction dir,
675 const svalue *sval_hint,
676 region_model_context *ctxt) const;
677 bool check_region_for_read (const region *src_reg,
678 region_model_context *ctxt) const;
679 void check_region_size (const region *lhs_reg, const svalue *rhs_sval,
680 region_model_context *ctxt) const;
681
682 /* Implemented in bounds-checking.cc */
683 bool check_symbolic_bounds (const region *base_reg,
684 const svalue *sym_byte_offset,
685 const svalue *num_bytes_sval,
686 const svalue *capacity,
687 enum access_direction dir,
688 const svalue *sval_hint,
689 region_model_context *ctxt) const;
690 bool check_region_bounds (const region *reg, enum access_direction dir,
691 const svalue *sval_hint,
692 region_model_context *ctxt) const;
693
694 void check_call_args (const call_details &cd) const;
696 tree format_attr) const;
698 tree callee_fndecl,
700 rdwr_map &rdwr_idx) const;
702 tree callee_fndecl,
704 rdwr_map &rdwr_idx);
706 tree callee_fndecl,
708 rdwr_map &rdwr_idx,
709 tree attr);
710 void check_function_attrs (const gcall &call,
711 tree callee_fndecl,
713
715 tree fndecl,
717
718 /* Storing this here to avoid passing it around everywhere. */
720
722
723 constraint_manager *m_constraints; // TODO: embed, rather than dynalloc?
724
726
727 std::vector<exception_node> m_thrown_exceptions_stack;
728 std::vector<exception_node> m_caught_exceptions_stack;
729
730 /* Map from base region to size in bytes, for tracking the sizes of
731 dynamically-allocated regions.
732 This is part of the region_model rather than the region to allow for
733 memory regions to be resized (e.g. by realloc). */
735};
736
737/* Some region_model activity could lead to warnings (e.g. attempts to use an
738 uninitialized value). This abstract base class encapsulates an interface
739 for the region model to use when emitting such warnings.
740
741 Having this as an abstract base class allows us to support the various
742 operations needed by program_state in the analyzer within region_model,
743 whilst keeping them somewhat modularized. */
744
746{
747 public:
748 bool
749 warn (std::unique_ptr<pending_diagnostic> d,
750 std::unique_ptr<pending_location::fixer_for_epath> ploc_fixer = nullptr);
751
752 /* Hook for determining where diagnostics are to currently be emitted. */
753 virtual pending_location
755
756 /* Hook for clients to store pending diagnostics.
757 Return true if the diagnostic was stored, or false if it was deleted. */
758 virtual bool
759 warn_at (std::unique_ptr<pending_diagnostic> d,
760 pending_location &&ploc) = 0;
761
762 /* Hook for clients to add a note to the last previously stored
763 pending diagnostic. */
764 virtual void add_note (std::unique_ptr<pending_note> pn) = 0;
765
766 /* Hook for clients to add an event to the last previously stored
767 pending diagnostic. */
768 virtual void add_event (std::unique_ptr<checker_event> event) = 0;
769
770 /* Hook for clients to be notified when an SVAL that was reachable
771 in a previous state is no longer live, so that clients can emit warnings
772 about leaks. */
773 virtual void on_svalue_leak (const svalue *sval) = 0;
774
775 /* Hook for clients to be notified when the set of explicitly live
776 svalues changes, so that they can purge state relating to dead
777 svalues. */
778 virtual void on_liveness_change (const svalue_set &live_svalues,
779 const region_model *model) = 0;
780
781 virtual logger *get_logger () = 0;
782
783 /* Hook for clients to be notified when the condition
784 "LHS OP RHS" is added to the region model.
785 This exists so that state machines can detect tests on edges,
786 and use them to trigger sm-state transitions (e.g. transitions due
787 to ptrs becoming known to be NULL or non-NULL, rather than just
788 "unchecked") */
789 virtual void on_condition (const svalue *lhs,
790 enum tree_code op,
791 const svalue *rhs) = 0;
792
793 /* Hook for clients to be notified when the condition that
794 SVAL is within RANGES is added to the region model.
795 Similar to on_condition, but for use when handling switch statements.
796 RANGES is non-empty. */
797 virtual void on_bounded_ranges (const svalue &sval,
798 const bounded_ranges &ranges) = 0;
799
800 /* Hook for clients to be notified when a frame is popped from the stack. */
801 virtual void on_pop_frame (const frame_region *) = 0;
802
803 /* Hooks for clients to be notified when an unknown change happens
804 to SVAL (in response to a call to an unknown function). */
805 virtual void on_unknown_change (const svalue *sval, bool is_mutable) = 0;
806
807 /* Hooks for clients to be notified when a phi node is handled,
808 where RHS is the pertinent argument. */
809 virtual void on_phi (const gphi *phi, tree rhs) = 0;
810
811 /* Hooks for clients to be notified when the region model doesn't
812 know how to handle the tree code of T at LOC. */
814 const dump_location_t &loc) = 0;
815
816 /* Hook for clients to be notified when a function_decl escapes. */
817 virtual void on_escaped_function (tree fndecl) = 0;
818
820
821 /* Hook for clients to purge state involving SVAL. */
822 virtual void purge_state_involving (const svalue *sval) = 0;
823
824 /* Hook for clients to split state with a non-standard path. */
825 virtual void bifurcate (std::unique_ptr<custom_edge_info> info) = 0;
826
827 /* Hook for clients to terminate the standard path. */
828 virtual void terminate_path () = 0;
829
830 virtual const extrinsic_state *get_ext_state () const = 0;
831
832 /* Hook for clients to access the a specific state machine in
833 any underlying program_state. */
834 virtual bool
835 get_state_map_by_name (const char *name,
836 sm_state_map **out_smap,
837 const state_machine **out_sm,
838 unsigned *out_sm_idx,
839 std::unique_ptr<sm_context> *out_sm_context) = 0;
840
841 /* Precanned ways for clients to access specific state machines. */
842 bool get_fd_map (sm_state_map **out_smap,
843 const state_machine **out_sm,
844 unsigned *out_sm_idx,
845 std::unique_ptr<sm_context> *out_sm_context)
846 {
847 return get_state_map_by_name ("file-descriptor", out_smap, out_sm,
848 out_sm_idx, out_sm_context);
849 }
850 bool get_malloc_map (sm_state_map **out_smap,
851 const state_machine **out_sm,
852 unsigned *out_sm_idx)
853 {
854 return get_state_map_by_name ("malloc", out_smap, out_sm, out_sm_idx,
855 nullptr);
856 }
857 bool get_taint_map (sm_state_map **out_smap,
858 const state_machine **out_sm,
859 unsigned *out_sm_idx)
860 {
861 return get_state_map_by_name ("taint", out_smap, out_sm, out_sm_idx,
862 nullptr);
863 }
864
865 bool possibly_tainted_p (const svalue *sval);
866
867 /* Get the current statement, if any. */
868 virtual const gimple *get_stmt () const = 0;
869
870 virtual const exploded_graph *get_eg () const = 0;
871
872 virtual const program_state *get_state () const = 0;
873
874 /* Hooks for detecting infinite loops. */
875 virtual void maybe_did_work () = 0;
876 virtual bool checking_for_infinite_loop_p () const = 0;
877 virtual void on_unusable_in_infinite_loop () = 0;
878};
879
880/* A "do nothing" subclass of region_model_context. */
881
883{
884public:
887 {
888 return pending_location ();
889 }
890 bool
891 warn_at (std::unique_ptr<pending_diagnostic>,
892 pending_location &&) override
893 {
894 return false;
895 }
896 void add_note (std::unique_ptr<pending_note>) override;
897 void add_event (std::unique_ptr<checker_event>) override;
898 void on_svalue_leak (const svalue *) override {}
900 const region_model *) override {}
901 logger *get_logger () override { return nullptr; }
902 void on_condition (const svalue *lhs ATTRIBUTE_UNUSED,
903 enum tree_code op ATTRIBUTE_UNUSED,
904 const svalue *rhs ATTRIBUTE_UNUSED) override
905 {
906 }
908 const bounded_ranges &) override
909 {
910 }
911 void on_pop_frame (const frame_region *) override {}
912 void on_unknown_change (const svalue *sval ATTRIBUTE_UNUSED,
913 bool is_mutable ATTRIBUTE_UNUSED) override
914 {
915 }
916 void on_phi (const gphi *phi ATTRIBUTE_UNUSED,
917 tree rhs ATTRIBUTE_UNUSED) override
918 {
919 }
920 void on_unexpected_tree_code (tree, const dump_location_t &) override {}
921
922 void on_escaped_function (tree) override {}
923
924 uncertainty_t *get_uncertainty () override { return nullptr; }
925
926 void purge_state_involving (const svalue *sval ATTRIBUTE_UNUSED) override {}
927
928 void bifurcate (std::unique_ptr<custom_edge_info> info) override;
929 void terminate_path () override;
930
931 const extrinsic_state *get_ext_state () const override { return nullptr; }
932
933 bool get_state_map_by_name (const char *,
934 sm_state_map **,
935 const state_machine **,
936 unsigned *,
937 std::unique_ptr<sm_context> *) override
938 {
939 return false;
940 }
941
942 const gimple *get_stmt () const override { return nullptr; }
943 const exploded_graph *get_eg () const override { return nullptr; }
944 const program_state *get_state () const override { return nullptr; }
945
946 void maybe_did_work () override {}
947 bool checking_for_infinite_loop_p () const override { return false; }
949};
950
951/* A subclass of region_model_context for determining if operations fail
952 e.g. "can we generate a region for the lvalue of EXPR?". */
953
955{
956public:
958
960 final override
961 {
963 }
964
965 bool had_errors_p () const { return m_num_unexpected_codes > 0; }
966
967private:
969};
970
971/* Subclass of region_model_context that wraps another context, allowing
972 for extra code to be added to the various hooks. */
973
975{
976 public:
979 {
980 if (m_inner)
981 return m_inner->get_pending_location_for_diag ();
982 else
983 return pending_location ();
984 }
985
986 bool
987 warn_at (std::unique_ptr<pending_diagnostic> d,
988 pending_location &&ploc) override
989 {
990 if (m_inner)
991 return m_inner->warn_at (std::move (d), std::move (ploc));
992 else
993 return false;
994 }
995
996 void add_note (std::unique_ptr<pending_note> pn) override
997 {
998 if (m_inner)
999 m_inner->add_note (std::move (pn));
1000 }
1001 void add_event (std::unique_ptr<checker_event> event) override;
1002
1003 void on_svalue_leak (const svalue *sval) override
1004 {
1005 if (m_inner)
1006 m_inner->on_svalue_leak (sval);
1007 }
1008
1009 void on_liveness_change (const svalue_set &live_svalues,
1010 const region_model *model) override
1011 {
1012 if (m_inner)
1013 m_inner->on_liveness_change (live_svalues, model);
1014 }
1015
1016 logger *get_logger () override
1017 {
1018 if (m_inner)
1019 return m_inner->get_logger ();
1020 else
1021 return nullptr;
1022 }
1023
1024 void on_condition (const svalue *lhs,
1025 enum tree_code op,
1026 const svalue *rhs) override
1027 {
1028 if (m_inner)
1029 m_inner->on_condition (lhs, op, rhs);
1030 }
1031
1032 void on_bounded_ranges (const svalue &sval,
1033 const bounded_ranges &ranges) override
1034 {
1035 if (m_inner)
1036 m_inner->on_bounded_ranges (sval, ranges);
1037 }
1038
1039 void on_pop_frame (const frame_region *frame_reg) override
1040 {
1041 if (m_inner)
1042 m_inner->on_pop_frame (frame_reg);
1043 }
1044
1045 void on_unknown_change (const svalue *sval, bool is_mutable) override
1046 {
1047 if (m_inner)
1048 m_inner->on_unknown_change (sval, is_mutable);
1049 }
1050
1051 void on_phi (const gphi *phi, tree rhs) override
1052 {
1053 if (m_inner)
1054 m_inner->on_phi (phi, rhs);
1055 }
1056
1058 const dump_location_t &loc) override
1059 {
1060 if (m_inner)
1061 m_inner->on_unexpected_tree_code (t, loc);
1062 }
1063
1064 void on_escaped_function (tree fndecl) override
1065 {
1066 if (m_inner)
1067 m_inner->on_escaped_function (fndecl);
1068 }
1069
1071 {
1072 if (m_inner)
1073 return m_inner->get_uncertainty ();
1074 else
1075 return nullptr;
1076 }
1077
1078 void purge_state_involving (const svalue *sval) override
1079 {
1080 if (m_inner)
1081 m_inner->purge_state_involving (sval);
1082 }
1083
1084 void bifurcate (std::unique_ptr<custom_edge_info> info) override
1085 {
1086 if (m_inner)
1087 m_inner->bifurcate (std::move (info));
1088 }
1089
1090 void terminate_path () override
1091 {
1092 if (m_inner)
1093 m_inner->terminate_path ();
1094 }
1095
1096 const extrinsic_state *get_ext_state () const override
1097 {
1098 if (m_inner)
1099 return m_inner->get_ext_state ();
1100 else
1101 return nullptr;
1102 }
1103
1104 bool get_state_map_by_name (const char *name,
1105 sm_state_map **out_smap,
1106 const state_machine **out_sm,
1107 unsigned *out_sm_idx,
1108 std::unique_ptr<sm_context> *out_sm_context)
1109 override
1110 {
1111 if (m_inner)
1112 return m_inner->get_state_map_by_name (name, out_smap, out_sm, out_sm_idx,
1113 out_sm_context);
1114 else
1115 return false;
1116 }
1117
1118 const gimple *get_stmt () const override
1119 {
1120 if (m_inner)
1121 return m_inner->get_stmt ();
1122 else
1123 return nullptr;
1124 }
1125
1126 const exploded_graph *get_eg () const override
1127 {
1128 if (m_inner)
1129 return m_inner->get_eg ();
1130 else
1131 return nullptr;
1132 }
1133
1134 const program_state *get_state () const override
1135 {
1136 if (m_inner)
1137 return m_inner->get_state ();
1138 else
1139 return nullptr;
1140 }
1141
1142 void maybe_did_work () override
1143 {
1144 if (m_inner)
1145 m_inner->maybe_did_work ();
1146 }
1147
1148 bool checking_for_infinite_loop_p () const override
1149 {
1150 if (m_inner)
1151 return m_inner->checking_for_infinite_loop_p ();
1152 return false;
1153 }
1155 {
1156 if (m_inner)
1157 m_inner->on_unusable_in_infinite_loop ();
1158 }
1159
1160protected:
1162 : m_inner (inner)
1163 {
1164 }
1165
1167};
1168
1169/* Subclass of region_model_context_decorator with a hook for adding
1170 notes/events when saving diagnostics. */
1171
1173{
1174public:
1175 bool
1176 warn_at (std::unique_ptr<pending_diagnostic> d,
1177 pending_location &&ploc) override
1178 {
1179 if (m_inner)
1180 if (m_inner->warn_at (std::move (d), std::move (ploc)))
1181 {
1182 add_annotations ();
1183 return true;
1184 }
1185 return false;
1186 }
1187
1188 /* Hook to add new event(s)/note(s) */
1189 virtual void add_annotations () = 0;
1190
1191protected:
1196};
1197
1198/* A bundle of data for use when attempting to merge two region_model
1199 instances to make a third. */
1200
1202{
1204 const region_model *model_b,
1205 const program_point &point,
1206 region_model *merged_model,
1208 const program_state *state_a,
1209 const program_state *state_b)
1210 : m_model_a (model_a), m_model_b (model_b),
1211 m_point (point),
1212 m_merged_model (merged_model),
1214 m_state_a (state_a), m_state_b (state_b)
1215 {
1216 }
1217
1218 void dump_to_pp (pretty_printer *pp, bool simple) const;
1219 void dump (FILE *fp, bool simple) const;
1220 void dump (bool simple) const;
1221
1223 {
1224 return m_model_a->get_manager ();
1225 }
1226
1227 bool mergeable_svalue_p (const svalue *) const;
1228
1229 const supernode *get_supernode () const
1230 {
1231 return m_point.get_supernode ();
1232 }
1233
1234 void on_widening_reuse (const widening_svalue *widening_sval);
1235
1240
1244
1246};
1247
1248/* A record that can (optionally) be written out when
1249 region_model::add_constraint fails. */
1250
1252{
1253public:
1255 virtual void dump_to_pp (pretty_printer *pp) const = 0;
1256
1257 const region_model &get_model () const { return m_model; }
1258
1259protected:
1261 : m_model (model)
1262 {}
1263
1265};
1266
1268{
1269public:
1271 tree lhs, enum tree_code op, tree rhs)
1272 : rejected_constraint (model),
1273 m_lhs (lhs), m_op (op), m_rhs (rhs)
1274 {}
1275
1276 void dump_to_pp (pretty_printer *pp) const final override;
1277
1281};
1282
1284{
1285public:
1287 : rejected_constraint (model)
1288 {}
1289
1290 void dump_to_pp (pretty_printer *pp) const final override;
1291};
1292
1294{
1295public:
1297 tree expr, const bounded_ranges *ranges)
1298 : rejected_constraint (model),
1299 m_expr (expr), m_ranges (ranges)
1300 {}
1301
1302 void dump_to_pp (pretty_printer *pp) const final override;
1303
1304private:
1307};
1308
1309/* A bundle of state. */
1310
1312{
1313public:
1315 const supergraph *sg = nullptr);
1316 const supergraph *get_supergraph () { return m_sg; }
1319 {
1320 return m_mgr.get_known_function_manager ();
1321 }
1322
1323 void log_stats (logger *logger) const;
1324
1325private:
1328};
1329
1330} // namespace ana
1331
1332extern void debug (const region_model &rmodel);
1333
1334namespace ana {
1335
1336#if CHECKING_P
1337
1338namespace selftest {
1339
1340using namespace ::selftest;
1341
1342/* An implementation of region_model_context for use in selftests, which
1343 stores any pending_diagnostic instances passed to it. */
1344
1345class test_region_model_context : public noop_region_model_context
1346{
1347public:
1348 bool
1349 warn_at (std::unique_ptr<pending_diagnostic> d,
1350 pending_location &&) final override
1351 {
1352 m_diagnostics.safe_push (d.release ());
1353 return true;
1354 }
1355
1356 unsigned get_num_diagnostics () const { return m_diagnostics.length (); }
1357
1358 void on_unexpected_tree_code (tree t, const dump_location_t &)
1359 final override
1360 {
1361 internal_error ("unhandled tree code: %qs",
1363 }
1364
1365private:
1366 /* Implicitly delete any diagnostics in the dtor. */
1367 auto_delete_vec<pending_diagnostic> m_diagnostics;
1368};
1369
1370/* Attempt to add the constraint (LHS OP RHS) to MODEL.
1371 Verify that MODEL remains satisfiable. */
1372
1373#define ADD_SAT_CONSTRAINT(MODEL, LHS, OP, RHS) \
1374 SELFTEST_BEGIN_STMT \
1375 bool sat = (MODEL).add_constraint (LHS, OP, RHS, nullptr); \
1376 ASSERT_TRUE (sat); \
1377 SELFTEST_END_STMT
1378
1379/* Attempt to add the constraint (LHS OP RHS) to MODEL.
1380 Verify that the result is not satisfiable. */
1381
1382#define ADD_UNSAT_CONSTRAINT(MODEL, LHS, OP, RHS) \
1383 SELFTEST_BEGIN_STMT \
1384 bool sat = (MODEL).add_constraint (LHS, OP, RHS, nullptr); \
1385 ASSERT_FALSE (sat); \
1386 SELFTEST_END_STMT
1387
1388/* Implementation detail of the ASSERT_CONDITION_* macros. */
1389
1390void assert_condition (const location &loc,
1391 region_model &model,
1392 const svalue *lhs, tree_code op, const svalue *rhs,
1393 tristate expected);
1394
1395void assert_condition (const location &loc,
1396 region_model &model,
1397 tree lhs, tree_code op, tree rhs,
1398 tristate expected);
1399
1400/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1401 as "true". */
1402
1403#define ASSERT_CONDITION_TRUE(REGION_MODEL, LHS, OP, RHS) \
1404 SELFTEST_BEGIN_STMT \
1405 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1406 tristate (tristate::TS_TRUE)); \
1407 SELFTEST_END_STMT
1408
1409/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1410 as "false". */
1411
1412#define ASSERT_CONDITION_FALSE(REGION_MODEL, LHS, OP, RHS) \
1413 SELFTEST_BEGIN_STMT \
1414 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1415 tristate (tristate::TS_FALSE)); \
1416 SELFTEST_END_STMT
1417
1418/* Assert that REGION_MODEL evaluates the condition "LHS OP RHS"
1419 as "unknown". */
1420
1421#define ASSERT_CONDITION_UNKNOWN(REGION_MODEL, LHS, OP, RHS) \
1422 SELFTEST_BEGIN_STMT \
1423 assert_condition (SELFTEST_LOCATION, REGION_MODEL, LHS, OP, RHS, \
1424 tristate (tristate::TS_UNKNOWN)); \
1425 SELFTEST_END_STMT
1426
1427} /* end of namespace selftest. */
1428
1429#endif /* #if CHECKING_P */
1430
1431} // namespace ana
1432
1433#endif /* GCC_ANALYZER_REGION_MODEL_H */
hash_map< rdwr_access_hash, attr_access > rdwr_map
Definition attribs.h:402
bool warn_at(std::unique_ptr< pending_diagnostic > d, pending_location &&ploc) override
Definition region-model.h:1176
virtual void add_annotations()=0
annotating_context(region_model_context *inner)
Definition region-model.h:1192
Definition svalue.h:1633
Definition svalue.h:793
Definition svalue.h:1077
Definition constraint-manager.h:178
Definition common.h:326
Definition call-details.h:31
Definition call-summary.h:68
Definition svalue.h:1396
Definition svalue.h:1531
Definition svalue.h:1779
Definition svalue.h:301
Definition constraint-manager.h:410
known_function_manager * get_known_function_manager()
Definition region-model.h:1318
const supergraph * get_supergraph()
Definition region-model.h:1316
const supergraph * m_sg
Definition region-model.h:1327
region_model_manager * get_model_manager()
Definition region-model.h:1317
void log_stats(logger *logger) const
engine(region_model_manager &mgr, const supergraph *sg=nullptr)
region_model_manager & m_mgr
Definition region-model.h:1326
Definition exploded-graph.h:783
Definition exploded-graph.h:206
Definition program-state.h:34
Definition region.h:319
Definition svalue.h:652
Definition known-function-manager.h:41
Definition common.h:297
Definition analyzer-logging.h:34
Definition region-model.h:883
const program_state * get_state() const override
Definition region-model.h:944
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:933
bool checking_for_infinite_loop_p() const override
Definition region-model.h:947
void maybe_did_work() override
Definition region-model.h:946
uncertainty_t * get_uncertainty() override
Definition region-model.h:924
void on_unexpected_tree_code(tree, const dump_location_t &) override
Definition region-model.h:920
void on_unknown_change(const svalue *sval, bool is_mutable) override
Definition region-model.h:912
void on_pop_frame(const frame_region *) override
Definition region-model.h:911
void on_phi(const gphi *phi, tree rhs) override
Definition region-model.h:916
void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) override
Definition region-model.h:902
void add_event(std::unique_ptr< checker_event >) override
void on_liveness_change(const svalue_set &, const region_model *) override
Definition region-model.h:899
logger * get_logger() override
Definition region-model.h:901
void on_escaped_function(tree) override
Definition region-model.h:922
const exploded_graph * get_eg() const override
Definition region-model.h:943
const gimple * get_stmt() const override
Definition region-model.h:942
pending_location get_pending_location_for_diag() const override
Definition region-model.h:886
void on_unusable_in_infinite_loop() override
Definition region-model.h:948
bool warn_at(std::unique_ptr< pending_diagnostic >, pending_location &&) override
Definition region-model.h:891
void on_svalue_leak(const svalue *) override
Definition region-model.h:898
void add_note(std::unique_ptr< pending_note >) override
void purge_state_involving(const svalue *sval) override
Definition region-model.h:926
const extrinsic_state * get_ext_state() const override
Definition region-model.h:931
void on_bounded_ranges(const svalue &, const bounded_ranges &) override
Definition region-model.h:907
void bifurcate(std::unique_ptr< custom_edge_info > info) override
void put(T src, T dst)
Definition region-model.h:82
void dump() const
Definition region-model.h:124
T get_dst_for_src(T src) const
Definition region-model.h:91
void dump_to_pp(pretty_printer *pp) const
Definition region-model.h:102
auto_vec< T > m_src_to_dst
Definition region-model.h:63
void update(T *) const
Definition region-model.h:136
one_way_id_map(int num_ids)
Definition region-model.h:71
Definition common.h:173
Definition svalue.h:1226
Definition svalue.h:447
Definition program-point.h:54
Definition program-state.h:224
Definition region-model-reachability.h:36
region_model_context * m_inner
Definition region-model.h:1166
const exploded_graph * get_eg() const override
Definition region-model.h:1126
void on_bounded_ranges(const svalue &sval, const bounded_ranges &ranges) override
Definition region-model.h:1032
void on_phi(const gphi *phi, tree rhs) override
Definition region-model.h:1051
void add_event(std::unique_ptr< checker_event > event) override
const extrinsic_state * get_ext_state() const override
Definition region-model.h:1096
void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) override
Definition region-model.h:1024
const gimple * get_stmt() const override
Definition region-model.h:1118
void maybe_did_work() override
Definition region-model.h:1142
const program_state * get_state() const override
Definition region-model.h:1134
void on_pop_frame(const frame_region *frame_reg) override
Definition region-model.h:1039
uncertainty_t * get_uncertainty() override
Definition region-model.h:1070
void bifurcate(std::unique_ptr< custom_edge_info > info) override
Definition region-model.h:1084
void add_note(std::unique_ptr< pending_note > pn) override
Definition region-model.h:996
void on_svalue_leak(const svalue *sval) override
Definition region-model.h:1003
pending_location get_pending_location_for_diag() const override
Definition region-model.h:978
bool checking_for_infinite_loop_p() const override
Definition region-model.h:1148
logger * get_logger() override
Definition region-model.h:1016
region_model_context_decorator(region_model_context *inner)
Definition region-model.h:1161
void purge_state_involving(const svalue *sval) override
Definition region-model.h:1078
void on_liveness_change(const svalue_set &live_svalues, const region_model *model) override
Definition region-model.h:1009
void on_unexpected_tree_code(tree t, const dump_location_t &loc) override
Definition region-model.h:1057
void on_escaped_function(tree fndecl) override
Definition region-model.h:1064
bool warn_at(std::unique_ptr< pending_diagnostic > d, pending_location &&ploc) override
Definition region-model.h:987
void terminate_path() override
Definition region-model.h:1090
void on_unknown_change(const svalue *sval, bool is_mutable) override
Definition region-model.h:1045
void on_unusable_in_infinite_loop() override
Definition region-model.h:1154
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:1104
Definition region-model.h:746
virtual void on_bounded_ranges(const svalue &sval, const bounded_ranges &ranges)=0
virtual bool warn_at(std::unique_ptr< pending_diagnostic > d, pending_location &&ploc)=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
bool get_malloc_map(sm_state_map **out_smap, const state_machine **out_sm, unsigned *out_sm_idx)
Definition region-model.h:850
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:842
virtual void add_note(std::unique_ptr< pending_note > pn)=0
virtual pending_location get_pending_location_for_diag() const =0
virtual logger * get_logger()=0
virtual const extrinsic_state * get_ext_state() const =0
bool possibly_tainted_p(const svalue *sval)
virtual const program_state * get_state() const =0
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:857
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
bool warn(std::unique_ptr< pending_diagnostic > d, std::unique_ptr< pending_location::fixer_for_epath > ploc_fixer=nullptr)
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
Definition region-model.h:294
path_var get_representative_path_var(const svalue *sval, svalue_set *visited, logger *logger) const
region_model(const region_model &other)
void impl_deallocation_call(const call_details &cd)
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:478
constraint_manager * get_constraints()
Definition region-model.h:473
void update_for_nonzero_return(const call_details &cd)
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 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)
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
void update_for_return_gcall(const gcall &call_stmt, region_model_context *ctxt)
bounded_ranges_manager * get_range_manager() const
Definition region-model.h:493
void dump(bool simple) const
path_var get_representative_path_var_1(const svalue *sval, svalue_set *visited, logger *logger) 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
const builtin_known_function * get_builtin_kf(const gcall &call, region_model_context *ctxt=nullptr) 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:723
const exception_node * get_current_thrown_exception() const
Definition region-model.h:595
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 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
bool add_constraint(const svalue *lhs, enum tree_code op, const svalue *rhs, 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:721
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
const region * push_frame(const function &fun, const gcall *call_stmt, const vec< const svalue * > *arg_sids, region_model_context *ctxt)
bool operator!=(const region_model &other) const
Definition region-model.h:304
const svalue * get_store_value(const region *reg, region_model_context *ctxt) const
const region * get_region_for_poisoned_expr(tree expr) const
void push_caught_exception(const exception_node &node)
Definition region-model.h:609
void poison_any_pointers_to_descendents(const region *reg, enum poison_kind pkind)
void update_for_gcall(const gcall &call_stmt, region_model_context *ctxt, function *callee=nullptr)
hashval_t hash() const
void check_function_attrs(const gcall &call, tree callee_fndecl, region_model_context *ctxt)
void get_regions_for_current_frame(auto_vec< const decl_region * > *out) const
std::unique_ptr< text_art::tree_widget > make_dump_widget(const text_art::dump_widget_info &dwi) 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
std::vector< exception_node > m_caught_exceptions_stack
Definition region-model.h:728
tristate compare_initial_and_pointer(const initial_svalue *init, const region_svalue *ptr) const
exception_node pop_thrown_exception()
Definition region-model.h:601
const function * get_current_function() const
const svalue * get_store_bytes(const region *base_reg, const byte_range &bytes, 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=nullptr, const program_state *state_a=nullptr, const program_state *state_b=nullptr) const
bool on_call_pre(const gcall &stmt, 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
tree get_fndecl_for_call(const gcall &call, region_model_context *ctxt)
bool region_exists_p(const region *reg) const
tree get_representative_tree(const svalue *sval, logger *logger=nullptr) const
void check_function_attr_access(const gcall &call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx) const
region_model(region_model_manager *mgr)
void handle_unrecognized_call(const gcall &call, region_model_context *ctxt)
void push_thrown_exception(const exception_node &node)
Definition region-model.h:591
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:296
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
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 check_one_function_attr_null_terminated_string_arg(const gcall &call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx, tree attr)
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)
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:382
std::unique_ptr< json::object > to_json() const
region_model_manager *const m_mgr
Definition region-model.h:719
const frame_region * m_current_frame
Definition region-model.h:725
void dump() const
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)
void check_function_attr_null_terminated_string_arg(const gcall &call, tree callee_fndecl, region_model_context *ctxt, rdwr_map &rdwr_idx)
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 check_for_throw_inside_call(const gcall &call, tree fndecl, region_model_context *ctxt)
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)
region_model_manager * get_manager() const
Definition region-model.h:492
const known_function * get_known_function(tree fndecl, const call_details &cd) const
const exception_node * get_current_caught_exception() const
Definition region-model.h:613
void write_bytes(const region *dest_reg, const svalue *num_bytes_sval, 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 unset_dynamic_extents(const region *reg)
void on_setjmp(const gcall &stmt, const exploded_node &enode, const superedge &sedge, 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
path_var get_representative_path_var(const region *reg, svalue_set *visited, logger *logger) 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
std::vector< exception_node > m_thrown_exceptions_stack
Definition region-model.h:727
bool check_region_bounds(const region *reg, enum access_direction dir, const svalue *sval_hint, region_model_context *ctxt) const
tree get_representative_tree(const region *reg, logger *logger=nullptr) const
void on_call_post(const gcall &stmt, bool unknown_side_effects, region_model_context *ctxt)
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)
const svalue * get_rvalue(path_var pv, region_model_context *ctxt) const
path_var get_representative_path_var_1(const region *reg, svalue_set *visited, logger *logger) const
const store * get_store() const
Definition region-model.h:479
dynamic_extents_t m_dynamic_extents
Definition region-model.h:734
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
void pop_frame(tree result_lvalue, const svalue **out_result, region_model_context *ctxt, const gcall *call_stmt, bool eval_return_svalue=true)
const svalue * scan_for_null_terminator(const region *reg, tree expr, const svalue **out_sval, region_model_context *ctxt) const
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)
exception_node pop_caught_exception()
Definition region-model.h:619
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 unbind_region_and_descendents(const region *reg, enum poison_kind pkind)
const dynamic_extents_t & get_dynamic_extents() const
Definition region-model.h:482
Definition svalue.h:214
Definition region-model.h:144
void remove(const region *reg)
Definition region-model.h:171
iterator begin() const
Definition region-model.h:160
const svalue *const * get(const region *reg) const
Definition region-model.h:163
hash_map_t::iterator iterator
Definition region-model.h:147
hash_map_t m_hash_map
Definition region-model.h:192
std::unique_ptr< text_art::tree_widget > make_dump_widget(const text_art::dump_widget_info &dwi) const
void purge_state_involving(const svalue *sval)
std::unique_ptr< json::object > to_json() const
hash_map< const region *, const svalue * > hash_map_t
Definition region-model.h:146
bool operator==(const region_to_value_map &other) const
iterator end() const
Definition region-model.h:161
void put(const region *reg, const svalue *sval)
Definition region-model.h:167
bool is_empty() const
Definition region-model.h:176
region_to_value_map & operator=(const region_to_value_map &other)
region_to_value_map()
Definition region-model.h:149
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:155
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:150
Definition region.h:126
virtual ~rejected_constraint()
Definition region-model.h:1254
virtual void dump_to_pp(pretty_printer *pp) const =0
rejected_constraint(const region_model &model)
Definition region-model.h:1260
const region_model & get_model() const
Definition region-model.h:1257
region_model m_model
Definition region-model.h:1264
void dump_to_pp(pretty_printer *pp) const final override
rejected_default_case(const region_model &model)
Definition region-model.h:1286
tree m_rhs
Definition region-model.h:1280
rejected_op_constraint(const region_model &model, tree lhs, enum tree_code op, tree rhs)
Definition region-model.h:1270
tree m_lhs
Definition region-model.h:1278
void dump_to_pp(pretty_printer *pp) const final override
enum tree_code m_op
Definition region-model.h:1279
void dump_to_pp(pretty_printer *pp) const final override
tree m_expr
Definition region-model.h:1305
const bounded_ranges * m_ranges
Definition region-model.h:1306
rejected_ranges_constraint(const region_model &model, tree expr, const bounded_ranges *ranges)
Definition region-model.h:1296
Definition svalue.h:981
Definition svalue.h:566
Definition program-state.h:92
Definition sm.h:43
Definition store.h:830
Definition svalue.h:895
Definition supergraph.h:281
Definition supergraph.h:105
Definition supergraph.h:224
Definition svalue.h:92
int m_num_unexpected_codes
Definition region-model.h:968
bool had_errors_p() const
Definition region-model.h:965
void on_unexpected_tree_code(tree, const dump_location_t &) final override
Definition region-model.h:959
tentative_region_model_context()
Definition region-model.h:957
Definition svalue.h:700
Definition store.h:161
Definition svalue.h:397
Definition svalue.h:1179
Definition region-model.h:223
virtual void visit_unknown_svalue(const unknown_svalue *)
Definition region-model.h:227
virtual void visit_poisoned_svalue(const poisoned_svalue *)
Definition region-model.h:228
virtual void visit_asm_output_svalue(const asm_output_svalue *)
Definition region-model.h:241
virtual void visit_unaryop_svalue(const unaryop_svalue *)
Definition region-model.h:231
virtual void visit_region_svalue(const region_svalue *)
Definition region-model.h:225
virtual void visit_initial_svalue(const initial_svalue *)
Definition region-model.h:230
virtual void visit_sub_svalue(const sub_svalue *)
Definition region-model.h:233
virtual void visit_setjmp_svalue(const setjmp_svalue *)
Definition region-model.h:229
virtual void visit_conjured_svalue(const conjured_svalue *)
Definition region-model.h:240
virtual void visit_placeholder_svalue(const placeholder_svalue *)
Definition region-model.h:237
virtual void visit_binop_svalue(const binop_svalue *)
Definition region-model.h:232
virtual void visit_const_fn_result_svalue(const const_fn_result_svalue *)
Definition region-model.h:242
virtual void visit_compound_svalue(const compound_svalue *)
Definition region-model.h:239
virtual void visit_unmergeable_svalue(const unmergeable_svalue *)
Definition region-model.h:236
virtual void visit_widening_svalue(const widening_svalue *)
Definition region-model.h:238
virtual void visit_bits_within_svalue(const bits_within_svalue *)
Definition region-model.h:235
virtual void visit_constant_svalue(const constant_svalue *)
Definition region-model.h:226
virtual void visit_region(const region *)
Definition region-model.h:244
virtual void visit_repeated_svalue(const repeated_svalue *)
Definition region-model.h:234
Definition svalue.h:1274
Definition bitmap.h:950
Definition vec.h:1667
Definition genoutput.cc:150
Definition dumpfile.h:446
Definition genmatch.cc:1506
Definition ree.cc:583
Definition hash-map.h:40
Definition hash-set.h:37
Definition inchash.h:38
Definition pretty-print.h:241
void set_output_stream(FILE *outfile)
Definition pretty-print.h:274
Definition tristate.h:26
bool debug
Definition collect-utils.cc:34
union tree_node * tree
Definition coretypes.h:97
void internal_error(const char *,...) ATTRIBUTE_GCC_DIAG(1
void final(rtx_insn *first, FILE *file, int optimize_p)
Definition final.cc:2009
internal_fn
Definition genmatch.cc:1015
tree_code
Definition genmatch.cc:1002
Definition access-diagram.h:30
@ stmt
Definition checker-event.h:38
access_direction
Definition common.h:371
poison_kind
Definition svalue.h:427
hash_set< const svalue * > svalue_set
Definition common.h:74
memory_space
Definition region.h:32
Definition custom-sarif-properties/state-graphs.h:33
Definition fold-const.cc:4352
void add_path_var(path_var pv, hash &hstate)
Definition dump-context.h:31
poly_int< N, C > r
Definition poly-int.h:774
i
Definition poly-int.h:776
Ca const poly_int< N, Cb > & b
Definition poly-int.h:771
Ca & a
Definition poly-int.h:770
void pp_flush(pretty_printer *pp)
Definition pretty-print.cc:2462
void pp_newline(pretty_printer *pp)
Definition pretty-print.cc:2737
void pp_string(pretty_printer *pp, const char *str)
Definition pretty-print.cc:2764
Definition store.h:233
Definition constraint-manager.h:123
Definition store.h:327
Definition region-model.h:253
void dump() const
exception_node(const svalue *exception_sval, const svalue *typeinfo_sval, const svalue *destructor_sval)
Definition region-model.h:254
const svalue * m_exception_sval
Definition region-model.h:279
bool operator==(const exception_node &other) const
tree maybe_get_type() const
void dump(bool simple) const
const svalue * m_typeinfo_sval
Definition region-model.h:280
const svalue * m_destructor_sval
Definition region-model.h:281
void dump(FILE *fp, bool simple) const
std::unique_ptr< text_art::tree_widget > make_dump_widget(const text_art::dump_widget_info &dwi) const
void dump_to_pp(pretty_printer *pp, bool simple) const
std::unique_ptr< json::object > to_json() const
void add_to_reachable_regions(reachable_regions &) const
const program_point & m_point
Definition region-model.h:1238
const program_state * m_state_a
Definition region-model.h:1242
const region_model * m_model_a
Definition region-model.h:1236
const extrinsic_state * m_ext_state
Definition region-model.h:1241
hash_set< const svalue * > m_svals_changing_meaning
Definition region-model.h:1245
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:1203
const program_state * m_state_b
Definition region-model.h:1243
const supernode * get_supernode() const
Definition region-model.h:1229
bool mergeable_svalue_p(const svalue *) const
void dump(bool simple) const
region_model_manager * get_manager() const
Definition region-model.h:1222
void on_widening_reuse(const widening_svalue *widening_sval)
region_model * m_merged_model
Definition region-model.h:1239
void dump(FILE *fp, bool simple) const
const region_model * m_model_b
Definition region-model.h:1237
Definition diagnostic-manager.h:35
int m_num_equiv_classes
Definition region-model.h:213
int m_num_bounded_ranges_constraints
Definition region-model.h:215
int m_num_client_items
Definition region-model.h:216
int m_num_svalues
Definition region-model.h:211
purge_stats()
Definition region-model.h:202
int m_num_constraints
Definition region-model.h:214
int m_num_regions
Definition region-model.h:212
Definition function.h:249
Definition gimple.h:549
Definition gimple.h:907
Definition gimple.h:352
Definition gimple.h:221
Definition gimple.h:461
Definition gimple.h:917
Definition dump-widget-info.h:31
Definition gengtype.h:252
Definition vec.h:450
#define gcc_assert(EXPR)
Definition system.h:817
#define DEBUG_FUNCTION
Definition system.h:1239
static bitmap visited
Definition tree-ssa-dce.cc:640
static control_dependences * cd
Definition tree-ssa-dce.cc:104
const char * get_tree_code_name(enum tree_code code)
Definition tree.cc:13037
#define TREE_CODE(NODE)
Definition tree.h:325
tree size_in_bytes(const_tree t)
Definition tree.h:5266
#define FOR_EACH_VEC_ELT(V, I, P)
Definition vec.h:1895