И еще один баг
Пример на базе исходников scmRTOS
Имеем классы
Код
class TCritSec
{
public:
TCritSec () : StatusReg(__get_interrupt_state()) { __disable_interrupt(); }
~TCritSec() { __set_interrupt_state(StatusReg); }
private:
istate_t StatusReg;
};
class TEventFlag
{
enum TValue { efOn = 1, efOff= 0 }; // prefix 'ef' means: "Event Flag"
public:
void Clear() { TCritSec cs; Value = efOff; }
private:
TValue Value;
};
TEventFlag evFlag1;
TEventFlag evFlag2;
Если в встречаются две критические секции подряд, то оптимизатор соершенно справедливо пытается их объединить.
evFlag1.Clear();
evFlag2.Clear();
Но подавив деструктор cs в evFlag1, оптимизатор забывает подавить контруктор cs в evFlag2.
В результате прерывания гарантированно запрещены после evFlag2.Clear();