GCC Middle and Back End API Reference
checker-event.h
Go to the documentation of this file.
1/* Subclasses of diagnostics::paths::event for analyzer diagnostics.
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_CHECKER_EVENT_H
22#define GCC_ANALYZER_CHECKER_EVENT_H
23
28
29namespace ana {
30
31/* An enum for discriminating between the concrete subclasses of
32 checker_event. */
33
57
58extern const char *event_kind_to_string (enum event_kind ek);
59
60/* Event subclasses.
61
62 The class hierarchy looks like this (using indentation to show
63 inheritance, and with event_kinds shown for the concrete subclasses):
64
65 diagnostics::paths::event
66 checker_event
67 debug_event (event_kind::debug)
68 custom_event (event_kind::custom)
69 precanned_custom_event
70 statement_event (event_kind::stmt)
71 region_creation_event (event_kind::region_creation)
72 function_entry_event (event_kind::function_entry)
73 state_change_event (event_kind::state_change)
74 superedge_event
75 cfg_edge_event
76 start_cfg_edge_event (event_kind::start_cfg_edge)
77 end_cfg_edge_event (event_kind::end_cfg_edge)
78 catch_cfg_edge_event (event_kind::catch_cfg_edge)
79 call_event (event_kind::call_)
80 return_event (event_kind::return_)
81 start_consolidated_cfg_edges_event (event_kind::start_consolidated_cfg_edges)
82 end_consolidated_cfg_edges_event (event_kind::end_consolidated_cfg_edges)
83 inlined_call_event (event_kind::inlined_call)
84 setjmp_event (event_kind::setjmp_)
85 rewind_event
86 rewind_from_longjmp_event (event_kind::rewind_from_longjmp)
87 rewind_to_setjmp_event (event_kind::rewind_to_setjmp)
88 throw_event (event_kind:throw_)
89 explicit_throw_event
90 throw_from_call_to_external_fn_event
91 unwind_event (event_kind::unwind)
92 warning_event (event_kind::warning). */
93
94/* Abstract subclass of diagnostics::paths::event; the base class for use in
95 checker_path (the analyzer's diagnostics::paths::path subclass). */
96
98{
99public:
100 /* Implementation of diagnostics::paths::event. */
101
102 location_t get_location () const final override { return m_loc; }
103 int get_stack_depth () const final override { return m_effective_depth; }
105 get_logical_location () const final override
106 {
107 return m_logical_loc;
108 }
109 meaning get_meaning () const override;
110 bool connect_to_next_event_p () const override { return false; }
112 {
113 return 0;
114 }
115
116 void
118 diagnostics::sarif_object &thread_flow_loc_obj)
119 const override;
120
121 /* Additional functionality. */
122 enum event_kind get_kind () const { return m_kind; }
123 tree get_fndecl () const { return m_effective_fndecl; }
124
126
130 virtual bool is_call_p () const { return false; }
131 virtual bool is_function_entry_p () const { return false; }
132 virtual bool is_return_p () const { return false; }
133
134 std::unique_ptr<diagnostics::digraphs::digraph>
135 maybe_make_diagnostic_state_graph (bool debug) const final override;
136
137 virtual const program_state *
138 get_program_state () const { return nullptr; }
139
140 /* For use with %@. */
142 {
143 return &m_emission_id;
144 }
145
146 void dump (pretty_printer *pp) const;
147 void debug () const;
148
149 void set_location (location_t loc) { m_loc = loc; }
150
151protected:
153 const event_loc_info &loc_info);
154
155 private:
157 const enum event_kind m_kind;
158 protected:
159 location_t m_loc;
165 diagnostics::paths::event_id_t m_emission_id; // only set once all pruning has occurred
167};
168
169/* A concrete event subclass for a purely textual event, for use in
170 debugging path creation and filtering. */
171
173{
174public:
175
176 debug_event (const event_loc_info &loc_info,
177 const char *desc)
178 : checker_event (event_kind::debug, loc_info),
179 m_desc (xstrdup (desc))
180 {
181 }
183 {
184 free (m_desc);
185 }
186
187 void print_desc (pretty_printer &) const final override;
188
189private:
190 char *m_desc;
191};
192
193/* An abstract event subclass for custom events. These are not filtered,
194 as they are likely to be pertinent to the diagnostic. */
195
197{
198protected:
199 custom_event (const event_loc_info &loc_info)
200 : checker_event (event_kind::custom, loc_info)
201 {
202 }
203};
204
205/* A concrete custom_event subclass with a precanned message. */
206
208{
209public:
211 const char *desc)
212 : custom_event (loc_info),
213 m_desc (xstrdup (desc))
214 {
215 }
217 {
218 free (m_desc);
219 }
220
221 void print_desc (pretty_printer &) const final override;
222
223private:
224 char *m_desc;
225};
226
227/* A concrete event subclass describing the execution of a gimple statement,
228 for use at high verbosity levels when debugging paths. */
229
231{
232public:
233 statement_event (const gimple *stmt, tree fndecl, int depth,
234 const program_state &dst_state);
235
236 void print_desc (pretty_printer &) const final override;
237
238 const program_state *
239 get_program_state () const final override
240 {
241 return &m_dst_state;
242 }
243
244 const gimple * const m_stmt;
246};
247
248/* An abstract event subclass describing the creation of a region that
249 is significant for a diagnostic.
250
251 There are too many combinations to express region creation in one message,
252 so we emit multiple region_creation_event instances when each pertinent
253 region is created.
254
255 The events are created by pending_diagnostic's add_region_creation_events
256 vfunc, which by default creates a region_creation_event_memory_space, and
257 if a capacity is known, a region_creation_event_capacity, giving e.g.:
258 (1) region created on stack here
259 (2) capacity: 100 bytes
260 but this vfunc can be overridden to create other events if other wordings
261 are more appropriate foa a given pending_diagnostic. */
262
264{
265protected:
267};
268
269/* Concrete subclass of region_creation_event.
270 Generates a message based on the memory space of the region
271 e.g. "region created on stack here". */
272
274{
275public:
277 const event_loc_info &loc_info)
278 : region_creation_event (loc_info),
279 m_mem_space (mem_space)
280 {
281 }
282
283 void print_desc (pretty_printer &pp) const final override;
284
285private:
287};
288
289/* Concrete subclass of region_creation_event.
290 Generates a message based on the capacity of the region
291 e.g. "capacity: 100 bytes". */
292
294{
295public:
297 const event_loc_info &loc_info)
298 : region_creation_event (loc_info),
299 m_capacity (capacity)
300 {
302 }
303
304 void print_desc (pretty_printer &pp) const final override;
305
306private:
308};
309
310/* Concrete subclass of region_creation_event.
311 Generates a message based on the capacity of the region
312 e.g. "allocated 100 bytes here". */
313
315{
316public:
318 const event_loc_info &loc_info)
319 : region_creation_event (loc_info),
320 m_capacity (capacity)
321 {}
322
323 void print_desc (pretty_printer &pp) const final override;
324
325private:
327};
328
329/* Concrete subclass of region_creation_event.
330 Generates a debug message intended for analyzer developers. */
331
333{
334public:
336 const event_loc_info &loc_info)
337 : region_creation_event (loc_info),
338 m_reg (reg), m_capacity (capacity)
339 {
340 }
341
342 void print_desc (pretty_printer &pp) const final override;
343
344private:
345 const region *m_reg;
347};
348
349/* An event subclass describing the entry to a function. */
350
352{
353public:
355 const program_state &state)
357 m_state (state)
358 {
359 }
360
362 const program_state &state);
363
364 void print_desc (pretty_printer &pp) const override;
365 meaning get_meaning () const override;
366
367 bool is_function_entry_p () const final override { return true; }
368
369 const program_state *
370 get_program_state () const final override
371 {
372 return &m_state;
373 }
374
375private:
377};
378
379/* Subclass of checker_event describing a state change. */
380
382{
383public:
385 const gimple *stmt,
386 const state_machine &sm,
387 const svalue *sval,
390 const svalue *origin,
391 const program_state &dst_state,
392 const exploded_node *enode);
393
394 void print_desc (pretty_printer &pp) const final override;
395 meaning get_meaning () const override;
396
397 const program_state *
398 get_program_state () const final override
399 {
400 return &m_dst_state;
401 }
402
404 {
405 return m_dst_state.get_current_function ();
406 }
407
408 const exploded_node *get_exploded_node () const { return m_enode; }
409
418};
419
420/* Subclass of checker_event; parent class for subclasses that relate to
421 a superedge. */
422
424{
425public:
426 void
428 diagnostics::sarif_object &thread_flow_loc_obj)
429 const override;
430
431 bool should_filter_p (int verbosity) const;
432
433 const program_state *
434 get_program_state () const override;
435
436 virtual const call_and_return_op *
438
439 protected:
440 superedge_event (enum event_kind kind, const exploded_edge &eedge,
441 const event_loc_info &loc_info);
442
443 public:
446};
447
448/* An abstract event subclass for when a CFG edge is followed; it has two
449 subclasses, representing the start of the edge and the end of the
450 edge, which come in pairs. */
451
453{
454public:
455 meaning get_meaning () const override;
456
458
459 protected:
461 const exploded_edge &eedge,
462 const event_loc_info &loc_info,
463 const control_flow_op *op);
464
466};
467
468/* A concrete event subclass for the start of a CFG edge
469 e.g. "following 'false' branch...'. */
470
472{
473public:
475 const event_loc_info &loc_info,
476 const control_flow_op *op)
477 : cfg_edge_event (event_kind::start_cfg_edge, eedge, loc_info, op)
478 {
479 }
480
481 void print_desc (pretty_printer &pp) const override;
482 bool connect_to_next_event_p () const final override { return true; }
483
484private:
486};
487
488/* A concrete event subclass for the end of a CFG edge
489 e.g. "...to here'. */
490
492{
493public:
495 const event_loc_info &loc_info,
496 const control_flow_op *op)
497 : cfg_edge_event (event_kind::end_cfg_edge, eedge, loc_info, op)
498 {
499 }
500
501 void print_desc (pretty_printer &pp) const final override
502 {
503 pp_string (&pp, "...to here");
504 }
505};
506
507/* A concrete event subclass for catching an exception
508 e.g. "...catching 'struct io_error' here". */
509
511{
512public:
514 const event_loc_info &loc_info,
515 const control_flow_op &op,
516 tree type)
517 : cfg_edge_event (event_kind::catch_, eedge, loc_info, &op),
518 m_type (type)
519 {
520 }
521
522 void print_desc (pretty_printer &pp) const final override
523 {
524 if (m_type)
525 pp_printf (&pp, "...catching exception of type %qT here", m_type);
526 else
527 pp_string (&pp, "...catching exception here");
528 }
529
530 meaning get_meaning () const override;
531
532private:
534};
535
537{
539 : m_var (NULL_TREE),
540 m_state (nullptr)
541 {
542 }
544 : m_var (var),
545 m_state (state)
546 {
547 }
548
551};
552
553/* A concrete event subclass for an interprocedural call. */
554
556{
557public:
559 const event_loc_info &loc_info);
560
561 void print_desc (pretty_printer &pp) const override;
562 meaning get_meaning () const override;
563
564 bool is_call_p () const final override;
565
566 const program_state *
567 get_program_state () const final override;
568
569 /* Mark this edge event as being either an interprocedural call or
570 return in which VAR is in STATE, and that this is critical to the
571 diagnostic (so that print_desc can attempt to get a better description
572 from any pending_diagnostic). */
577
578protected:
581
585};
586
587/* A concrete event subclass for an interprocedural return. */
588
590{
591public:
593 const event_loc_info &loc_info);
594
595 void print_desc (pretty_printer &pp) const final override;
596 meaning get_meaning () const override;
597
598 bool is_return_p () const final override;
599
600 const call_and_return_op *
602 {
604 }
605
606 const program_state *
607 get_program_state () const override;
608
609 /* Mark this edge event as being either an interprocedural call or
610 return in which VAR is in STATE, and that this is critical to the
611 diagnostic (so that print_desc can attempt to get a better description
612 from any pending_diagnostic). */
617
623};
624
625/* A concrete event subclass for the start of a consolidated run of CFG
626 edges all either TRUE or FALSE e.g. "following 'false' branch...'. */
627
629{
630public:
632 bool edge_sense)
634 m_edge_sense (edge_sense)
635 {
636 }
637
638 void print_desc (pretty_printer &pp) const final override;
639 meaning get_meaning () const override;
640 bool connect_to_next_event_p () const final override { return true; }
641
642 private:
644};
645
646/* A concrete event subclass for the end of a consolidated run of
647 CFG edges e.g. "...to here'. */
648
650{
651public:
656
657 void print_desc (pretty_printer &pp) const final override
658 {
659 pp_string (&pp, "...to here");
660 }
661};
662
663/* A concrete event subclass for describing an inlined call event
664 e.g. "inlined call to 'callee' from 'caller'". */
665
667{
668public:
669 inlined_call_event (location_t loc,
670 tree apparent_callee_fndecl,
671 tree apparent_caller_fndecl,
672 int actual_depth,
673 int stack_depth_adjustment)
675 event_loc_info (loc,
676 apparent_caller_fndecl,
677 actual_depth + stack_depth_adjustment)),
678 m_apparent_callee_fndecl (apparent_callee_fndecl),
679 m_apparent_caller_fndecl (apparent_caller_fndecl)
680 {
681 gcc_assert (LOCATION_BLOCK (loc) == NULL);
682 }
683
684 void print_desc (pretty_printer &) const final override;
685 meaning get_meaning () const override;
686
687private:
690};
691
692/* A concrete event subclass for a setjmp or sigsetjmp call. */
693
695{
696public:
697 setjmp_event (const event_loc_info &loc_info,
698 const exploded_node *enode,
699 const gcall &setjmp_call)
700 : checker_event (event_kind::setjmp_, loc_info),
701 m_enode (enode), m_setjmp_call (setjmp_call)
702 {
703 }
704
705 void print_desc (pretty_printer &pp) const final override;
706
707 meaning get_meaning () const override;
708
711 diagnostics::paths::event_id_t emission_id) final override;
712
713private:
716};
717
718/* An abstract event subclass for rewinding from a longjmp to a setjmp
719 (or siglongjmp to sigsetjmp).
720
721 Base class for two from/to subclasses, showing the two halves of the
722 rewind. */
723
725{
726public:
729 const exploded_edge *get_eedge () const { return m_eedge; }
730
731 meaning get_meaning () const override;
732
733 protected:
735 enum event_kind kind,
736 const event_loc_info &loc_info,
737 const rewind_info_t *rewind_info);
739
740 private:
742};
743
744/* A concrete event subclass for rewinding from a longjmp to a setjmp,
745 showing the longjmp (or siglongjmp). */
746
748{
749public:
751 const event_loc_info &loc_info,
752 const rewind_info_t *rewind_info)
753 : rewind_event (eedge, event_kind::rewind_from_longjmp, loc_info,
754 rewind_info)
755 {
756 }
757
758 void print_desc (pretty_printer &pp) const final override;
759};
760
761/* A concrete event subclass for rewinding from a longjmp to a setjmp,
762 showing the setjmp (or sigsetjmp). */
763
765{
766public:
768 const event_loc_info &loc_info,
769 const rewind_info_t *rewind_info)
770 : rewind_event (eedge, event_kind::rewind_to_setjmp, loc_info,
771 rewind_info)
772 {
773 }
774
775 void print_desc (pretty_printer &pp) const final override;
776
779 diagnostics::paths::event_id_t emission_id) final override;
780
781private:
783};
784
785/* An abstract subclass for throwing/rethrowing an exception. */
786
788{
789public:
790 throw_event (const event_loc_info &loc_info,
791 const exploded_node *enode,
792 const gcall &throw_call)
793 : checker_event (event_kind::throw_, loc_info),
794 m_enode (enode),
795 m_throw_call (throw_call)
796 {
797 }
798
799 meaning get_meaning () const override;
800
801protected:
804};
805
806/* A concrete event subclass for an explicit "throw EXC;"
807 or "throw;" (actually, a call to __cxa_throw or __cxa_rethrow). */
808
810{
811public:
813 const exploded_node *enode,
814 const gcall &throw_call,
815 tree type,
816 bool is_rethrow)
817 : throw_event (loc_info, enode, throw_call),
818 m_type (type),
819 m_is_rethrow (is_rethrow)
820 {
821 }
822
823 void print_desc (pretty_printer &pp) const final override;
824
825private:
828};
829
830/* A concrete event subclass for an exception being thrown
831 from within a call to a function we don't have the body of,
832 or where we don't know what function was called. */
833
835{
836public:
838 const exploded_node *enode,
839 const gcall &throw_call,
840 tree fndecl)
841 : throw_event (loc_info, enode, throw_call),
842 m_fndecl (fndecl)
843 {
844 }
845
846 void print_desc (pretty_printer &pp) const final override;
847
848private:
850};
851
852/* A concrete event subclass for unwinding a stack frame when
853 processing an exception. */
854
856{
857public:
858 unwind_event (const event_loc_info &loc_info)
859 : checker_event (event_kind::unwind, loc_info),
860 m_num_frames (1)
861 {
862 }
863
864 meaning get_meaning () const override;
865
866 void print_desc (pretty_printer &pp) const final override;
867
869};
870
871/* Concrete subclass of checker_event for use at the end of a path:
872 a repeat of the warning message at the end of the path (perhaps with
873 references to pertinent events that occurred on the way), at the point
874 where the problem occurs. */
875
877{
878public:
880 const exploded_node *enode,
881 const state_machine *sm,
883 const program_state *program_state_ = nullptr)
884 : checker_event (event_kind::warning, loc_info),
885 m_enode (enode),
886 m_sm (sm), m_var (var), m_state (state)
887 {
888 if (program_state_)
889 m_program_state = std::make_unique<program_state> (*program_state_);
890 }
891
892 void print_desc (pretty_printer &pp) const final override;
893 meaning get_meaning () const override;
894
895 const program_state *
896 get_program_state () const final override;
897
898 const exploded_node *get_exploded_node () const { return m_enode; }
899
900private:
905 /* Optional copy of program state, for when this is different from
906 m_enode's state: */
907 std::unique_ptr<program_state> m_program_state;
908};
909
910} // namespace ana
911
912#endif /* GCC_ANALYZER_CHECKER_EVENT_H */
Definition ops.h:382
void print_desc(pretty_printer &pp) const override
critical_state m_critical_state
Definition checker-event.h:584
const program_state * get_program_state() const final override
meaning get_meaning() const override
call_event(const exploded_edge &eedge, const event_loc_info &loc_info)
bool is_call_p() const final override
tree get_callee_fndecl() const
void record_critical_state(tree var, state_machine::state_t state)
Definition checker-event.h:573
const supernode * m_dest_snode
Definition checker-event.h:583
tree get_caller_fndecl() const
const supernode * m_src_snode
Definition checker-event.h:582
tree m_type
Definition checker-event.h:533
catch_cfg_edge_event(const exploded_edge &eedge, const event_loc_info &loc_info, const control_flow_op &op, tree type)
Definition checker-event.h:513
meaning get_meaning() const override
void print_desc(pretty_printer &pp) const final override
Definition checker-event.h:522
meaning get_meaning() const override
::edge get_cfg_edge() const
cfg_edge_event(enum event_kind kind, const exploded_edge &eedge, const event_loc_info &loc_info, const control_flow_op *op)
const control_flow_op * m_op
Definition checker-event.h:465
diagnostics::paths::event_id_t m_emission_id
Definition checker-event.h:165
virtual const program_state * get_program_state() const
Definition checker-event.h:138
diagnostics::logical_locations::key get_logical_location() const final override
Definition checker-event.h:105
checker_event(enum event_kind kind, const event_loc_info &loc_info)
const diagnostics::paths::event_id_t * get_id_ptr() const
Definition checker-event.h:141
void debug() const
virtual bool is_return_p() const
Definition checker-event.h:132
virtual void prepare_for_emission(checker_path *, pending_diagnostic *pd, diagnostics::paths::event_id_t emission_id)
tree m_effective_fndecl
Definition checker-event.h:161
enum event_kind get_kind() const
Definition checker-event.h:122
int get_stack_depth() const final override
Definition checker-event.h:103
location_t m_loc
Definition checker-event.h:159
enum event_kind m_kind
Definition checker-event.h:157
tree m_original_fndecl
Definition checker-event.h:160
virtual bool is_function_entry_p() const
Definition checker-event.h:131
diagnostics::logical_locations::key m_logical_loc
Definition checker-event.h:166
diagnostics::paths::thread_id_t get_thread_id() const final override
Definition checker-event.h:111
void maybe_add_sarif_properties(diagnostics::sarif_builder &, diagnostics::sarif_object &thread_flow_loc_obj) const override
void set_location(location_t loc)
Definition checker-event.h:149
pending_diagnostic * m_pending_diagnostic
Definition checker-event.h:164
bool connect_to_next_event_p() const override
Definition checker-event.h:110
int get_original_stack_depth() const
Definition checker-event.h:125
location_t get_location() const final override
Definition checker-event.h:102
virtual bool is_call_p() const
Definition checker-event.h:130
std::unique_ptr< diagnostics::digraphs::digraph > maybe_make_diagnostic_state_graph(bool debug) const final override
tree get_fndecl() const
Definition checker-event.h:123
const checker_path * m_path
Definition checker-event.h:156
int m_effective_depth
Definition checker-event.h:163
int m_original_depth
Definition checker-event.h:162
meaning get_meaning() const override
void dump(pretty_printer *pp) const
Definition checker-path.h:32
Definition ops.h:590
custom_event(const event_loc_info &loc_info)
Definition checker-event.h:199
char * m_desc
Definition checker-event.h:190
~debug_event()
Definition checker-event.h:182
debug_event(const event_loc_info &loc_info, const char *desc)
Definition checker-event.h:176
void print_desc(pretty_printer &) const final override
void print_desc(pretty_printer &pp) const final override
Definition checker-event.h:501
end_cfg_edge_event(const exploded_edge &eedge, const event_loc_info &loc_info, const control_flow_op *op)
Definition checker-event.h:494
end_consolidated_cfg_edges_event(const event_loc_info &loc_info)
Definition checker-event.h:652
void print_desc(pretty_printer &pp) const final override
Definition checker-event.h:657
tree m_type
Definition checker-event.h:826
void print_desc(pretty_printer &pp) const final override
bool m_is_rethrow
Definition checker-event.h:827
explicit_throw_event(const event_loc_info &loc_info, const exploded_node *enode, const gcall &throw_call, tree type, bool is_rethrow)
Definition checker-event.h:812
Definition exploded-graph.h:335
Definition exploded-graph.h:206
function_entry_event(const program_point &dst_point, const program_state &state)
const program_state * get_program_state() const final override
Definition checker-event.h:370
meaning get_meaning() const override
function_entry_event(const event_loc_info &loc_info, const program_state &state)
Definition checker-event.h:354
bool is_function_entry_p() const final override
Definition checker-event.h:367
void print_desc(pretty_printer &pp) const override
const program_state & m_state
Definition checker-event.h:376
meaning get_meaning() const override
void print_desc(pretty_printer &) const final override
inlined_call_event(location_t loc, tree apparent_callee_fndecl, tree apparent_caller_fndecl, int actual_depth, int stack_depth_adjustment)
Definition checker-event.h:669
tree m_apparent_callee_fndecl
Definition checker-event.h:688
tree m_apparent_caller_fndecl
Definition checker-event.h:689
Definition pending-diagnostic.h:189
~precanned_custom_event()
Definition checker-event.h:216
char * m_desc
Definition checker-event.h:224
void print_desc(pretty_printer &) const final override
precanned_custom_event(const event_loc_info &loc_info, const char *desc)
Definition checker-event.h:210
Definition program-point.h:54
Definition program-state.h:224
tree m_capacity
Definition checker-event.h:326
void print_desc(pretty_printer &pp) const final override
region_creation_event_allocation_size(tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:317
void print_desc(pretty_printer &pp) const final override
region_creation_event_capacity(tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:296
tree m_capacity
Definition checker-event.h:307
region_creation_event_debug(const region *reg, tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:335
tree m_capacity
Definition checker-event.h:346
const region * m_reg
Definition checker-event.h:345
void print_desc(pretty_printer &pp) const final override
enum memory_space m_mem_space
Definition checker-event.h:286
void print_desc(pretty_printer &pp) const final override
region_creation_event_memory_space(enum memory_space mem_space, const event_loc_info &loc_info)
Definition checker-event.h:276
region_creation_event(const event_loc_info &loc_info)
Definition region.h:126
const supernode * m_dest_snode
Definition checker-event.h:620
return_event(const exploded_edge &eedge, const event_loc_info &loc_info)
const call_and_return_op * m_call_and_return_op
Definition checker-event.h:621
critical_state m_critical_state
Definition checker-event.h:622
void record_critical_state(tree var, state_machine::state_t state)
Definition checker-event.h:613
void print_desc(pretty_printer &pp) const final override
bool is_return_p() const final override
const supernode * m_src_snode
Definition checker-event.h:619
const exploded_edge & m_eedge
Definition checker-event.h:618
meaning get_meaning() const override
const program_state * get_program_state() const override
const call_and_return_op * get_call_and_return_op() const
Definition checker-event.h:601
tree get_longjmp_caller() const
rewind_event(const exploded_edge *eedge, enum event_kind kind, const event_loc_info &loc_info, const rewind_info_t *rewind_info)
meaning get_meaning() const override
tree get_setjmp_caller() const
const exploded_edge * m_eedge
Definition checker-event.h:741
const rewind_info_t * m_rewind_info
Definition checker-event.h:738
const exploded_edge * get_eedge() const
Definition checker-event.h:729
rewind_from_longjmp_event(const exploded_edge *eedge, const event_loc_info &loc_info, const rewind_info_t *rewind_info)
Definition checker-event.h:750
void print_desc(pretty_printer &pp) const final override
Definition exploded-graph.h:447
void prepare_for_emission(checker_path *path, pending_diagnostic *pd, diagnostics::paths::event_id_t emission_id) final override
rewind_to_setjmp_event(const exploded_edge *eedge, const event_loc_info &loc_info, const rewind_info_t *rewind_info)
Definition checker-event.h:767
void print_desc(pretty_printer &pp) const final override
diagnostics::paths::event_id_t m_original_setjmp_event_id
Definition checker-event.h:782
meaning get_meaning() const override
const gcall & m_setjmp_call
Definition checker-event.h:715
void print_desc(pretty_printer &pp) const final override
void prepare_for_emission(checker_path *path, pending_diagnostic *pd, diagnostics::paths::event_id_t emission_id) final override
const exploded_node * m_enode
Definition checker-event.h:714
setjmp_event(const event_loc_info &loc_info, const exploded_node *enode, const gcall &setjmp_call)
Definition checker-event.h:697
bool connect_to_next_event_p() const final override
Definition checker-event.h:482
void print_desc(pretty_printer &pp) const override
start_cfg_edge_event(const exploded_edge &eedge, const event_loc_info &loc_info, const control_flow_op *op)
Definition checker-event.h:474
static bool should_print_expr_p(tree)
bool connect_to_next_event_p() const final override
Definition checker-event.h:640
meaning get_meaning() const override
start_consolidated_cfg_edges_event(const event_loc_info &loc_info, bool edge_sense)
Definition checker-event.h:631
bool m_edge_sense
Definition checker-event.h:643
void print_desc(pretty_printer &pp) const final override
state_machine::state_t m_to
Definition checker-event.h:414
state_machine::state_t m_from
Definition checker-event.h:413
void print_desc(pretty_printer &pp) const final override
const svalue * m_origin
Definition checker-event.h:415
const exploded_node * get_exploded_node() const
Definition checker-event.h:408
state_change_event(const event_loc_info &loc_info, const gimple *stmt, const state_machine &sm, const svalue *sval, state_machine::state_t from, state_machine::state_t to, const svalue *origin, const program_state &dst_state, const exploded_node *enode)
meaning get_meaning() const override
program_state m_dst_state
Definition checker-event.h:416
const state_machine & m_sm
Definition checker-event.h:411
const svalue * m_sval
Definition checker-event.h:412
const program_state * get_program_state() const final override
Definition checker-event.h:398
const exploded_node * m_enode
Definition checker-event.h:417
const gimple * m_stmt
Definition checker-event.h:410
const function * get_dest_function() const
Definition checker-event.h:403
Definition sm.h:43
const state_machine::state * state_t
Definition sm.h:63
statement_event(const gimple *stmt, tree fndecl, int depth, const program_state &dst_state)
void print_desc(pretty_printer &) const final override
const program_state * get_program_state() const final override
Definition checker-event.h:239
const gimple *const m_stmt
Definition checker-event.h:244
const program_state m_dst_state
Definition checker-event.h:245
void maybe_add_sarif_properties(diagnostics::sarif_builder &, diagnostics::sarif_object &thread_flow_loc_obj) const override
virtual const call_and_return_op * get_call_and_return_op() const
const program_state * get_program_state() const override
superedge_event(enum event_kind kind, const exploded_edge &eedge, const event_loc_info &loc_info)
const exploded_edge & m_eedge
Definition checker-event.h:444
bool should_filter_p(int verbosity) const
const superedge * m_sedge
Definition checker-event.h:445
Definition supergraph.h:281
Definition supergraph.h:224
Definition svalue.h:92
const gcall & m_throw_call
Definition checker-event.h:803
meaning get_meaning() const override
throw_event(const event_loc_info &loc_info, const exploded_node *enode, const gcall &throw_call)
Definition checker-event.h:790
const exploded_node * m_enode
Definition checker-event.h:802
void print_desc(pretty_printer &pp) const final override
throw_from_call_to_external_fn_event(const event_loc_info &loc_info, const exploded_node *enode, const gcall &throw_call, tree fndecl)
Definition checker-event.h:837
tree m_fndecl
Definition checker-event.h:849
unwind_event(const event_loc_info &loc_info)
Definition checker-event.h:858
meaning get_meaning() const override
void print_desc(pretty_printer &pp) const final override
int m_num_frames
Definition checker-event.h:868
const program_state * get_program_state() const final override
std::unique_ptr< program_state > m_program_state
Definition checker-event.h:907
tree m_var
Definition checker-event.h:903
const exploded_node * get_exploded_node() const
Definition checker-event.h:898
const state_machine * m_sm
Definition checker-event.h:902
meaning get_meaning() const override
const exploded_node * m_enode
Definition checker-event.h:901
void print_desc(pretty_printer &pp) const final override
state_machine::state_t m_state
Definition checker-event.h:904
warning_event(const event_loc_info &loc_info, const exploded_node *enode, const state_machine *sm, tree var, state_machine::state_t state, const program_state *program_state_=nullptr)
Definition checker-event.h:879
Definition logical-locations.h:101
Definition paths.h:83
Definition sarif-sink.cc:769
Definition sarif-sink.h:151
Definition pretty-print.h:241
bool debug
Definition collect-utils.cc:34
static struct path_prefix cpath path
Definition collect2.cc:514
class edge_def * edge
Definition coretypes.h:369
union tree_node * tree
Definition coretypes.h:97
bool warning(diagnostics::option_id, const char *,...) ATTRIBUTE_GCC_DIAG(2
void final(rtx_insn *first, FILE *file, int optimize_p)
Definition final.cc:2009
struct state * state_t
Definition genautomata.cc:195
free(str)
#define LOCATION_BLOCK(LOC)
Definition input.h:98
Definition access-diagram.h:30
event_kind
Definition checker-event.h:35
@ function_entry
Definition checker-event.h:40
@ throw_
Definition checker-event.h:53
@ call_
Definition checker-event.h:45
@ unwind
Definition checker-event.h:54
@ stmt
Definition checker-event.h:38
@ setjmp_
Definition checker-event.h:50
@ rewind_to_setjmp
Definition checker-event.h:52
@ start_consolidated_cfg_edges
Definition checker-event.h:47
@ start_cfg_edge
Definition checker-event.h:42
@ region_creation
Definition checker-event.h:39
@ inlined_call
Definition checker-event.h:49
@ state_change
Definition checker-event.h:41
@ rewind_from_longjmp
Definition checker-event.h:51
@ catch_
Definition checker-event.h:44
@ custom
Definition checker-event.h:37
@ end_cfg_edge
Definition checker-event.h:43
@ return_
Definition checker-event.h:46
@ end_consolidated_cfg_edges
Definition checker-event.h:48
const char * event_kind_to_string(enum event_kind ek)
memory_space
Definition region.h:32
int thread_id_t
Definition event-id.h:71
diagnostic_event_id_t event_id_t
Definition event-id.h:66
void pp_printf(pretty_printer *pp, const char *msg,...)
Definition pretty-print.cc:2683
void pp_string(pretty_printer *pp, const char *str)
Definition pretty-print.cc:2764
Definition checker-event.h:537
critical_state()
Definition checker-event.h:538
state_machine::state_t m_state
Definition checker-event.h:550
tree m_var
Definition checker-event.h:549
critical_state(tree var, state_machine::state_t state)
Definition checker-event.h:543
Definition event-loc-info.h:29
Definition function.h:249
Definition gimple.h:352
Definition gimple.h:221
Definition genautomata.cc:669
Definition gengtype.h:252
#define NULL
Definition system.h:50
#define gcc_assert(EXPR)
Definition system.h:817
#define NULL_TREE
Definition tree.h:318