From: Paul Eggert Date: Tue, 30 Apr 2024 08:20:12 +0000 (-0700) Subject: Pacify GCC 14 -Wnull-dereference in tim_sort X-Git-Url: http://git.eshelyaron.com/gitweb/?a=commitdiff_plain;h=9883428dfd5bf5b1063e1d566c62ee2232abf642;p=emacs.git 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) --- 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))