Ho una funzione particolare (un gestore di segnale) per il quale mi piacerebbe rilevare la ricorsione, cioè per capire se la funzione si è chiamata direttamente o indirettamente. La cosa complicata è che la funzione chiama un codice non sotto il suo controllo in un punto e quel codice potrebbe fare qualsiasi cosa.Rileva la ricorsione in modo affidabile anche in presenza di salti non locali
Normalmente, avevo appena scrivere qualcosa di simile
void foo() {
static int recursed = 0;
if(recursed) {
...
}
recursed = 1;
othercode();
recursed = 0;
}
ma in questo caso, io sono preoccupato del fatto che othercode
potrebbe utilizzare un longjmp
o simili a scoppiare, con conseguente recursed
rimanendo a 1. Nel evento che la mia funzione è saltata fuori in questo modo, voglio assicurarmi che non veda se stesso come ricorsivo se viene chiamato più tardi (il fatto che sia longjmp
'd out non è un problema altrimenti).
Nota: ritengo che sia probabile che sia longjmp
. Il othercode
è un gestore di segnali concatenati da un altro codice in-the-wild e esistono gestori per es. SIGSEGV
che usano longjmp
per ripristinare il contesto (ad esempio come gestori di eccezioni "protezione da errore"). Si noti che l'utilizzo di longjmp
in un gestore di segnale sincrono è generalmente sicuro. In ogni caso, non mi interessa particolarmente se l'altro codice è sicuro, perché non è qualcosa sotto il mio controllo.
Siete preoccupati che 'longjmp' sia probabile, o solo che sia una possibilità? – Patashu
@Patashu: probabile. Vedi la mia modifica. – nneonneo
Il titolo della domanda deve essere modificato per essere un po 'più specifico, qualcosa come' Rileva re-entrancy anche quando longjmp è usato ' – Patashu