]>
Commit | Line | Data |
---|---|---|
6d4a35ca | 1 | /* Additional metadata for a diagnostic. |
a945c346 | 2 | Copyright (C) 2019-2024 Free Software Foundation, Inc. |
6d4a35ca DM |
3 | Contributed by David Malcolm <dmalcolm@redhat.com> |
4 | ||
5 | This file is part of GCC. | |
6 | ||
7 | GCC is free software; you can redistribute it and/or modify it under | |
8 | the terms of the GNU General Public License as published by the Free | |
9 | Software Foundation; either version 3, or (at your option) any later | |
10 | version. | |
11 | ||
12 | GCC is distributed in the hope that it will be useful, but WITHOUT ANY | |
13 | WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 | FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 | for more details. | |
16 | ||
17 | You should have received a copy of the GNU General Public License | |
18 | along with GCC; see the file COPYING3. If not see | |
19 | <http://www.gnu.org/licenses/>. */ | |
20 | ||
21 | #ifndef GCC_DIAGNOSTIC_METADATA_H | |
22 | #define GCC_DIAGNOSTIC_METADATA_H | |
23 | ||
12b67d1e DM |
24 | class sarif_object; |
25 | ||
6d4a35ca DM |
26 | /* A bundle of additional metadata that can be associated with a |
27 | diagnostic. | |
28 | ||
0b14f590 DM |
29 | This supports an optional CWE identifier, and zero or more |
30 | "rules". */ | |
6d4a35ca DM |
31 | |
32 | class diagnostic_metadata | |
33 | { | |
34 | public: | |
0b14f590 DM |
35 | /* Abstract base class for referencing a rule that has been violated, |
36 | such as within a coding standard, or within a specification. */ | |
37 | class rule | |
38 | { | |
39 | public: | |
40 | virtual char *make_description () const = 0; | |
41 | virtual char *make_url () const = 0; | |
42 | }; | |
43 | ||
44 | /* Concrete subclass. */ | |
45 | class precanned_rule : public rule | |
46 | { | |
47 | public: | |
48 | precanned_rule (const char *desc, const char *url) | |
49 | : m_desc (desc), m_url (url) | |
50 | {} | |
51 | ||
52 | char *make_description () const final override | |
53 | { | |
54 | return m_desc ? xstrdup (m_desc) : NULL; | |
55 | } | |
56 | ||
57 | char *make_url () const final override | |
58 | { | |
59 | return m_url ? xstrdup (m_url) : NULL; | |
60 | } | |
61 | ||
62 | private: | |
63 | const char *m_desc; | |
64 | const char *m_url; | |
65 | }; | |
66 | ||
6d4a35ca | 67 | diagnostic_metadata () : m_cwe (0) {} |
12b67d1e DM |
68 | virtual ~diagnostic_metadata () {} |
69 | ||
70 | /* Hook for SARIF output to allow for adding diagnostic-specific | |
71 | properties to the result object's property bag. */ | |
72 | virtual void | |
73 | maybe_add_sarif_properties (sarif_object &/*result_obj*/) const | |
74 | { | |
75 | } | |
6d4a35ca DM |
76 | |
77 | void add_cwe (int cwe) { m_cwe = cwe; } | |
78 | int get_cwe () const { return m_cwe; } | |
79 | ||
0b14f590 DM |
80 | /* Associate R with the diagnostic. R must outlive |
81 | the metadata. */ | |
82 | void add_rule (const rule &r) | |
83 | { | |
84 | m_rules.safe_push (&r); | |
85 | } | |
86 | ||
87 | unsigned get_num_rules () const { return m_rules.length (); } | |
88 | const rule &get_rule (unsigned idx) const { return *(m_rules[idx]); } | |
89 | ||
6d4a35ca DM |
90 | private: |
91 | int m_cwe; | |
0b14f590 | 92 | auto_vec<const rule *> m_rules; |
6d4a35ca DM |
93 | }; |
94 | ||
95 | #endif /* ! GCC_DIAGNOSTIC_METADATA_H */ |