Bug #282

failure of test_asctime(TestTime) on mswin32

Added by Usaku NAKAMURA almost 7 years ago. Updated about 4 years ago.

[ruby-dev:35555]
Status:Closed
Priority:Low
Assignee:Usaku NAKAMURA
ruby -v: Backport:

Description

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

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のバグです。
しかしわざわざ対策すべきかどうかは微妙。
=end

History

#1 Updated by _ wanabe almost 7 years ago

=begin
ワナベです。

2008/08/12 20:56 木村浩一 kbk@kt.rim.or.jp:

・_WIN32というシンボルは対象が広すぎ(MSVCRTを使わないものも含む)
・MSVCRTのバグに対する workaround ということを明確にすべき

と思います。
後者はコメントをつけるなり、いかにもという名前で判定するなり。

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

--
ワナベ

=end

#2 Updated by _ wanabe almost 7 years ago

=begin
ワナベと申します。

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);

}

--
ワナベ

=end

#3 Updated by Usaku NAKAMURA over 6 years ago

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

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

In message " Re: Ruby 1.9 - Bug #282 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

=end

#4 Updated by Usaku NAKAMURA over 6 years ago

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

=begin
Applied in changeset r18871.
=end

Also available in: Atom PDF