Я пытаюсь лучше понять область видимости блока в C и узнать, предоставляет ли стандарт какие-либо гарантии в отношении элементов выталкивающего стека при выходе из области видимости блока, которые могли быть помещены в стек при входе в эту область видимости. Например, может ли переход к метке за пределами блока (который просто выполняет переход к метке в C, ничего особенного там) после объявления переменной в этом блоке приводит к поврежденному стеку?
Вот надуманный пример, и если он поможет более детально определить вопрос, предположим -O0
. Моя путаница заключается в том, выталкивается ли err2
из стека при попадании на путь выполнения, который переходит на метку fatal
. Поскольку в C нет ничего особенного, я бы предположил, что err2
не извлечен из стека, и это приведет к повреждению стека.
void foo()
{
int err;
if (err = baz()) {
printf("error %i", err);
int err2;
if (err2 = another_thing())
goto fatal;
}
printf("done");
return;
fatal:
printf("there was a fatal error");
}