【问题标题】:When `volatile` is needed when `longjmp()` is called?何时调用 `longjmp()` 时需要 `volatile`?
【发布时间】:2019-02-06 23:22:57
【问题描述】:

我正在尝试制作一个最小的工作示例来显示何时需要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

【问题讨论】:

  • 您通常不能通过运行示例程序来表明需要volatile。它是必需的,因为标准是这样说的。

标签: c volatile setjmp


【解决方案1】:

只要局部变量在设置调用setjmp 和跳转回之间发生变化。

7.13.2.1p3

所有可访问对象都有值,抽象机器的所有其他组件249)都有状态,截至 longjmp 函数被调用,除了自动对象的值 包含函数的本地存储持续时间 调用相应的 setjmp 宏 volatile 限定类型,并且已在 setjmp 之间更改 调用和 longjmp 调用是不确定的。

setjmp 对您的寄存器进行快照。如果局部变量在寄存器中,并且您在 setjmp 调用后更改了变量,则当您跳回时,它将具有快照值。

在 Linux x86_64 上,我得到输出 2(由于 volatile 是最新的)和 10(旧值)如果我在优化的情况下编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2021-01-30
    • 2019-08-12
    • 2012-02-09
    相关资源
    最近更新 更多