Project

General

Profile

Bug #674

Failure: test_aset(TestSDBM)

Added by znz (Kazuhiro NISHIYAMA) over 10 years ago. Updated about 8 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
-
ruby -v:
Backport:
[ruby-dev:36854]

Description

=begin
1) Failure:
test_aset(TestSDBM) [.../trunk/test/sdbm/test_sdbm.rb:174]:
<""> expected but was
<"barbarfoo">.
について調べてみました。

ext/sdbm/init.cのfsdbm_fetchの
return rb_external_str_new(value.dptr, value.dsize);
でvalue = {dptr = "barbarfoo", dsize = 0}となっていて、
lenに0を指定しているのにstring.cのrb_external_str_new_with_encが
if (len == 0 && ptr) len = strlen(ptr);
でlenを無視してstrlenしてしまっているのが原因のようです。
=end

History

#1

Updated by nobu (Nobuyoshi Nakada) over 10 years ago

=begin
なかだです。

At Wed, 22 Oct 2008 03:16:57 +0900,
Kazuhiro NISHIYAMA wrote in [ruby-dev:36854]:

ext/sdbm/init.cのfsdbm_fetchの
return rb_external_str_new(value.dptr, value.dsize);
でvalue = {dptr = "barbarfoo", dsize = 0}となっていて、
lenに0を指定しているのにstring.cのrb_external_str_new_with_encが
if (len == 0 && ptr) len = strlen(ptr);
でlenを無視してstrlenしてしまっているのが原因のようです。

まだlen==0を指定してrb_external_str_new_with_enc()を呼ぶコードは
ないようですし、rb_{external,locale}_str_new()をそれぞれ二つに分
けたほうがいいんじゃないでしょうか。あるいは、正しい値としてあり
うる0じゃなくて-1あたりにするとか。

Index: include/ruby/intern.h
===================================================================
--- include/ruby/intern.h (revision 19872)
+++ include/ruby/intern.h (working copy)
@@ -549,5 +549,7 @@ VALUE rb_tainted_str_new(const char*, lo
VALUE rb_tainted_str_new2(const char*);
VALUE rb_external_str_new(const char*, long);
+VALUE rb_external_str_new_cstr(const char*);
VALUE rb_locale_str_new(const char*, long);
+VALUE rb_locale_str_new_cstr(const char*);
VALUE rb_str_buf_new(long);
VALUE rb_str_buf_new_cstr(const char*);
@@ -620,4 +622,16 @@ size_t rb_str_capacity(VALUE);
rb_usascii_str_new_cstr(str); \
})
+#define rb_external_str_new_cstr(str) extension ( \
+{ \

  • (__builtin_constant_p(str)) ? \
  • rb_external_str_new(str, strlen(str)) : \
  • rb_external_str_new_cstr(str); \ +}) +#define rb_locale_str_new_cstr(str) extension ( \ +{ \
  • (__builtin_constant_p(str)) ? \
  • rb_locale_str_new(str, strlen(str)) : \
  • rb_locale_str_new_cstr(str); \
    +})
    #define rb_str_buf_new_cstr(str) extension ( \
    { \

    Index: string.c

    --- string.c (revision 19872)
    +++ string.c (working copy)
    @@ -29,4 +29,6 @@
    #undef rb_tainted_str_new_cstr
    #undef rb_usascii_str_new_cstr
    +#undef rb_external_str_new_cstr
    +#undef rb_locale_str_new_cstr
    #undef rb_str_new2
    #undef rb_str_new3
    @@ -529,5 +531,4 @@ rb_external_str_new_with_enc(const char
    VALUE str;

  • if (len == 0 && !ptr) len = strlen(ptr);
    str = rb_tainted_str_new(ptr, len);
    rb_enc_associate(str, eenc);
    @@ -542,4 +543,11 @@ rb_external_str_new(const char *ptr, lon

VALUE
+rb_external_str_new_cstr(const char *ptr)
+{

  • long len = ptr ? strlen(ptr) : 0;
  • return rb_external_str_new_with_enc(ptr, len, rb_default_external_encoding()); +} + +VALUE rb_locale_str_new(const char *ptr, long len) { @@ -548,4 +556,11 @@ rb_locale_str_new(const char *ptr, long

VALUE
+rb_locale_str_new_cstr(const char *ptr)
+{

  • long len = ptr ? strlen(ptr) : 0;
  • return rb_external_str_new_with_enc(ptr, len, rb_locale_encoding()); +} + +VALUE rb_str_export(VALUE str) {

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

=end

#2

Updated by matz (Yukihiro Matsumoto) over 10 years ago

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

=begin
Applied in changeset r19885.
=end

Also available in: Atom PDF