From: SourceForge.net <no...@so...> - 2006-05-03 19:34:59
|
Bugs item #1481333, was opened at 2006-05-03 21:34 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Frieder Ferlemann (frief) Assigned to: Nobody/Anonymous (nobody) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-05-04 09:06:46
|
Bugs item #1481333, was opened at 2006-05-03 21:34 Message generated for change (Settings changed) made by bernhardheld You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Frieder Ferlemann (frief) >Assigned to: Bernhard Held (bernhardheld) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-05-08 14:02:30
|
Bugs item #1481333, was opened at 2006-05-03 12:34 Message generated for change (Comment added) made by sandeep You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None >Group: non bugs Status: Open >Resolution: Fixed Priority: 5 Submitted By: Frieder Ferlemann (frief) Assigned to: Bernhard Held (bernhardheld) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- >Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 07:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-05-08 14:02:36
|
Bugs item #1481333, was opened at 2006-05-03 12:34 Message generated for change (Comment added) made by sandeep You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: non bugs Status: Open Resolution: Fixed Priority: 5 Submitted By: Frieder Ferlemann (frief) Assigned to: Bernhard Held (bernhardheld) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- >Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 07:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 07:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-05-08 22:28:09
|
Bugs item #1481333, was opened at 2006-05-03 21:34 Message generated for change (Comment added) made by frief You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: non bugs Status: Open Resolution: Fixed Priority: 5 Submitted By: Frieder Ferlemann (frief) Assigned to: Bernhard Held (bernhardheld) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- >Comment By: Frieder Ferlemann (frief) Date: 2006-05-09 00:28 Message: Logged In: YES user_id=589052 Hello Sandeep, long time no see, *very* nice to see you back again!) GCC would issue the warning "comparison is always true due to limited range of data type" and compile (the admittedly pretty broken) example code into an endless loop. It would be perfect if SDCC would do similar. Greetings and many thanks for your great work! Frieder ---------------------------------------------------------------------- Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 16:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 16:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |
From: SourceForge.net <no...@so...> - 2006-05-10 05:21:05
|
Bugs item #1481333, was opened at 2006-05-03 14:34 Message generated for change (Comment added) made by epetrich You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: non bugs Status: Open Resolution: Fixed Priority: 5 Submitted By: Frieder Ferlemann (frief) Assigned to: Bernhard Held (bernhardheld) Summary: Loop reversal on an always true condition Initial Comment: Actually the source code itself is broken... (Could have been the result of a macro expansion) The character variable is always less than the value it is compared to so the code should result in an endless loop. -----------8<---------------------------------- int counter; void f () { unsigned char i; for (i=0; i<0x102; i++) /* condition is always true */ counter++; } ----------->8---------------------------------- instead the body of the loop is executed twice (low byte of 0x0102): -----------8<---------------------------------- ;loop.c:6: for (i = 0; i < 0x102; i++) /* condition is always true */ mov r2,#0x02 00103$: ;loop.c:7: counter++; inc _counter clr a cjne a,_counter,00109$ inc (_counter + 1) 00109$: djnz r2,00103$ ----------->8---------------------------------- ---------------------------------------------------------------------- >Comment By: Erik Petrich (epetrich) Date: 2006-05-10 00:21 Message: Logged In: YES user_id=635249 Whether or not a warning is given, there is still a bug if the code generated does not loop the correct number of times. Another variant to consider is: for (i=0; i<0; i++) /* condition is always false */ With loop reversal enabled, the loop body executes 256 times instead of 0. ---------------------------------------------------------------------- Comment By: Frieder Ferlemann (frief) Date: 2006-05-08 17:28 Message: Logged In: YES user_id=589052 Hello Sandeep, long time no see, *very* nice to see you back again!) GCC would issue the warning "comparison is always true due to limited range of data type" and compile (the admittedly pretty broken) example code into an endless loop. It would be perfect if SDCC would do similar. Greetings and many thanks for your great work! Frieder ---------------------------------------------------------------------- Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 09:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- Comment By: Sandeep Dutta (sandeep) Date: 2006-05-08 09:02 Message: Logged In: YES user_id=1551 I don't think this is a bug. The type of 'i' is an unsigned char; which can hold a max of 0xff (& 0x102 > 0xff) ; I think the compiler should give a warning. Change the type of i to "unsigned short". ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=100599&aid=1481333&group_id=599 |