http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59933
Bug ID: 59933
Summary: for loop goes wild with assert() enabled
Product: gcc
Version: 4.8.2
Status: UNCONFIRMED
Severity: major
Priority: P3
Component: c
Assignee: unassigned at gcc dot gnu.org
Reporter: warnerme at ptd dot net
I have this odd case where a for loop goes wild.
But it only fails when assert() is enabled.
gcc -Iinc -g -O2 -DDEBUG -fstack-protector-all -W -Wstrict-prototypes -Wall
-Wextra -Wcast-align -Wnested-externs -Wshadow -c -o build/NSQ_del_dec.o
c/NSQ_del_dec.c
If -DNDEBUG is used, the code works fine, although there is a slight difference
between CYGWIN32 (4.8.2-2) and CYGWIN64 (4.8.2-1). This was not a problem with
gcc 4.7.
if (RDmin_Q10 < RDmax_Q10)
{
#if 1
/* THIS IS THE CODE THAT FAILS */
for (k = i; k < (int)(sizeof(NSQ_del_dec_struct) /
sizeof(opus_int32)); ++k)
{
psDelDec[RDmax_ind].sLPC_Q14[k] =
psDelDec[RDmin_ind].sLPC_Q14[k];
}
#else
/* THIS IS THE WORK-AROUND */
int n = (sizeof(NSQ_del_dec_struct) / sizeof(opus_int32)) - i;
opus_int32 *src = &psDelDec[RDmin_ind].sLPC_Q14[i];
opus_int32 *dst = &psDelDec[RDmax_ind].sLPC_Q14[i];
while (n-- > 0)
*dst++ = *src++;
#endif
psSampleState[RDmax_ind][0] = psSampleState[RDmin_ind][1];
}
I've tried lots of combinations of code to get the work around, and this even
fails when I insert printf-s, but the most common with this exact code is that
it does sizeof(NSQ_del_dec_struct) number of loops leaving out the /
sizeof(opus_int32). I have had some test test where the loop didn't stop till
it destroyed enough stack to crash it.
Sorry, that the file is a bit big but trying to whittle it down usually made
the problem go away.