changeset 28968:3043a3e2ef95 v8.2.5006

patch 8.2.5006: asan warns for undefined behavior Commit: https://github.com/vim/vim/commit/68e64d2c1735f2a39afa8a0475ae29bedb116684 Author: Bram Moolenaar <Bram@vim.org> Date: Sun May 22 22:07:52 2022 +0100 patch 8.2.5006: asan warns for undefined behavior Problem: Asan warns for undefined behavior. Solution: Cast the shifted value to unsigned.
author Bram Moolenaar <Bram@vim.org>
date Sun, 22 May 2022 23:15:03 +0200
parents 13d66390ef26
children c0a54e5eeb3b
files src/eval.c src/version.c src/vim9execute.c src/vim9expr.c
diffstat 4 files changed, 6 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/src/eval.c
+++ b/src/eval.c
@@ -3089,7 +3089,7 @@ eval5(char_u **arg, typval_T *rettv, eva
 		rettv->vval.v_number = 0;
 	    else if (type == EXPR_LSHIFT)
 		rettv->vval.v_number =
-				    rettv->vval.v_number << var2.vval.v_number;
+		      (uvarnumber_T)rettv->vval.v_number << var2.vval.v_number;
 	    else
 		rettv->vval.v_number =
 		      (uvarnumber_T)rettv->vval.v_number >> var2.vval.v_number;
--- a/src/version.c
+++ b/src/version.c
@@ -735,6 +735,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    5006,
+/**/
     5005,
 /**/
     5004,
--- a/src/vim9execute.c
+++ b/src/vim9execute.c
@@ -4091,7 +4091,7 @@ exec_instructions(ectx_T *ectx)
 			case EXPR_LSHIFT: if (arg2 > MAX_LSHIFT_BITS)
 					      res = 0;
 					  else
-					      res = arg1 << arg2;
+					      res = (uvarnumber_T)arg1 << arg2;
 					  break;
 			case EXPR_RSHIFT: if (arg2 > MAX_LSHIFT_BITS)
 					      res = 0;
--- a/src/vim9expr.c
+++ b/src/vim9expr.c
@@ -2716,7 +2716,8 @@ compile_expr5(char_u **arg, cctx_T *cctx
 	    if (tv2->vval.v_number > MAX_LSHIFT_BITS)
 		tv1->vval.v_number = 0;
 	    else if (type == EXPR_LSHIFT)
-		tv1->vval.v_number = tv1->vval.v_number << tv2->vval.v_number;
+		tv1->vval.v_number =
+			(uvarnumber_T)tv1->vval.v_number << tv2->vval.v_number;
 	    else
 		tv1->vval.v_number =
 			(uvarnumber_T)tv1->vval.v_number >> tv2->vval.v_number;