Когда требуется volatile, когда вызывается longjmp ()? - PullRequest
0 голосов
/ 07 февраля 2019

Я пытаюсь сделать минимальный рабочий пример, чтобы показать, когда нужно volatile.Но следующий пример не требует volatile.Кто-нибудь может показать пример?Спасибо.

#include <stdio.h>
#include <setjmp.h>

static jmp_buf buf;

int main() {
    volatile int local_var = 1;
    int local_var2 = 10;
    if(!setjmp(buf)) {
        local_var = 2;
        local_var2 = 20;
        longjmp(buf, 1);
    } else {
        printf("%d\n", local_var);
        printf("%d\n", local_var2);
    }

    return 0;
}
$ ./main.exe 
2
20

1 Ответ

0 голосов
/ 07 февраля 2019

Всякий раз, когда локальная переменная могла измениться между вызовом установки на setjmp и переходом назад.

7.13.2.1p3

Вседоступные объекты имеют значения, а все остальные компоненты абстрактной машины249) имеют состояние на момент вызова функции longjmp, за исключением того, что значения объектов с длительностью автоматического хранения, локальные для функции, содержащей вызов соответствующего setjmpмакрос, который не имеет volatile-квалифицированного типа и был изменен между вызовом setjmp и вызовом longjmp, является неопределенным.

setjmp снимки ваших регистров.Если локальная переменная была в регистре, и вы изменили переменную после вызова setjmp, при возврате она будет иметь моментальный снимок.

В Linux x86_64 я получаю выходные данные 2 (додата, поскольку volatile) и 10 (старое значение), если я скомпилирую с оптимизацией.

...