From: Sandeep D. <sa...@dd...> - 2000-03-12 00:45:44
|
Hi Michael , Your fix for the == IS_LITERAL looks good.. however the crash was because the local variable "key2" is being used before it is defined inside a loop, the compiler was not detecting this situation...have fixed it.. the caveat being such variables will be spilt.... Have mode some more infrastructural changes so "make clean" required... Sandeep > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > Here's the one I found while releasing gbdk3-2.92: > > This code: > > typedef unsigned char UBYTE; > > UBYTE joypad(void); > > enum { > J_UP, J_DOWN, J_A > }; > > void main() > { > UBYTE key1, key2, j; > j = 0; > > while(1) { > key1 = joypad(); > if(!(key1 & J_A)){ > if((key1 & J_UP) && !(key2 & J_UP) && j > 0) > j--; > else if((key1 & J_DOWN) && !(key2 & J_DOWN) && j < 3) > j++; > } > key2 = key1; > } > } > > Causes a segfault in sdcc-mcs51 and sdcc-gbz80. If you init key2 i.e: > > j = 0; > key2 = anything; > > it's fine. > > I've also made a small change to SDCCicode.c re: IS_LITERAL. In some > cases esp in geniCodeCast geniCodeAssign the class of an operand is > derrived, then IS_LITERAL is run on the class. Problem is in some cases > when the operand is a SYMBOL then IS_LITERAL also passes, which later > causes a segfault in floatFromVal. I changed the check IS_LITERAL(etype) > to op->type == VALUE && IS_LITERAL() in the cases that were segfaulting > for me but didnt check any others... > > - -- Michael > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.0.0 (GNU/Linux) > Comment: For info see http://www.gnupg.org > > iD8DBQE4yeLUUejL3SuzxEgRAgGbAKCgUwtC2qC8yaBqP8XtRHrgkqNCHwCgpRYz > I+p9be/fBKJU1w7aziIfAYI= > =OIyO > -----END PGP SIGNATURE----- > > _______________________________________________ > sdcc-devel mailing list > sdc...@li... > http://lists.sourceforge.net/mailman/listinfo/sdcc-devel |