If interrupts are off, the the PoC program might wait forever for "hits > 32" if never testfun() never detects a "hit". Giving up after 1M bust loops ("cycles < 1000000") should prevent this from happening... but... I wonder...
gcc -o test test.c -Wall -DHIT_THRESHOLD=50 -DNO_INTERRUPTS
Without -O0, some optimizations are still enabled. Could a modern "clever" optimizing compiler assume that the speculative "hit" never happens and therefor conclude that "cycles" is only used after the loop when it is "guaranteed" to have the value 1000000 and "optimize" the loop into something like /*long cycles = 0;*/ //DEAD
while (hits < 32 /*&& cycles < 1000000*/) { //DEAD
// ... rest of loop body, maybe?
/* cycles++; */ //DEAD
pipeline_flush();
/*}*/ //DEAD
and the sprintf() into something like: sprintf(out_, "%c: %s in 100000 cycles (hitrate: %f%%)\n",
secret_read_area[idx], results, 100*hits/(double)(100000));
I'm probably worrying about nothing. Or at lest I should be worrying about nothing, but with the current trend of "clever" optimizers exploiting everything they think is provable, I'm no longer certain. bleh