99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

什么是段錯誤?

工程師 ? 來源:聚優(yōu)致成 ? 作者:聚優(yōu)致成 ? 2020-09-11 14:04 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:聚優(yōu)致成

一、什么是段錯誤?一旦一個程序發(fā)生了越界訪問,cpu 就會產(chǎn)生相應(yīng)的保護(hù),于是 segmentation fault 就出現(xiàn)了,通過上面的解釋,段錯誤應(yīng)該就是訪問了不可訪問的內(nèi)存。

這個內(nèi)存區(qū)要么是不存在的,要么是受到系統(tǒng)保護(hù)的,還有可能是缺少文件或者文件損壞。

二、段錯誤產(chǎn)生的原因下面是一些典型的段錯誤的原因:

非關(guān)聯(lián)化空指針——這是特殊情況由內(nèi)存管理硬件

試圖訪問一個不存在的內(nèi)存地址(在進(jìn)程的地址空間)

試圖訪問內(nèi)存的程序沒有權(quán)利(如內(nèi)核結(jié)構(gòu)流程上下文)

試圖寫入只讀存儲器(如代碼段)

1、訪問不存在的內(nèi)存地址

在C代碼,分割錯誤通常發(fā)生由于指針的錯誤使用,特別是在C動態(tài)內(nèi)存分配。非關(guān)聯(lián)化一個空指針總是導(dǎo)致段錯誤。

但野指針和懸空指針指向的內(nèi)存,可能會或可能不會存在,而且可能或不可能是可讀的還是可寫的,因此會導(dǎo)致瞬態(tài)錯誤。

#include 《stdio.h》int main (void){ int *ptr = NULL; *ptr = 0; return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

現(xiàn)在,非關(guān)聯(lián)化這些變量可能導(dǎo)致段錯誤:非關(guān)聯(lián)化空指針通常會導(dǎo)致段錯誤,閱讀時從野指針可能導(dǎo)致隨機(jī)數(shù)據(jù)但沒有段錯誤,和閱讀從懸空指針可能導(dǎo)致有效數(shù)據(jù),然后隨機(jī)數(shù)據(jù)覆蓋。

2、訪問系統(tǒng)保護(hù)的內(nèi)存地址

#include 《stdio.h》 int main (void){ int *ptr = (int *)0; *ptr = 100; return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

3、訪問只讀的內(nèi)存地址

寫入只讀存儲器提出了一個 segmentation fault,這個發(fā)生在程序?qū)懭胱约旱囊徊糠执a段或者是只讀的數(shù)據(jù)段,這些都是由操作系統(tǒng)加載到只讀存儲器。

#include 《stdio.h》#include 《string.h》 int main (void){ char *ptr = “test”; strcpy (ptr, “TEST”); return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

#include 《stdio.h》 int main (void){ char *ptr = “hello”; *ptr = ‘H’; return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

上述例子ANSI C代碼通常會導(dǎo)致段錯誤和內(nèi)存保護(hù)平臺。它試圖修改一個字符串文字,這是根據(jù)ANSI C標(biāo)準(zhǔn)未定義的行為。大多數(shù)編譯器在編譯時不會抓,而是編譯這個可執(zhí)行代碼,將崩潰。

包含這個代碼被編譯程序時,字符串“hello”位于rodata部分程序的可執(zhí)行文件的只讀部分?jǐn)?shù)據(jù)段。

當(dāng)加載時,操作系統(tǒng)與其他字符串和地方常數(shù)只讀段的內(nèi)存中的數(shù)據(jù)。當(dāng)執(zhí)行時,一個變量 ptr 設(shè)置為指向字符串的位置,并試圖編寫一個H字符通過變量進(jìn)入內(nèi)存,導(dǎo)致段錯誤。

編譯程序的編譯器不檢查作業(yè)的只讀的位置在編譯時,和運(yùn)行類unix操作系統(tǒng)產(chǎn)生以下運(yùn)行時發(fā)生 segmentation fault。

可以糾正這個代碼使用一個數(shù)組而不是一個字符指針,這個棧上分配內(nèi)存并初始化字符串的值:

#include 《stdio.h》 int main (void){ char ptr[] = “hello”; ptr[0] = ‘H’; return 0;}

即使不能修改字符串(相反,這在C標(biāo)準(zhǔn)未定義行為,在C char *類型,所以沒有隱式轉(zhuǎn)換原始代碼,在c++的 const char *類型,因此有一個隱式轉(zhuǎn)換,所以編譯器通常會抓住這個特定的錯誤。

4、空指針廢棄

因為是一個很常見的程序錯誤空指針廢棄(讀或?qū)懺谝粋€空指針,用于C的意思是“沒有對象指針”作為一個錯誤指示器),大多數(shù)操作系統(tǒng)內(nèi)存訪問空指針的地址,這樣它會導(dǎo)致段錯誤。

