tas@mtuxo.att.com (XMPC2-T.SKROBALA) (01/18/89)
- - - - - The following bug report will be sent to Manx. Most people probably won't hit it, but if you do, it can be a real pain to track down. ************************************************************************* Aztec C 3.6 for the Amiga produces incorrect code for the following short program. Note that, in this example, a bitwise '|' is used where a logical '||' would make more sense, but it still is valid C code, and such use does occur from time to time. From the assembly code produced, you can see that the compiler saves the temporary value in d0 on the stack before calling function2. The problem is that that value is popped off the stack even in the case when function2 is not called and the value isn't on the stack in the first place. When this happens, an invalid value is popped off, and, worse, the stack is corrupted and all sorts of bad things can result. ********************************************************************** main() { register k; if( (k == 259 && function1()) | (k == 260 && function2()) ) { k = 0 ; } } ********************************************************************** ;:ts=8 ;main() ;{ public _main _main: link a5,#.2 movem.l .3,-(sp) ; register k; ; ; if( (k == 259 && function1()) | (k == 260 && function2()) ) ; { cmp.w #259,d4 bne .5 jsr _function1 tst.w d0 beq .5 move.l #1,d0 bra .6 .5 move.l #0,d0 .6 cmp.w #260,d4 bne .7 move.w d0,-(sp) ; this doesn't get executed if bne above happens jsr _function2 tst.w d0 beq .7 move.l #1,d0 bra .8 .7 move.l #0,d0 .8 move.w (sp)+,d1 ; but this always happens, making sp and d1 wrong or.w d0,d1 beq .4 ; k = 0 ; move.l #0,d4 ; } ;} .4 .9 movem.l (sp)+,.3 unlk a5 rts .2 equ 0 .3 reg d4 public _function2 public _function1 public .begin dseg end