Message ID | 20231018130840.3249206-1-stli@linux.ibm.com |
---|---|
State | New |
Headers | show |
Series | s390: Fix undefined behaviour in feenableexcept, fedisableexcept [BZ #30960] | expand |
On Okt 18 2023, Stefan Liebler wrote: > diff --git a/sysdeps/s390/fpu/fedisblxcpt.c b/sysdeps/s390/fpu/fedisblxcpt.c > index 728f103f43..84b2c5e64a 100644 > --- a/sysdeps/s390/fpu/fedisblxcpt.c > +++ b/sysdeps/s390/fpu/fedisblxcpt.c > @@ -26,7 +26,8 @@ fedisableexcept (int excepts) > > _FPU_GETCW (temp); > old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; > - new_flags = (temp & (~((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT))); > + new_flags = (temp & (~(((unsigned int) excepts & FE_ALL_EXCEPT) > + << FPC_EXCEPTION_MASK_SHIFT))); There is a redundant pair of parens around the ~ operator that makes the whole expression more difficult to read. Please consider removing it. > _FPU_SETCW (new_flags); > > return old_exc; > diff --git a/sysdeps/s390/fpu/feenablxcpt.c b/sysdeps/s390/fpu/feenablxcpt.c > index 0807e610a2..76d25316f4 100644 > --- a/sysdeps/s390/fpu/feenablxcpt.c > +++ b/sysdeps/s390/fpu/feenablxcpt.c > @@ -26,7 +26,8 @@ feenableexcept (int excepts) > > _FPU_GETCW (temp); > old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; > - new_flags = (temp | ((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT)); > + new_flags = (temp | ((unsigned int) (excepts & FE_ALL_EXCEPT) > + << FPC_EXCEPTION_MASK_SHIFT)); > _FPU_SETCW (new_flags); > > return old_exc; Please place the cast consistently (either inside or outside the (excepts & FE_ALL_EXCEPT) expression). Ok with that change.
On 19.10.23 10:48, Andreas Schwab wrote: > On Okt 18 2023, Stefan Liebler wrote: > >> diff --git a/sysdeps/s390/fpu/fedisblxcpt.c b/sysdeps/s390/fpu/fedisblxcpt.c >> index 728f103f43..84b2c5e64a 100644 >> --- a/sysdeps/s390/fpu/fedisblxcpt.c >> +++ b/sysdeps/s390/fpu/fedisblxcpt.c >> @@ -26,7 +26,8 @@ fedisableexcept (int excepts) >> >> _FPU_GETCW (temp); >> old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; >> - new_flags = (temp & (~((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT))); >> + new_flags = (temp & (~(((unsigned int) excepts & FE_ALL_EXCEPT) >> + << FPC_EXCEPTION_MASK_SHIFT))); > > There is a redundant pair of parens around the ~ operator that makes the > whole expression more difficult to read. Please consider removing it. > >> _FPU_SETCW (new_flags); >> >> return old_exc; >> diff --git a/sysdeps/s390/fpu/feenablxcpt.c b/sysdeps/s390/fpu/feenablxcpt.c >> index 0807e610a2..76d25316f4 100644 >> --- a/sysdeps/s390/fpu/feenablxcpt.c >> +++ b/sysdeps/s390/fpu/feenablxcpt.c >> @@ -26,7 +26,8 @@ feenableexcept (int excepts) >> >> _FPU_GETCW (temp); >> old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; >> - new_flags = (temp | ((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT)); >> + new_flags = (temp | ((unsigned int) (excepts & FE_ALL_EXCEPT) >> + << FPC_EXCEPTION_MASK_SHIFT)); >> _FPU_SETCW (new_flags); >> >> return old_exc; > > Please place the cast consistently (either inside or outside the > (excepts & FE_ALL_EXCEPT) expression). Ok with that change. > Thanks for the review. I've just committed it with your two mentioned changes. Thanks, Stefan
diff --git a/sysdeps/s390/fpu/fedisblxcpt.c b/sysdeps/s390/fpu/fedisblxcpt.c index 728f103f43..84b2c5e64a 100644 --- a/sysdeps/s390/fpu/fedisblxcpt.c +++ b/sysdeps/s390/fpu/fedisblxcpt.c @@ -26,7 +26,8 @@ fedisableexcept (int excepts) _FPU_GETCW (temp); old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; - new_flags = (temp & (~((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT))); + new_flags = (temp & (~(((unsigned int) excepts & FE_ALL_EXCEPT) + << FPC_EXCEPTION_MASK_SHIFT))); _FPU_SETCW (new_flags); return old_exc; diff --git a/sysdeps/s390/fpu/feenablxcpt.c b/sysdeps/s390/fpu/feenablxcpt.c index 0807e610a2..76d25316f4 100644 --- a/sysdeps/s390/fpu/feenablxcpt.c +++ b/sysdeps/s390/fpu/feenablxcpt.c @@ -26,7 +26,8 @@ feenableexcept (int excepts) _FPU_GETCW (temp); old_exc = (temp & FPC_EXCEPTION_MASK) >> FPC_EXCEPTION_MASK_SHIFT; - new_flags = (temp | ((excepts & FE_ALL_EXCEPT) << FPC_EXCEPTION_MASK_SHIFT)); + new_flags = (temp | ((unsigned int) (excepts & FE_ALL_EXCEPT) + << FPC_EXCEPTION_MASK_SHIFT)); _FPU_SETCW (new_flags); return old_exc;