#include 《stdio.h》 int main (void){ int *ptr = NULL; printf (“%d\n”, *ptr); return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

這個示例代碼創(chuàng)建了一個空指針,然后試圖訪問它的值(讀值)。在運(yùn)行時在許多操作系統(tǒng)中,這樣做會導(dǎo)致段錯誤。

非關(guān)聯(lián)化一個空指針,然后分配(寫一個值到一個不存在的目標(biāo))也通常會導(dǎo)致段錯誤。

#include 《stdio.h》 int main (void){ int *ptr = NULL; *ptr = 1; return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

下面的代碼包含一個空指針,但當(dāng)編譯通常不會導(dǎo)致段錯誤,值是未使用的。因此,廢棄通常會被優(yōu)化掉,死代碼消除。

#include 《stdio.h》 int main (void){ int *ptr = NULL; *ptr; return 0;}

還有,比如malloc 動態(tài)分配內(nèi)存,釋放、置空完成后,不可再使用該指針。

#include 《stdio.h》#include 《stdlib.h》#include 《string.h》 int main(){ char* str=(char* )malloc(100); if(*str) { return; } strcpy(str,“hello”); printf(“%s\n”,str); free(str); str=NULL; strcpy(str,“abcdef”); return 0;}輸出結(jié)果:hello段錯誤 (核心已轉(zhuǎn)儲)

5、堆棧溢出

#include 《stdio.h》#include 《string.h》 int main (void){ main (); return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

上述例子的無限遞歸,導(dǎo)致的堆棧溢出會導(dǎo)致段錯誤,但無線遞歸未必導(dǎo)致堆棧溢出,優(yōu)化執(zhí)行的編譯器和代碼的確切結(jié)構(gòu)。在這種情況下,遙不可及的代碼(返回語句)行為是未定義的。

因此,編譯器可以消除它,使用尾部調(diào)用優(yōu)化,可能導(dǎo)致沒有堆棧使用。其他優(yōu)化可能包括將遞歸轉(zhuǎn)換成迭代,給出例子的結(jié)構(gòu)功能永遠(yuǎn)會導(dǎo)致程序運(yùn)行,雖然可能不是其他堆棧溢出。

6、內(nèi)存越界(數(shù)組越界,變量類型不一致等)

