longjmp setjmp and volatile
/*******************************************************************************
* 版权所有:
* 模 块 名:
* 文 件 名:volatile_setjmp.c
* 实现功能:
* 作 者:XYZ
* 版 本:V1.0
* 日 期:2013.11.15
* 联系方式:xiao13149920@foxmail.com
********************************************************************************/
// volatile_setjmp.c
#include<stdio.h>
#include<stdlib.h>
#include<setjmp.h> static jmp_buf env; static void do_jump(int nvar, int rvar, int vvar)
{
printf("Inside do_jump(): nvar:%d, rvar:%d, vvar:%d\n", nvar, rvar, vvar);
longjmp(env, );
} int main(int argc, char *argv[])
{
int nvar;
register int rvar; // allocated in register if possible
volatile int vvar; // see text nvar = ;
rvar = ;
vvar = ; if (setjmp(env) == )
{
nvar = ;
rvar = ;
vvar = ;
do_jump(nvar, rvar, vvar);
}
else
{
printf("After do_jump(): nvar:%d, rvar:%d, vvar:%d\n", nvar, rvar, vvar);
} return ;
}
1. When we compile the program with
gcc -o volatile_setjmp volatile_setjmp.c
and the output :
Inside do_jump(): nvar:777, rvar:888, vvar:999
After do_jump(): nvar:777, rvar:888, vvar:999
2.However, when we compile with optimization
gcc -O -o volatile_setjmp volatile_setjmp.
we get the following unexpected results:
Inside do_jump(): nvar:777, rvar:888, vvar:999
After do_jump(): nvar:111, rvar:222, vvar:999
We can prevent such code reorganization by declaring variables as volatile,which tells the optimizer not to optimizethem. In the preceding program output,we see that the variable vvar, which was declared volatile, was correctly handled,even when we compiled with optimization.
longjmp setjmp and volatile的更多相关文章
- C++异常实现与longjmp, setjmp,栈指针EBP, Active Record
这篇讲的不错: http://blog.csdn.net/smstong/article/details/50728022 首先Active Record 然后EBP,ESP等指针 2 通过setjm ...
- apue学习笔记(第七章 进程环境)
本章将了解进程的环境. main函数 C程序总是从main函数开始执行,main函数的原型是: int main(int argc,char *argv[]); 其中,argc是命令行参数的数目,ar ...
- 用arm-linux-gcc v4.3.4交叉编译Qt4.8.3
1.解压缩 #tar zxvf qt-everywhere-opensource-src-4.8.3.tar.gz 2. configure #mkdir buildarm-static #cd b ...
- C高级 跨平台协程库
1.0 协程库引言 协程对于上层语言还是比较常见的. 例如C# 中 yield retrun, lua 中 coroutine.yield 等来构建同步并发的程序. 本文就是探讨如何从底层实现开发级别 ...
- 鸿蒙内核源码分析(汇编汇总篇) | 所有的汇编代码都在这里 | 百篇博客分析OpenHarmony源码 | v40.03
百篇博客系列篇.本篇为: v40.xx 鸿蒙内核源码分析(汇编汇总篇) | 汇编可爱如邻家女孩 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...
- Android Jni 调用
Chap1:JNI完全手册... 3 Chap2:JNI-百度百科... 11 Chap 3:javah命令帮助信息... 16 Chap 4:用javah产生一个.h文件... 17 Chap5:j ...
- setjmp()、longjmp() Linux Exception Handling/Error Handling、no-local goto
目录 . 应用场景 . Use Case Code Analysis . 和setjmp.longjmp有关的glibc and eglibc 2.5, 2.7, 2.13 - Buffer Over ...
- 【转】浅析C语言的非局部跳转:setjmp和longjmp
转自 http://www.cnblogs.com/lienhua34/archive/2012/04/22/2464859.html C语言中有一个goto语句,其可以结合标号实现函数内部的任意跳转 ...
- 进程环境之setjmp和longjmp函数
在C中,goto语句是不能跨越函数的,而执行这样跳转功能的是函数setjmp和longjmp.这两个函数对于处理发生在深层嵌套函数调用中的出错情况是非常有用的. setjmp和longjmp函数也称为 ...
随机推荐
- 团队作业week14
0 如果你的团队来了一个新队员,有一台全新的机器,你们是否有一个文档,只要设置了相应的权限,她就可以根据文档,从头开始搭建环境, 并成功地把最新.最稳定版本的软件编译出来,并运行必要的单元测试?(在这 ...
- TOEFL备考计划
一.总则: 1.坚持每一天,充分利用一切可以利用的时间学英语.没有持之以恒的学习和大量的时将做保障,一切都是空谈. 2.每天听写一篇文章,以此文章为中心,展开一天的学习. OG, TOP 3.听说读写 ...
- 有关宏定义的bug
#define max(a,b) a>b?a:b 这个宏有诸多缺点:当调用比如max(3,2)*2时会出现不想要的结果.按理来说,我们想要得到的结果是:3*2=6,但是由于优先级的问题,得到的结 ...
- IOS开发之GCD---dispatch_semaphore
信号量是一个整形值并且具有一个初始计数值,并且支持两个操作:信号通知和等待.当一个信号量被信号通知,其计数会被增加.当一个线程在一个信号量上等待时,线程会被阻塞(如果有必要的话),直至计数器大于零, ...
- 用到的一些python包,记录下
Requests beautifulsoup lxml logging gevent django Bottle numpy pandas sklearn pyopencv opencv_python ...
- js计时器
js代码: <script language="javascript"> ,h=,s=,ss=; function second(){ )==){s+=;ss=;} & ...
- Android开发之无线遥控器
最近弄了一个UDP/TCP的小东西,主要需要实现的功能如下(服务器端): 1.基于局域网 2.服务器端网络接口为无线与有线 3.服务器端接收到客户端的数据需要模拟按键进行处理 4.开机自启动 5.使用 ...
- (01-02) odoo8.0_Ubuntu14.04_nginx反代理设置
作者:陈伟明联系 : QQ 942923305 | 微信 toby942923305E-mail: cwm.win@hotmail.com============================== ...
- select两个关联的下拉列表
今天用到两个关联的select,整理一下代码,仅供参考 如下: <html> <head> <meta charset="UTF-8"> < ...
- 如何用php生成1-10之间的不重复随机数
今天跟大家分享一个PHP中的案列,大家一起学习学习. 使用shuffle函数生成随机 ...