aboutsummaryrefslogtreecommitdiff
path: root/gcc/diagnostic-format-sarif.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/diagnostic-format-sarif.cc')
-rw-r--r--gcc/diagnostic-format-sarif.cc169
1 files changed, 96 insertions, 73 deletions
diff --git a/gcc/diagnostic-format-sarif.cc b/gcc/diagnostic-format-sarif.cc
index 454eaae..14cdbc2 100644
--- a/gcc/diagnostic-format-sarif.cc
+++ b/gcc/diagnostic-format-sarif.cc
@@ -50,6 +50,7 @@ along with GCC; see the file COPYING3. If not see
#include "pretty-print-urlifier.h"
#include "demangle.h"
#include "backtrace.h"
+#include "xml.h"
/* A json::array where the values are "unique" as per
SARIF v2.1.0 section 3.7.3 ("Array properties with unique values"). */
@@ -751,7 +752,6 @@ public:
sarif_builder (diagnostic_context &context,
pretty_printer &printer,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts);
~sarif_builder ();
@@ -767,6 +767,9 @@ public:
return m_logical_loc_mgr;
}
+ void
+ set_main_input_filename (const char *name);
+
void on_report_diagnostic (const diagnostic_info &diagnostic,
diagnostic_t orig_diag_kind,
diagnostic_sarif_format_buffer *buffer);
@@ -1643,7 +1646,6 @@ sarif_thread_flow::add_location ()
sarif_builder::sarif_builder (diagnostic_context &context,
pretty_printer &printer,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts)
: m_context (context),
@@ -1672,17 +1674,6 @@ sarif_builder::sarif_builder (diagnostic_context &context,
if (auto client_data_hooks = context.get_client_data_hooks ())
m_logical_loc_mgr = client_data_hooks->get_logical_location_manager ();
-
- /* Mark MAIN_INPUT_FILENAME_ as the artifact that the tool was
- instructed to scan.
- Only quote the contents if it gets referenced by physical locations,
- since otherwise the "no diagnostics" case would quote the main input
- file, and doing so noticeably bloated the output seen in analyzer
- integration testing (build directory went from 20G -> 21G). */
- if (main_input_filename_)
- get_or_create_artifact (main_input_filename_,
- diagnostic_artifact_role::analysis_target,
- false);
}
sarif_builder::~sarif_builder ()
@@ -1731,12 +1722,12 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
/* If we don't have any useful information, don't print
anything. */
- if (filename == NULL && function == NULL)
+ if (filename == nullptr && function == nullptr)
return 0;
/* Skip functions in diagnostic.cc or diagnostic-global-context.cc. */
if (closure->m_frames_arr->size () == 0
- && filename != NULL
+ && filename != nullptr
&& (strcmp (lbasename (filename), "diagnostic.cc") == 0
|| strcmp (lbasename (filename),
"diagnostic-global-context.cc") == 0))
@@ -1750,13 +1741,13 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
return 1;
}
- char *alc = NULL;
- if (function != NULL)
+ char *alc = nullptr;
+ if (function != nullptr)
{
char *str = cplus_demangle_v3 (function,
(DMGL_VERBOSE | DMGL_ANSI
| DMGL_GNU_V3 | DMGL_PARAMS));
- if (str != NULL)
+ if (str != nullptr)
{
alc = str;
function = str;
@@ -1768,7 +1759,7 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
if (strncmp (function, bt_stop[i], len) == 0
&& (function[len] == '\0' || function[len] == '('))
{
- if (alc != NULL)
+ if (alc != nullptr)
free (alc);
/* Returning a non-zero value stops the backtrace. */
return 1;
@@ -1790,7 +1781,7 @@ bt_callback (void *data, uintptr_t pc, const char *filename, int lineno,
frame_obj->set_integer ("lineno", lineno);
closure->m_frames_arr->append (std::move (frame_obj));
- if (alc != NULL)
+ if (alc != nullptr)
free (alc);
return 0;
@@ -1820,6 +1811,20 @@ sarif_builder::make_stack_from_backtrace ()
return stack;
}
+void
+sarif_builder::set_main_input_filename (const char *name)
+{
+ /* Mark NAME as the artifact that the tool was instructed to scan.
+ Only quote the contents if it gets referenced by physical locations,
+ since otherwise the "no diagnostics" case would quote the main input
+ file, and doing so noticeably bloated the output seen in analyzer
+ integration testing (build directory went from 20G -> 21G). */
+ if (name)
+ get_or_create_artifact (name,
+ diagnostic_artifact_role::analysis_target,
+ false);
+}
+
/* Implementation of "on_report_diagnostic" for SARIF output. */
void
@@ -2731,51 +2736,51 @@ maybe_get_sarif_kind (enum logical_location_kind kind)
{
default:
gcc_unreachable ();
- case LOGICAL_LOCATION_KIND_UNKNOWN:
+ case logical_location_kind::unknown:
return nullptr;
/* Kinds within executable code. */
- case LOGICAL_LOCATION_KIND_FUNCTION:
+ case logical_location_kind::function:
return "function";
- case LOGICAL_LOCATION_KIND_MEMBER:
+ case logical_location_kind::member:
return "member";
- case LOGICAL_LOCATION_KIND_MODULE:
+ case logical_location_kind::module_:
return "module";
- case LOGICAL_LOCATION_KIND_NAMESPACE:
+ case logical_location_kind::namespace_:
return "namespace";
- case LOGICAL_LOCATION_KIND_TYPE:
+ case logical_location_kind::type:
return "type";
- case LOGICAL_LOCATION_KIND_RETURN_TYPE:
+ case logical_location_kind::return_type:
return "returnType";
- case LOGICAL_LOCATION_KIND_PARAMETER:
+ case logical_location_kind::parameter:
return "parameter";
- case LOGICAL_LOCATION_KIND_VARIABLE:
+ case logical_location_kind::variable:
return "variable";
/* Kinds within XML or HTML documents. */
- case LOGICAL_LOCATION_KIND_ELEMENT:
+ case logical_location_kind::element:
return "element";
- case LOGICAL_LOCATION_KIND_ATTRIBUTE:
+ case logical_location_kind::attribute:
return "attribute";
- case LOGICAL_LOCATION_KIND_TEXT:
+ case logical_location_kind::text:
return "text";
- case LOGICAL_LOCATION_KIND_COMMENT:
+ case logical_location_kind::comment:
return "comment";
- case LOGICAL_LOCATION_KIND_PROCESSING_INSTRUCTION:
+ case logical_location_kind::processing_instruction:
return "processingInstruction";
- case LOGICAL_LOCATION_KIND_DTD:
+ case logical_location_kind::dtd:
return "dtd";
- case LOGICAL_LOCATION_KIND_DECLARATION:
+ case logical_location_kind::declaration:
return "declaration";
/* Kinds within JSON documents. */
- case LOGICAL_LOCATION_KIND_OBJECT:
+ case logical_location_kind::object:
return "object";
- case LOGICAL_LOCATION_KIND_ARRAY:
+ case logical_location_kind::array:
return "array";
- case LOGICAL_LOCATION_KIND_PROPERTY:
+ case logical_location_kind::property:
return "property";
- case LOGICAL_LOCATION_KIND_VALUE:
+ case logical_location_kind::value:
return "value";
}
}
@@ -2955,6 +2960,20 @@ populate_thread_flow_location_object (sarif_result &result,
via a property bag. */
ev.maybe_add_sarif_properties (*this, tfl_obj);
+ if (get_opts ().m_xml_state)
+ if (auto xml_state = ev.maybe_make_xml_state (true))
+ {
+ sarif_property_bag &props = tfl_obj.get_or_create_properties ();
+
+ pretty_printer pp;
+ xml_state->write_as_xml (&pp, 0, true);
+
+#define PROPERTY_PREFIX "gcc/diagnostic_event/"
+ props.set_string (PROPERTY_PREFIX "xml_state",
+ pp_formatted_text (&pp));
+#undef PROPERTY_PREFIX
+ }
+
/* "location" property (SARIF v2.1.0 section 3.38.3). */
tfl_obj.set<sarif_location>
("location",
@@ -2986,9 +3005,9 @@ populate_thread_flow_location_object (sarif_result &result,
std::unique_ptr<json::array>
sarif_builder::maybe_make_kinds_array (diagnostic_event::meaning m) const
{
- if (m.m_verb == diagnostic_event::VERB_unknown
- && m.m_noun == diagnostic_event::NOUN_unknown
- && m.m_property == diagnostic_event::PROPERTY_unknown)
+ if (m.m_verb == diagnostic_event::verb::unknown
+ && m.m_noun == diagnostic_event::noun::unknown
+ && m.m_property == diagnostic_event::property::unknown)
return nullptr;
auto kinds_arr = std::make_unique<json::array> ();
@@ -3657,6 +3676,12 @@ public:
diagnostic_output_format::dump (out, indent);
}
+ void
+ set_main_input_filename (const char *name) final override
+ {
+ m_builder.set_main_input_filename (name);
+ }
+
std::unique_ptr<diagnostic_per_format_buffer>
make_per_format_buffer () final override
{
@@ -3722,11 +3747,10 @@ public:
protected:
sarif_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts)
: diagnostic_output_format (context),
- m_builder (context, *get_printer (), line_maps, main_input_filename_,
+ m_builder (context, *get_printer (), line_maps,
std::move (serialization_format), sarif_gen_opts),
m_buffer (nullptr)
{}
@@ -3740,11 +3764,10 @@ class sarif_stream_output_format : public sarif_output_format
public:
sarif_stream_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts,
FILE *stream)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::move (serialization_format), sarif_gen_opts),
m_stream (stream)
{
@@ -3766,11 +3789,10 @@ class sarif_file_output_format : public sarif_output_format
public:
sarif_file_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization_format,
const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::move (serialization_format), sarif_gen_opts),
m_output_file (std::move (output_file))
{
@@ -3914,34 +3936,39 @@ sarif_builder::sarif_token_printer::print_tokens (pretty_printer *pp,
}
/* Populate CONTEXT in preparation for SARIF output (either to stderr, or
- to a file). */
+ to a file).
+ Return a reference to *FMT. */
-static void
+static diagnostic_output_format &
diagnostic_output_format_init_sarif (diagnostic_context &context,
std::unique_ptr<sarif_output_format> fmt)
{
+ gcc_assert (fmt);
+ diagnostic_output_format &out = *fmt;
+
fmt->update_printer ();
context.set_output_format (std::move (fmt));
+
+ return out;
}
-/* Populate CONTEXT in preparation for SARIF output to stderr. */
+/* Populate CONTEXT in preparation for SARIF output to stderr.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_stderr (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted)
{
gcc_assert (line_maps);
const sarif_generation_options sarif_gen_opts;
auto serialization
= std::make_unique<sarif_serialization_format_json> (formatted);
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_stream_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
stderr));
@@ -4018,12 +4045,12 @@ diagnostic_output_format_open_sarif_file (diagnostic_context &context,
}
/* Populate CONTEXT in preparation for SARIF output to a file named
- BASE_FILE_NAME.sarif. */
+ BASE_FILE_NAME.sarif.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_file (diagnostic_context &context,
line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
const char *base_file_name)
{
@@ -4038,22 +4065,21 @@ diagnostic_output_format_init_sarif_file (diagnostic_context &context,
= std::make_unique<sarif_serialization_format_json> (formatted);
const sarif_generation_options sarif_gen_opts;
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_file_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
std::move (output_file)));
}
-/* Populate CONTEXT in preparation for SARIF output to STREAM. */
+/* Populate CONTEXT in preparation for SARIF output to STREAM.
+ Return a reference to the new sink. */
-void
+diagnostic_output_format &
diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
FILE *stream)
{
@@ -4061,11 +4087,10 @@ diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
const sarif_generation_options sarif_gen_opts;
auto serialization
= std::make_unique<sarif_serialization_format_json> (formatted);
- diagnostic_output_format_init_sarif
+ return diagnostic_output_format_init_sarif
(context,
std::make_unique<sarif_stream_output_format> (context,
line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
stream));
@@ -4074,7 +4099,6 @@ diagnostic_output_format_init_sarif_stream (diagnostic_context &context,
std::unique_ptr<diagnostic_output_format>
make_sarif_sink (diagnostic_context &context,
const line_maps &line_maps,
- const char *main_input_filename_,
std::unique_ptr<sarif_serialization_format> serialization,
const sarif_generation_options &sarif_gen_opts,
diagnostic_output_file output_file)
@@ -4082,7 +4106,6 @@ make_sarif_sink (diagnostic_context &context,
auto sink
= std::make_unique<sarif_file_output_format> (context,
&line_maps,
- main_input_filename_,
std::move (serialization),
sarif_gen_opts,
std::move (output_file));
@@ -4093,7 +4116,8 @@ make_sarif_sink (diagnostic_context &context,
// struct sarif_generation_options
sarif_generation_options::sarif_generation_options ()
-: m_version (sarif_version::v2_1_0)
+: m_version (sarif_version::v2_1_0),
+ m_xml_state (false)
{
}
@@ -4183,11 +4207,11 @@ public:
{
auto format = std::make_unique<buffered_output_format> (*this,
line_table,
- main_input_filename,
true,
sarif_gen_opts);
m_format = format.get (); // borrowed
diagnostic_output_format_init_sarif (*this, std::move (format));
+ m_format->set_main_input_filename (main_input_filename);
}
std::unique_ptr<sarif_log> flush_to_object ()
@@ -4204,10 +4228,9 @@ private:
public:
buffered_output_format (diagnostic_context &context,
const line_maps *line_maps,
- const char *main_input_filename_,
bool formatted,
const sarif_generation_options &sarif_gen_opts)
- : sarif_output_format (context, line_maps, main_input_filename_,
+ : sarif_output_format (context, line_maps,
std::make_unique<sarif_serialization_format_json>
(formatted),
sarif_gen_opts)
@@ -4243,7 +4266,7 @@ test_make_location_object (const sarif_generation_options &sarif_gen_opts,
test_diagnostic_context dc;
pretty_printer pp;
sarif_builder builder
- (dc, pp, line_table, "MAIN_INPUT_FILENAME",
+ (dc, pp, line_table,
std::make_unique<sarif_serialization_format_json> (true),
sarif_gen_opts);