I mean a scenario like this: There is some class (I call it victim
) with a private data member and another class (named attacker
) with some method, which, of course, normally does not have access to private members of other classes and does not even hold a reference to an instance of victim
:
extern "C" {
#include <pigpiod_if2.h>
}
class victim {
private:
static bool is_ready;
static bool is_on;
public:
static void init ()
{
is_ready = true;
is_on = true;
}
/* Some other public methods go here. */
}
class attacker {
private:
static int last_read_pin;
public:
static void run ()
{
while (true) {
/* Some sensible code goes here. */
last_read_pin = -1;
time_sleep (0.01); // Using nanosleep () does not change behavior.
}
}
}
This is just a code snippet to illustrate the following question: Is it possible, not just in theory, but also practically, that attacker::run ()
can modify the values of the two private static vars of victim
unintentionally, without addressing any public member of victim
, maybe due to undefined behavior or even a compiler bug? Thank you.
UPDATE: After a hint from another user, I did rebuild the complete app using make clean
and make
. Also, I added the endless loop into my example. The change in is_ready
occurs during the sixth run of the loop. Changing the sleep interval does not change behavior, though.
UPDATE #2: I ran my code through gdb
with a watch on the is_ready
variable, and I got an alert when last_read_pin
was set to –1:
Hardware watchpoint 1: is_ready
Old value = true
New value = false
attacker::Run ()
last_read_pin = -1;
UPDATE #3: Moving last_read_pin
into the Run ()
method itself, thereby making it an internal variable, does not help either.
UPDATE #4: After simply commenting out the line of code, which makes so much trouble, the issue still persisten, apparently being caused by one line above, which reads like this:
keypad::last_levels [h] [k] = 0;
I had to comment out this line, too, to get rid of the problem with is_ready
being changed.
Could the use of pigpiod
cause this issue? I an earlier version, I was using pigpio
directly and did not encounter this problem.
Compiled with gcc 4.9.2.