mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-01-14 00:06:24 +01:00
Merge branch '2913-error-warning' into 'main'
gerror: Emit a critical warning if the message format is NULL Closes #2913 See merge request GNOME/glib!3286
This commit is contained in:
commit
23d28b9d6e
@ -755,13 +755,14 @@ g_error_new_valist (GQuark domain,
|
|||||||
const gchar *format,
|
const gchar *format,
|
||||||
va_list args)
|
va_list args)
|
||||||
{
|
{
|
||||||
|
g_return_val_if_fail (format != NULL, NULL);
|
||||||
|
|
||||||
/* Historically, GError allowed this (although it was never meant to work),
|
/* Historically, GError allowed this (although it was never meant to work),
|
||||||
* and it has significant use in the wild, which g_return_val_if_fail
|
* and it has significant use in the wild, which g_return_val_if_fail
|
||||||
* would break. It should maybe g_return_val_if_fail in GLib 4.
|
* would break. It should maybe g_return_val_if_fail in GLib 4.
|
||||||
* (GNOME#660371, GNOME#560482)
|
* (GNOME#660371, GNOME#560482)
|
||||||
*/
|
*/
|
||||||
g_warn_if_fail (domain != 0);
|
g_warn_if_fail (domain != 0);
|
||||||
g_warn_if_fail (format != NULL);
|
|
||||||
|
|
||||||
return g_error_new_steal (domain, code, g_strdup_vprintf (format, args), NULL);
|
return g_error_new_steal (domain, code, g_strdup_vprintf (format, args), NULL);
|
||||||
}
|
}
|
||||||
@ -887,9 +888,10 @@ g_error_copy (const GError *error)
|
|||||||
ErrorDomainInfo info;
|
ErrorDomainInfo info;
|
||||||
|
|
||||||
g_return_val_if_fail (error != NULL, NULL);
|
g_return_val_if_fail (error != NULL, NULL);
|
||||||
/* See g_error_new_valist for why these don't return */
|
g_return_val_if_fail (error->message != NULL, NULL);
|
||||||
|
|
||||||
|
/* See g_error_new_valist for why this doesn’t return */
|
||||||
g_warn_if_fail (error->domain != 0);
|
g_warn_if_fail (error->domain != 0);
|
||||||
g_warn_if_fail (error->message != NULL);
|
|
||||||
|
|
||||||
copy = g_error_new_steal (error->domain,
|
copy = g_error_new_steal (error->domain,
|
||||||
error->code,
|
error->code,
|
||||||
|
@ -129,17 +129,6 @@ test_new_valist_invalid_va (gpointer dummy,
|
|||||||
* g_error_new_valist() with a %NULL format will crash on FreeBSD as its
|
* g_error_new_valist() with a %NULL format will crash on FreeBSD as its
|
||||||
* implementation of vasprintf() is less forgiving than Linux’s. That’s
|
* implementation of vasprintf() is less forgiving than Linux’s. That’s
|
||||||
* fine: it’s a programmer error in either case. */
|
* fine: it’s a programmer error in either case. */
|
||||||
const struct
|
|
||||||
{
|
|
||||||
GQuark domain;
|
|
||||||
const gchar *format;
|
|
||||||
}
|
|
||||||
tests[] =
|
|
||||||
{
|
|
||||||
{ G_MARKUP_ERROR, NULL },
|
|
||||||
{ 0, "Message" },
|
|
||||||
};
|
|
||||||
gsize i;
|
|
||||||
|
|
||||||
g_test_summary ("Test that g_error_new_valist() rejects invalid input");
|
g_test_summary ("Test that g_error_new_valist() rejects invalid input");
|
||||||
|
|
||||||
@ -149,13 +138,32 @@ test_new_valist_invalid_va (gpointer dummy,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS (tests); i++)
|
{
|
||||||
|
GError *error = NULL;
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start (ap, dummy);
|
||||||
|
|
||||||
|
#pragma GCC diagnostic push
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
|
||||||
|
#pragma GCC diagnostic ignored "-Wformat-extra-args"
|
||||||
|
|
||||||
|
g_test_expect_message (G_LOG_DOMAIN,
|
||||||
|
G_LOG_LEVEL_CRITICAL,
|
||||||
|
"*g_error_new_valist: assertion 'format != NULL' failed*");
|
||||||
|
error = g_error_new_valist (G_MARKUP_ERROR, G_MARKUP_ERROR_EMPTY, NULL, ap);
|
||||||
|
g_test_assert_expected_messages ();
|
||||||
|
g_assert_null (error);
|
||||||
|
|
||||||
|
#pragma GCC diagnostic pop
|
||||||
|
|
||||||
|
va_end (ap);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
GError *error = NULL, *error_copy = NULL;
|
GError *error = NULL, *error_copy = NULL;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
g_test_message ("Test %" G_GSIZE_FORMAT, i);
|
|
||||||
|
|
||||||
va_start (ap, dummy);
|
va_start (ap, dummy);
|
||||||
|
|
||||||
#pragma GCC diagnostic push
|
#pragma GCC diagnostic push
|
||||||
@ -164,7 +172,7 @@ test_new_valist_invalid_va (gpointer dummy,
|
|||||||
g_test_expect_message (G_LOG_DOMAIN,
|
g_test_expect_message (G_LOG_DOMAIN,
|
||||||
G_LOG_LEVEL_WARNING,
|
G_LOG_LEVEL_WARNING,
|
||||||
"*g_error_new_valist: runtime check failed*");
|
"*g_error_new_valist: runtime check failed*");
|
||||||
error = g_error_new_valist (tests[i].domain, G_MARKUP_ERROR_EMPTY, tests[i].format, ap);
|
error = g_error_new_valist (0, G_MARKUP_ERROR_EMPTY, "Message", ap);
|
||||||
g_test_assert_expected_messages ();
|
g_test_assert_expected_messages ();
|
||||||
g_assert_nonnull (error);
|
g_assert_nonnull (error);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user