aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2023-10-31 17:05:40 -0400
committerDavid Malcolm <dmalcolm@redhat.com>2023-10-31 17:05:40 -0400
commitb9e2088d2977441818e8e24f3b497b167992dba0 (patch)
tree3e62de468cb37b3e6d3ed0f92fee23a0bd3f2257
parentf66b2fc122b8a17591afbb881d580b32e8ddb708 (diff)
downloadgcc-b9e2088d2977441818e8e24f3b497b167992dba0.zip
gcc-b9e2088d2977441818e8e24f3b497b167992dba0.tar.gz
gcc-b9e2088d2977441818e8e24f3b497b167992dba0.tar.bz2
pretty-print: gracefully handle null URLs
gcc/ChangeLog: * pretty-print.cc (pretty_printer::pretty_printer): Initialize m_skipping_null_url. (pp_begin_url): Handle URL being null. (pp_end_url): Likewise. (selftest::test_null_urls): New. (selftest::pretty_print_cc_tests): Call it. * pretty-print.h (pretty_printer::m_skipping_null_url): New. Signed-off-by: David Malcolm <dmalcolm@redhat.com>
-rw-r--r--gcc/pretty-print.cc57
-rw-r--r--gcc/pretty-print.h4
2 files changed, 59 insertions, 2 deletions
diff --git a/gcc/pretty-print.cc b/gcc/pretty-print.cc
index 75446cc..80780cf 100644
--- a/gcc/pretty-print.cc
+++ b/gcc/pretty-print.cc
@@ -1664,7 +1664,8 @@ pretty_printer::pretty_printer (int maximum_length)
need_newline (),
translate_identifiers (true),
show_color (),
- url_format (URL_FORMAT_NONE)
+ url_format (URL_FORMAT_NONE),
+ m_skipping_null_url (false)
{
pp_line_cutoff (this) = maximum_length;
/* By default, we emit prefixes once per message. */
@@ -1687,7 +1688,8 @@ pretty_printer::pretty_printer (const pretty_printer &other)
need_newline (other.need_newline),
translate_identifiers (other.translate_identifiers),
show_color (other.show_color),
- url_format (other.url_format)
+ url_format (other.url_format),
+ m_skipping_null_url (false)
{
pp_line_cutoff (this) = maximum_length;
/* By default, we emit prefixes once per message. */
@@ -2211,6 +2213,13 @@ identifier_to_locale (const char *ident)
void
pp_begin_url (pretty_printer *pp, const char *url)
{
+ if (!url)
+ {
+ /* Handle null URL by skipping all output here,
+ and in the next pp_end_url. */
+ pp->m_skipping_null_url = true;
+ return;
+ }
switch (pp->url_format)
{
case URL_FORMAT_NONE:
@@ -2254,6 +2263,13 @@ get_end_url_string (pretty_printer *pp)
void
pp_end_url (pretty_printer *pp)
{
+ if (pp->m_skipping_null_url)
+ {
+ /* We gracefully handle pp_begin_url (NULL) by omitting output for
+ both begin and end. Here we handle the latter. */
+ pp->m_skipping_null_url = false;
+ return;
+ }
if (pp->url_format != URL_FORMAT_NONE)
pp_string (pp, get_end_url_string (pp));
}
@@ -2588,6 +2604,42 @@ test_urls ()
}
}
+/* Verify that we gracefully reject null URLs. */
+
+void
+test_null_urls ()
+{
+ {
+ pretty_printer pp;
+ pp.url_format = URL_FORMAT_NONE;
+ pp_begin_url (&pp, nullptr);
+ pp_string (&pp, "This isn't a link");
+ pp_end_url (&pp);
+ ASSERT_STREQ ("This isn't a link",
+ pp_formatted_text (&pp));
+ }
+
+ {
+ pretty_printer pp;
+ pp.url_format = URL_FORMAT_ST;
+ pp_begin_url (&pp, nullptr);
+ pp_string (&pp, "This isn't a link");
+ pp_end_url (&pp);
+ ASSERT_STREQ ("This isn't a link",
+ pp_formatted_text (&pp));
+ }
+
+ {
+ pretty_printer pp;
+ pp.url_format = URL_FORMAT_BEL;
+ pp_begin_url (&pp, nullptr);
+ pp_string (&pp, "This isn't a link");
+ pp_end_url (&pp);
+ ASSERT_STREQ ("This isn't a link",
+ pp_formatted_text (&pp));
+ }
+}
+
/* Test multibyte awareness. */
static void test_utf8 ()
{
@@ -2637,6 +2689,7 @@ pretty_print_cc_tests ()
test_pp_format ();
test_prefixes_and_wrapping ();
test_urls ();
+ test_null_urls ();
test_utf8 ();
}
diff --git a/gcc/pretty-print.h b/gcc/pretty-print.h
index 02658c8..8759f0d 100644
--- a/gcc/pretty-print.h
+++ b/gcc/pretty-print.h
@@ -295,6 +295,10 @@ public:
/* Whether URLs should be emitted, and which terminator to use. */
diagnostic_url_format url_format;
+
+ /* If true, then we've had a pp_begin_url (nullptr), and so the
+ next pp_end_url should be a no-op. */
+ bool m_skipping_null_url;
};
inline const char *