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