Project

General

Profile

Actions

Bug #13545

closed

Ruby built by clang 4.0.0 parses Float literal wrongly

Added by mame (Yusuke Endoh) almost 7 years ago. Updated over 6 years ago.

Status:
Closed
Assignee:
-
Target version:
-
[ruby-core:81003]

Description

$ ./configure --prefix=/home/mame/work/local CC=clang
$ make -j 4 miniruby
$ ./miniruby -e 'p 1.1851510441583988e+30'
1.1851510441583981e+30

See the last digit. While the original literal ends with "8e+30", the result ends with "1e+30". The version of clang is 4.0.0-1ubuntu1.

There seems to be a bug in ruby_strtod. It manipulates a double variable as an integer variable by using cast. I think that this is undefined behavior, and clang seems to optimize some operations out.

We can fix this issue by adding volatile to its variable declaration, but I'm unsure if this is a good solution.

diff --git a/util.c b/util.c
index 4ae7c4fc96..ecd55bb0c5 100644
--- a/util.c
+++ b/util.c
@@ -1832,7 +1832,7 @@ d2b(double d_, int *e, int *bits)
 static double
 ratio(Bigint *a, Bigint *b)
 {
-    double_u da, db;
+    volatile double_u da, db;
     int k, ka, kb;
 
     dval(da) = b2d(a, &ka);
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0