Bug #3490

test_pack_utf8 failure on mswin64

Added by shintaro kuwamoto almost 4 years ago. Updated almost 3 years ago.

Status:Closed
Priority:Normal
Assignee:Usaku NAKAMURA
Category:core
Target version:1.9.3
ruby -v:ruby 1.9.3dev (2010-06-27 trunk 28450) [x64-mswin64_90] Backport:

Description

=begin
testintegercombのtestpackutf8がmswin64環境で失敗します。
aが-0x80000001の時に期待されているRangeErrorが投げられずに素通りします。

NUM2LONGの戻り値の型がlongなので、pack.:908行目で小さい型への変換が起こるようです。
NUM2LONGを使わずに、直接NUM2LONG_internalに置き換えると成功します。

Z:\rubytrunk\build>nmake test-all TESTS=ruby\testinteger_comb.rb

Microsoft(R) Program Maintenance Utility Version 9.00.30729.01
Copyright (C) Microsoft Corporation. All rights reserved.

     .\ruby.exe -I../lib -I".ext/x64-mswin64_90" "../tool/runruby.rb" --extou

t=".ext" -- "../test/runner.rb" ruby\testintegercomb.rb
Loaded suite ../test/runner
Started
..................F....................
Finished in 6.465000 seconds.

1) Failure:
testpackutf8(TestIntegerComb) [Z:/rubytrunk/test/ruby/testinteger_comb.rb:61
4]:
RangeError expected but nothing was raised.

39 tests, 1332736 assertions, 1 failures, 0 errors, 0 skips

Test run options: --seed 56768
NMAKE : fatal error U1077: '.\ruby.exe' : リターン コード '0x1'
Stop.
=end

Associated revisions

Revision 29612
Added by Usaku NAKAMURA over 3 years ago

  • bignum.c (rbbig2long, rbbig2ulong): rb2ulong() returns VALUE, but its real range is ulong. So, if the size of VALUE is bigger than ulong, upper bits are always zero even if the actual value is negative. fixed #3490

History

#1 Updated by Yusuke Endoh almost 4 years ago

  • Status changed from Open to Assigned
  • Assignee set to Usaku NAKAMURA
  • Priority changed from Normal to Low

=begin
遠藤です。

受理されるべきでない値が受理されるのでバグですが、受理されるべき
値が受理されないわけではないので、致命的ではないと判断し優先度を
Low にします。
個人的には 1.9.2 では WONTFIX が望ましいと思いますが、usa さんの
意見はどうでしょうか。

SIGNEDVALUE rbbig2long(VALUE x)

あたりが、sizeof(VALUE) == sizeof(long) を期待している気がする
ので、以下のようなパッチで直るんじゃないかと思いました。
ただ、直ったとしてもこのパッチには他の環境での影響が怖いのと、
他にも直すべき場所がありそう (rb_big2ulong とか) なので、検討が
必要だと思います。

diff --git a/bignum.c b/bignum.c
index 24f1340..cd2fbcb 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1189,11 +1189,11 @@ rb_big2long(VALUE x)
{
VALUE num = big2ulong(x, "long", TRUE);

  • if ((SIGNED_VALUE)num < 0 &&
  • (RBIGNUMSIGN(x) || (SIGNEDVALUE)num != LONG_MIN)) {
  • if ((long)num < 0 &&
  • (RBIGNUMSIGN(x) || (long)num != LONGMIN)) { rbraise(rbeRangeError, "bignum too big to convert into `long'"); }
  • if (!RBIGNUMSIGN(x)) return -(SIGNEDVALUE)num;
  • if (!RBIGNUM_SIGN(x)) return (VALUE)(-(long)num);
    return num;
    }

    Yusuke Endoh mame@tsg.ne.jp
    =end

#2 Updated by Yui NARUSE over 3 years ago

  • Priority changed from Low to Normal
  • Target version changed from 1.9.2 to 1.9.3

=begin
忘れ去られている気がするので、一度優先度を上げます
=end

#3 Updated by Usaku NAKAMURA over 3 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

=begin
This issue was solved with changeset r29612.
shintaro, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.

=end

#4 Updated by Usaku NAKAMURA over 3 years ago

  • Status changed from Closed to Assigned

=begin
というわけで今頃対応してみたのですが、これで十分じゃないかと思いつつも、
いまいち確信は持てません。難しい。
これでいいなら他の環境への影響なしで済むんですが。

なお、test/rubyはこれで全部通ってるような気はします。

=end

#5 Updated by Usaku NAKAMURA over 3 years ago

  • Status changed from Assigned to Closed

=begin

=end

Also available in: Atom PDF