diff options
| author | Paul Eggert | 2021-03-21 18:08:13 -0700 |
|---|---|---|
| committer | Paul Eggert | 2021-03-25 08:13:12 -0700 |
| commit | 6a4ed891d84b1ca1e4d68a6de9dd374f1fadd971 (patch) | |
| tree | 3a950065f2e0da076faca86a6653f81d2899c69a /src | |
| parent | 720a8b17f8f48f2bc7d59dc71be1d5fc35f0964b (diff) | |
| download | emacs-6a4ed891d84b1ca1e4d68a6de9dd374f1fadd971.tar.gz emacs-6a4ed891d84b1ca1e4d68a6de9dd374f1fadd971.zip | |
Fix replace-buffer-contents undefined behavior
* 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).
Diffstat (limited to 'src')
| -rw-r--r-- | src/editfns.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/src/editfns.c b/src/editfns.c index 621e35171d8..cd9633d4c6a 100644 --- a/src/editfns.c +++ b/src/editfns.c | |||
| @@ -2053,6 +2053,8 @@ nil. */) | |||
| 2053 | code. */ | 2053 | code. */ |
| 2054 | ptrdiff_t del_bytes = (size_t) size_a / CHAR_BIT + 1; | 2054 | ptrdiff_t del_bytes = (size_t) size_a / CHAR_BIT + 1; |
| 2055 | ptrdiff_t ins_bytes = (size_t) size_b / CHAR_BIT + 1; | 2055 | ptrdiff_t ins_bytes = (size_t) size_b / CHAR_BIT + 1; |
| 2056 | unsigned char *deletions = SAFE_ALLOCA (del_bytes); | ||
| 2057 | unsigned char *insertions = SAFE_ALLOCA (ins_bytes); | ||
| 2056 | struct context ctx = { | 2058 | struct context ctx = { |
| 2057 | .buffer_a = a, | 2059 | .buffer_a = a, |
| 2058 | .buffer_b = b, | 2060 | .buffer_b = b, |
| @@ -2060,8 +2062,8 @@ nil. */) | |||
| 2060 | .beg_b = min_b, | 2062 | .beg_b = min_b, |
| 2061 | .a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a), | 2063 | .a_unibyte = BUF_ZV (a) == BUF_ZV_BYTE (a), |
| 2062 | .b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b), | 2064 | .b_unibyte = BUF_ZV (b) == BUF_ZV_BYTE (b), |
| 2063 | .deletions = SAFE_ALLOCA (del_bytes), | 2065 | .deletions = deletions, |
| 2064 | .insertions = SAFE_ALLOCA (ins_bytes), | 2066 | .insertions = insertions, |
| 2065 | .fdiag = buffer + size_b + 1, | 2067 | .fdiag = buffer + size_b + 1, |
| 2066 | .bdiag = buffer + diags + size_b + 1, | 2068 | .bdiag = buffer + diags + size_b + 1, |
| 2067 | .heuristic = true, | 2069 | .heuristic = true, |