Calls to gcc_jit_context_get_builtin_function that accessed builtins in sanitizer.def and after (or failed to match any builtin) led to a crash accessing a NULL builtin name.
The entries with the NULL name came from these lines in sanitizer.def: /* This has to come before all the sanitizer builtins. */ DEF_BUILTIN_STUB(BEGIN_SANITIZER_BUILTINS, (const char *)0) [...snip...] /* This has to come after all the sanitizer builtins. */ DEF_BUILTIN_STUB(END_SANITIZER_BUILTINS, (const char *)0) This patch updates jit-builtins.c to cope with such entries, fixing the crash. Successfully bootstrapped®rtested on x86_64-pc-linux-gnu; takes jit.sum from 9769 to 9789 PASS results. Committed to trunk as r252769. gcc/jit/ChangeLog: PR jit/82174 * jit-builtins.c (matches_builtin): Ignore entries with a NULL name. gcc/testsuite/ChangeLog: PR jit/82174 * jit.dg/test-error-gcc_jit_context_get_builtin_function-unknown-builtin.c: New test case. --- gcc/jit/jit-builtins.c | 5 ++++- ..._context_get_builtin_function-unknown-builtin.c | 22 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/jit.dg/test-error-gcc_jit_context_get_builtin_function-unknown-builtin.c diff --git a/gcc/jit/jit-builtins.c b/gcc/jit/jit-builtins.c index 7840915..35c4db0 100644 --- a/gcc/jit/jit-builtins.c +++ b/gcc/jit/jit-builtins.c @@ -68,7 +68,10 @@ matches_builtin (const char *in_name, const struct builtin_data& bd) { const bool debug = 0; - gcc_assert (bd.name); + + /* Ignore entries with a NULL name. */ + if (!bd.name) + return false; if (debug) fprintf (stderr, "seen builtin: %s\n", bd.name); diff --git a/gcc/testsuite/jit.dg/test-error-gcc_jit_context_get_builtin_function-unknown-builtin.c b/gcc/testsuite/jit.dg/test-error-gcc_jit_context_get_builtin_function-unknown-builtin.c new file mode 100644 index 0000000..b1e389c --- /dev/null +++ b/gcc/testsuite/jit.dg/test-error-gcc_jit_context_get_builtin_function-unknown-builtin.c @@ -0,0 +1,22 @@ +#include <stdlib.h> +#include <stdio.h> + +#include "libgccjit.h" + +#include "harness.h" + +void +create_code (gcc_jit_context *ctxt, void *user_data) +{ + gcc_jit_context_get_builtin_function (ctxt, + "this_is_not_a_builtin"); +} + +void +verify_code (gcc_jit_context *ctxt, gcc_jit_result *result) +{ + CHECK_VALUE (result, NULL); + + CHECK_STRING_VALUE (gcc_jit_context_get_first_error (ctxt), + "builtin \"this_is_not_a_builtin\" not found"); +} -- 1.8.5.3