Rychle jsem ten program prošel. Ještě nevím čím ten popsaný problém je způsoben, ale určitě tam vidím následující zásadní
chyby:
.
.
.
// return time formated into string
char* getTime() {
unsigned int d, m, h, n, s;
char t[12];
d = SDS_get_u(5);
m = SDS_get_u(6);
h = SDS_get_u(8);
n = SDS_get_u(9);
s = SDS_get_u(10);
sprintf( t, "%02u.%02u. %02u:%02u:%02u ", d, m, h, n, s);
return t;
}
1. funkce vrací (return) proměnnou, která existuje jen na zásobníku funkce samotné (tzn. "t" přestane existovat jakmile se funkce ukončí).
2. velikost pole "t" je mnohem menší (jen 12 míst, viz původní kód), než množství textu který sprintf() zapíše
3. je použit sprintf() namísto bezpečného snprintf() - pokud by se použil snprintf, tak by to nepadalo (ale ano text by byl oříznutý, ale za to nemůže ta funkce, ale definice pole "t" která je moc "malá").
Pro příklad - opravený kus programu:
#define TEMP_BUF_SIZE (32)
char tempBuf[TEMP_BUF_SIZE];
// return time formated into string
char* getTime()
{
unsigned int d, m, h, n, s;
d = SDS_get_u(5);
m = SDS_get_u(6);
h = SDS_get_u(8);
n = SDS_get_u(9);
s = SDS_get_u(10);
snprintf( tempBuf, TEMP_BUF_SIZE, "%02u.%02u. %02u:%02u:%02u ", d, m, h, n, s);
return tempBuf;
}
Opravy - používá se globalní (namísto lokální) proměnná "tempBuf", je dostatečně velká (v příkladu 32 bajtů, tj. až 31 znaků a 0x00 pro ukončení textu) a nakonec, používá se bezpečná funkce snprintf() tak jak to má být.
Doufám že tyto poznámky pomohou při dalším psaní programu. Podobný přístup se dá aplikovat na různé jiné místa . . . tzv. "defenzivní programování".
Ihned vydáváme BETA FW (který pak bude oficiální po testech), který si bude umět poradit s touto programátorskou chybou (a dalšími odvozenými chybami) - prosím vyzkoušejte, co to u vás udělá.
Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !