我用gcc 4.8.4和-O0标志编译了以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
static jmp_buf env;
static void
doJump(int nvar, int rvar, int vvar)
{
printf("Inside doJump(): nvar=%d rvar=%d vvar=%d\n", nvar, rvar, vvar);
longjmp(env, 1);
}
int
main(int argc, char *argv[])
{
int nvar;
register int rvar;
volatile int vvar;
nvar = 111;
rvar = 222;
vvar = 333;
if (setjmp(env) == 0) {
nvar = 777;
rvar = 888;
vvar = 999;
doJump(nvar, rvar, vvar);
} else {
printf("After longjmp(): nvar=%d rvar=%d vvar=%d\n", nvar, rvar, vvar);
}
exit(EXIT_SUCCESS);
}
它产生了以下输出:
Inside doJump(): nvar=777 rvar=888 vvar=999
After longjmp(): nvar=777 rvar=222 vvar=999
我的期望是,由于禁用了所有优化,第二行中的rvar将为888。
当我从“ rvar”的定义中删除“ register”或在“ register”前面添加“ volatile”时,输出888。
因此,尽管-O0标志似乎gcc仍然执行一些优化。
有没有办法禁用gcc中的绝对所有优化?
C11标准表示longjmp()
:
到该函数被调用时,所有可访问对象都具有值,并且抽象机249的所有其他组件都具有状态
longjmp
,只是自动存储持续时间的对象的值在函数中是本地的,包含相应的调用setjmp
不具有volatile限定类型并且在setjmp
调用和longjmp
调用之间已更改的宏是不确定的。249)这包括但不限于浮点状态标志和打开文件的状态。
您正在遇到不确定的值...符合标准的行为。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句