]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix replace-buffer-contents undefined behavior
authorPaul Eggert <eggert@cs.ucla.edu>
Mon, 22 Mar 2021 01:08:13 +0000 (18:08 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Thu, 25 Mar 2021 15:13:12 +0000 (08:13 -0700)
* src/editfns.c (Freplace_buffer_contents): Avoid undefined
behavior with competing side effects in parallel subexpressions.
Problem reported by Apple clang version 12.0.0 (clang-1200.0.32.29).

src/editfns.c

index 621e35171d80411f002b6b664210518874d5513b..cd9633d4c6a456f32c86b4f6d02e6c8a766e13c9 100644 (file)
@@ -2053,6 +2053,8 @@ nil.  */)
      code.  */
   ptrdiff_t del_bytes = (size_t) size_a / CHAR_BIT + 1;
   ptrdiff_t ins_bytes = (size_t) size_b / CHAR_BIT + 1;
+  unsigned char *deletions = SAFE_ALLOCA (del_bytes);
+  unsigned char *insertions = SAFE_ALLOCA (ins_bytes);
   struct context ctx = {
     .buffer_a = a,
     .buffer_b = b,
@@ -2060,8 +2062,8 @@ nil.  */)
     .beg_b = min_b,
     .a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a),
     .b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b),
-    .deletions = SAFE_ALLOCA (del_bytes),
-    .insertions = SAFE_ALLOCA (ins_bytes),
+    .deletions = deletions,
+    .insertions = insertions,
     .fdiag = buffer + size_b + 1,
     .bdiag = buffer + diags + size_b + 1,
     .heuristic = true,