GCC Middle and Back End API Reference
checker-event.h
Go to the documentation of this file.
1/* Subclasses of diagnostic_event for analyzer diagnostics.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
20
21#ifndef GCC_ANALYZER_CHECKER_EVENT_H
22#define GCC_ANALYZER_CHECKER_EVENT_H
23
26
27namespace ana {
28
29/* A bundle of location information for a checker_event. */
30
32{
33 event_loc_info (location_t loc, tree fndecl, int depth)
34 : m_loc (loc), m_fndecl (fndecl), m_depth (depth)
35 {}
36
40};
41
42/* An enum for discriminating between the concrete subclasses of
43 checker_event. */
44
65
66extern const char *event_kind_to_string (enum event_kind ek);
67
68/* Event subclasses.
69
70 The class hierarchy looks like this (using indentation to show
71 inheritance, and with event_kinds shown for the concrete subclasses):
72
73 diagnostic_event
74 checker_event
75 debug_event (EK_DEBUG)
76 custom_event (EK_CUSTOM)
77 precanned_custom_event
78 statement_event (EK_STMT)
79 region_creation_event (EK_REGION_CREATION)
80 function_entry_event (EK_FUNCTION_ENTRY)
81 state_change_event (EK_STATE_CHANGE)
82 superedge_event
83 cfg_edge_event
84 start_cfg_edge_event (EK_START_CFG_EDGE)
85 end_cfg_edge_event (EK_END_CFG_EDGE)
86 call_event (EK_CALL_EDGE)
87 return_edge (EK_RETURN_EDGE)
88 start_consolidated_cfg_edges_event (EK_START_CONSOLIDATED_CFG_EDGES)
89 end_consolidated_cfg_edges_event (EK_END_CONSOLIDATED_CFG_EDGES)
90 inlined_call_event (EK_INLINED_CALL)
91 setjmp_event (EK_SETJMP)
92 rewind_event
93 rewind_from_longjmp_event (EK_REWIND_FROM_LONGJMP)
94 rewind_to_setjmp_event (EK_REWIND_TO_SETJMP)
95 warning_event (EK_WARNING). */
96
97/* Abstract subclass of diagnostic_event; the base class for use in
98 checker_path (the analyzer's diagnostic_path subclass). */
99
101{
102public:
103 /* Implementation of diagnostic_event. */
104
105 location_t get_location () const final override { return m_loc; }
107 int get_stack_depth () const final override { return m_effective_depth; }
109 {
111 return &m_logical_loc;
112 else
113 return NULL;
114 }
115 meaning get_meaning () const override;
116 bool connect_to_next_event_p () const override { return false; }
118 {
119 return 0;
120 }
121
122 void
124
125 /* Additional functionality. */
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 /* For use with %@. */
138 {
139 return &m_emission_id;
140 }
141
142 void dump (pretty_printer *pp) const;
143 void debug () const;
144
145 void set_location (location_t loc) { m_loc = loc; }
146
147protected:
149 const event_loc_info &loc_info);
150
151 public:
152 const enum event_kind m_kind;
153 protected:
160 diagnostic_event_id_t m_emission_id; // only set once all pruning has occurred
162};
163
164/* A concrete event subclass for a purely textual event, for use in
165 debugging path creation and filtering. */
166
168{
169public:
170
172 const char *desc)
174 m_desc (xstrdup (desc))
175 {
176 }
178 {
179 free (m_desc);
180 }
181
182 label_text get_desc (bool) const final override;
183
184private:
185 char *m_desc;
186};
187
188/* An abstract event subclass for custom events. These are not filtered,
189 as they are likely to be pertinent to the diagnostic. */
190
192{
193protected:
198};
199
200/* A concrete custom_event subclass with a precanned message. */
201
203{
204public:
206 const char *desc)
208 m_desc (xstrdup (desc))
209 {
210 }
212 {
213 free (m_desc);
214 }
215
216 label_text get_desc (bool) const final override;
217
218private:
219 char *m_desc;
220};
221
222/* A concrete event subclass describing the execution of a gimple statement,
223 for use at high verbosity levels when debugging paths. */
224
226{
227public:
228 statement_event (const gimple *stmt, tree fndecl, int depth,
229 const program_state &dst_state);
230
231 label_text get_desc (bool) const final override;
232
233 const gimple * const m_stmt;
235};
236
237/* An abstract event subclass describing the creation of a region that
238 is significant for a diagnostic.
239
240 There are too many combinations to express region creation in one message,
241 so we emit multiple region_creation_event instances when each pertinent
242 region is created.
243
244 The events are created by pending_diagnostic's add_region_creation_events
245 vfunc, which by default creates a region_creation_event_memory_space, and
246 if a capacity is known, a region_creation_event_capacity, giving e.g.:
247 (1) region created on stack here
248 (2) capacity: 100 bytes
249 but this vfunc can be overridden to create other events if other wordings
250 are more appropriate foa a given pending_diagnostic. */
251
257
258/* Concrete subclass of region_creation_event.
259 Generates a message based on the memory space of the region
260 e.g. "region created on stack here". */
261
277
278/* Concrete subclass of region_creation_event.
279 Generates a message based on the capacity of the region
280 e.g. "capacity: 100 bytes". */
281
283{
284public:
292
293 label_text get_desc (bool can_colorize) const final override;
294
295private:
297};
298
299/* Concrete subclass of region_creation_event.
300 Generates a message based on the capacity of the region
301 e.g. "allocated 100 bytes here". */
302
304{
305public:
311
312 label_text get_desc (bool can_colorize) const final override;
313
314private:
316};
317
318/* Concrete subclass of region_creation_event.
319 Generates a debug message intended for analyzer developers. */
320
322{
323public:
327 m_reg (reg), m_capacity (capacity)
328 {
329 }
330
331 label_text get_desc (bool can_colorize) const final override;
332
333private:
334 const region *m_reg;
336};
337
338/* An event subclass describing the entry to a function. */
339
341{
342public:
347
349
350 label_text get_desc (bool can_colorize) const override;
351 meaning get_meaning () const override;
352
353 bool is_function_entry_p () const final override { return true; }
354};
355
356/* Subclass of checker_event describing a state change. */
357
359{
360public:
361 state_change_event (const supernode *node, const gimple *stmt,
362 int stack_depth,
363 const state_machine &sm,
364 const svalue *sval,
367 const svalue *origin,
369 const exploded_node *enode);
370
371 label_text get_desc (bool can_colorize) const final override;
372 meaning get_meaning () const override;
373
375 {
377 }
378
379 const exploded_node *get_exploded_node () const { return m_enode; }
380
390};
391
392/* Subclass of checker_event; parent class for subclasses that relate to
393 a superedge. */
394
396{
397public:
399 const override;
400
401 /* Mark this edge event as being either an interprocedural call or
402 return in which VAR is in STATE, and that this is critical to the
403 diagnostic (so that get_desc can attempt to get a better description
404 from any pending_diagnostic). */
410
412
413 bool should_filter_p (int verbosity) const;
414
415 protected:
417 const event_loc_info &loc_info);
418
419 public:
424};
425
426/* An abstract event subclass for when a CFG edge is followed; it has two
427 subclasses, representing the start of the edge and the end of the
428 edge, which come in pairs. */
429
431{
432public:
433 meaning get_meaning () const override;
434
436
437 protected:
439 const event_loc_info &loc_info);
440};
441
442/* A concrete event subclass for the start of a CFG edge
443 e.g. "following 'false' branch...'. */
444
446{
447public:
453
454 label_text get_desc (bool can_colorize) const override;
455 bool connect_to_next_event_p () const final override { return true; }
456
457protected:
459
460private:
462 tree lhs,
463 enum tree_code op,
464 tree rhs);
466};
467
468/* A concrete event subclass for the end of a CFG edge
469 e.g. "...to here'. */
470
472{
473public:
479
480 label_text get_desc (bool /*can_colorize*/) const final override
481 {
482 return label_text::borrow ("...to here");
483 }
484};
485
486/* A concrete event subclass for an interprocedural call. */
487
506
507/* A concrete event subclass for an interprocedural return. */
508
523
524/* A concrete event subclass for the start of a consolidated run of CFG
525 edges all either TRUE or FALSE e.g. "following 'false' branch...'. */
526
528{
529public:
536
537 label_text get_desc (bool can_colorize) const final override;
538 meaning get_meaning () const override;
539 bool connect_to_next_event_p () const final override { return true; }
540
541 private:
543};
544
545/* A concrete event subclass for the end of a consolidated run of
546 CFG edges e.g. "...to here'. */
547
549{
550public:
555
556 label_text get_desc (bool /*can_colorize*/) const final override
557 {
558 return label_text::borrow ("...to here");
559 }
560};
561
562/* A concrete event subclass for describing an inlined call event
563 e.g. "inlined call to 'callee' from 'caller'". */
564
566{
567public:
582
583 label_text get_desc (bool /*can_colorize*/) const final override;
584 meaning get_meaning () const override;
585
586private:
589};
590
591/* A concrete event subclass for a setjmp or sigsetjmp call. */
592
594{
595public:
597 const exploded_node *enode,
598 const gcall *setjmp_call)
600 m_enode (enode), m_setjmp_call (setjmp_call)
601 {
602 }
603
604 label_text get_desc (bool can_colorize) const final override;
605
608 diagnostic_event_id_t emission_id) final override;
609
610private:
613};
614
615/* An abstract event subclass for rewinding from a longjmp to a setjmp
616 (or siglongjmp to sigsetjmp).
617
618 Base class for two from/to subclasses, showing the two halves of the
619 rewind. */
620
622{
623public:
626 const exploded_edge *get_eedge () const { return m_eedge; }
627
628 protected:
630 enum event_kind kind,
634
635 private:
637};
638
639/* A concrete event subclass for rewinding from a longjmp to a setjmp,
640 showing the longjmp (or siglongjmp). */
641
655
656/* A concrete event subclass for rewinding from a longjmp to a setjmp,
657 showing the setjmp (or sigsetjmp). */
658
679
680/* Concrete subclass of checker_event for use at the end of a path:
681 a repeat of the warning message at the end of the path (perhaps with
682 references to pertinent events that occurred on the way), at the point
683 where the problem occurs. */
684
686{
687public:
689 const exploded_node *enode,
690 const state_machine *sm,
693 m_enode (enode),
694 m_sm (sm), m_var (var), m_state (state)
695 {
696 }
697
698 label_text get_desc (bool can_colorize) const final override;
699 meaning get_meaning () const override;
700
701 const exploded_node *get_exploded_node () const { return m_enode; }
702
703private:
708};
709
710} // namespace ana
711
712#endif /* GCC_ANALYZER_CHECKER_EVENT_H */
state
Definition cfgbuild.cc:168
Definition checker-event.h:489
label_text get_desc(bool can_colorize) const 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
const supernode * m_dest_snode
Definition checker-event.h:504
tree get_caller_fndecl() const
const supernode * m_src_snode
Definition checker-event.h:503
Definition supergraph.h:393
Definition checker-event.h:431
meaning get_meaning() const override
cfg_edge_event(enum event_kind kind, const exploded_edge &eedge, const event_loc_info &loc_info)
const cfg_superedge & get_cfg_superedge() const
Definition supergraph.h:515
Definition checker-event.h:101
virtual void prepare_for_emission(checker_path *, pending_diagnostic *pd, diagnostic_event_id_t emission_id)
checker_event(enum event_kind kind, const event_loc_info &loc_info)
void debug() const
virtual bool is_return_p() const
Definition checker-event.h:134
tree m_effective_fndecl
Definition checker-event.h:156
diagnostic_event_id_t m_emission_id
Definition checker-event.h:160
int get_stack_depth() const final override
Definition checker-event.h:107
location_t m_loc
Definition checker-event.h:154
const diagnostic_event_id_t * get_id_ptr() const
Definition checker-event.h:137
enum event_kind m_kind
Definition checker-event.h:152
tree m_original_fndecl
Definition checker-event.h:155
virtual bool is_function_entry_p() const
Definition checker-event.h:133
const logical_location * get_logical_location() const final override
Definition checker-event.h:108
tree get_fndecl() const final override
Definition checker-event.h:106
tree_logical_location m_logical_loc
Definition checker-event.h:161
void set_location(location_t loc)
Definition checker-event.h:145
pending_diagnostic * m_pending_diagnostic
Definition checker-event.h:159
bool connect_to_next_event_p() const override
Definition checker-event.h:116
int get_original_stack_depth() const
Definition checker-event.h:127
location_t get_location() const final override
Definition checker-event.h:105
void maybe_add_sarif_properties(sarif_object &thread_flow_loc_obj) const override
virtual bool is_call_p() const
Definition checker-event.h:132
int m_effective_depth
Definition checker-event.h:158
int m_original_depth
Definition checker-event.h:157
diagnostic_thread_id_t get_thread_id() const final override
Definition checker-event.h:117
meaning get_meaning() const override
void dump(pretty_printer *pp) const
Definition checker-path.h:31
Definition checker-event.h:192
custom_event(const event_loc_info &loc_info)
Definition checker-event.h:194
Definition checker-event.h:168
label_text get_desc(bool) const final override
char * m_desc
Definition checker-event.h:185
~debug_event()
Definition checker-event.h:177
debug_event(const event_loc_info &loc_info, const char *desc)
Definition checker-event.h:171
Definition checker-event.h:472
label_text get_desc(bool) const final override
Definition checker-event.h:480
end_cfg_edge_event(const exploded_edge &eedge, const event_loc_info &loc_info)
Definition checker-event.h:474
Definition checker-event.h:549
label_text get_desc(bool) const final override
Definition checker-event.h:556
end_consolidated_cfg_edges_event(const event_loc_info &loc_info)
Definition checker-event.h:551
Definition exploded-graph.h:381
Definition exploded-graph.h:203
Definition checker-event.h:341
function_entry_event(const program_point &dst_point)
meaning get_meaning() const override
label_text get_desc(bool can_colorize) const override
bool is_function_entry_p() const final override
Definition checker-event.h:353
function_entry_event(const event_loc_info &loc_info)
Definition checker-event.h:343
Definition checker-event.h:566
label_text get_desc(bool) const final override
meaning get_meaning() const 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:568
tree m_apparent_callee_fndecl
Definition checker-event.h:587
tree m_apparent_caller_fndecl
Definition checker-event.h:588
Definition pending-diagnostic.h:208
Definition checker-event.h:203
label_text get_desc(bool) const final override
~precanned_custom_event()
Definition checker-event.h:211
char * m_desc
Definition checker-event.h:219
precanned_custom_event(const event_loc_info &loc_info, const char *desc)
Definition checker-event.h:205
Definition program-point.h:175
Definition program-state.h:203
const function * get_current_function() const
Definition checker-event.h:304
tree m_capacity
Definition checker-event.h:315
region_creation_event_allocation_size(tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:306
label_text get_desc(bool can_colorize) const final override
Definition checker-event.h:283
region_creation_event_capacity(tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:285
label_text get_desc(bool can_colorize) const final override
tree m_capacity
Definition checker-event.h:296
Definition checker-event.h:322
region_creation_event_debug(const region *reg, tree capacity, const event_loc_info &loc_info)
Definition checker-event.h:324
tree m_capacity
Definition checker-event.h:335
const region * m_reg
Definition checker-event.h:334
label_text get_desc(bool can_colorize) const final override
Definition checker-event.h:263
enum memory_space m_mem_space
Definition checker-event.h:275
region_creation_event_memory_space(enum memory_space mem_space, const event_loc_info &loc_info)
Definition checker-event.h:265
label_text get_desc(bool can_colorize) const final override
Definition checker-event.h:253
region_creation_event(const event_loc_info &loc_info)
Definition region.h:125
Definition checker-event.h:510
return_event(const exploded_edge &eedge, const event_loc_info &loc_info)
bool is_return_p() const final override
label_text get_desc(bool can_colorize) const final override
meaning get_meaning() const override
Definition checker-event.h:622
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)
tree get_setjmp_caller() const
const exploded_edge * m_eedge
Definition checker-event.h:636
const rewind_info_t * m_rewind_info
Definition checker-event.h:633
const exploded_edge * get_eedge() const
Definition checker-event.h:626
Definition checker-event.h:643
rewind_from_longjmp_event(const exploded_edge *eedge, const event_loc_info &loc_info, const rewind_info_t *rewind_info)
Definition checker-event.h:645
label_text get_desc(bool can_colorize) const final override
Definition exploded-graph.h:457
Definition checker-event.h:660
void prepare_for_emission(checker_path *path, pending_diagnostic *pd, diagnostic_event_id_t emission_id) final override
label_text get_desc(bool can_colorize) const 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:662
diagnostic_event_id_t m_original_setjmp_event_id
Definition checker-event.h:677
Definition checker-event.h:594
setjmp_event(const event_loc_info &loc_info, const exploded_node *enode, const gcall *setjmp_call)
Definition checker-event.h:596
const gcall * m_setjmp_call
Definition checker-event.h:612
void prepare_for_emission(checker_path *path, pending_diagnostic *pd, diagnostic_event_id_t emission_id) final override
const exploded_node * m_enode
Definition checker-event.h:611
label_text get_desc(bool can_colorize) const final override
Definition checker-event.h:446
bool connect_to_next_event_p() const final override
Definition checker-event.h:455
static label_text maybe_describe_condition(bool can_colorize, tree lhs, enum tree_code op, tree rhs)
start_cfg_edge_event(const exploded_edge &eedge, const event_loc_info &loc_info)
Definition checker-event.h:448
label_text get_desc(bool can_colorize) const override
label_text maybe_describe_condition(bool can_colorize) const
static bool should_print_expr_p(tree)
Definition checker-event.h:528
bool connect_to_next_event_p() const final override
Definition checker-event.h:539
label_text get_desc(bool can_colorize) const final override
meaning get_meaning() const override
start_consolidated_cfg_edges_event(const event_loc_info &loc_info, bool edge_sense)
Definition checker-event.h:530
bool m_edge_sense
Definition checker-event.h:542
Definition checker-event.h:359
state_machine::state_t m_to
Definition checker-event.h:386
state_machine::state_t m_from
Definition checker-event.h:385
const svalue * m_origin
Definition checker-event.h:387
label_text get_desc(bool can_colorize) const final override
state_change_event(const supernode *node, const gimple *stmt, int stack_depth, 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)
const exploded_node * get_exploded_node() const
Definition checker-event.h:379
meaning get_meaning() const override
const supernode * m_node
Definition checker-event.h:381
program_state m_dst_state
Definition checker-event.h:388
const state_machine & m_sm
Definition checker-event.h:383
const svalue * m_sval
Definition checker-event.h:384
const exploded_node * m_enode
Definition checker-event.h:389
const gimple * m_stmt
Definition checker-event.h:382
const function * get_dest_function() const
Definition checker-event.h:374
Definition sm.h:45
Definition sm.h:40
Definition checker-event.h:226
statement_event(const gimple *stmt, tree fndecl, int depth, const program_state &dst_state)
label_text get_desc(bool) const final override
const gimple *const m_stmt
Definition checker-event.h:233
const program_state m_dst_state
Definition checker-event.h:234
Definition checker-event.h:396
state_machine::state_t m_critical_state
Definition checker-event.h:423
superedge_event(enum event_kind kind, const exploded_edge &eedge, const event_loc_info &loc_info)
const callgraph_superedge & get_callgraph_superedge() const
tree m_var
Definition checker-event.h:422
const exploded_edge & m_eedge
Definition checker-event.h:420
bool should_filter_p(int verbosity) const
void record_critical_state(tree var, state_machine::state_t state)
Definition checker-event.h:405
void maybe_add_sarif_properties(sarif_object &thread_flow_loc_obj) const override
const superedge * m_sedge
Definition checker-event.h:421
Definition supergraph.h:314
Definition supergraph.h:235
Definition svalue.h:90
Definition checker-event.h:686
tree m_var
Definition checker-event.h:706
const exploded_node * get_exploded_node() const
Definition checker-event.h:701
const state_machine * m_sm
Definition checker-event.h:705
meaning get_meaning() const override
const exploded_node * m_enode
Definition checker-event.h:704
label_text get_desc(bool can_colorize) const final override
state_machine::state_t m_state
Definition checker-event.h:707
warning_event(const event_loc_info &loc_info, const exploded_node *enode, const state_machine *sm, tree var, state_machine::state_t state)
Definition checker-event.h:688
Definition diagnostic-event-id.h:37
Definition diagnostic-path.h:70
Definition logical-location.h:52
Definition pretty-print.h:244
Definition diagnostic-format-sarif.h:42
Definition tree-logical-location.h:42
union tree_node * tree
Definition coretypes.h:97
unsigned diagnostic_thread_id_t
Definition diagnostic-event-id.h:64
void final(rtx_insn *first, FILE *file, int optimize_p)
Definition final.cc:2002
free(str)
tree_code
Definition genmatch.cc:347
T * ggc_alloc(ALONE_CXX_MEM_STAT_INFO)
Definition ggc.h:184
#define LOCATION_BLOCK(LOC)
Definition input.h:187
Definition access-diagram.h:30
event_kind
Definition checker-event.h:46
@ EK_STATE_CHANGE
Definition checker-event.h:52
@ EK_END_CONSOLIDATED_CFG_EDGES
Definition checker-event.h:58
@ EK_REWIND_TO_SETJMP
Definition checker-event.h:62
@ EK_SETJMP
Definition checker-event.h:60
@ EK_WARNING
Definition checker-event.h:63
@ EK_STMT
Definition checker-event.h:49
@ EK_CALL_EDGE
Definition checker-event.h:55
@ EK_FUNCTION_ENTRY
Definition checker-event.h:51
@ EK_CUSTOM
Definition checker-event.h:48
@ EK_START_CONSOLIDATED_CFG_EDGES
Definition checker-event.h:57
@ EK_START_CFG_EDGE
Definition checker-event.h:53
@ EK_DEBUG
Definition checker-event.h:47
@ EK_REWIND_FROM_LONGJMP
Definition checker-event.h:61
@ EK_RETURN_EDGE
Definition checker-event.h:56
@ EK_INLINED_CALL
Definition checker-event.h:59
@ EK_REGION_CREATION
Definition checker-event.h:50
@ EK_END_CFG_EDGE
Definition checker-event.h:54
const char * event_kind_to_string(enum event_kind ek)
memory_space
Definition region.h:31
Definition checker-event.h:32
location_t m_loc
Definition checker-event.h:37
event_loc_info(location_t loc, tree fndecl, int depth)
Definition checker-event.h:33
tree m_fndecl
Definition checker-event.h:38
int m_depth
Definition checker-event.h:39
Definition diagnostic-path.h:114
Definition function.h:249
Definition gimple.h:353
Definition gimple.h:225
Definition genautomata.cc:669
#define NULL
Definition system.h:50
#define gcc_assert(EXPR)
Definition system.h:821