Samotné telo myfunction(uint8_t* data) z druhého príkladu reentrantné môže byť, ak nemodifikuje iné premenné než tie čo má na stacku, lenže funkcia/miesto skade sa zavolá myfunction() kde už je pointer nasmerovaný na globálnu alebo inak zdieľanú premennú, to už reentrantné nie je - aspoň teda ak to nie je const pointer, alebo bez mechanizmu synchronizácie (kritické sekcie, semafor ap). Do toho ešte atomickosť zápisu/čítania, niečo iné môže byť priradenie vs inkrement/dekrement alebo iné operácie, teda koľko inštrukcií vykoná zápis a či počas nich môže dôjsť k prerušeniu. Veci závisia aj od kompilátora a platformy.
Predpokladám, že si nemôžeš dovoliť zakázať prerušenia alebo rozumne malý buffer na stack...
Príklad druhej funkcie, ktorá je vždy reentrantná, aj ak pointer smeruje ku globálnej premennej, by mohol byť napr.
Kód: Vybrať všetko
uint8_t myfunction(const uint8_t* data)
{
if (data)
return *data + 1;
return 0;
}
s tým, že si návratovú hodnotu ponecháš na stacku - v lokálnych premennách alebo ako kópiu vo vstupných argumentoch iných funkcií (pass by value).