Bug #282

failure of test_asctime(TestTime) on mswin32

Added by usa (Usaku NAKAMURA) almost 4 years ago. Updated about 1 year ago.

[ruby-dev:35555]
Status:Closed Start date:07/17/2008
Priority:Low Due date:
Assignee:usa (Usaku NAKAMURA) % Done:

100%

Category:-
Target version:-
ruby -v:

Description

表題の通りですが、忘れないように記録に残しておきます。

 test_asctime(TestTime) [(snip)/test/ruby/test_time.rb:291]:
 <"Sat Jan  1 00:00:00 2000"> expected but was
 <"Sat Jan 01 00:00:00 2000">.

C90を読む限りは日付の部分は月名部分に続けて "%3d" なので、MSVCRTのバグです。
しかしわざわざ対策すべきかどうかは微妙。

Associated revisions

Revision 18871
Added by usa (Usaku NAKAMURA) over 3 years ago

* time.c (time_asctime): workaround for MSVCRT's bug. based on a patch from wanabe <s.wanabe AT gmail.com> at [ruby-dev:35831] and a suggestion by KIMURA Koichi <kbk AT kt.rim.or.jp> at [ruby-dev:35832] fixed [ruby-dev:35555]

History

Updated by wanabe (_ wanabe) almost 4 years ago

ワナベです。

2008/08/12 20:56 木村浩一 <kbk@kt.rim.or.jp>:
> ・_WIN32というシンボルは対象が広すぎ(MSVCRTを使わないものも含む)
> ・MSVCRTのバグに対する workaround ということを明確にすべき
>
> と思います。
> 後者はコメントをつけるなり、いかにもという名前で判定するなり。

なるほど。そうしますとどうするのがいいのでしょう。
#if defined(__MSVCRT__) || defined(_MSC_VER)
という式を考えたのですが、わかりやすい(後者を満たしている)とは思えません。
何かほかの定数や configure の結果などを使ってうまくできないものでしょうか。

-- 
ワナベ

Updated by wanabe (_ wanabe) almost 4 years ago

ワナベと申します。

2008/07/17 6:59 Usaku NAKAMURA <redmine@ruby-lang.org>:
>  test_asctime(TestTime) [(snip)/test/ruby/test_time.rb:291]:
>  <"Sat Jan  1 00:00:00 2000"> expected but was
>  <"Sat Jan 01 00:00:00 2000">.
>
> C90を読む限りは日付の部分は月名部分に続けて "%3d" なので、MSVCRTのバグです。
> しかしわざわざ対策すべきかどうかは微妙。

単純にこんな風に対応してしまうのは駄目なのでしょうか。
テストが毎回失敗するのは何だか気になります。

Index: time.c
===================================================================
--- time.c	(revision 18359)
+++ time.c	(working copy)
@@ -1339,6 +1339,9 @@
     }
     s = asctime(&tobj->tm);
     if (s[24] == '\n') s[24] = '\0';
+#ifdef _WIN32
+    if (s[7] == ' ' && s[8] == '0') s[8] = ' ';
+#endif

     return rb_str_new2(s);
 }

-- 
ワナベ

Updated by usa (Usaku NAKAMURA) over 3 years ago

こんにちは、なかむら(う)です。

なぜか反応が遅くなってしまいましたが、

In message "[ruby-dev:35849] Re: [Ruby 1.9 - Bug #282] (Open) failure of test_asctime(TestTime) on mswin32"
    on Aug.14,2008 01:43:49, <kbk@kt.rim.or.jp> wrote:
> #if (defined _MT || defined __MSVCRT__) && !defined __BORLANDC__
> #define MSVCRT_THREADS
> #endif
> 
> このパターンと同様に config.h あたりで
> 
> #define AVOID_MSVCRT_BUG
> 
> という定義をしてしまうとか。
> 
> config.h を作るときにいろいろほかにも小さなプログラムを作りながら
> 検査していますので、この問題のチェックのためのステップを入れても
> いいと思いますがどうでしょうか(やる場合の話として)。

ここまでやるほどのことかなあ、と思ったので、

> でも
> #if defined(__MSVCRT__) || defined(_MSC_VER)
> で判定しておいて、きちんとコメントをつけておくだけでいいという気もします。

その程度でお茶を濁してcommitしました。
お二人ともいろいろありがとうございました。


> ところで問題になっているこの挙動は、msvcr[789].dll でも同様なんでしょうか?

全部同じです。


それでは。
-- 
U.Nakamura <usa@garbagecollect.jp>

Updated by usa (Usaku NAKAMURA) over 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100
Applied in changeset r18871.

Also available in: Atom PDF