PCRE/D and Optimization Bug?

Dave Dave_member at pathlink.com
Fri Aug 11 05:57:46 PDT 2006


Please post this in the D Bugzilla: http://d.puremagic.com/bugzilla/

Thanks.

icee wrote:
> I wrote my PCRE D wrapper module a few days ago, It can be found at 
> http://icube.freezope.org/pcred/
> http://icube.freezope.org/pcred/pcred-0.1.zip
> And I got Access Violation when run the sample which compiled with 
> "build -release -O -clean sample.d", but everything is OK when i remove 
> the -O flag.
> This can be resolved by using volatile synchronized or change some 
> expression, see below.
> But i'd like to confirm, is it really a dmd bug or somewhat?
> 
> To find out where the problem occurs, I wrote a small block of codes which 
> demonstrates the problem.
> the writefln statements show the difference between the compilation with -O 
> or not.
> 
> with DMD 0.155/0.163
> 
> 
> import std.stdio;
> import std.process;
> 
> char[] replace(char[] subject) {
>   char[] s = new char[subject.length];
>   int lng = 0;
>   char[] sa;
>   int lngnew;
>   int i = 0;
>   while(i<10) {
>    i++;
>    sa = "repxxxxxxxxxxxx";
>    lngnew = lng + sa.length;
>    if(lngnew > s.length) s.length = lngnew * 2; // expand size
>    writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
>    s[lng .. lngnew] = sa[0 .. $];
>    lng = lngnew;
> 
>    //volatile{//OK
> 
>    sa = "repzzzzzzzzzzzzzzzzzzzzzz";
>    //lngnew = lng-1 + sa.length+1;//OK
>    //synchronized lngnew = lng + sa.length;//OK
>    //lngnew += sa.length;//OK
>    lngnew = lng + sa.length;// 2*sa.length?
>    if(lngnew > s.length) s.length = lngnew * 2; // expand size
>    writefln(lng, \t, lngnew, \t, s.length, \t, sa.length);
>    s[lng .. lngnew] = sa[0 .. $];
>    lng = lngnew;
> 
>    //}
> 
>   }
>   return s[0 .. lng];
> }
> 
> void demo() {
>  int lng = 0;
>  int lngnew = 0;
>  int i = 0;
>  char[] sa = "xxxx";//it seem to be around the Dynamic Array's length 
> property.
> 
>  // class SA {
>   // int _a;
>   // this(int a) {_a = a;}
>   // int length() {return _a;}
>  // }
>  // SA sa = new SA(4);//OK
>  while(i<10) {
>   i++;
>   lngnew = lng + sa.length;
>   writefln(lng, \t, lngnew, \t, sa.length);
>   lng = lngnew;
> 
>   lngnew = lng + sa.length;
>   writefln(lng, \t, lngnew, \t, sa.length);
>   lng = lngnew;
>  }
> }
> 
> int main(char[][] args) {
>  try {
>   demo();
>   writefln(replace("012345678901234567890"));
>  } catch(Exception e) {
>   writefln(e.msg);
>  }
>  system("pause");
>  return 0;
> } 
> 
> 



More information about the Digitalmars-d-bugs mailing list