When porting my software from Win32 to Linux, i had to recompile it with gcc
under Mingw and also under Linux. There was a hurdle, because the loop shown
below in b) crashed after a while on both platforms. (I was happy to find the
location of the bug with gdb!) After rearranging the code like c) it worked
properly.
Sorry, but i am not able to provide test data. Maybe someone will see at once,
where the problem is located.
Greetings
Jens
http://cococo.de
a) prerequisite
#define max(a,b)a>b?a:b
b) buggy variant (for loop in line 13)
//--
//copy column left to right
//--
void copyvector(Tree pre,Tree left,int lc,Tree right,int rc) {
int nr;
callsofcopyvector++;
//check initialization of precondition
defval(left,right,rc,coeff(left,0,lc));
right->functype=left->functype;
right->bordertype=left->bordertype;
right->symtype=left->symtype;
right->reversive=left->reversive;
for (nr=0;nr <= max(left->rows,right->rows);nr++) {//now do composition of
functions
if (nr <= right->rows)
asg(right,nr,rc,0);
if ((nr <= left->rows) && (nr <= right->rows)) {
Tree ur=coeff(left,nr,lc);
//debug(coeff(left,nr,0))
asg(right,nr,rc,ur);
}
}
asg(right,0,rc,pre);
checkunreachable(right,right,rc);
return;
}
c) working variant
//--
//copy column left to right
//--
void copyvector(Tree pre,Tree left,int lc,Tree right,int rc) {
int nr,mav=max(left->rows,right->rows);
callsofcopyvector++;
//check initialization of precondition
defval(left,right,rc,coeff(left,0,lc));
right->functype=left->functype;
right->bordertype=left->bordertype;
right->symtype=left->symtype;
right->reversive=left->reversive;
for (nr=0;nr <= mav;nr++) {//now do composition of functions
if (nr <= right->rows)
asg(right,nr,rc,0);
if ((nr <= left->rows) && (nr <= right->rows)) {
Tree ur=coeff(left,nr,lc);
//debug(coeff(left,nr,0))
asg(right,nr,rc,ur);
}
}
asg(right,0,rc,pre);
checkunreachable(right,right,rc);
return;
}
--
Summary: usage of macro in loop boundary leads to crash
Product: gcc
Version: 4.1.2
Status: UNCONFIRMED
Severity: blocker
Priority: P3
Component: c
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jd at cococo dot de
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44681