1/* Additional metadata for a diagnostic.
2 Copyright (C) 2019-2023 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 under
8the terms of the GNU General Public License as published by the Free
9Software Foundation; either version 3, or (at your option) any later
10version.
11
12GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13WARRANTY; without even the implied warranty of MERCHANTABILITY or
14FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15for 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_DIAGNOSTIC_METADATA_H
22#define GCC_DIAGNOSTIC_METADATA_H
23
24/* A bundle of additional metadata that can be associated with a
25 diagnostic.
26
27 This supports an optional CWE identifier, and zero or more
28 "rules". */
29
30class diagnostic_metadata
31{
32 public:
33 /* Abstract base class for referencing a rule that has been violated,
34 such as within a coding standard, or within a specification. */
35 class rule
36 {
37 public:
38 virtual char *make_description () const = 0;
39 virtual char *make_url () const = 0;
40 };
41
42 /* Concrete subclass. */
43 class precanned_rule : public rule
44 {
45 public:
46 precanned_rule (const char *desc, const char *url)
47 : m_desc (desc), m_url (url)
48 {}
49
50 char *make_description () const final override
51 {
52 return m_desc ? xstrdup (m_desc) : NULL;
53 }
54
55 char *make_url () const final override
56 {
57 return m_url ? xstrdup (m_url) : NULL;
58 }
59
60 private:
61 const char *m_desc;
62 const char *m_url;
63 };
64
65 diagnostic_metadata () : m_cwe (0) {}
66
67 void add_cwe (int cwe) { m_cwe = cwe; }
68 int get_cwe () const { return m_cwe; }
69
70 /* Associate R with the diagnostic. R must outlive
71 the metadata. */
72 void add_rule (const rule &r)
73 {
74 m_rules.safe_push (obj: &r);
75 }
76
77 unsigned get_num_rules () const { return m_rules.length (); }
78 const rule &get_rule (unsigned idx) const { return *(m_rules[idx]); }
79
80 private:
81 int m_cwe;
82 auto_vec<const rule *> m_rules;
83};
84
85#endif /* ! GCC_DIAGNOSTIC_METADATA_H */
86

source code of gcc/diagnostic-metadata.h