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