#include 《stdio.h》int main (void){ char test[10]; printf (“%c\n”, test[100000]); return 0;}輸出結(jié)果:段錯誤(核心已轉(zhuǎn)儲)

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141630
  • 編程
    +關(guān)注

    關(guān)注

    88

    文章

    3689

    瀏覽量

    95229
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    如何驗證CAN控制器的錯誤響應(yīng)機(jī)制?

    CAN節(jié)點的穩(wěn)定性、可靠性和安全性得益于其強(qiáng)大的錯誤管理機(jī)制。上一篇文章我們介紹了CAN控制器的錯誤管理機(jī)制的工作原理。本文將基于其工作原理及ISO16845-1:2016標(biāo)準(zhǔn),為大家介紹
    的頭像 發(fā)表于 04-30 18:24 ?209次閱讀
    如何驗證CAN控制器的<b class='flag-5'>錯誤</b>響應(yīng)機(jī)制?

    IGBT IPM的錯誤輸出功能

    本文將介紹“保護(hù)功能和工作時序”系列的第五個功能——“錯誤輸出功能(FO)”。
    的頭像 發(fā)表于 03-19 17:22 ?627次閱讀
    IGBT IPM的<b class='flag-5'>錯誤</b>輸出功能

    快速搞懂C語言程序內(nèi)存分區(qū)!

    到動態(tài)分配的數(shù)據(jù)等內(nèi)容。(內(nèi)存分區(qū)圖示)理解這些內(nèi)存分區(qū)的結(jié)構(gòu)和特性,不僅有助于編寫更高效的代碼,還能幫助排查和解決如錯誤、內(nèi)存泄漏、棧溢出等常見問題。以下是常見的六
    的頭像 發(fā)表于 03-14 17:37 ?662次閱讀
    快速搞懂C語言程序內(nèi)存分區(qū)!

    程序中斷的100種寫法

    。 信號處理:在Unix/Linux系統(tǒng)中,通過信號(signal)處理機(jī)制實現(xiàn)中斷。 異常處理:由程序中的異常(如除零錯誤、錯誤)觸發(fā)。 3. 中斷控制器配置 中斷向量表:在嵌入式系統(tǒng)中,通過配置
    發(fā)表于 01-28 08:25

    常見xgboost錯誤及解決方案

    XGBoost(eXtreme Gradient Boosting)是一種流行的機(jī)器學(xué)習(xí)算法,用于解決分類和回歸問題。盡管它非常強(qiáng)大和靈活,但在使用過程中可能會遇到一些常見的錯誤。以下是一些常見
    的頭像 發(fā)表于 01-19 11:22 ?2484次閱讀

    電橋電路的常見錯誤分析

    電橋電路的常見錯誤分析主要包括以下幾個方面: 一、電阻值不準(zhǔn)確 電阻值不準(zhǔn)確是電橋電路常見的錯誤之一。這可能是由于電阻本身的誤差,如電阻的標(biāo)稱值與實際值存在偏差,或者電阻老化、溫度變化等因素導(dǎo)致
    的頭像 發(fā)表于 01-09 10:08 ?1122次閱讀

    GPIO錯誤排查與解決

    在嵌入式系統(tǒng)和微控制器編程中,通用輸入輸出(GPIO)是最常見的接口之一。然而,在使用GPIO時,我們可能會遇到各種錯誤。 1. 理解GPIO GPIO是微控制器上的一組引腳,可以被配置為輸入或輸出
    的頭像 發(fā)表于 01-09 09:46 ?2301次閱讀

    RTOS中的錯誤檢查機(jī)制

    在嵌入式應(yīng)用中,有可能發(fā)生各種各樣的錯誤,系統(tǒng)必須能夠檢測到這些錯誤并作出適當(dāng)?shù)捻憫?yīng)。RTOS通常內(nèi)置了一些錯誤檢查功能,用于檢測錯誤并向應(yīng)用提供響應(yīng)
    的頭像 發(fā)表于 01-03 14:44 ?742次閱讀

    EEPROM編程常見錯誤及解決方案

    EEPROM(電可擦可編程只讀存儲器)在編程過程中可能會遇到多種錯誤。以下是一些常見的EEPROM編程錯誤及其解決方案: 常見錯誤 數(shù)據(jù)寫入錯誤 : 在寫入EEPROM時,數(shù)據(jù)可能由于
    的頭像 發(fā)表于 12-16 17:08 ?4638次閱讀

    SQL錯誤代碼及解決方案

    在SQL數(shù)據(jù)庫開發(fā)和管理中,常見的錯誤代碼及其解決方案可以歸納如下: 一、語法錯誤(Syntax Errors) 錯誤代碼 :無特定代碼,但通常會在錯誤消息中明確指出是語法
    的頭像 發(fā)表于 11-19 10:21 ?6518次閱讀

    socket編程中的錯誤處理技巧

    Socket編程是網(wǎng)絡(luò)編程的基礎(chǔ),它允許程序之間通過TCP/IP協(xié)議進(jìn)行通信。然而,網(wǎng)絡(luò)通信是不穩(wěn)定的,可能會遇到各種問題,如網(wǎng)絡(luò)延遲、連接中斷、數(shù)據(jù)丟失等。 錯誤處理的重要性 提高程序的健壯性
    的頭像 發(fā)表于 11-01 17:47 ?1537次閱讀

    網(wǎng)關(guān)錯誤是什么意思

    網(wǎng)關(guān)錯誤是計算機(jī)網(wǎng)絡(luò)中一個常見且復(fù)雜的問題,它通常發(fā)生在客戶端和服務(wù)器之間的通信過程中,導(dǎo)致客戶端的請求無法被正確處理或響應(yīng)。為了全面理解網(wǎng)關(guān)錯誤,本文將從其定義、原因、類型、影響、診斷方法以及解決方案等多個方面進(jìn)行詳細(xì)闡述。
    的頭像 發(fā)表于 09-30 11:40 ?9537次閱讀

    SRAM中的錯誤檢測

    電子發(fā)燒友網(wǎng)站提供《SRAM中的錯誤檢測.pdf》資料免費下載
    發(fā)表于 09-20 11:15 ?0次下載
    SRAM中的<b class='flag-5'>錯誤</b>檢測

    CAN總線錯誤狀態(tài)的種類

    CAN總線錯誤狀態(tài)的種類主要包括以下幾種,每種狀態(tài)都反映了CAN總線網(wǎng)絡(luò)中節(jié)點或總線的不同錯誤情況,以及相應(yīng)的通信能力和限制。
    的頭像 發(fā)表于 09-03 14:17 ?3474次閱讀

    【飛凌嵌入式OK527N-C開發(fā)板體驗】3.鼠標(biāo)+硬件編解碼+音頻播放器

    有偶而的報錯,且運(yùn)行一時間 會有明顯卡頓,懷疑是加載一,解碼一。 測試音頻播放,啟動后可以 顯示 出播放器畫面,但我沒鼠標(biāo)無法播放,但神奇的地方是我這個屏幕有觸摸,點按時會導(dǎo)致
    發(fā)表于 07-25 23:47