]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.12] gh-106550: Fix sign conversion in pycore_code.h (GH-112613) (#112696)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Mon, 4 Dec 2023 11:14:13 +0000 (12:14 +0100)
committerGitHub <noreply@github.com>
Mon, 4 Dec 2023 11:14:13 +0000 (11:14 +0000)
gh-106550: Fix sign conversion in pycore_code.h (GH-112613)

Fix sign conversion in pycore_code.h: use unsigned integers and cast
explicitly when needed.
(cherry picked from commit a74902a14cdc0952abf7bfabcf529c9b132c5cce)

Co-authored-by: Victor Stinner <vstinner@python.org>
Include/internal/pycore_code.h

index 75a23f3f5af560d0fbae7f61b6012c16018764d3..92e0a8bbd394eed5baf8da94a2330ea3131d575b 100644 (file)
@@ -359,27 +359,29 @@ write_varint(uint8_t *ptr, unsigned int val)
         val >>= 6;
         written++;
     }
-    *ptr = val;
+    *ptr = (uint8_t)val;
     return written;
 }
 
 static inline int
 write_signed_varint(uint8_t *ptr, int val)
 {
+    unsigned int uval;
     if (val < 0) {
-        val = ((-val)<<1) | 1;
+        // (unsigned int)(-val) has an undefined behavior for INT_MIN
+        uval = ((0 - (unsigned int)val) << 1) | 1;
     }
     else {
-        val = val << 1;
+        uval = (unsigned int)val << 1;
     }
-    return write_varint(ptr, val);
+    return write_varint(ptr, uval);
 }
 
 static inline int
 write_location_entry_start(uint8_t *ptr, int code, int length)
 {
     assert((code & 15) == code);
-    *ptr = 128 | (code << 3) | (length - 1);
+    *ptr = 128 | (uint8_t)(code << 3) | (uint8_t)(length - 1);
     return 1;
 }
 
@@ -419,9 +421,9 @@ write_location_entry_start(uint8_t *ptr, int code, int length)
 
 
 static inline uint16_t
-adaptive_counter_bits(int value, int backoff) {
-    return (value << ADAPTIVE_BACKOFF_BITS) |
-        (backoff & ((1<<ADAPTIVE_BACKOFF_BITS)-1));
+adaptive_counter_bits(uint16_t value, uint16_t backoff) {
+    return ((value << ADAPTIVE_BACKOFF_BITS)
+            | (backoff & ((1 << ADAPTIVE_BACKOFF_BITS) - 1)));
 }
 
 static inline uint16_t
@@ -438,12 +440,12 @@ adaptive_counter_cooldown(void) {
 
 static inline uint16_t
 adaptive_counter_backoff(uint16_t counter) {
-    unsigned int backoff = counter & ((1<<ADAPTIVE_BACKOFF_BITS)-1);
+    uint16_t backoff = counter & ((1 << ADAPTIVE_BACKOFF_BITS) - 1);
     backoff++;
     if (backoff > MAX_BACKOFF_VALUE) {
         backoff = MAX_BACKOFF_VALUE;
     }
-    unsigned int value = (1 << backoff) - 1;
+    uint16_t value = (uint16_t)(1 << backoff) - 1;
     return adaptive_counter_bits(value, backoff);
 }