Hi, avr-gcc seems to occasinally remove compare for ppv in following code. This changes semantics in the if clause and causes incorrect code execution as ppv is not compared first before *ppv compare.
void test(int req, void *conf) { void **ppv = (void **) conf; unsigned long *lvp = (unsigned long *) conf; unsigned long lv = *lvp; unsigned char bv = (unsigned char) lv; switch (req) { case 1: if (bv) { asm ( "nop ; bv needs to be defined and used"); } break; case 2: asm ( "nop ; entry to case 2"); /* bug: first compare for ppv is missing, second is only left */ if (ppv && (*ppv != 0)) { asm ( "nop ; ppv and *ppv are not zeros"); } else { asm ( "nop ; either ppv or *ppv is zero"); } break; } } Known workaround is to use -fno-delete-null-pointer-checks. After a small debate on this issue on avr-gcc mailing list I was adviced to post a bug report. I used following command line: avr-gcc -c -mmcu=atmega128 -Os -Wall -Wstrict-prototypes -Wa,-ahlms=test.lst test.c -o test.o I am using avr-gcc supplied in WinAVR-20050214 (gcc 3.4.3). > avr-gcc -v Reading specs from C:/WinAVR/bin/../lib/gcc/avr/3.4.3/specs Configured with: ../gcc-3.4.3/configure --prefix=m:/WinAVR --build=mingw32 -- host=mingw32 --target=avr --enable-languages=c,c++ --with-dwarf2 Thread model: single gcc version 3.4.3 -- Summary: optimizer removes incorrectly variable comparision in if clause Product: gcc Version: 3.4.3 Status: UNCONFIRMED Severity: normal Priority: P2 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: chaac at nic dot fi CC: gcc-bugs at gcc dot gnu dot org GCC host triplet: i686-winxp-sp2 GCC target triplet: avr-*-* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21479