1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
|
/* SARIF output for diagnostics.
Copyright (C) 2023-2025 Free Software Foundation, Inc.
Contributed by David Malcolm <dmalcolm@redhat.com>.
This file is part of GCC.
GCC is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
Software Foundation; either version 3, or (at your option) any later
version.
GCC is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
#ifndef GCC_DIAGNOSTICS_SARIF_SINK_H
#define GCC_DIAGNOSTICS_SARIF_SINK_H
#include "json.h"
#include "diagnostics/sink.h"
#include "diagnostics/output-file.h"
#include "diagnostics/logical-locations.h"
namespace diagnostics {
namespace digraphs {
class digraph;
class node;
class edge;
}
/* Enum for choosing what format to serializing the generated SARIF into. */
enum class sarif_serialization_kind
{
json,
num_values
};
extern output_file
open_sarif_output_file (context &dc,
line_maps *line_maps,
const char *base_file_name,
enum sarif_serialization_kind serialization_kind);
extern sink &
init_sarif_stderr (context &dc,
const line_maps *line_maps,
bool formatted);
extern sink &
init_sarif_file (context &dc,
line_maps *line_maps,
bool formatted,
const char *base_file_name);
extern sink &
init_sarif_stream (context &dc,
const line_maps *line_maps,
bool formatted,
FILE *stream);
/* Abstract base class for handling JSON output vs other kinds of
serialization of the json tree. */
class sarif_serialization_format
{
public:
virtual ~sarif_serialization_format () {}
virtual void write_to_file (FILE *outf,
const json::value &top) = 0;
};
/* Concrete subclass for serializing SARIF as JSON. */
class sarif_serialization_format_json : public sarif_serialization_format
{
public:
sarif_serialization_format_json (bool formatted)
: m_formatted (formatted)
{
}
void write_to_file (FILE *outf, const json::value &top) final override;
private:
bool m_formatted;
};
/* Control of SARIF generation. */
enum class sarif_version
{
v2_1_0,
v2_2_prerelease_2024_08_08,
num_versions
};
/* A bundle of state for controlling what to put in SARIF output,
such as which version of SARIF to generate
(as opposed to SARIF *serialization* options, such as formatting). */
struct sarif_generation_options
{
sarif_generation_options ();
enum sarif_version m_version;
bool m_state_graph;
};
extern std::unique_ptr<sink>
make_sarif_sink (context &dc,
const line_maps &line_maps,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts,
output_file output_file_);
class sarif_builder;
class sarif_location_manager;
/* Concrete subclass of json::object for SARIF property bags
(SARIF v2.1.0 section 3.8). */
class sarif_property_bag : public json::object
{
public:
void set_logical_location (const char *property_name,
sarif_builder &,
logical_locations::key logical_loc);
void set_graph (const char *property_name,
sarif_builder &,
sarif_location_manager *sarif_location_mgr,
const digraphs::digraph &g);
};
/* Concrete subclass of json::object for SARIF objects that can
contain property bags (as per SARIF v2.1.0 section 3.8.1, which has:
"In addition to those properties that are explicitly documented, every
object defined in this document MAY contain a property named properties
whose value is a property bag.") */
class sarif_object : public json::object
{
public:
sarif_property_bag &get_or_create_properties ();
};
/* Subclass of sarif_object for SARIF "graph" objects
(SARIF v2.1.0 section 3.39). */
class sarif_graph : public sarif_object
{
};
/* Subclass of sarif_object for SARIF "node" objects
(SARIF v2.1.0 section 3.40). */
class sarif_node : public sarif_object
{
};
/* Subclass of sarif_object for SARIF "edge" objects
(SARIF v2.1.0 section 3.41). */
class sarif_edge : public sarif_object
{
};
extern std::unique_ptr<sarif_graph>
make_sarif_graph (const digraphs::digraph &g,
sarif_builder *builder,
sarif_location_manager *sarif_location_mgr);
extern std::unique_ptr<sarif_node>
make_sarif_node (const digraphs::node &n,
sarif_builder *builder,
sarif_location_manager *sarif_location_mgr);
extern std::unique_ptr<sarif_edge>
make_sarif_edge (const digraphs::edge &e,
sarif_builder *builder);
} // namespace diagnostics
#endif /* ! GCC_DIAGNOSTICS_SARIF_SINK_H */
|