Nel seguente codice, la funzione foo
si chiama in modo ricorsivo una volta. La chiamata interna provoca l'aumento di una violazione di accesso. La chiamata esterna cattura l'eccezione.È __finalmente necessario eseguire EXCEPTION_CONTINUE_SEARCH?
#include <windows.h>
#include <stdio.h>
void foo(int cont)
{
__try
{
__try
{
__try
{
if (!cont)
*(int *)0 = 0;
foo(cont - 1);
}
__finally
{
printf("inner finally %d\n", cont);
}
}
__except (!cont? EXCEPTION_CONTINUE_SEARCH: EXCEPTION_EXECUTE_HANDLER)
{
printf("except %d\n", cont);
}
}
__finally
{
printf("outer finally %d\n", cont);
}
}
int main()
{
__try
{
foo(1);
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
printf("main\n");
}
return 0;
}
Il risultato atteso qui dovrebbe essere
inner finally 0
outer finally 0
inner finally 1
except 1
outer finally 1
Tuttavia, outer finally 0
è vistosamente manca dalla produzione reale. È un bug o c'è qualche dettaglio che sto trascurando?
Per completezza, succede con VS2015, compilando per x64. Sorprendentemente non succede su x86, portandomi a credere che sia davvero un bug.
Questo potrebbe tecnicamente rientrare nell'ambito di competenza di un comportamento non definito, come si sta assegnando a un puntatore nullo. Hai provato a lanciare un'eccezione normale usando 'RaiseException'? – OmnipotentEntity
Beh, non va bene. Non è un nuovo problema, VS2013 si comporta allo stesso modo. Sembra una limitazione strutturale di/SAFESEH per me, specifica per la ricorsione, funziona bene in un caso non ricorsivo. Piuttosto dubbioso qui nessuno può risolvere questo problema, meglio eseguire il ping su connect.microsoft.com a riguardo. –
@OnnipotentEntity: l'assegnazione a un puntatore nullo è * comportamento non definito *, per quanto riguarda lo standard di linguaggio C++. Sulla piattaforma Windows, tuttavia, questo è ben definito: l'istruzione solleva una violazione di accesso, che viene comunicata al codice utente tramite un'eccezione SEH. – IInspectable