diff options
-rw-r--r-- | ChangeLog | 7 | ||||
-rw-r--r-- | include/ruby/missing.h | 15 | ||||
-rw-r--r-- | numeric.c | 8 |
3 files changed, 22 insertions, 8 deletions
@@ -1,3 +1,10 @@ +Sat Oct 22 02:07:48 2011 Naohisa Goto <ngotogenome@gmail.com> + + * numeric.c (rb_infinity, rb_nan): use union to prevent bus error + caused by misalignment. [Bug #5469] [ruby-dev:44657] + + * include/ruby/missing.h (INFINITY, NAN): ditto + Fri Oct 21 22:02:17 2011 Nobuyoshi Nakada <nobu@ruby-lang.org> * gc.c (initial_params): pack in a struct. diff --git a/include/ruby/missing.h b/include/ruby/missing.h index 91a6540299..0edb1ec6c0 100644 --- a/include/ruby/missing.h +++ b/include/ruby/missing.h @@ -124,20 +124,27 @@ RUBY_EXTERN double lgamma_r(double, int *); RUBY_EXTERN double cbrt(double); #endif +#if !defined(INFINITY) || !defined(NAN) +union bytesequence4_or_float { + unsigned char bytesequence[4]; + float float_value; +}; +#endif + #ifdef INFINITY # define HAVE_INFINITY #else /** @internal */ -RUBY_EXTERN const unsigned char rb_infinity[]; -# define INFINITY (*(float *)rb_infinity) +RUBY_EXTERN const union bytesequence4_or_float rb_infinity; +# define INFINITY (rb_infinity.float_value) #endif #ifdef NAN # define HAVE_NAN #else /** @internal */ -RUBY_EXTERN const unsigned char rb_nan[]; -# define NAN (*(float *)rb_nan) +RUBY_EXTERN const union bytesequence4_or_float rb_nan; +# define NAN (rb_nan.float_value) #endif #ifndef isinf @@ -66,16 +66,16 @@ #ifdef HAVE_INFINITY #elif !defined(WORDS_BIGENDIAN) /* BYTE_ORDER == LITTLE_ENDIAN */ -const unsigned char rb_infinity[] = "\x00\x00\x80\x7f"; +const union bytesequence4_or_float rb_infinity = { 0x00, 0x00, 0x80, 0x7f }; #else -const unsigned char rb_infinity[] = "\x7f\x80\x00\x00"; +const union bytesequence4_or_float rb_infinity = { 0x7f, 0x80, 0x00, 0x00 }; #endif #ifdef HAVE_NAN #elif !defined(WORDS_BIGENDIAN) /* BYTE_ORDER == LITTLE_ENDIAN */ -const unsigned char rb_nan[] = "\x00\x00\xc0\x7f"; +const union bytesequence4_or_float rb_nan = { 0x00, 0x00, 0xc0, 0x7f }; #else -const unsigned char rb_nan[] = "\x7f\xc0\x00\x00"; +const union bytesequence4_or_float rb_nan = { 0x7f, 0xc0, 0x00, 0x00 }; #endif #ifndef HAVE_ROUND |