PCRE/D and Optimization Bug?

icee iceelyne at gmail.com
Tue Aug 8 05:40:43 PDT 2006



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 mailing list