1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
ruby--ruby/internal
卜部昌平 13064fe5db avoid undefined behaviour when n==0
ISO/IEC 9899:1999 section 6.5.7 states that "If the value of the right
operand is negative or is greater than or equal to the width of the
promoted left operand, the behavior is undefined".  So we have to take
care of such situations.

This has not been a problem because contemporary C compilers are
extraordinary smart to compile the series of shifts into a single
ROTLQ/ROTRQ machine instruction.  In contrast to what C says those
instructions have fully defined behaviour for all possible inputs.
Hence it has been quite difficult to observe the undefined-ness of such
situations.  But undefined is undefined.  We should not rely on such
target-specific assumptions.

We are fixing the situation by carefully avoiding shifts with out-of-
range values.  At least GCC since 4.6.3 and Clang since 8.0 can issue
the exact same instructions like before the changeset.

Also in case of Intel processors, there supposedly be intrinsics named
_rotr/_rotl that do exactly what we need.  They, in practice, are absent
on Clang before 9.x so we cannot blindly use.  But we can at least save
MSVC.

See also:
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57157
https://bugs.llvm.org/show_bug.cgi?id=17332
2020-01-10 21:17:15 +09:00
..
array.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
bignum.h Introduce BIGNUM_EMBED_P to check BIGNUM_EMBED_FLAG (#2802) 2019-12-31 22:48:23 +09:00
bits.h avoid undefined behaviour when n==0 2020-01-10 21:17:15 +09:00
class.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
compar.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
compile.h internal/compile.h rework 2019-12-26 20:45:12 +09:00
compilers.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
complex.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
cont.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
dir.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
enc.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
encoding.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
enum.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
enumerator.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
error.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
eval.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
file.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
fixnum.h internal/fixnum.h rework 2019-12-26 20:45:12 +09:00
gc.h Try to fix error on Solaris 2019-12-27 09:20:58 +09:00
hash.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
imemo.h internal/imemo.h rework 2019-12-26 20:45:12 +09:00
inits.h
io.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
load.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
loadpath.h
math.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
missing.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
mjit.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
numeric.h internal/numeric.h rework 2019-12-26 20:45:12 +09:00
object.h internal/object.h rework 2019-12-26 20:45:12 +09:00
parse.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
proc.h internal/proc.h rework 2019-12-26 20:45:12 +09:00
process.h internal/process.h rework 2019-12-26 20:45:12 +09:00
random.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
range.h internal/range.h rework 2019-12-26 20:45:12 +09:00
rational.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
re.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
sanitizers.h Fixed an unavailable sanitizer feature 2019-12-29 08:19:43 +09:00
serial.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
signal.h
static_assert.h internal/static_assert.h rework 2019-12-26 20:45:12 +09:00
stdbool.h internal/stdbool.h rework 2019-12-26 20:45:12 +09:00
string.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
struct.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
symbol.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
thread.h internal/thread.h rework 2019-12-26 20:45:12 +09:00
time.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
transcode.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
util.h other minior internal header tweaks 2019-12-26 20:45:12 +09:00
variable.h decouple internal.h headers 2019-12-26 20:45:12 +09:00
vm.h Fully separate positional arguments and keyword arguments 2020-01-02 18:40:45 -08:00
warnings.h internal/warnings.h rework 2019-12-26 20:45:12 +09:00