From 230f672b3ed0f64c9110ef9dba616c17d713816d Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 9 May 2024 13:09:32 -0400 Subject: diagnostics: fix ICE on sarif output when source file is unreadable [PR111700] Backported from r14-4474-g94caa6a6b4bd73. gcc/ChangeLog: PR driver/111700 * input.cc (file_cache::add_file): Update leading comment to clarify that it can fail. (file_cache::lookup_or_add_file): Likewise. (get_source_file_content): Gracefully handle lookup_or_add_file failing. gcc/testsuite/ChangeLog: PR driver/111700 * c-c++-common/diagnostic-format-sarif-file-pr111700.c: New test. Signed-off-by: David Malcolm --- gcc/input.cc | 12 ++++++++++-- .../c-c++-common/diagnostic-format-sarif-file-pr111700.c | 12 ++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/diagnostic-format-sarif-file-pr111700.c diff --git a/gcc/input.cc b/gcc/input.cc index eaf301e..d1668ef 100644 --- a/gcc/input.cc +++ b/gcc/input.cc @@ -443,7 +443,10 @@ file_cache::evicted_cache_tab_entry (unsigned *highest_use_count) accessed by caret diagnostic. This cache is added to an array of cache and can be retrieved by lookup_file_in_cache_tab. This function returns the created cache. Note that only the last - num_file_slots files are cached. */ + num_file_slots files are cached. + + This can return nullptr if the FILE_PATH can't be opened for + reading, or if the content can't be converted to the input_charset. */ file_cache_slot* file_cache::add_file (const char *file_path) @@ -547,7 +550,10 @@ file_cache::~file_cache () /* Lookup the cache used for the content of a given file accessed by caret diagnostic. If no cached file was found, create a new cache for this file, add it to the array of cached file and return - it. */ + it. + + This can return nullptr on a cache miss if FILE_PATH can't be opened for + reading, or if the content can't be converted to the input_charset. */ file_cache_slot* file_cache::lookup_or_add_file (const char *file_path) @@ -1071,6 +1077,8 @@ get_source_file_content (const char *file_path) diagnostic_file_cache_init (); file_cache_slot *c = global_dc->m_file_cache->lookup_or_add_file (file_path); + if (c == nullptr) + return char_span (nullptr, 0); return c->get_full_file_content (); } diff --git a/gcc/testsuite/c-c++-common/diagnostic-format-sarif-file-pr111700.c b/gcc/testsuite/c-c++-common/diagnostic-format-sarif-file-pr111700.c new file mode 100644 index 0000000..06605ac --- /dev/null +++ b/gcc/testsuite/c-c++-common/diagnostic-format-sarif-file-pr111700.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fdiagnostics-format=sarif-file" } */ + +# 0 "this-file-does-not-exist.c" +#warning message + +/* Verify that some JSON was written to a file with the expected name. */ +/* { dg-final { verify-sarif-file } } */ + +/* ...and that it at least includes the warning + { dg-final { scan-sarif-file "\"message\": " } } + { dg-final { scan-sarif-file "\"text\": \"#warning message" } } */ -- cgit v1.1