Weird optimization bug...?
Adrian Bentley
adruab@voria.com
Thu Jun 3 17:24:00 GMT 2004
Yeah, that would make sense. And buffer overruns can sometimes appear
only in release mode (not 0 initializing something or the like)....
However, if that was the case, inserting a random function into the code
certain shouldn't fix the problem :P.
Here's a snippet of code for all to see, I'll just explain some of the
dependent stuff:
//not compilable unless you have all the other classes... which is a lot
template<typename T1,typename T2> void
vbox_blur(T1 pen,int w, int h, int length,T2 outpen)
{
int x,y;
typename T1::iterator_y iter, end;
printf("V Blur (%d,%d) - %d size\n",w,h,length); //debug crap
const int div = (length*2+1);
length=min(h,length);
for(x=0;x<w;x++,pen.inc_x(),outpen.inc_x())
{
printf("\nx line %d\n",x); //debugging crud
iter=pen.y();
end=pen.end_y();
const typename T1::value_type val=pen.get_value();
typename T1::accumulator_type tot(val*(length+1));
//tot=val*(length+1);
for (y=0;y<length && iter!=end;y++,++iter) tot+=*iter;
iter=pen.y();
for (y=0;y<h && iter!=end;y++,++iter,outpen.inc_y())
{
//calling either of these functions here fixes the crash... WTF!!!!!!
//printf("%d\n",y);
//stupid(y);
/*if (y>length) tot-=iter[-length-1];
else tot-=val;
if (y+length<h) tot+=iter[length];
else tot+=end[-1];*/
tot -= (y>length) ? iter[-length-1] : val;
tot += (y+length<h) ? iter[length] : end[-1];
outpen.put_value(tot/div);
}
outpen.dec_y(y);
}
}
The pen is basically just a random-access iterator for a 2 dimensional
array (the inc_x and inc_y functions behave exactly as you'd expect).
The value type it's looking at is basically a vector (actually a color)
with overloaded functions +=, -=, / (among others). Iterator_y is
basically just a specialized iterator to increment using a stride rather
than 1.
In any case, I'm pretty sure this was not a buffer overrun (at least of
the fault of the pen/iterators), because it worked just fine in previous
versions of gcc, and it's pretty simple and has been tested (I'm going
to disect the pen class in a bit). Plus that certainly doesn't explain
why forcing a function call will make it not crash.
I would submit a bug, except this certainly isn't very straight forward,
and I can't submit that big of a chunk of my project for testing....
Any suggestions?
Adruab
On Thu, 2004-06-03 at 04:26, Eljay Love-Jensen wrote:
> Hi Adruab,
>
> A bug like that is usually indicative of a buffer overrun.
>
> int rgb[3];
> rgb[4] = 7;
>
> Or of cavalier casting.
> short hue;
> int* p = (int*)&hue;
> *p = 0;
>
> Without seeing the code (or some sample code that replicates the bug), it
> would be difficult to guess less likely scenarios.
>
> HTH,
> --Eljay
>
>
>
More information about the Gcc-help
mailing list