marlin
"In the while loop the timer overflows if TEMP_RESIDENCY_TIME is larger than 32 When TEMP_RESIDENCY_TIME is set to be 32 or larger, the timer overflows yielding always false in the comparison in the while condition. Issue 55: https://github.com/MarlinFirmware/Marlin/issues/55"
Bug fixed by commit f87c80889fe
| Type | IntegerOverflow |
| Config | "TEMP_RESIDENCY_TIME" (1st degree) |
| Fix-in | code |
| Location | main/ |
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEMP_RESIDENCY_TIME 30
void process_commands(){
unsigned long millis = 123456789l;
#ifdef TEMP_RESIDENCY_TIME
long residencyStart;
residencyStart = -1;
/* continue to loop until we have reached the target temp
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
while((residencyStart == -1) ||
(residencyStart > -1 && (millis - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) { // ERROR if TEMP_RESIDENCY_TIME > 32 => int overflow
#else
printf("%s", "Cooling down or heating hotend");
#endif //TEMP_RESIDENCY_TIME
}
}
int main(int argc, char **argv)
{
#ifdef TEMP_RESIDENCY_TIME
process_commands();
#endif
return 0;
}
diff --git a/simple/f87c808.c b/simple/f87c808.c
--- a/simple/f87c808.c
+++ b/simple/f87c808.c
@@ -13,7 +13,7 @@ void process_commands(){
/* continue to loop until we have reached the target temp
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
while((residencyStart == -1) ||
- (residencyStart > -1 && (millis - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) { // ERROR if TEMP_RESIDENCY_TIME > 32 => int overflow
+ (residencyStart > -1 && (millis - residencyStart) < TEMP_RESIDENCY_TIME*1000l) )
#else
printf("%s", "Cooling down or heating hotend");
#endif //TEMP_RESIDENCY_TIME
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define TEMP_RESIDENCY_TIME 30
int main(int argc, char **argv)
{
#ifdef TEMP_RESIDENCY_TIME
unsigned long millis = 123456789l;
long residencyStart;
residencyStart = -1;
/* continue to loop until we have reached the target temp
_and_ until TEMP_RESIDENCY_TIME hasn't passed since we reached it */
while((residencyStart == -1) ||
(residencyStart > -1 && (millis - residencyStart) < TEMP_RESIDENCY_TIME*1000) ) { // ERROR if TEMP_RESIDENCY_TIME > 32 => int overflow
#else
printf("%s", "Cooling down or heating hotend");
#endif //TEMP_RESIDENCY_TIME
return 0;
}
. call Marlin.pde:521: void process_comands() . 806: case 109: . 845: while((residencyStart == -1) || . ERORR 846: (residencyStart > -1 && (millis() - residencyStart) < TEMP_RESIDENCY_TIME*1000) )