# SEGV by attr

**URL:** <https://www.ruby-forum.com/t/segv-by-attr/115261>\
**Category:** Development\
**Created:** [September 22, 2007, 5:53pm UTC](https://www.ruby-forum.com/t/segv-by-attr/115261 "2007-09-22T17:53:34Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 22, 2007, 5:53pm UTC](https://www.ruby-forum.com/t/segv-by-attr/115261/1 "2007-09-22T17:53:34Z")

</div>

e$B0J2\<$N$h$&$K$9$k$He(B SEGV e$B$7$^$9!#e(B

% limit stacksize 1m  
% ./ruby -ve ’  
class C  
attr “a” \* 2000000  
end  
’  
ruby 1.9.0 (2007-09-22 patchlevel 0) [i686-linux]  
zsh: segmentation fault (core dumped) ./ruby -ve ’ class C attr “a” \*  
2000000 end ’  
% gdb ruby core.4810  
GNU gdb 6.4.90-debian  
Copyright © 2006 Free Software Foundation, Inc.  
GDB is free software, covered by the GNU General Public License, and you  
are  
welcome to change it and/or distribute copies of it under certain  
conditions.  
Type “show copying” to see the conditions.  
There is absolutely no warranty for GDB. Type “show warranty” for  
details.  
This GDB was configured as “i486-linux-gnu”…Using host libthread\_db  
library “/lib/tls/libthread\_db.so.1”.

warning: Can’t read pathname for load map: Input/output error.  
Reading symbols from /lib/tls/libpthread.so.0…done.  
Loaded symbols for /lib/tls/libpthread.so.0  
Reading symbols from /lib/tls/libdl.so.2…done.  
Loaded symbols for /lib/tls/libdl.so.2  
Reading symbols from /lib/tls/libcrypt.so.1…done.  
Loaded symbols for /lib/tls/libcrypt.so.1  
Reading symbols from /lib/tls/libm.so.6…done.  
Loaded symbols for /lib/tls/libm.so.6  
Reading symbols from /lib/tls/libc.so.6…done.  
Loaded symbols for /lib/tls/libc.so.6  
Reading symbols from /lib/ld-linux.so.2…done.  
Loaded symbols for /lib/ld-linux.so.2  
Core was generated by `./ruby -ve  
class C  
attr “a” \* 2000000  
end  
'.  
Program terminated with signal 11, Segmentation fault.  
#0 0x08058f4b in rb\_attr (klass=3084222700, id=8776, read=2, write=0,  
ex=2) at eval\_method.ci:441  
441 snprintf(buf, len, “@%s”, name);  
(gdb) bt  
#0 0x08058f4b in rb\_attr (klass=3084222700, id=8776, read=2, write=0,  
ex=2) at eval\_method.ci:441  
#1 0x0807942f in rb\_mod\_attr\_reader (argc=1, argv=0xb7d7a028,  
klass=3084222700) at object.c:1408  
#2 0x080794d8 in rb\_mod\_attr (argc=1, argv=0xb7d7a028,  
klass=3084222700) at object.c:1421  
#3 0x080edf5a in call\_cfunc (func=0x8079441 \<rb\_mod\_attr\>,  
recv=3084222700, len=-1, argc=1, argv=0xb7d7a028)  
at insnhelper.ci:276  
#4 0x080f59e1 in vm\_call\_cfunc (th=0x8181160, reg\_cfp=0xb7df9f28,  
num=1, id=1088, recv=3084222700, klass=3084222680,  
mn=0xb7d780e0, blockptr=0x0) at insnhelper.ci:365  
#5 0x080f5570 in vm\_call\_method (th=0x8181160, cfp=0xb7df9f28, num=1,  
blockptr=0x0, flag=8, id=1088, mn=0xb7d780b8,  
recv=3084222700, klass=3084222680) at insnhelper.ci:490  
#6 0x080f1daf in vm\_eval (th=0x8181160, initial=0) at insns.def:1073  
#7 0x080f5bba in vm\_eval\_body (th=0x8181160) at vm.c:1162  
#8 0x080f61ff in rb\_iseq\_eval (iseqval=3084222940) at vm.c:1371  
#9 0x0805a47d in ruby\_exec\_node (n=0xb7d58218, file=0x81bb1d1 “-e”) at  
eval.c:231  
#10 0x0805a500 in ruby\_run\_node (n=0xb7d58218) at eval.c:256  
#11 0x080576c5 in main (argc=3, argv=0xbff33104, envp=0xbff33114) at  
main.c:46  
(gdb)

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 24, 2007, 5:05pm UTC](https://www.ruby-forum.com/t/segv-by-attr/115261/2 "2007-09-24T17:05:41Z")

</div>

e$B$J$+$@$G$9!#e(B

At Sun, 23 Sep 2007 00:52:42 +0900,  
Tanaka A. wrote in [ruby-dev:31818]:

> Program terminated with signal 11, Segmentation fault.  
> #0 0x08058f4b in rb\_attr (klass=3084222700, id=8776, read=2, write=0, ex=2) at eval\_method.ci:441  
> 441 snprintf(buf, len, “@%s”, name);

e$B$U$H!“e(BID\_ATTRSETe$B$N$h$&$Ke(BID\_INSTANCEe$B$J$I$be(BID\_LOCALe$B$HBP1~4X78$,$“e(B  
e$B$l$P!”$o$6$o$6$”$i$?$a$FJ8;zNs$r:n$kI,MW$b$J$$$s$8$c$J$$$+!"$H;We(B  
e$B$$$^$7$?!#e(B

# Index: parse.y

— parse.y (revision 13508)  
+++ parse.y (working copy)  
@@ -7375,4 +7375,28 @@ rb\_id\_attrset(ID id)  
}

+ID  
+rb\_id\_ivar(ID id)  
+{

- id &= ~ID\_SCOPE\_MASK;
- id |= ID\_INSTANCE;
- return id;  
+}
- 

+ID  
+rb\_id\_cvar(ID id)  
+{

- id &= ~ID\_SCOPE\_MASK;
- id |= ID\_CLASS;
- return id;  
+}
- 

+ID  
+rb\_id\_gvar(ID id)  
+{

- id &= ~ID\_SCOPE\_MASK;
- id |= ID\_GLOBAL;
- return id;  
+}
- 

static NODE \*  
attrset\_gen(struct parser\_params \*parser, NODE \*recv, ID id)  
@@ -8504,8 +8528,20 @@ rb\_intern3(const char \*name, long len, r  
}  
if (m - name \< len) id = ID\_JUNK;

- m = name;
- switch (id) {
- 

```
 case ID_CLASS:

```

- m++;
- 

```
 case ID_GLOBAL:

```

- 

```
 case ID_INSTANCE:

```

- m++;
- id |= rb\_intern3(m, len-(m-name), enc) & ~ID\_SCOPE\_MASK;
- goto id\_register;
- 

```
 default:

```

- break;
- }  
new\_id:  
id |= ++global\_symbols.last\_id \<\< ID\_SCOPE\_SHIFT;  
@@ -8534,4 +8570,17 @@ rb\_intern\_str(VALUE str)  
}

+static VALUE  
+id2string(ID id)  
+{

- ID id2 = (id & ~ID\_SCOPE\_MASK) | ID\_LOCAL;
- VALUE str;
- 
- while (!(str = rb\_id2str(id2))) {
- if ((id2 & ID\_SCOPE\_MASK) == ID\_CONST) return 0;
- id2 = (id & ~ID\_SCOPE\_MASK) | ID\_CONST;
- }
- return str;  
+}
- 

VALUE  
rb\_id2str(ID id)  
@@ -8558,19 +8607,27 @@ rb\_id2str(ID id)  
return (VALUE)data;

- if (is\_attrset\_id(id)) {
- ID id2 = (id & ~ID\_SCOPE\_MASK) | ID\_LOCAL;
- VALUE str;
- 
- while (!(str = rb\_id2str(id2))) {
- 

```
 if (!is_local_id(id2)) return 0;

```

- 

```
 id2 = (id & ~ID_SCOPE_MASK) | ID_CONST;

```

- }

- switch (id & ID\_SCOPE\_MASK) {
- 

```
 case ID_CLASS:

```

- if (!(str = id2string(id))) return 0;
- str = rb\_str\_append(rb\_str\_new2("@@"), str);
- break;
- 

```
 case ID_GLOBAL:

```

- if (!(str = id2string(id))) return 0;
- str = rb\_str\_append(rb\_str\_new2("$"), str);
- break;
- 

```
 case ID_INSTANCE:

```

- if (!(str = id2string(id))) return 0;
- str = rb\_str\_append(rb\_str\_new2("@"), str);
- break;
- 

```
 case ID_ATTRSET:

```

- if (!(str = id2string(id))) return 0;  
str = rb\_str\_dup(str);  
rb\_str\_cat(str, “=”, 1);

- rb\_intern\_str(str);
- if (st\_lookup(global\_symbols.id\_str, id, &data))
- 

```
 return (VALUE)data;

```

- break;  
}

- return 0;

- OBJ\_FREEZE(str);
- st\_add\_direct(global\_symbols.sym\_id, (st\_data\_t)str, id);
- st\_add\_direct(global\_symbols.id\_str, id, (st\_data\_t)str);
- return str;  
}

# Index: eval\_method.ci

— eval\_method.ci (revision 13508)  
+++ eval\_method.ci (working copy)  
@@ -406,4 +406,5 @@ rb\_method\_boundp(VALUE klass, ID id, int  
}

+extern ID rb\_id\_ivar(ID);  
void  
rb\_attr(VALUE klass, ID id, int read, int write, int ex)  
@@ -438,5 +439,5 @@ rb\_attr(VALUE klass, ID id, int read, in  
rb\_raise(rb\_eArgError, “argument needs to be symbol or string”);  
}

- attriv = rb\_intern\_str(rb\_sprintf("@%s", name));

- attriv = rb\_id\_ivar(id);  
if (read) {  
rb\_add\_method(klass, id, NEW\_IVAR(attriv), noex);

---

<div class="post-metadata">

**Author:** ![Tanaka\_A](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/t/c67d28/32.png) [@Tanaka\_A](https://www.ruby-forum.com/u/Tanaka_A)\
**Post date:** [September 24, 2007, 5:52pm UTC](https://www.ruby-forum.com/t/segv-by-attr/115261/3 "2007-09-24T17:52:48Z")

</div>

e$B$J$+$@$G$9!#e(B

At Tue, 25 Sep 2007 00:04:11 +0900,  
Nobuyoshi N. wrote in [ruby-dev:31844]:

> e$B$U$H!“e(BID\_ATTRSETe$B$N$h$&$Ke(BID\_INSTANCEe$B$J$I$be(BID\_LOCALe$B$HBP1~4X78$,$“e(B  
> e$B$l$P!”$o$6$o$6$”$i$?$a$FJ8;zNs$r:n$kI,MW$b$J$$$s$8$c$J$$$+!"$H;We(B  
> e$B$$$^$7$?!#e(B

e$B$A$g$$$H8E$$$N$rAw$C$F$7$^$$$^$7$?!#e(B

> @@ -8558,19 +8607,27 @@ rb\_id2str(ID id)

VALUE str; e$B$He(B

> str = rb\_str\_dup(str);  
> rb\_str\_cat(str, “=”, 1);
> 
> - rb\_intern\_str(str);
> - if (st\_lookup(global\_symbols.id\_str, id, &data))
> - 
> 
> ```
> return (VALUE)data;
> 
> ```
> 
> - break;

```
  default:

```

return 0;

e$B$,H4$1$F$^$7$?!#e(B
