From 9883428dfd5bf5b1063e1d566c62ee2232abf642 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Tue, 30 Apr 2024 01:20:12 -0700 Subject: [PATCH] Pacify GCC 14 -Wnull-dereference in tim_sort * src/lisp.h (tim_sort): Require array arg to be nonnull. * src/sort.c (reverse_slice): Omit no-longer-needed eassert. (tim_sort): Avoid undefined behavior when length == 0, since reverse_slice would then compute &seq[-1]. (cherry picked from commit c2b2a38f70f6c4639903a014db5b835b37669ea7) --- src/lisp.h | 3 ++- src/sort.c | 4 +--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/lisp.h b/src/lisp.h index 4487948b007..bf928f51b17 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -4301,7 +4301,8 @@ extern void mark_fns (void); /* Defined in sort.c */ extern void tim_sort (Lisp_Object, Lisp_Object, Lisp_Object *, const ptrdiff_t, - bool); + bool) + ARG_NONNULL ((3)); /* Defined in floatfns.c. */ verify (FLT_RADIX == 2 || FLT_RADIX == 16); diff --git a/src/sort.c b/src/sort.c index 808cd187dcf..02dad327cd4 100644 --- a/src/sort.c +++ b/src/sort.c @@ -38,8 +38,6 @@ along with GNU Emacs. If not, see . */ static void reverse_slice(Lisp_Object *lo, Lisp_Object *hi) { - eassert (lo && hi); - --hi; while (lo < hi) { Lisp_Object t = *lo; @@ -1095,7 +1093,7 @@ tim_sort (Lisp_Object predicate, Lisp_Object keyfunc, Lisp_Object *allocated_keys = NULL; merge_state ms; - if (reverse) + if (reverse && 0 < length) reverse_slice (seq, seq + length); /* preserve stability */ if (NILP (keyfunc)) -- 2.39.5