marlin
"Multiplication of an int with 1000 may overflow in 16-bit architectures
Period_seconds * 1000 may overflow in 16-bit architectures, resulting in a wraparound, thus a negative result. This negative integer, when interpreted as an unsigned long, it's a very large number. Thus the comparison may always yield false. Issue 1309: https://github.com/MarlinFirmware/Marlin/pull/1309"
Bug fixed by commit 30248214c7f
| Type | IntegerOverflow |
| Config | "THERMAL_RUNAWAY_PROTECTION_PERIOD && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0" (2nd degree) |
| Fix-in | code |
| Location | temperature/ |
#include <stdio.h>
unsigned long millis = 123456789l;
#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
void thermal_runaway_protection(int *state, unsigned long *timer, float temperature, float target_temperature, int heater_id, int period_seconds, int hysteresis_degc)
{
if (temperature >= (target_temperature - hysteresis_degc))
{
*timer = 123456782l;
}
else if ( (millis - *timer) > (period_seconds) * 1000)
{
printf("%s","Thermal Runaway, system stopped! Heater_ID: ");
printf("%d",(int)heater_id);
printf("%s","THERMAL RUNAWAY");
}
}
#endif
int main(void){
thermal_runaway_protection(0, 123456783, 145.0f, 200.0f, 1, 10, 1);
return 0;
}
diff --git a/simple/3024821.c b/simple/3024821.c
--- a/simple/3024821.c
+++ b/simple/3024821.c
@@ -8,7 +8,7 @@ if (temperature >= (target_temperature - hysteresis_degc))
{
*timer = 123456782l;
}
- else if ( (millis - *timer) > (period_seconds) * 1000)
+ else if ( (millis - *timer) > (unsigned long)(period_seconds) * 1000)
{
printf("%s","Thermal Runaway, system stopped! Heater_ID: ");
printf("%d",(int)heater_id);
#include <stdio.h>
int main(void){
unsigned long millis = 123456789l;
#if defined (THERMAL_RUNAWAY_PROTECTION_PERIOD) && THERMAL_RUNAWAY_PROTECTION_PERIOD > 0
int state = 0;
unsigned long *timer = 123456782l;
float temperature = 145.0f;
float target_temperature = 200.0f;
int heater_id = 1;
int period_seconds = 10;
int hysteresis_degc = 1;
if (temperature >= (target_temperature - hysteresis_degc))
{
*timer = 123456782;
}
else if ( (millis - *timer) > (period_seconds) * 1000)
{
printf("%s","Thermal Runaway, system stopped! Heater_ID: ");
printf("%d",(int)heater_id);
printf("%s","THERMAL RUNAWAY");
}
#endif
return 0;
}
. call Marlin/temperature.cpp:1017: void thermal_runaway_protection(...) . ERROR temperature.cpp:1052: else if ( (millis() - *timer) > (period_seconds) * 1000) // Comparing an unsigned long with an integer...