# Huge \`if' dumps core

**URL:** <https://www.ruby-forum.com/t/huge-if-dumps-core/115383>\
**Category:** Development\
**Created:** [September 24, 2007, 7:26pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383 "2007-09-24T19:26:00Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 24, 2007, 7:26pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383/1 "2007-09-24T19:26:00Z")

</div>

e$B1sF#$H?=$7$^$9!#e(B

e$B0J2\<$N$h$&$K$9$k$He(B 1.8 e$B!"e(B1.9 e$B6&$KMn$A$^$9!#e(B

$ ./ruby -ve ‘eval(“if false then;” + “elsif false then;” \* 1000000 +  
“end”)’  
ruby 1.8.6 (2007-09-23 patchlevel 5000) [i686-linux]  
e$B%;%0%a%s%F!\<%7%g%s0cH?$G$9e(B

$ ./ruby -ve ‘eval(“if false then;” + “elsif false then;” \* 1000000 +  
“end”)’  
ruby 1.9.0 (2007-09-24 patchlevel 0) [i686-linux]  
e$B%;%0%a%s%F!\<%7%g%s0cH?$G$9e(B

ALLOCA\_N e$B$,860x$N$h$&$G$9!#e(B

# Index: parse.y

— parse.y (revision 13509)  
+++ parse.y (working copy)  
@@ -4593,7 +4593,7 @@  
len = pe - p;  
if (len \> 4) {  
char \*p2;

- buf = ALLOCA\_N(char, len+2);

- buf = ALLOC\_N(char, len+2);  
MEMCPY(buf, p, char, len);  
buf[len] = ‘\0’;  
rb\_compile\_error\_append("%s", buf);  
@@ -4608,6 +4608,7 @@  
buf[i] = ‘^’;  
buf[i+1] = ‘\0’;  
rb\_compile\_error\_append("%s", buf);
- free(buf);  
}  
#else  
dispatch1(parse\_error, STR\_NEW2(msg));

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 24, 2007, 8:13pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383/2 "2007-09-24T20:13:08Z")

</div>

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

At Tue, 25 Sep 2007 02:24:48 +0900,  
Yusuke ENDOH wrote in [ruby-dev:31848]:

> ALLOCA\_N e$B$,860x$N$h$&$G$9!#e(B

e$B$5$9$,$K!“e(B1MBe$B$r1[$($k%(%i!\<%a%C%;!\<%8$,=P$F$/$l$F$b$”$^$j$&$l$7e(B  
e$B$/$J$$$N$G$O!#e(B

# Index: parse.y

— parse.y (e$B%j%S%8%g%se(B 13509)  
+++ parse.y (e$B:n6H%3%T!\<e(B)  
@@ -4573,4 +4573,5 @@ parser\_yyerror(struct parser\_params \*par  
{  
#ifndef RIPPER

- const int max\_line\_margin = 30;  
const char \*p, \*pe;  
char \*buf;  
@@ -4594,8 +4595,21 @@ parser\_yyerror(struct parser\_params \*par  
if (len \> 4) {  
char \*p2;
- const char \*pre = “”, \*post = “”;
- 
- if (len \> max\_line\_margin \* 2 + 10) {
- 

```
 if (lex_p - p > max_line_margin) {

```

- p = rb\_enc\_prev\_char(p, lex\_p - max\_line\_margin,  
rb\_enc\_get(lex\_lastline));
- pre = “…”;
- 

```
 }

```

- 

```
 if (pe - lex_p > max_line_margin) {

```

- pe = rb\_enc\_prev\_char(lex\_p, lex\_p + max\_line\_margin,  
rb\_enc\_get(lex\_lastline));
- post = “…”;
- 

```
 }

```

- 

```
 len = pe - p;

```

- }  
buf = ALLOCA\_N(char, len+2);  
MEMCPY(buf, p, char, len);  
buf[len] = ‘\0’;

- rb\_compile\_error\_append("%s", buf);

- rb\_compile\_error\_append("%s%s%s", pre, buf, post);

- rb\_compile\_error\_append("%s", buf);

- rb\_compile\_error\_append("%s%s", pre, buf);  
}  
#else

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 25, 2007, 2:13pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383/3 "2007-09-25T14:13:20Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:31851] Re: huge `if’ dumps core”  
on Tue, 25 Sep 2007 03:12:12 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|At Tue, 25 Sep 2007 02:24:48 +0900,  
|Yusuke ENDOH wrote in [ruby-dev:31848]:  
|\> e$B0J2\<$N$h$&$K$9$k$He(B 1.8 e$B!"e(B1.9 e$B6&$KMn$A$^$9!#e(B

|\> ALLOCA\_N e$B$,860x$N$h$&$G$9!#e(B  
|  
|e$B$5$9$,$K!“e(B1MBe$B$r1[$($k%(%i!\<%a%C%;!\<%8$,=P$F$/$l$F$b$”$^$j$&$l$7e(B  
|e$B$/$J$$$N$G$O!#e(B

e$B$G$7$g$&$M!#$J$+$@$5$s$N%Q%C%A$r%3%\_%C%H$7$F$/$@$5$$$^$;$s$+!)e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 25, 2007, 9:28pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383/4 "2007-09-25T21:28:47Z")

</div>

e$B$^$D$b$He(B e$B$f$-$R$m$G$9e(B

In message “Re: [ruby-dev:31862] Re: huge `if’ dumps core”  
on Wed, 26 Sep 2007 04:16:16 +0900, Nobuyoshi N.  
[removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) writes:

|1.8e$B$N$[$&$O$I$&$7$^$7$g$&$+!#e(Brb\_enc\_prev\_char()e$BAjEv$,$J$$$N$G!"e(B  
|re\_adjust\_startpos()e$B$+$iN.MQ$9$k$J$i0J2\<$N$h$&$J46$8$G$9!#e(B

e$B$&$`!#$8$c$“!”$3$N%Q%C%A$rEv$F$kJ}8~$G!#e(B

---

<div class="post-metadata">

**Author:** ![Yusuke\_ENDOH](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/y/c89c15/32.png) [@Yusuke\_ENDOH](https://www.ruby-forum.com/u/Yusuke_ENDOH)\
**Post date:** [September 25, 2007, 9:17pm UTC](https://www.ruby-forum.com/t/huge-if-dumps-core/115383/5 "2007-09-25T21:17:43Z")

</div>

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

At Tue, 25 Sep 2007 21:12:42 +0900,  
Yukihiro M. wrote in [ruby-dev:31855]:

> |\> e$B0J2\<$N$h$&$K$9$k$He(B 1.8 e$B!"e(B1.9 e$B6&$KMn$A$^$9!#e(B
> 
> |\> ALLOCA\_N e$B$,860x$N$h$&$G$9!#e(B  
> |  
> |e$B$5$9$,$K!“e(B1MBe$B$r1[$($k%(%i!\<%a%C%;!\<%8$,=P$F$/$l$F$b$”$^$j$&$l$7e(B  
> |e$B$/$J$$$N$G$O!#e(B
> 
> e$B$G$7$g$&$M!#$J$+$@$5$s$N%Q%C%A$r%3%\_%C%H$7$F$/$@$5$$$^$;$s$+!)e(B

1.8e$B$N$[$&$O$I$&$7$^$7$g$&$+!#e(Brb\_enc\_prev\_char()e$BAjEv$,$J$$$N$G!"e(B  
re\_adjust\_startpos()e$B$+$iN.MQ$9$k$J$i0J2\<$N$h$&$J46$8$G$9!#e(B

e$B$H$$$&$+!"\<j85$G$Oe(B[ruby-talk:247595]e$B$,Ev$?$C$?$^$^$@$C$?$N$G!"$=e(B  
e$B$b$=$be(B"memory exhausted"e$B\<+BN$,H/@8$7$J$+$C$?$N$G$9$,!#e(B

# Index: parse.y

— parse.y (revision 13508)  
+++ parse.y (working copy)  
@@ -2517,5 +2517,7 @@ yyerror(msg)  
const char \*msg;  
{

- char \*p, \*pe, \*buf;

- const int max\_line\_margin = 30;
- const char \*p, \*pe;
- char \*buf;  
int len, i;

@@ -2536,15 +2538,30 @@ yyerror(msg)  
len = pe - p;  
if (len \> 4) {

- char \*p2;
- const char \*pre = “”, \*post = “”;
- 
- if (len \> max\_line\_margin \* 2 + 10) {
- 

```
 int re_mbc_startpos _((const char *, int, int, int));

```

- 

```
 if ((len = lex_p - p) > max_line_margin) {

```

- p = p + re\_mbc\_startpos(p, len, len - max\_line\_margin, 0);
- pre = “…”;
- 

```
 }

```

- 

```
 if ((len = pe - lex_p) > max_line_margin) {

```

- pe = lex\_p + re\_mbc\_startpos(lex\_p, len, max\_line\_margin, 1);
- post = “…”;
- 

```
 }

```

- 

```
 len = pe - p;

```

- }  
buf = ALLOCA\_N(char, len+2);  
MEMCPY(buf, p, char, len);  
buf[len] = ‘\0’;

- rb\_compile\_error\_append("%s", buf);

- rb\_compile\_error\_append("%s%s%s", pre, buf, post);

- p = buf; pe = p + len;

- p2 = buf; pe = buf + len;

- while (p \< pe) {
- 

```
 if (*p != '\t') *p = ' ';

```

- 

```
 p++;

```

- while (p2 \< pe) {
- 

```
 if (*p2 != '\t') *p2 = ' ';

```

- 

```
 p2++;

```

}  
buf[i] = ‘^’;  
Index: regex.c  
===================================================================  
— regex.c (revision 13508)  
+++ regex.c (working copy)  
@@ -3110,4 +3110,26 @@ re\_compile\_fastmap(bufp)  
/\* adjust startpos value to the position between characters. \*/  
int  
+re\_mbc\_startpos(string, size, startpos, range)
- 

```
const char *string;

```

- 

```
int size, startpos, range;

```

+{

- int i = mbc\_startpos(string, startpos);
- 
- if (i \< startpos) {
- if (range \> 0) {
- 

```
 startpos = i + mbclen(string[i]);

```

- }
- else {
- 

```
 int len = mbclen(string[i]);

```

- 

```
 if (i + len <= startpos)

```

- startpos = i + len;
- 

```
 else

```

- startpos = i;
- }
- }
- return startpos;  
+}
- 

+int  
re\_adjust\_startpos(bufp, string, size, startpos, range)  
struct re\_pattern\_buffer _bufp;  
@@ -3122,18 +3144,5 @@ re\_adjust\_startpos(bufp, string, size, s  
/_ Adjust startpos for mbc string \*/  
if (current\_mbctype && startpos\>0 &&  
!(bufp-\>options&RE\_OPTIMIZE\_BMATCH)) {

- int i = mbc\_startpos(string, startpos);
- 
- if (i \< startpos) {
- 

```
 if (range > 0) {

```

- startpos = i + mbclen(string[i]);
- 

```
 }

```

- 

```
 else {

```

- int len = mbclen(string[i]);
- if (i + len \<= startpos)
- startpos = i + len;
- else
- startpos = i;
- 

```
 }

```

- }

- startpos = re\_mbc\_startpos(string, size, startpos, range);  
}  
return startpos;
