From: mame@... Date: 2019-12-17T00:25:06+00:00 Subject: [ruby-core:96280] [Ruby master Bug#16159] rubyspec about time fails in Asia/Kuala_Lumpur timezone Issue #16159 has been updated by mame (Yusuke Endoh). Assignee changed from Eregon (Benoit Daloze) to akr (Akira Tanaka) By further investigation, now I think that it is a bug of Time.new. `find_time_t` in time.c uses integer division like `((tptr->tm_year-69)/4)`. Because 1933 is older than 1970, `tptr->tm_year` is negative. The result of division is not guaranteed to be floor'ed in C, which leads to the bug. @akr Could you review this? ```diff diff --git a/time.c b/time.c index 25b843e405..e7f9202cf4 100644 --- a/time.c +++ b/time.c @@ -3121,6 +3121,10 @@ static VALUE find_time_numguess_getter(void) #define DEBUG_FIND_TIME_NUMGUESS_INC #endif +static int FLOOR_DIV(int n, int m) { + return FIX2INT(rb_fix_div_fix(INT2FIX(n), INT2FIX(m))); +} + static const char * find_time_t(struct tm *tptr, int utc_p, time_t *tp) { @@ -3365,12 +3369,12 @@ find_time_t(struct tm *tptr, int utc_p, time_t *tp) *tp = guess_lo + ((tptr->tm_year - tm_lo.tm_year) * 365 + - ((tptr->tm_year-69)/4) - - ((tptr->tm_year-1)/100) + - ((tptr->tm_year+299)/400) - - ((tm_lo.tm_year-69)/4) + - ((tm_lo.tm_year-1)/100) - - ((tm_lo.tm_year+299)/400) + + FLOOR_DIV((tptr->tm_year-69), 4) - + FLOOR_DIV((tptr->tm_year-1), 100) + + FLOOR_DIV((tptr->tm_year+299), 400) - + FLOOR_DIV((tm_lo.tm_year-69), 4) + + FLOOR_DIV((tm_lo.tm_year-1), 100) - + FLOOR_DIV((tm_lo.tm_year+299), 400) + tptr_tm_yday - tm_lo.tm_yday) * 86400 + (tptr->tm_hour - tm_lo.tm_hour) * 3600 + ``` ---------------------------------------- Bug #16159: rubyspec about time fails in Asia/Kuala_Lumpur timezone https://bugs.ruby-lang.org/issues/16159#change-83183 * Author: jimmynguyc (Jimmy Ngu) * Status: Assigned * Priority: Normal * Assignee: akr (Akira Tanaka) * Target version: * ruby -v: ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] * Backport: 2.5: UNKNOWN, 2.6: UNKNOWN ---------------------------------------- Steps to reproduce: 1. Check out current master from Github (89c5d5a64e12cea23b230913b79c3d499bf30b12) 2. Run `autoconf` 3. Run `./configure` 4. Run `make check -- --with-openssl-dir=/usr/local/opt/openssl/lib` Result: ``` $ make check -- --with-openssl-dir=/usr/local/opt/openssl/lib BASERUBY = /Users/jimmy/.rbenv/shims/ruby --disable=gems CC = clang LD = ld LDSHARED = clang -dynamiclib CFLAGS = -O3 -ggdb3 -Wall -Wextra -Werror=deprecated-declarations -Werror=division-by-zero -Werror=implicit-function-declaration -Werror=implicit-int -Werror=pointer-arith -Werror=shorten-64-to-32 -Werror=write-strings -Wmissing-noreturn -Wno-constant-logical-operand -Wno-long-long -Wno-missing-field-initializers -Wno-overlength-strings -Wno-parentheses-equality -Wno-self-assign -Wno-tautological-compare -Wno-unused-parameter -Wno-unused-value -Wunused-variable -Werror=extra-tokens -std=gnu99 -pipe XCFLAGS = -D_FORTIFY_SOURCE=2 -fstack-protector-strong -fno-strict-overflow -DRUBY_DEVEL=1 -fvisibility=hidden -DRUBY_EXPORT -fPIE -DCANONICALIZATION_FOR_MATHN -I. -I.ext/include/x86_64-darwin18 -I./include -I. -I./enc/unicode/12.1.0 CPPFLAGS = -I/usr/local/opt/openssl/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT DLDFLAGS = -L/usr/local/opt/openssl/lib -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -fstack-protector-strong -Wl,-pie -framework Security -framework Foundation SOLIBS = -lpthread -lgmp -ldl -lobjc LANG = en_US.UTF-8 LC_ALL = LC_CTYPE = en_US.UTF-8 MFLAGS = Apple LLVM version 10.0.1 (clang-1001.0.46.4) Target: x86_64-apple-darwin18.7.0 Thread model: posix InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin ./revision.h unchanged generating encdb.h encdb.h unchanged generating enc.mk making srcs under enc make[1]: Nothing to be done for `srcs'. generating transdb.h transdb.h unchanged generating makefiles ext/configure-ext.mk ext/configure-ext.mk unchanged generating makefile exts.mk exts.mk unchanged ./revision.h unchanged make[1]: Nothing to be done for `note'. making enc make[1]: Nothing to be done for `enc'. making trans make[1]: Nothing to be done for `./enc/trans'. making encs make[1]: Nothing to be done for `encs'. Generating RDoc documentation No newer files. Files: 0 Classes: 0 (0 undocumented) Modules: 0 (0 undocumented) Constants: 0 (0 undocumented) Attributes: 0 (0 undocumented) Methods: 0 (0 undocumented) Total: 0 (0 undocumented) 0.00% documented Elapsed: 0.0s Fiber count: 10000 (skipping) Thread count: 4094 (can't create Thread: Resource temporarily unavailable) PASS all 1408 tests exec ./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- --disable-gems "./bootstraptest/runner.rb" --ruby="ruby --disable-gems" ./KNOWNBUGS.rb 2019-09-10 00:54:00 +0800 Driver is ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] Target is ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] KNOWNBUGS.rb PASS 0 No tests, no problem test succeeded Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- --disable-gems" # Running tests: Finished tests in 2.620115s, 87.4007 tests/s, 190.0680 assertions/s. 229 tests, 498 assertions, 0 failures, 0 errors, 0 skips ruby -v: ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] Run options: "--ruby=./miniruby -I./lib -I. -I.ext/common ./tool/runruby.rb --extout=.ext -- --disable-gems" --excludes-dir=./test/excludes --name=!/memory_leak/ # Running tests: Finished tests in 504.198097s, 41.7792 tests/s, 5397.4460 assertions/s. 21065 tests, 2721382 assertions, 0 failures, 0 errors, 37 skips ruby -v: ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] $ /Users/jimmy/Projects/ruby/miniruby -I/Users/jimmy/Projects/ruby/lib /Users/jimmy/Projects/ruby/tool/runruby.rb --archdir=/Users/jimmy/Projects/ruby --extout=.ext -- /Users/jimmy/Projects/ruby/spec/mspec/bin/mspec-run -B ./spec/default.mspec ruby 2.7.0dev (2019-09-09T12:27:40Z master 89c5d5a64e) [x86_64-darwin18] 1) Time.local handles years from 0 as such FAILED Expected 1932 to equal 1933 /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:138:in `block (3 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `upto' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `block (2 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/local_spec.rb:5:in `<top (required)>' 2) Time.mktime handles years from 0 as such FAILED Expected 1932 to equal 1933 /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:138:in `block (3 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `upto' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `block (2 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/mktime_spec.rb:5:in `<top (required)>' 3) Time.new handles years from 0 as such FAILED Expected 1932 to equal 1933 /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:138:in `block (3 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `upto' /Users/jimmy/Projects/ruby/spec/ruby/core/time/shared/time_params.rb:136:in `block (2 levels) in <top (required)>' /Users/jimmy/Projects/ruby/spec/ruby/core/time/new_spec.rb:11:in `<top (required)>' [\ | ==================100%================== | 00:00:00] 3F 0E Finished in 59.678478 seconds 3771 files, 30927 examples, 158359 expectations, 3 failures, 0 errors, 0 tagged make: *** [yes-test-spec] Error 1 ``` I'm running a 15" MacBook Pro 2.9 GHz Intel Core i7 -- https://bugs.ruby-lang.org/ Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe> <http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>