Skip to content

Commit fb9b4dd

Browse files
author
Tilmann Scheller
committed
Fix signed left shift in vm_loop().
Signed left shift operations are undefined in C. Add constants for the minimum/maximum integer value which are already shifted. Technically, the constant for the shifted maximum value is not required, adding it for consistency/increased readability. The bug was detected by -Wshift-negative-value both with GCC 6.x and Clang. This fixes #1174. JerryScript-DCO-1.0-Signed-off-by: Tilmann Scheller t.scheller@samsung.com
1 parent 5f7997d commit fb9b4dd

File tree

2 files changed

+14
-6
lines changed

2 files changed

+14
-6
lines changed

jerry-core/ecma/base/ecma-globals.h

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -143,20 +143,28 @@ typedef int32_t ecma_integer_value_t;
143143
* Maximum integer number for an ecma value
144144
*/
145145
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
146-
#define ECMA_INTEGER_NUMBER_MAX 0x7fffff
146+
#define ECMA_INTEGER_NUMBER_MAX 0x7fffff
147+
#define ECMA_INTEGER_NUMBER_MAX_SHIFTED 0x7fffff0
147148
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
148-
#define ECMA_INTEGER_NUMBER_MAX 0x7ffffff
149+
#define ECMA_INTEGER_NUMBER_MAX 0x7ffffff
150+
#define ECMA_INTEGER_NUMBER_MAX_SHIFTED 0x7ffffff0
149151
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
150152

151153
/**
152154
* Minimum integer number for an ecma value
153155
*/
154156
#if CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32
155-
#define ECMA_INTEGER_NUMBER_MIN -0x7fffff
157+
#define ECMA_INTEGER_NUMBER_MIN -0x7fffff
158+
#define ECMA_INTEGER_NUMBER_MIN_SHIFTED -0x7fffff0
156159
#else /* CONFIG_ECMA_NUMBER_TYPE != CONFIG_ECMA_NUMBER_FLOAT32 */
157-
#define ECMA_INTEGER_NUMBER_MIN -0x8000000
160+
#define ECMA_INTEGER_NUMBER_MIN -0x8000000
161+
#define ECMA_INTEGER_NUMBER_MIN_SHIFTED (-0x7fffffff - 1) /* -0x80000000 */
158162
#endif /* CONFIG_ECMA_NUMBER_TYPE == CONFIG_ECMA_NUMBER_FLOAT32 */
159163

164+
#if ECMA_DIRECT_SHIFT != 4
165+
#error "Please update ECMA_INTEGER_NUMBER_MIN/MAX_SHIFTED according to the new value of ECMA_DIRECT_SHIFT."
166+
#endif
167+
160168
/**
161169
* Checks whether the integer number is in the integer number range.
162170
*/

jerry-core/vm/vm.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1215,12 +1215,12 @@ vm_loop (vm_frame_ctx_t *frame_ctx_p) /**< frame context */
12151215

12161216
if (opcode_flags & VM_OC_DECREMENT_OPERATOR_FLAG)
12171217
{
1218-
if (int_value > (ECMA_INTEGER_NUMBER_MIN << ECMA_DIRECT_SHIFT))
1218+
if (int_value > ECMA_INTEGER_NUMBER_MIN_SHIFTED)
12191219
{
12201220
int_increase = -(1 << ECMA_DIRECT_SHIFT);
12211221
}
12221222
}
1223-
else if (int_value < (ECMA_INTEGER_NUMBER_MAX << ECMA_DIRECT_SHIFT))
1223+
else if (int_value < ECMA_INTEGER_NUMBER_MAX_SHIFTED)
12241224
{
12251225
int_increase = 1 << ECMA_DIRECT_SHIFT;
12261226
}

0 commit comments

Comments
 (0)