為了解決這個限制,C函式館提供了setjmp()和longjmp()函式,它們分別承擔非局部標號和goto作用。頭檔案<setjmp.h>申明了這些函式及同時所需的jmp_buf數據類型。
原理非常簡單:
1.setjmp(j)設定“jump”點,用正確的程式上下文填充jmp_buf對象j。這個上下文包括程式存放位置、棧和框架指針,其它重要的暫存器和記憶體數據。當初始化完jump的上下文,setjmp()返回0值。
2. 以後調用longjmp(j,r)的效果就是一個非局部的goto或“長跳轉”到由j描述的上下文處(也就是到那原來設定j的setjmp()處)。當作為長跳轉的目標而被調用時,setjmp()返回r或1(如果r設為0的話)。(記住,setjmp()不能在這種情況時返回0。)
通過有兩類返回值,setjmp()讓你知道它正在被怎么使用。當設定j時,setjmp()如你期望地執行;但當作為長跳轉的目標時,setjmp()就從外面“喚醒”它的上下文。你可以用longjmp()來終止異常,用setjmp()標記相應的異常處理程式。
#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{
printf("exception raised\n");
longjmp(j, 1); /* jump to exception handler */
printf("this line should never appear\n");
}
int main(void)
{
if(setjmp(j) == 0)
{
printf("''setjmp'' is initializing ''j''\n");
raise_exception();
printf("this line should never appear\n");
}
else
{
printf("''setjmp'' was just jumped into\n");
/* this code is the exception handler */
}
return 0;
}
/* When run yields:
''setjmp'' is initializing ''j''
exception raised
''setjmp'' was just jumped into
*/
那個填充jmp_buf的函式不在調用longjmp()之前返回。否則,存儲在jmp_buf中的上下文就有問題了:
jmp_buf j;
void f(void)
{
setjmp(j);
}
int main(void)
{
f();
longjmp(j, 1); /* logic error */
return 0;
}
所以,你必須把setjmp()處理成只是到其所在位置的一個非局部跳轉。
Longjmp()和setjmp()聯合體運行於異常生命期的2和3階段。longjmp(j,r)產生異常對象r(一個整數),並且作為返回值傳送到setjmp(j)處。實際上,setjmp()函式通報了異常r。
下面這個例子採用switch,能更好的展現這對函式的功能:
#include <setjmp.h>
#include <stdio.h>
jmp_buf j;
void raise_exception(void)
{
printf("exception raised\n");
longjmp(j, 3); /* jump to exception handler case 3 */
printf("this line should never appear\n");
}
int main(void)
{
switch (setjmp(j))
{
case 0:
printf("''setjmp'' is initializing ''j''\n");
raise_exception();
printf("this line should never appear\n");
case 1:
printf("Case 1\n");break;
case 2:
printf("Case 2\n");break;
case 3:
printf("Case 3\n");break;
default:
break;
}
return 0;
}
相關詞條
-
setjmp
setjmp與刺激的abort()和exit()相比,goto語句看起來是處理異常的更可行方案。
-
溢出
溢出的原因現實狀況在幾乎所有計算機語言中,不管是新的語言還是舊的語言,使緩衝區溢出的任何嘗試通常都會被該語言本身自動檢測並阻止(...
溢出的原因 溢出解決方法 溢出分類 防溢技術套用 -
溢出漏洞
簡介它一般是由於編程人員的疏忽造成的。具體的講,溢出漏洞是由於程式中的某個或某些輸入函式(使用者輸入參數)對所接收數據的邊界驗證...
簡介 何謂溢出漏洞 相關資料 -
緩衝區溢出攻擊
setjmp/longjmp。意思是在檢驗點設定“setjmp(buffer...
特點 危害 原理 問題 實驗 -
快取溢出
中提供了一對長跳轉函式setjmp/longjmp來進行程式執行流的非局部跳轉,意思是在某一個檢查點設定setjmp(buffer),在程式執行...
概述 快取溢出攻擊方式 檢測和預防技術 黑客如何攪亂快取 組成部分 -
Linux/UNIX系統編程手冊
6.7 環境列表 1016.8 執行非局部跳轉:setjmp()和...
圖書描述 作者簡介 目錄 -
Linux C函式實例速查手冊
:取得進程執行優先權5.17 longjmp函式:跳到原先setjmp...5.19 setjmp函式:存儲當前堆疊環境5.20 setgid函式...
內容簡介 目錄 -
《項目驅動——單片機套用設計基礎》
setjmp與longjmp的實現 5.2 最簡單的多任務模型 5.2.1 雙...
基本信息 內容簡介 編輯推薦 目錄 -
C專家編程
6.7 控制執行緒6.8 setjmp和longjmp6.9 UNIX中...
內容簡介 編輯推薦 目錄