PR diagnostics/124014 identifies an ICE in sarif output of
diagnostics that occur after free_lang_data has called
tree_diagnostics_defaults, which happens e.g. with lto.

The issue is that in r16-413-g8ab6899dce92e6 I introduced to sarif_sink
a cached pointer to the logical_locations::manager, which for tree-using
clients is part of the compiler_data_hooks.  Hence for the case above, the
pointer is freed from under the sarif_sink, and any diagnostic
issued after that point with a current_function_decl will
trigger a use-after-free.

Fix by removing the cached pointer.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.
Pushed to trunk as r16-7422-g13c2da6cdbd1a3.

gcc/ChangeLog:
        PR diagnostics/124014
        * diagnostics/sarif-sink.cc
        (sarif_builder::get_logical_location_manager): Reimplement, to
        eliminate m_logical_loc_mgr.
        (sarif_builder::m_logical_loc_mgr): Drop field.
        (sarif_builder::sarif_builder): Update for removed field.
        (sarif_builder::set_any_logical_locs_arr): Likewise.
        (sarif_builder::ensure_sarif_logical_location_for): Likewise.
        (sarif_builder::make_minimal_sarif_logical_location): Likewise.

gcc/testsuite/ChangeLog:
        PR diagnostics/124014
        * gcc.dg/sarif-output/ice-pr124014.c: New test.

Signed-off-by: David Malcolm <[email protected]>
---
 gcc/diagnostics/sarif-sink.cc                 | 31 +++++++++----------
 .../gcc.dg/sarif-output/ice-pr124014.c        |  4 +++
 2 files changed, 19 insertions(+), 16 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/sarif-output/ice-pr124014.c

diff --git a/gcc/diagnostics/sarif-sink.cc b/gcc/diagnostics/sarif-sink.cc
index 8e8947aa026a1..2cd64d65112e9 100644
--- a/gcc/diagnostics/sarif-sink.cc
+++ b/gcc/diagnostics/sarif-sink.cc
@@ -801,7 +801,9 @@ public:
   const logical_locations::manager *
   get_logical_location_manager () const
   {
-    return m_logical_loc_mgr;
+    if (auto client_data_hooks = m_context.get_client_data_hooks ())
+      return client_data_hooks->get_logical_location_manager ();
+    return nullptr;
   }
 
   void
@@ -994,8 +996,6 @@ private:
   const line_maps *m_line_maps;
   sarif_token_printer m_token_printer;
 
-  const logical_locations::manager *m_logical_loc_mgr;
-
   /* The JSON object for the invocation object.  */
   std::unique_ptr<sarif_invocation> m_invocation_obj;
 
@@ -1700,7 +1700,6 @@ sarif_builder::sarif_builder (diagnostics::context &dc,
   m_printer (&printer),
   m_line_maps (line_maps),
   m_token_printer (*this),
-  m_logical_loc_mgr (nullptr),
   m_invocation_obj
     (std::make_unique<sarif_invocation> (*this,
                                         dc.get_original_argv ())),
@@ -1721,9 +1720,6 @@ sarif_builder::sarif_builder (diagnostics::context &dc,
 {
   gcc_assert (m_line_maps);
   gcc_assert (m_serialization_format);
-
-  if (auto client_data_hooks = dc.get_client_data_hooks ())
-    m_logical_loc_mgr = client_data_hooks->get_logical_location_manager ();
 }
 
 sarif_builder::~sarif_builder ()
@@ -2307,7 +2303,8 @@ set_any_logical_locs_arr (sarif_location &location_obj,
 {
   if (!logical_loc)
     return;
-  gcc_assert (m_logical_loc_mgr);
+  auto logical_loc_mgr = get_logical_location_manager ();
+  gcc_assert (logical_loc_mgr);
   auto location_locs_arr = std::make_unique<json::array> ();
 
   auto logical_loc_obj = make_minimal_sarif_logical_location (logical_loc);
@@ -3061,28 +3058,29 @@ int
 sarif_builder::
 ensure_sarif_logical_location_for (logical_locations::key k)
 {
-  gcc_assert (m_logical_loc_mgr);
+  auto logical_loc_mgr = get_logical_location_manager ();
+  gcc_assert (logical_loc_mgr);
 
   auto sarif_logical_loc = std::make_unique<sarif_logical_location> ();
 
-  if (const char *short_name = m_logical_loc_mgr->get_short_name (k))
+  if (const char *short_name = logical_loc_mgr->get_short_name (k))
     sarif_logical_loc->set_string ("name", short_name);
 
   /* "fullyQualifiedName" property (SARIF v2.1.0 section 3.33.5).  */
-  if (const char *name_with_scope = m_logical_loc_mgr->get_name_with_scope (k))
+  if (const char *name_with_scope = logical_loc_mgr->get_name_with_scope (k))
     sarif_logical_loc->set_string ("fullyQualifiedName", name_with_scope);
 
   /* "decoratedName" property (SARIF v2.1.0 section 3.33.6).  */
-  if (const char *internal_name = m_logical_loc_mgr->get_internal_name (k))
+  if (const char *internal_name = logical_loc_mgr->get_internal_name (k))
     sarif_logical_loc->set_string ("decoratedName", internal_name);
 
   /* "kind" property (SARIF v2.1.0 section 3.33.7).  */
-  enum logical_locations::kind kind = m_logical_loc_mgr->get_kind (k);
+  enum logical_locations::kind kind = logical_loc_mgr->get_kind (k);
   if (const char *sarif_kind_str = maybe_get_sarif_kind (kind))
     sarif_logical_loc->set_string ("kind", sarif_kind_str);
 
   /* "parentIndex" property (SARIF v2.1.0 section 3.33.8).  */
-  if (auto parent_key = m_logical_loc_mgr->get_parent (k))
+  if (auto parent_key = logical_loc_mgr->get_parent (k))
     {
       /* Recurse upwards.  */
       int parent_index = ensure_sarif_logical_location_for (parent_key);
@@ -3105,7 +3103,8 @@ std::unique_ptr<sarif_logical_location>
 sarif_builder::
 make_minimal_sarif_logical_location (logical_locations::key logical_loc)
 {
-  gcc_assert (m_logical_loc_mgr);
+  auto logical_loc_mgr = get_logical_location_manager ();
+  gcc_assert (logical_loc_mgr);
 
   /* Ensure that m_cached_logical_locs has a "logicalLocation" object
      (SARIF v2.1.0 section 3.33) for LOGICAL_LOC, and return its index within
@@ -3120,7 +3119,7 @@ make_minimal_sarif_logical_location 
(logical_locations::key logical_loc)
 
   /* "fullyQualifiedName" property (SARIF v2.1.0 section 3.33.5).  */
   if (const char *name_with_scope
-        = m_logical_loc_mgr->get_name_with_scope (logical_loc))
+       = logical_loc_mgr->get_name_with_scope (logical_loc))
     sarif_logical_loc->set_string ("fullyQualifiedName", name_with_scope);
 
   return sarif_logical_loc;
diff --git a/gcc/testsuite/gcc.dg/sarif-output/ice-pr124014.c 
b/gcc/testsuite/gcc.dg/sarif-output/ice-pr124014.c
new file mode 100644
index 0000000000000..6a7bc5de32f4f
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/sarif-output/ice-pr124014.c
@@ -0,0 +1,4 @@
+/* { dg-options "-fdiagnostics-add-output=sarif -fbranch-probabilities" } */
+/* { dg-additional-options "-flto" { target lto } }  */
+
+void main() {} /* { dg-warning "missing-profile" } */
-- 
2.26.3

Reply via email to