If a NULL is passed in as the expected or actual value for an ASSERT_STREQ, the call to strcmp within selftest::assert_streq can segfault, leading to a failure of -fself-test without indicating which test failed.
Handle this more gracefully by checking for NULL, so that information on the failing test is printed to stderr if this occurs. Successfully bootstrapped®rtested on x86_64-pc-linux-gnu. I also manually tested the various kinds of failure of ASSERT_STR_EQ, and verified that each branch prints a sane failure message before aborting. OK for trunk? gcc/ChangeLog: * selftest.c (selftest::assert_streq): Handle NULL values of val_actual and val_expected. --- gcc/selftest.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/selftest.c b/gcc/selftest.c index ed6e517..76a4c41 100644 --- a/gcc/selftest.c +++ b/gcc/selftest.c @@ -60,13 +60,25 @@ selftest::fail_formatted (const location &loc, const char *fmt, ...) abort (); } -/* Implementation detail of ASSERT_STREQ. */ +/* Implementation detail of ASSERT_STREQ. + Compare val_expected and val_actual with strcmp. They ought + to be non-NULL; fail gracefully if either are NULL. */ void selftest::assert_streq (const location &loc, const char *desc_expected, const char *desc_actual, const char *val_expected, const char *val_actual) { + /* If val_expected is NULL, the test is buggy. Fail gracefully. */ + if (val_expected == NULL) + ::selftest::fail_formatted + (loc, "ASSERT_STREQ (%s, %s) expected=NULL", + desc_expected, desc_actual); + /* If val_actual is NULL, fail with a custom error message. */ + if (val_actual == NULL) + ::selftest::fail_formatted + (loc, "ASSERT_STREQ (%s, %s) expected=\"%s\" actual=NULL", + desc_expected, desc_actual, val_expected); if (0 == strcmp (val_expected, val_actual)) ::selftest::pass (loc, "ASSERT_STREQ"); else -- 1.8.5.3