Skip to content

Commit d19cf62

Browse files
committed
Use memcpy in set_bits to avoid alignment issues
1 parent f075c91 commit d19cf62

File tree

1 file changed

+10
-4
lines changed

1 file changed

+10
-4
lines changed

Python/jit.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,12 +157,18 @@ set_bits(uint32_t *loc, uint8_t loc_start, uint64_t value, uint8_t value_start,
157157
uint8_t width)
158158
{
159159
assert(loc_start + width <= 32);
160+
uint32_t temp_val;
161+
// Use memcpy to safely read the value, avoiding potential alignment
162+
// issues and strict aliasing violations.
163+
memcpy(&temp_val, loc, sizeof(temp_val));
160164
// Clear the bits we're about to patch:
161-
*loc &= ~(((1ULL << width) - 1) << loc_start);
162-
assert(get_bits(*loc, loc_start, width) == 0);
165+
temp_val &= ~(((1ULL << width) - 1) << loc_start);
166+
assert(get_bits(temp_val, loc_start, width) == 0);
163167
// Patch the bits:
164-
*loc |= get_bits(value, value_start, width) << loc_start;
165-
assert(get_bits(*loc, loc_start, width) == get_bits(value, value_start, width));
168+
temp_val |= get_bits(value, value_start, width) << loc_start;
169+
assert(get_bits(temp_val, loc_start, width) == get_bits(value, value_start, width));
170+
// Safely write the modified value back to memory.
171+
memcpy(loc, &temp_val, sizeof(temp_val));
166172
}
167173

168174
// See https://developer.arm.com/documentation/ddi0602/2023-09/Base-Instructions

0 commit comments

Comments
 (0)