Блоки: Блоки на основе стека, выходящие за рамки scope

В одном из заголовочных файлов Apple для libdispatch, queue.h появляется следующее предупреждение:

// The declaration of a block allocates storage on the stack. 
// Therefore, this is an invalid construct:

dispatch_block_t block;

if (x) {
    block = ^{ printf("true\n"); };
} else {
    block = ^{ printf("false\n"); };
}
block(); // unsafe!!!

// What is happening behind the scenes:

if (x) {
    struct Block __tmp_1 = ...; // setup details
    block = &__tmp_1;
} else {
    struct Block __tmp_2 = ...; // setup details
    block = &__tmp_2;
}

// As the example demonstrates, the address of a stack variable is 
// escaping the scope in which it is allocated. That is a classic C bug.

Попробуйте, как я могу, я не могу придумать тестовый пример, который бы иллюстрировал эту ошибку. Я могу создавать блоки, которые инстанцируются на стеке, но они (кажется) всегда появляются по уникальным адресам на стеке, даже если они находятся вне пределов видимости по отношению друг к другу.

Я представляю, что ответ на этот вопрос прост, но он ускользает от меня. Может ли кто-нибудь заполнить пробелы в моем (ограниченном) понимании?

ОТРЕДАКТИРУЙТЕ : Я видел этот ответ, но я не совсем понимаю, как этот экземпляр может перевести на мой пример, размещенный выше. Кто-нибудь может показать мне пример, используя if constructs?

8
задан Community 23 May 2017 в 12:09
поделиться