diff options
| author | Paul Eggert | 2024-04-30 01:20:12 -0700 |
|---|---|---|
| committer | Paul Eggert | 2024-04-30 01:26:23 -0700 |
| commit | c2b2a38f70f6c4639903a014db5b835b37669ea7 (patch) | |
| tree | 8255bd14c436e9c7d17a9d4dae6e217a5042b793 /src | |
| parent | 009a6ba71ea6741371e4799bdb475235a5b6da90 (diff) | |
| download | emacs-c2b2a38f70f6c4639903a014db5b835b37669ea7.tar.gz emacs-c2b2a38f70f6c4639903a014db5b835b37669ea7.zip | |
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].
Diffstat (limited to 'src')
| -rw-r--r-- | src/lisp.h | 3 | ||||
| -rw-r--r-- | 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); | |||
| 4301 | 4301 | ||
| 4302 | /* Defined in sort.c */ | 4302 | /* Defined in sort.c */ |
| 4303 | extern void tim_sort (Lisp_Object, Lisp_Object, Lisp_Object *, const ptrdiff_t, | 4303 | extern void tim_sort (Lisp_Object, Lisp_Object, Lisp_Object *, const ptrdiff_t, |
| 4304 | bool); | 4304 | bool) |
| 4305 | ARG_NONNULL ((3)); | ||
| 4305 | 4306 | ||
| 4306 | /* Defined in floatfns.c. */ | 4307 | /* Defined in floatfns.c. */ |
| 4307 | verify (FLT_RADIX == 2 || FLT_RADIX == 16); | 4308 | 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 <https://www.gnu.org/licenses/>. */ | |||
| 38 | static void | 38 | static void |
| 39 | reverse_slice(Lisp_Object *lo, Lisp_Object *hi) | 39 | reverse_slice(Lisp_Object *lo, Lisp_Object *hi) |
| 40 | { | 40 | { |
| 41 | eassert (lo && hi); | ||
| 42 | |||
| 43 | --hi; | 41 | --hi; |
| 44 | while (lo < hi) { | 42 | while (lo < hi) { |
| 45 | Lisp_Object t = *lo; | 43 | Lisp_Object t = *lo; |
| @@ -1095,7 +1093,7 @@ tim_sort (Lisp_Object predicate, Lisp_Object keyfunc, | |||
| 1095 | Lisp_Object *allocated_keys = NULL; | 1093 | Lisp_Object *allocated_keys = NULL; |
| 1096 | merge_state ms; | 1094 | merge_state ms; |
| 1097 | 1095 | ||
| 1098 | if (reverse) | 1096 | if (reverse && 0 < length) |
| 1099 | reverse_slice (seq, seq + length); /* preserve stability */ | 1097 | reverse_slice (seq, seq + length); /* preserve stability */ |
| 1100 | 1098 | ||
| 1101 | if (NILP (keyfunc)) | 1099 | if (NILP (keyfunc)) |