GCC Middle and Back End API Reference
exploded-graph.h
Go to the documentation of this file.
1/* Classes for managing a directed graph of <point, state> pairs.
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_EXPLODED_GRAPH_H
22#define GCC_ANALYZER_EXPLODED_GRAPH_H
23
24#include "alloc-pool.h"
25#include "fibonacci_heap.h"
26#include "supergraph.h"
27#include "sbitmap.h"
28#include "shortest-paths.h"
29#include "analyzer/sm.h"
33
34namespace ana {
35
36/* Concrete implementation of region_model_context, wiring it up to the
37 rest of the analysis engine. */
38
40{
41 public:
43 exploded_node *enode_for_diag,
44
45 /* TODO: should we be getting the ECs from the
46 old state, rather than the new? */
47 const program_state *old_state,
48 program_state *new_state,
49 uncertainty_t *uncertainty,
50 path_context *path_ctxt,
51 const gimple *stmt = nullptr,
52 bool *out_could_have_done_work = nullptr);
53
56 uncertainty_t *uncertainty,
57 logger *logger = nullptr);
58
59 bool
60 warn_at (std::unique_ptr<pending_diagnostic> d,
61 pending_location &&ploc) final override;
62 void add_note (std::unique_ptr<pending_note> pn) final override;
63 void add_event (std::unique_ptr<checker_event> event) final override;
64 void on_svalue_leak (const svalue *) override;
65 void on_liveness_change (const svalue_set &live_svalues,
66 const region_model *model) final override;
67 logger *get_logger () final override
68 {
69 return m_logger.get_logger ();
70 }
71
73 const svalue *sval,
75
76 void on_condition (const svalue *lhs,
77 enum tree_code op,
78 const svalue *rhs) final override;
79
80 void on_bounded_ranges (const svalue &sval,
81 const bounded_ranges &ranges) final override;
82
83 void on_pop_frame (const frame_region *frame_reg) final override;
84
85 void on_unknown_change (const svalue *sval, bool is_mutable) final override;
86
87 void on_phi (const gphi *phi, tree rhs) final override;
88
90 const dump_location_t &loc) final override;
91
92 void on_escaped_function (tree fndecl) final override;
93
95
96 void purge_state_involving (const svalue *sval) final override;
97
98 void bifurcate (std::unique_ptr<custom_edge_info> info) final override;
99 void terminate_path () final override;
100 const extrinsic_state *get_ext_state () const final override
101 {
102 return &m_ext_state;
103 }
104 bool
105 get_state_map_by_name (const char *name,
106 sm_state_map **out_smap,
107 const state_machine **out_sm,
108 unsigned *out_sm_idx,
109 std::unique_ptr<sm_context> *out_sm_context) override;
110
111 const gimple *get_stmt () const override { return m_stmt; }
112 const exploded_graph *get_eg () const override { return m_eg; }
113
114 const program_state *get_state () const override { return m_new_state; }
115
116 void maybe_did_work () override;
117 bool checking_for_infinite_loop_p () const override { return false; }
119
122
133};
134
135/* A <program_point, program_state> pair, used internally by
136 exploded_node as its immutable data, and as a key for identifying
137 exploded_nodes we've already seen in the graph. */
138
140{
141public:
143 const program_state &state)
144 : m_point (point),
145 m_state (state),
146 m_hash (m_point.hash () ^ m_state.hash ())
147 {
148 /* We shouldn't be building point_and_states and thus exploded_nodes
149 for states that aren't valid. */
150 gcc_assert (state.m_valid);
151 }
152
153 hashval_t hash () const
154 {
155 return m_hash;
156 }
157 bool operator== (const point_and_state &other) const
158 {
159 return m_point == other.m_point && m_state == other.m_state;
160 }
161
162 const program_point &get_point () const { return m_point; }
163 const program_state &get_state () const { return m_state; }
164
166 {
167 m_state = state;
168 m_hash = m_point.hash () ^ m_state.hash ();
169 }
170
171 void validate (const extrinsic_state &ext_state) const;
172
173private:
176 hashval_t m_hash;
177};
178
179/* A traits class for exploded graphs and their nodes and edges. */
180
182{
187 {
188 dump_args_t (const exploded_graph &eg) : m_eg (eg) {}
189
190 bool show_enode_details_p (const exploded_node &enode) const;
191
192 virtual void
194
196 };
197 typedef exploded_cluster cluster_t;
198};
199
200/* An exploded_node is a unique, immutable <point, state> pair within the
201 exploded_graph.
202 Each exploded_node has a unique index within the graph
203 (for ease of debugging). */
204
205class exploded_node : public dnode<eg_traits>
206{
207 public:
208 /* Has this enode had exploded_graph::process_node called on it?
209 This allows us to distinguish enodes that were merged during
210 worklist-handling, and thus never had process_node called on them
211 (in favor of processing the merged node). */
212 enum class status
213 {
214 /* Node is in the worklist. */
216
217 /* Node has had exploded_graph::process_node called on it. */
219
220 /* Node was excluded from worklist on creation.
221 e.g. for handling exception-unwinding. */
223
224 /* Node was left unprocessed due to merger; it won't have had
225 exploded_graph::process_node called on it. */
227
228 /* Node was processed by maybe_process_run_of_enodes. */
230 };
231 static const char * status_to_str (enum status s);
232
233 exploded_node (const point_and_state &ps, int index);
234
235 hashval_t hash () const { return m_ps.hash (); }
236
237 const char * get_dot_fillcolor () const;
238 void dump_dot (graphviz_out *gv, const dump_args_t &args)
239 const final override;
240 void dump_dot_id (pretty_printer *pp) const;
241
243 void dump (FILE *fp, const extrinsic_state &ext_state) const;
244 void dump (const extrinsic_state &ext_state) const;
245
248
249 std::unique_ptr<json::object> to_json (const extrinsic_state &ext_state) const;
250
252 const gcall &call,
253 program_state *new_state,
256 const gcall &call,
257 const program_point &after_throw_point,
258 program_state *new_state,
259 bool is_rethrow,
261
263
264 const program_point &get_point () const { return m_ps.get_point (); }
265 const supernode *get_supernode () const
266 {
267 return get_point ().get_supernode ();
268 }
269 location_t get_location () const
270 {
271 return get_point ().get_location ();
272 }
274 {
275 return get_point ().get_function ();
276 }
277 int get_stack_depth () const
278 {
279 return get_point ().get_stack_depth ();
280 }
281
282 const program_state &get_state () const { return m_ps.get_state (); }
283
284 const point_and_state *get_ps_key () const { return &m_ps; }
285 const program_point *get_point_key () const { return &m_ps.get_point (); }
286
287 void dump_succs_and_preds (FILE *outf) const;
288
289 enum status get_status () const { return m_status; }
290 void set_status (enum status s)
291 {
293 m_status = s;
294 }
295
297 {
298 m_saved_diagnostics.safe_push (sd);
299 }
300 unsigned get_num_diagnostics () const
301 {
302 return m_saved_diagnostics.length ();
303 }
304 const saved_diagnostic *get_saved_diagnostic (unsigned idx) const
305 {
306 return m_saved_diagnostics[idx];
307 }
308
309private:
311
312 /* The <program_point, program_state> pair. This is const, as it
313 is immutable once the exploded_node has been created. */
315
317
318 /* The saved_diagnostics at this enode, borrowed from the
319 diagnostic_manager. */
320 auto_vec <const saved_diagnostic *> m_saved_diagnostics;
321
322public:
323 /* The index of this exploded_node. */
324 const int m_index;
325
326 /* The number of stmts that were processed when process_node was
327 called on this enode. */
329};
330
331/* An edge within the exploded graph.
332 Some exploded_edges have an underlying superedge; others don't. */
333
334class exploded_edge : public dedge<eg_traits>
335{
336 public:
338 const superedge *sedge, bool could_do_work,
339 std::unique_ptr<custom_edge_info> custom_info);
340 void dump_dot (graphviz_out *gv, const dump_args_t &args)
341 const final override;
343
344 std::unique_ptr<json::object> to_json () const;
345
346 //private:
347 const superedge *const m_sedge;
348
349 /* nullptr for most edges; will be non-NULL for special cases
350 such as an unwind from a longjmp to a setjmp, or when
351 a signal is delivered to a signal-handler. */
352 std::unique_ptr<custom_edge_info> m_custom_info;
353
354 bool could_do_work_p () const { return m_could_do_work_p; }
355
356 const gimple *maybe_get_stmt () const;
357 const operation *maybe_get_op () const;
358
359private:
361
362 /* For -Wanalyzer-infinite-loop.
363 Set to true during processing if any of the activity along
364 this edge is "externally-visible work" (and thus ruling this
365 out as being part of an infinite loop.
366
367 For example, given:
368
369 while (1)
370 do_something ();
371
372 although it is an infinite loop, presumably the point of the
373 program is the loop body, and thus reporting this as an infinite
374 loop is likely to be unhelpful to the user. */
376};
377
378/* Extra data for an exploded_edge that represents an interprocedural
379 call. */
380
382{
383public:
384 interprocedural_call (const gcall &call_stmt,
385 function &callee_fun)
386 : m_call_stmt (call_stmt),
387 m_callee_fun (callee_fun)
388 {}
389
390 void print (pretty_printer *pp) const final override;
391
392 void get_dot_attrs (const char *&out_style,
393 const char *&out_color) const final override;
394
396 const exploded_edge *eedge,
397 region_model_context *ctxt) const final override;
398
400 const exploded_edge *eedge,
401 region_model_context *ctxt) const final override;
402
403 void add_events_to_path (checker_path *emission_path,
404 const exploded_edge &eedge,
405 pending_diagnostic &pd) const final override;
406
407private:
410};
411
412/* Extra data for an exploded_edge that represents an interprocedural
413 return. */
414
416{
417public:
418 interprocedural_return (const gcall &call_stmt)
419 : m_call_stmt (call_stmt)
420 {}
421
422 void print (pretty_printer *pp) const final override;
423
424 void get_dot_attrs (const char *&out_style,
425 const char *&out_color) const final override;
426
428 const exploded_edge *eedge,
429 region_model_context *ctxt) const final override;
430
432 const exploded_edge *eedge,
433 region_model_context *ctxt) const final override;
434
435 void add_events_to_path (checker_path *emission_path,
436 const exploded_edge &eedge,
437 pending_diagnostic &pd) const final override;
438
439private:
441};
442
443/* Extra data for an exploded_edge that represents a rewind from a
444 longjmp to a setjmp (or from a siglongjmp to a sigsetjmp). */
445
447{
448public:
450 const gcall &longjmp_call)
452 m_longjmp_call (longjmp_call)
453 {}
454
455 void print (pretty_printer *pp) const final override
456 {
457 pp_string (pp, "rewind");
458 }
459
461 const exploded_edge *eedge,
462 region_model_context *ctxt) const final override;
463
464 void add_events_to_path (checker_path *emission_path,
465 const exploded_edge &eedge,
466 pending_diagnostic &pd) const final override;
467
470 {
471 return get_enode_origin ()->get_point ();
472 }
473
476 {
477 const program_point &origin_point = get_enode_origin ()->get_point ();
478 return program_point (m_setjmp_record.m_sedge->m_dest,
479 origin_point.get_call_string ());
480 }
481
482 const gcall &get_setjmp_call () const
483 {
484 return *m_setjmp_record.m_setjmp_call;
485 }
486
487 const gcall &get_longjmp_call () const
488 {
489 return m_longjmp_call;
490 }
491
493 {
494 return m_setjmp_record.m_enode;
495 }
496
497private:
500};
501
502/* Statistics about aspects of an exploded_graph. */
503
504struct stats
505{
506 stats (int num_supernodes);
507 void log (logger *logger) const;
508 void dump (FILE *out) const;
509
510 int get_total_enodes () const;
511
516};
517
518/* Traits class for ensuring uniqueness of point_and_state data within
519 an exploded_graph. */
520
522{
523 typedef const point_and_state *key_type;
526
527 static inline hashval_t hash (const key_type &k)
528 {
529 gcc_assert (k != nullptr);
530 gcc_assert (k != reinterpret_cast<key_type> (1));
531 return k->hash ();
532 }
533 static inline bool equal_keys (const key_type &k1, const key_type &k2)
534 {
535 gcc_assert (k1 != nullptr);
536 gcc_assert (k2 != nullptr);
537 gcc_assert (k1 != reinterpret_cast<key_type> (1));
538 gcc_assert (k2 != reinterpret_cast<key_type> (1));
539 if (k1 && k2)
540 return *k1 == *k2;
541 else
542 /* Otherwise they must both be non-NULL. */
543 return k1 == k2;
544 }
545 template <typename T>
546 static inline void remove (T &)
547 {
548 /* empty; the nodes are handled elsewhere. */
549 }
550 template <typename T>
551 static inline void mark_deleted (T &entry)
552 {
553 entry.m_key = reinterpret_cast<key_type> (1);
554 }
555 template <typename T>
556 static inline void mark_empty (T &entry)
557 {
558 entry.m_key = nullptr;
559 }
560 template <typename T>
561 static inline bool is_deleted (const T &entry)
562 {
563 return entry.m_key == reinterpret_cast<key_type> (1);
564 }
565 template <typename T>
566 static inline bool is_empty (const T &entry)
567 {
568 return entry.m_key == nullptr;
569 }
570 static const bool empty_zero_p = false;
571};
572
573/* Per-program_point data for an exploded_graph. */
574
576{
578 : m_key (key), m_excess_enodes (0)
579 {}
580
583 /* The number of attempts to create an enode for this point
584 after exceeding --param=analyzer-max-enodes-per-program-point. */
586};
587
588/* Traits class for storing per-program_point data within
589 an exploded_graph. */
590
592{
593 typedef const program_point *key_type;
596
597 static inline hashval_t hash (const key_type &k)
598 {
599 gcc_assert (k != nullptr);
600 gcc_assert (k != reinterpret_cast<key_type> (1));
601 return k->hash ();
602 }
603 static inline bool equal_keys (const key_type &k1, const key_type &k2)
604 {
605 gcc_assert (k1 != nullptr);
606 gcc_assert (k2 != nullptr);
607 gcc_assert (k1 != reinterpret_cast<key_type> (1));
608 gcc_assert (k2 != reinterpret_cast<key_type> (1));
609 if (k1 && k2)
610 return *k1 == *k2;
611 else
612 /* Otherwise they must both be non-NULL. */
613 return k1 == k2;
614 }
615 template <typename T>
616 static inline void remove (T &)
617 {
618 /* empty; the nodes are handled elsewhere. */
619 }
620 template <typename T>
621 static inline void mark_deleted (T &entry)
622 {
623 entry.m_key = reinterpret_cast<key_type> (1);
624 }
625 template <typename T>
626 static inline void mark_empty (T &entry)
627 {
628 entry.m_key = nullptr;
629 }
630 template <typename T>
631 static inline bool is_deleted (const T &entry)
632 {
633 return entry.m_key == reinterpret_cast<key_type> (1);
634 }
635 template <typename T>
636 static inline bool is_empty (const T &entry)
637 {
638 return entry.m_key == nullptr;
639 }
640 static const bool empty_zero_p = false;
641};
642
643/* Data about a particular call_string within an exploded_graph. */
644
646{
647 per_call_string_data (const call_string &key, int num_supernodes)
648 : m_key (key), m_stats (num_supernodes)
649 {}
650
653};
654
655/* Data about a particular function within an exploded_graph. */
656
666
667/* The strongly connected components of a supergraph.
668 In particular, this allows us to compute a partial ordering
669 of supernodes. */
670
672{
673public:
675
676 int get_scc_id (int node_index) const
677 {
678 return m_per_node[node_index].m_lowlink;
679 }
680
681 void dump () const;
682
683 std::unique_ptr<json::array> to_json () const;
684
685private:
687 {
689 : m_id (-1), m_lowlink (-1), m_on_stack (false)
690 {}
691
692 int m_id;
695 };
696
697 void strong_connect (unsigned index, logger *logger);
698
702};
703
704/* The worklist of exploded_node instances that have been added to
705 an exploded_graph, but that haven't yet been processed to find
706 their successors (or warnings).
707
708 The enodes are stored in a priority queue, ordered by a topological
709 sort of the SCCs in the supergraph, so that enodes for the same
710 program_point should appear at the front of the queue together.
711 This allows for state-merging at CFG join-points, so that
712 sufficiently-similar enodes can be merged into one. */
713
715{
716public:
717 worklist (const exploded_graph &eg, const analysis_plan &plan);
718 unsigned length () const;
721 void add_node (exploded_node *enode);
722 int get_scc_id (const supernode &snode) const
723 {
724 return m_scc.get_scc_id (snode.m_id);
725 }
726
727 std::unique_ptr<json::object> to_json () const;
728
729private:
730 class key_t
731 {
732 public:
733 key_t (const worklist &w, exploded_node *enode)
734 : m_worklist (w), m_enode (enode)
735 {}
736
737 bool operator< (const key_t &other) const
738 {
739 return cmp (*this, other) < 0;
740 }
741
742 bool operator== (const key_t &other) const
743 {
744 return cmp (*this, other) == 0;
745 }
746
747 bool operator> (const key_t &other) const
748 {
749 return !(*this == other || *this < other);
750 }
751
752 private:
753 static int cmp (const key_t &ka, const key_t &kb);
754
755 int get_scc_id (const exploded_node *enode) const
756 {
757 const supernode *snode = enode->get_supernode ();
758 if (snode == nullptr)
759 return 0;
760 return m_worklist.m_scc.get_scc_id (snode->m_id);
761 }
762
765 };
766
767 /* The order is important here: m_scc needs to stick around
768 until after m_queue has finished being cleaned up (the dtor
769 calls the ordering fns). */
772
773 /* Priority queue, backed by a fibonacci_heap. */
776};
777
778/* An exploded_graph is a directed graph of unique <point, state> pairs.
779 It also has a worklist of nodes that are waiting for their successors
780 to be added to the graph. */
781
782class exploded_graph : public digraph<eg_traits>
783{
784public:
785 typedef hash_map <const call_string *,
787
790 const state_purge_map *purge_map,
791 const analysis_plan &plan,
792 int verbosity);
794
795 logger *get_logger () const { return m_logger.get_logger (); }
796
797 const supergraph &get_supergraph () const { return m_sg; }
798 const extrinsic_state &get_ext_state () const { return m_ext_state; }
799 engine *get_engine () const { return m_ext_state.get_engine (); }
800 const state_purge_map *get_purge_map () const { return m_purge_map; }
801 const analysis_plan &get_analysis_plan () const { return m_plan; }
802
803 exploded_node *get_origin () const { return m_origin; }
804
806
811
813 const program_state &state,
814 exploded_node *enode_for_diag,
815 bool add_to_worklist = true);
817 const superedge *sedge, bool could_do_work,
818 std::unique_ptr<custom_edge_info> custom = nullptr);
819
824
827
831
833 const exploded_node *enode,
834 const supernode *node, const gimple *stmt,
837
843 {
845 }
846
849 void log_stats () const;
850 void dump_stats (FILE *) const;
851 void dump_exploded_nodes () const;
852
853 std::unique_ptr<json::object> to_json () const;
854
856
859
860 int get_scc_id (const supernode &node) const
861 {
862 return m_worklist.get_scc_id (node);
863 }
864
866
868 const gimple *stmt,
870
871 /* In infinite-loop.cc */
872 void detect_infinite_loops ();
873
874 /* In infinite-recursion.cc */
877 exploded_node *enode) const;
878
879private:
881
883
885
887
888 /* Map from point/state to exploded node.
889 To avoid duplication we store point_and_state
890 *pointers* as keys, rather than point_and_state, using the
891 instance from within the exploded_node, with a custom hasher. */
892 typedef hash_map <const point_and_state *, exploded_node *,
895
896 /* Map from program_point to per-program_point data. */
900
902
904
906
908
910
913
915
916 /* Stats. */
921
923
924 /* Functions with a top-level enode, to make add_function_entry
925 be idempotent, for use in handling callbacks. */
927};
928
929/* A path within an exploded_graph: a sequence of edges. */
930
932{
933public:
936
937 unsigned length () const { return m_edges.length (); }
938
939 bool find_stmt_backwards (const gimple *search_stmt,
940 int *out_idx) const;
941
943
945 const extrinsic_state *ext_state) const;
946 void dump (FILE *fp, const extrinsic_state *ext_state) const;
947 void dump (const extrinsic_state *ext_state = nullptr) const;
948 void dump_to_file (const char *filename,
949 const extrinsic_state &ext_state) const;
950
951 bool feasible_p (logger *logger, std::unique_ptr<feasibility_problem> *out,
952 engine *eng, const exploded_graph *eg) const;
953
955};
956
957/* A reason why a particular exploded_path is infeasible. */
958
960{
961public:
962 feasibility_problem (unsigned eedge_idx,
963 const exploded_edge &eedge,
964 std::unique_ptr<rejected_constraint> rc)
965 : m_eedge_idx (eedge_idx), m_eedge (eedge),
966 m_rc (std::move (rc))
967 {}
968
969 void dump_to_pp (pretty_printer *pp) const;
970
971 unsigned m_eedge_idx;
973 std::unique_ptr<rejected_constraint> m_rc;
974};
975
976/* A class for capturing the state of a node when checking a path
977 through the exploded_graph for feasibility. */
978
980{
981public:
983 const supergraph &sg);
985 const supergraph &sg);
987
989
991 const exploded_edge *eedge,
993 std::unique_ptr<rejected_constraint> *out_rc);
994
996 const region_model &get_model () const { return m_model; }
999
1000 void dump_to_pp (pretty_printer *pp, bool simple, bool multiline) const;
1001
1002private:
1005};
1006
1007/* Finding the shortest exploded_path within an exploded_graph. */
1008
1010
1011// TODO: split the above up?
1012
1013} // namespace ana
1014
1015#endif /* GCC_ANALYZER_EXPLODED_GRAPH_H */
Definition analysis-plan.h:35
Definition call-string.h:41
Definition checker-path.h:32
Definition common.h:392
Definition diagnostic-manager.h:161
Definition region-model.h:1334
Definition exploded-graph.h:335
std::unique_ptr< json::object > to_json() const
const operation * maybe_get_op() const
void dump_dot_label(pretty_printer *pp) const
bool m_could_do_work_p
Definition exploded-graph.h:375
exploded_edge(exploded_node *src, exploded_node *dest, const superedge *sedge, bool could_do_work, std::unique_ptr< custom_edge_info > custom_info)
std::unique_ptr< custom_edge_info > m_custom_info
Definition exploded-graph.h:352
void dump_dot(graphviz_out *gv, const dump_args_t &args) const final override
bool could_do_work_p() const
Definition exploded-graph.h:354
DISABLE_COPY_AND_ASSIGN(exploded_edge)
const gimple * maybe_get_stmt() const
const superedge *const m_sedge
Definition exploded-graph.h:347
Definition exploded-graph.h:783
hash_map< const point_and_state *, exploded_node *, eg_hash_map_traits > map_t
Definition exploded-graph.h:893
void log_stats() const
stats * get_global_stats()
Definition exploded-graph.h:847
const call_string_data_map_t * get_per_call_string_data() const
Definition exploded-graph.h:857
const state_purge_map * get_purge_map() const
Definition exploded-graph.h:800
const extrinsic_state & m_ext_state
Definition exploded-graph.h:905
void detect_infinite_recursion(exploded_node *enode)
Definition infinite-recursion.cc:581
call_string_data_map_t m_per_call_string_data
Definition exploded-graph.h:922
stats m_functionless_stats
Definition exploded-graph.h:920
exploded_node * find_previous_entry_to(function *top_of_stack_fun, exploded_node *enode) const
Definition infinite-recursion.cc:324
function_stat_map_t m_per_function_stats
Definition exploded-graph.h:919
exploded_edge * add_edge(exploded_node *src, exploded_node *dest, const superedge *sedge, bool could_do_work, std::unique_ptr< custom_edge_info > custom=nullptr)
void detect_infinite_loops()
Definition infinite-loop.cc:555
void process_node(exploded_node *node)
engine * get_engine() const
Definition exploded-graph.h:799
point_map_t m_per_point_data
Definition exploded-graph.h:899
diagnostic_manager & get_diagnostic_manager()
Definition exploded-graph.h:838
exploded_node * add_function_entry(const function &fun)
per_function_data * get_per_function_data(function *) const
log_user m_logger
Definition exploded-graph.h:886
bool maybe_process_run_of_enodes(exploded_node *node)
const supergraph & get_supergraph() const
Definition exploded-graph.h:797
const analysis_plan & get_analysis_plan() const
Definition exploded-graph.h:801
map_t m_point_and_state_to_node
Definition exploded-graph.h:894
const supergraph & m_sg
Definition exploded-graph.h:884
exploded_graph(const supergraph &sg, logger *logger, const extrinsic_state &ext_state, const state_purge_map *purge_map, const analysis_plan &plan, int verbosity)
diagnostic_manager m_diagnostic_manager
Definition exploded-graph.h:914
hash_map< function *, per_function_data * > per_function_data_t
Definition exploded-graph.h:911
void build_initial_worklist()
per_call_string_data * get_or_create_per_call_string_data(const call_string &)
const diagnostic_manager & get_diagnostic_manager() const
Definition exploded-graph.h:842
per_program_point_data * get_per_program_point_data(const program_point &) const
logger * get_logger() const
Definition exploded-graph.h:795
exploded_node * m_origin
Definition exploded-graph.h:903
per_function_data * get_or_create_per_function_data(function *)
void on_escaped_function(tree fndecl)
void dump_exploded_nodes() const
hash_map< const call_string *, per_call_string_data * > call_string_data_map_t
Definition exploded-graph.h:786
hash_set< function * > m_functions_with_enodes
Definition exploded-graph.h:926
stats * get_or_create_function_stats(function *fn)
void print_bar_charts(pretty_printer *pp) const
stats m_global_stats
Definition exploded-graph.h:917
ordered_hash_map< function *, stats * > function_stat_map_t
Definition exploded-graph.h:918
const extrinsic_state & get_ext_state() const
Definition exploded-graph.h:798
worklist m_worklist
Definition exploded-graph.h:901
void dump_stats(FILE *) const
int get_scc_id(const supernode &node) const
Definition exploded-graph.h:860
hash_map< const program_point *, per_program_point_data *, eg_point_hash_map_traits > point_map_t
Definition exploded-graph.h:898
std::unique_ptr< json::object > to_json() const
void save_diagnostic(const state_machine &sm, const exploded_node *enode, const supernode *node, const gimple *stmt, tree var, state_machine::state_t state, pending_diagnostic *d)
const state_purge_map *const m_purge_map
Definition exploded-graph.h:907
const analysis_plan & m_plan
Definition exploded-graph.h:909
void unwind_from_exception(exploded_node &enode, const gimple *stmt, region_model_context *ctxt)
exploded_node * get_or_create_node(const program_point &point, const program_state &state, exploded_node *enode_for_diag, bool add_to_worklist=true)
per_program_point_data * get_or_create_per_program_point_data(const program_point &)
per_function_data_t m_per_function_data
Definition exploded-graph.h:912
exploded_node * get_origin() const
Definition exploded-graph.h:803
exploded_node * get_node_by_index(int idx) const
DISABLE_COPY_AND_ASSIGN(exploded_graph)
Definition exploded-graph.h:206
DISABLE_COPY_AND_ASSIGN(exploded_node)
const point_and_state * get_ps_key() const
Definition exploded-graph.h:284
void dump(const extrinsic_state &ext_state) const
unsigned m_num_processed_stmts
Definition exploded-graph.h:328
status
Definition exploded-graph.h:213
@ special
Definition exploded-graph.h:222
@ bulk_merged
Definition exploded-graph.h:229
@ worklist
Definition exploded-graph.h:215
@ merger
Definition exploded-graph.h:226
function * get_function() const
Definition exploded-graph.h:273
void dump_to_pp(pretty_printer *pp, const extrinsic_state &ext_state) const
location_t get_location() const
Definition exploded-graph.h:269
unsigned get_num_diagnostics() const
Definition exploded-graph.h:300
void dump_saved_diagnostics(pretty_printer *pp) const
void dump_dot(graphviz_out *gv, const dump_args_t &args) const final override
void on_throw(exploded_graph &eg, const gcall &call, const program_point &after_throw_point, program_state *new_state, bool is_rethrow, region_model_context *ctxt)
std::unique_ptr< json::object > to_json(const extrinsic_state &ext_state) const
void add_diagnostic(const saved_diagnostic *sd)
Definition exploded-graph.h:296
void dump_processed_stmts(pretty_printer *pp) const
const point_and_state m_ps
Definition exploded-graph.h:314
const char * get_dot_fillcolor() const
void dump_dot_id(pretty_printer *pp) const
const program_state & get_state() const
Definition exploded-graph.h:282
static const char * status_to_str(enum status s)
void dump_succs_and_preds(FILE *outf) const
const int m_index
Definition exploded-graph.h:324
const program_point * get_point_key() const
Definition exploded-graph.h:285
enum status get_status() const
Definition exploded-graph.h:289
void set_status(enum status s)
Definition exploded-graph.h:290
int get_stack_depth() const
Definition exploded-graph.h:277
void on_longjmp(exploded_graph &eg, const gcall &call, program_state *new_state, region_model_context *ctxt)
exploded_node(const point_and_state &ps, int index)
const program_point & get_point() const
Definition exploded-graph.h:264
void dump(FILE *fp, const extrinsic_state &ext_state) const
auto_vec< const saved_diagnostic * > m_saved_diagnostics
Definition exploded-graph.h:320
const supernode * get_supernode() const
Definition exploded-graph.h:265
void detect_leaks(exploded_graph &eg)
hashval_t hash() const
Definition exploded-graph.h:235
enum status m_status
Definition exploded-graph.h:316
const saved_diagnostic * get_saved_diagnostic(unsigned idx) const
Definition exploded-graph.h:304
exploded_path()
Definition exploded-graph.h:934
void dump(const extrinsic_state *ext_state=nullptr) const
unsigned length() const
Definition exploded-graph.h:937
exploded_node * get_final_enode() const
void dump(FILE *fp, const extrinsic_state *ext_state) const
bool find_stmt_backwards(const gimple *search_stmt, int *out_idx) const
bool feasible_p(logger *logger, std::unique_ptr< feasibility_problem > *out, engine *eng, const exploded_graph *eg) const
void dump_to_file(const char *filename, const extrinsic_state &ext_state) const
void dump_to_pp(pretty_printer *pp, const extrinsic_state *ext_state) const
auto_vec< const exploded_edge * > m_edges
Definition exploded-graph.h:954
exploded_path(const exploded_path &other)
Definition program-state.h:34
feasibility_problem(unsigned eedge_idx, const exploded_edge &eedge, std::unique_ptr< rejected_constraint > rc)
Definition exploded-graph.h:962
const exploded_edge & m_eedge
Definition exploded-graph.h:972
void dump_to_pp(pretty_printer *pp) const
unsigned m_eedge_idx
Definition exploded-graph.h:971
std::unique_ptr< rejected_constraint > m_rc
Definition exploded-graph.h:973
bool maybe_update_for_edge(logger *logger, const exploded_edge *eedge, region_model_context *ctxt, std::unique_ptr< rejected_constraint > *out_rc)
auto_sbitmap & get_snodes_visited()
Definition exploded-graph.h:997
feasibility_state(const region_model &model, const supergraph &sg)
auto_sbitmap m_snodes_visited
Definition exploded-graph.h:1004
feasibility_state(region_model_manager *manager, const supergraph &sg)
void dump_to_pp(pretty_printer *pp, bool simple, bool multiline) const
region_model & get_model()
Definition exploded-graph.h:995
feasibility_state(const feasibility_state &other)
region_model m_model
Definition exploded-graph.h:1003
const region_model & get_model() const
Definition exploded-graph.h:996
feasibility_state & operator=(const feasibility_state &other)
const auto_sbitmap & get_snodes_visited() const
Definition exploded-graph.h:998
Definition region.h:319
void on_condition(const svalue *lhs, enum tree_code op, const svalue *rhs) final override
void on_unknown_change(const svalue *sval, bool is_mutable) final override
void terminate_path() final override
impl_region_model_context(exploded_graph &eg, exploded_node *enode_for_diag, const program_state *old_state, program_state *new_state, uncertainty_t *uncertainty, path_context *path_ctxt, const gimple *stmt=nullptr, bool *out_could_have_done_work=nullptr)
exploded_graph * m_eg
Definition exploded-graph.h:123
const extrinsic_state & m_ext_state
Definition exploded-graph.h:129
logger * get_logger() final override
Definition exploded-graph.h:67
void on_svalue_leak(const svalue *) override
void on_pop_frame(const frame_region *frame_reg) final override
void on_liveness_change(const svalue_set &live_svalues, const region_model *model) final override
void add_note(std::unique_ptr< pending_note > pn) final override
bool * m_out_could_have_done_work
Definition exploded-graph.h:132
bool warn_at(std::unique_ptr< pending_diagnostic > d, pending_location &&ploc) final override
void on_state_leak(const state_machine &sm, const svalue *sval, state_machine::state_t state)
impl_region_model_context(program_state *state, const extrinsic_state &ext_state, uncertainty_t *uncertainty, logger *logger=nullptr)
void add_event(std::unique_ptr< checker_event > event) final override
pending_location get_pending_location_for_diag() const override
program_state * m_new_state
Definition exploded-graph.h:127
log_user m_logger
Definition exploded-graph.h:124
const program_state * m_old_state
Definition exploded-graph.h:126
void on_unusable_in_infinite_loop() override
Definition exploded-graph.h:118
const program_state * get_state() const override
Definition exploded-graph.h:114
void on_phi(const gphi *phi, tree rhs) final override
void on_unexpected_tree_code(tree t, const dump_location_t &loc) final override
void on_escaped_function(tree fndecl) final override
void bifurcate(std::unique_ptr< custom_edge_info > info) final override
path_context * m_path_ctxt
Definition exploded-graph.h:131
void purge_state_involving(const svalue *sval) final override
void on_bounded_ranges(const svalue &sval, const bounded_ranges &ranges) final override
uncertainty_t * get_uncertainty() final override
const gimple * m_stmt
Definition exploded-graph.h:128
uncertainty_t * m_uncertainty
Definition exploded-graph.h:130
const gimple * get_stmt() const override
Definition exploded-graph.h:111
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
bool checking_for_infinite_loop_p() const override
Definition exploded-graph.h:117
const extrinsic_state * get_ext_state() const final override
Definition exploded-graph.h:100
const exploded_graph * get_eg() const override
Definition exploded-graph.h:112
exploded_node * m_enode_for_diag
Definition exploded-graph.h:125
const gcall & m_call_stmt
Definition exploded-graph.h:408
void get_dot_attrs(const char *&out_style, const char *&out_color) const final override
bool update_model(region_model *model, const exploded_edge *eedge, region_model_context *ctxt) const final override
interprocedural_call(const gcall &call_stmt, function &callee_fun)
Definition exploded-graph.h:384
void add_events_to_path(checker_path *emission_path, const exploded_edge &eedge, pending_diagnostic &pd) const final override
bool update_state(program_state *state, const exploded_edge *eedge, region_model_context *ctxt) const final override
function & m_callee_fun
Definition exploded-graph.h:409
void print(pretty_printer *pp) const final override
const gcall & m_call_stmt
Definition exploded-graph.h:440
void print(pretty_printer *pp) const final override
interprocedural_return(const gcall &call_stmt)
Definition exploded-graph.h:418
void add_events_to_path(checker_path *emission_path, const exploded_edge &eedge, pending_diagnostic &pd) const final override
bool update_model(region_model *model, const exploded_edge *eedge, region_model_context *ctxt) const final override
bool update_state(program_state *state, const exploded_edge *eedge, region_model_context *ctxt) const final override
void get_dot_attrs(const char *&out_style, const char *&out_color) const final override
Definition analyzer-logging.h:189
Definition analyzer-logging.h:34
Definition ops.h:80
Definition common.h:435
Definition pending-diagnostic.h:189
Definition exploded-graph.h:140
hashval_t m_hash
Definition exploded-graph.h:176
bool operator==(const point_and_state &other) const
Definition exploded-graph.h:157
void validate(const extrinsic_state &ext_state) const
const program_state & get_state() const
Definition exploded-graph.h:163
program_state m_state
Definition exploded-graph.h:175
program_point m_point
Definition exploded-graph.h:174
point_and_state(const program_point &point, const program_state &state)
Definition exploded-graph.h:142
const program_point & get_point() const
Definition exploded-graph.h:162
hashval_t hash() const
Definition exploded-graph.h:153
void set_state(const program_state &state)
Definition exploded-graph.h:165
Definition program-point.h:54
location_t get_location() const
Definition program-point.h:98
function * get_function() const
Definition program-point.h:88
const supernode * get_supernode() const
Definition program-point.h:82
int get_stack_depth() const
Definition program-point.h:107
const call_string & get_call_string() const
Definition program-point.h:86
hashval_t hash() const
Definition program-state.h:224
Definition region-model.h:768
Definition region-model-manager.h:32
Definition region-model.h:299
setjmp_record m_setjmp_record
Definition exploded-graph.h:498
program_point get_point_before_setjmp() const
Definition exploded-graph.h:469
bool update_model(region_model *model, const exploded_edge *eedge, region_model_context *ctxt) const final override
const gcall & get_setjmp_call() const
Definition exploded-graph.h:482
void print(pretty_printer *pp) const final override
Definition exploded-graph.h:455
const exploded_node * get_enode_origin() const
Definition exploded-graph.h:492
void add_events_to_path(checker_path *emission_path, const exploded_edge &eedge, pending_diagnostic &pd) const final override
const gcall & m_longjmp_call
Definition exploded-graph.h:499
program_point get_point_after_setjmp() const
Definition exploded-graph.h:475
rewind_info_t(const setjmp_record &setjmp_record, const gcall &longjmp_call)
Definition exploded-graph.h:449
const gcall & get_longjmp_call() const
Definition exploded-graph.h:487
Definition diagnostic-manager.h:79
Definition program-state.h:92
Definition sm.h:43
const state_machine::state * state_t
Definition sm.h:63
Definition state-purge.h:31
Definition exploded-graph.h:672
void strong_connect(unsigned index, logger *logger)
int get_scc_id(int node_index) const
Definition exploded-graph.h:676
auto_vec< per_node_data > m_per_node
Definition exploded-graph.h:701
const supergraph & m_sg
Definition exploded-graph.h:699
strongly_connected_components(const supergraph &sg, logger *logger)
auto_vec< unsigned > m_stack
Definition exploded-graph.h:700
std::unique_ptr< json::array > to_json() const
Definition supergraph.h:281
Definition supergraph.h:105
Definition supergraph.h:224
int m_id
Definition supergraph.h:268
Definition svalue.h:92
Definition store.h:161
bool operator<(const key_t &other) const
Definition exploded-graph.h:737
const worklist & m_worklist
Definition exploded-graph.h:763
bool operator==(const key_t &other) const
Definition exploded-graph.h:742
exploded_node * m_enode
Definition exploded-graph.h:764
bool operator>(const key_t &other) const
Definition exploded-graph.h:747
static int cmp(const key_t &ka, const key_t &kb)
int get_scc_id(const exploded_node *enode) const
Definition exploded-graph.h:755
key_t(const worklist &w, exploded_node *enode)
Definition exploded-graph.h:733
Definition exploded-graph.h:715
std::unique_ptr< json::object > to_json() const
void add_node(exploded_node *enode)
strongly_connected_components m_scc
Definition exploded-graph.h:770
worklist(const exploded_graph &eg, const analysis_plan &plan)
queue_t m_queue
Definition exploded-graph.h:775
exploded_node * take_next()
fibonacci_heap< key_t, exploded_node > queue_t
Definition exploded-graph.h:774
exploded_node * peek_next()
const analysis_plan & m_plan
Definition exploded-graph.h:771
int get_scc_id(const supernode &snode) const
Definition exploded-graph.h:722
unsigned length() const
Definition sbitmap.h:303
Definition vec.h:1667
dedge(node_t *src, node_t *dest)
Definition digraph.h:93
eg_traits::dump_args_t dump_args_t
Definition digraph.h:91
digraph()
Definition digraph.h:128
Definition digraph.h:43
eg_traits::dump_args_t dump_args_t
Definition digraph.h:46
Definition dumpfile.h:446
Definition ree.cc:583
Definition fibonacci_heap.h:143
Definition graphviz.h:385
Definition hash-map.h:40
Definition hash-set.h:37
Definition ordered-hash-map.h:35
Definition pretty-print.h:241
Definition shortest-paths.h:49
union tree_node * tree
Definition coretypes.h:97
void final(rtx_insn *first, FILE *file, int optimize_p)
Definition final.cc:2009
tree_code
Definition genmatch.cc:1002
Definition access-diagram.h:30
@ stmt
Definition checker-event.h:38
@ custom
Definition checker-event.h:37
shortest_paths< eg_traits, exploded_path > shortest_exploded_paths
Definition exploded-graph.h:1009
hash_set< const svalue * > svalue_set
Definition common.h:73
Definition custom-sarif-properties/state-graphs.h:33
void pp_string(pretty_printer *pp, const char *str)
Definition pretty-print.cc:2764
Definition constraint-manager.h:123
Definition exploded-graph.h:522
static bool equal_keys(const key_type &k1, const key_type &k2)
Definition exploded-graph.h:533
static void mark_empty(T &entry)
Definition exploded-graph.h:556
static void mark_deleted(T &entry)
Definition exploded-graph.h:551
static bool is_deleted(const T &entry)
Definition exploded-graph.h:561
static const bool empty_zero_p
Definition exploded-graph.h:570
exploded_node * compare_type
Definition exploded-graph.h:525
const point_and_state * key_type
Definition exploded-graph.h:523
exploded_node * value_type
Definition exploded-graph.h:524
static void remove(T &)
Definition exploded-graph.h:546
static hashval_t hash(const key_type &k)
Definition exploded-graph.h:527
static bool is_empty(const T &entry)
Definition exploded-graph.h:566
Definition exploded-graph.h:592
static bool is_deleted(const T &entry)
Definition exploded-graph.h:631
static const bool empty_zero_p
Definition exploded-graph.h:640
static void mark_empty(T &entry)
Definition exploded-graph.h:626
static hashval_t hash(const key_type &k)
Definition exploded-graph.h:597
const program_point * key_type
Definition exploded-graph.h:593
per_program_point_data * value_type
Definition exploded-graph.h:594
per_program_point_data * compare_type
Definition exploded-graph.h:595
static void mark_deleted(T &entry)
Definition exploded-graph.h:621
static bool is_empty(const T &entry)
Definition exploded-graph.h:636
static bool equal_keys(const key_type &k1, const key_type &k2)
Definition exploded-graph.h:603
static void remove(T &)
Definition exploded-graph.h:616
bool show_enode_details_p(const exploded_node &enode) const
const exploded_graph & m_eg
Definition exploded-graph.h:195
virtual void dump_extra_info(const exploded_node *, pretty_printer *) const
Definition exploded-graph.h:193
dump_args_t(const exploded_graph &eg)
Definition exploded-graph.h:188
Definition exploded-graph.h:182
exploded_graph graph_t
Definition exploded-graph.h:185
exploded_edge edge_t
Definition exploded-graph.h:184
exploded_node node_t
Definition exploded-graph.h:183
exploded_cluster cluster_t
Definition exploded-graph.h:197
Definition diagnostic-manager.h:35
Definition exploded-graph.h:646
stats m_stats
Definition exploded-graph.h:652
const call_string & m_key
Definition exploded-graph.h:651
per_call_string_data(const call_string &key, int num_supernodes)
Definition exploded-graph.h:647
Definition exploded-graph.h:658
per_function_data()
Definition exploded-graph.h:659
auto_vec< call_summary * > m_summaries
Definition exploded-graph.h:664
void add_call_summary(exploded_node *node)
Definition exploded-graph.h:576
const program_point m_key
Definition exploded-graph.h:581
int m_excess_enodes
Definition exploded-graph.h:585
per_program_point_data(const program_point &key)
Definition exploded-graph.h:577
auto_vec< exploded_node * > m_enodes
Definition exploded-graph.h:582
Definition svalue.h:531
Definition exploded-graph.h:505
void log(logger *logger) const
void dump(FILE *out) const
int m_num_nodes
Definition exploded-graph.h:512
int m_num_supernodes
Definition exploded-graph.h:515
int m_node_reuse_after_merge_count
Definition exploded-graph.h:514
stats(int num_supernodes)
int get_total_enodes() const
int m_node_reuse_count
Definition exploded-graph.h:513
per_node_data()
Definition exploded-graph.h:688
bool m_on_stack
Definition exploded-graph.h:694
int m_id
Definition exploded-graph.h:692
int m_lowlink
Definition exploded-graph.h:693
Definition function.h:249
Definition gimple.h:352
Definition gimple.h:221
Definition gimple.h:461
Definition ira-emit.cc:158
Definition gengtype.h:377
Definition genautomata.cc:669
#define gcc_assert(EXPR)
Definition system.h:817
#define false
Definition system.h:891
static sbitmap processed
Definition tree-ssa-dce.cc:88
static void add_to_worklist(same_succ *same)
Definition tree-ssa-tail-merge.cc:714