精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

什么是段錯誤?

工程師 ? 來源:聚優致成 ? 作者:聚優致成 ? 2020-09-11 14:04 ? 次閱讀

來源:聚優致成

一、什么是段錯誤?一旦一個程序發生了越界訪問,cpu 就會產生相應的保護,于是 segmentation fault 就出現了,通過上面的解釋,段錯誤應該就是訪問了不可訪問的內存。

這個內存區要么是不存在的,要么是受到系統保護的,還有可能是缺少文件或者文件損壞。

二、段錯誤產生的原因下面是一些典型的段錯誤的原因:

非關聯化空指針——這是特殊情況由內存管理硬件

試圖訪問一個不存在的內存地址(在進程的地址空間)

試圖訪問內存的程序沒有權利(如內核結構流程上下文)

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

1、訪問不存在的內存地址

在C代碼,分割錯誤通常發生由于指針的錯誤使用,特別是在C動態內存分配。非關聯化一個空指針總是導致段錯誤。

但野指針和懸空指針指向的內存,可能會或可能不會存在,而且可能或不可能是可讀的還是可寫的,因此會導致瞬態錯誤。

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

現在,非關聯化這些變量可能導致段錯誤:非關聯化空指針通常會導致段錯誤,閱讀時從野指針可能導致隨機數據但沒有段錯誤,和閱讀從懸空指針可能導致有效數據,然后隨機數據覆蓋。

2、訪問系統保護的內存地址

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

3、訪問只讀的內存地址

寫入只讀存儲器提出了一個 segmentation fault,這個發生在程序寫入自己的一部分代碼段或者是只讀的數據段,這些都是由操作系統加載到只讀存儲器。

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

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

上述例子ANSI C代碼通常會導致段錯誤和內存保護平臺。它試圖修改一個字符串文字,這是根據ANSI C標準未定義的行為。大多數編譯器在編譯時不會抓,而是編譯這個可執行代碼,將崩潰。

包含這個代碼被編譯程序時,字符串“hello”位于rodata部分程序的可執行文件的只讀部分數據段。

當加載時,操作系統與其他字符串和地方常數只讀段的內存中的數據。當執行時,一個變量 ptr 設置為指向字符串的位置,并試圖編寫一個H字符通過變量進入內存,導致段錯誤。

編譯程序的編譯器不檢查作業的只讀的位置在編譯時,和運行類unix操作系統產生以下運行時發生 segmentation fault。

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

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

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

4、空指針廢棄

因為是一個很常見的程序錯誤空指針廢棄(讀或寫在一個空指針,用于C的意思是“沒有對象指針”作為一個錯誤指示器),大多數操作系統內存訪問空指針的地址,這樣它會導致段錯誤。

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

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

非關聯化一個空指針,然后分配(寫一個值到一個不存在的目標)也通常會導致段錯誤。

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

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

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

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

#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;}輸出結果:hello段錯誤 (核心已轉儲)

5、堆棧溢出

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

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

因此,編譯器可以消除它,使用尾部調用優化,可能導致沒有堆棧使用。其他優化可能包括將遞歸轉換成迭代,給出例子的結構功能永遠會導致程序運行,雖然可能不是其他堆棧溢出。

6、內存越界(數組越界,變量類型不一致等)

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

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7601

    瀏覽量

    136251
  • 編程
    +關注

    關注

    88

    文章

    3596

    瀏覽量

    93610
收藏 人收藏

    評論

    相關推薦

    SQL錯誤代碼及解決方案

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

    網關錯誤是什么意思

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

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

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

    一文讀懂CAN通訊錯誤

    CAN總線通信技術廣泛應用于多個行業,是每個總線設計工程師必學的一個通訊網絡。然而,對于CAN通信中的錯誤幀,許多人僅停留在表面了解,缺乏深入理解,這導致許多工程師在面對總線通信故障時感到無從下手
    的頭像 發表于 06-12 08:24 ?2576次閱讀
    一文讀懂CAN通訊<b class='flag-5'>錯誤</b>幀

    使用sophon-demo_v0.1.8_dbb4632_20231116下面的YOLOv8中的yolov8_bmcv歷程出現錯誤的原因?

    使用sophon-demo_v0.1.8_dbb4632_20231116下面的YOLOv8中的yolov8_bmcv歷程,出現錯誤: 定位到代碼中出錯的函數是 picDec(h, img_file.c_str(), bmimg);這是什么原因呢?這個函數是算能提供的代
    發表于 05-30 07:37

    鴻蒙OpenHarmony:【 hb安裝異常處理】

    hb安裝過程中出現亂碼、錯誤
    的頭像 發表于 04-30 16:28 ?726次閱讀
    鴻蒙OpenHarmony:【 hb安裝異常處理】

    一文讀懂CAN控制器錯誤處理的原理

    CAN通訊的錯誤幀到底是如何被界定的?本文帶你輕松了解!錯誤標定檢測到錯誤條件的站通過發送錯誤標志指示錯誤。對于“
    的頭像 發表于 04-26 08:25 ?1548次閱讀
    一文讀懂CAN控制器<b class='flag-5'>錯誤</b>處理的原理

    ucosiii的串口打印輸出遇到了硬件錯誤怎么解決?

    我練兩天調試了ucos-iii之前是應為一些問題發現系統運行錯誤,但是到了第二天打開工程從新編譯下載程序測試,發現一剛剛開始打印串口消息就出現了硬件錯誤錯誤),懷疑是使用了半主機模
    發表于 04-24 06:03

    盤點PCB設計中的常見錯誤

    搞技術,難免存在錯誤,只有經歷過錯誤,才能更快地成長。PCB設計也一樣,今天就來盤點一下PCB設計中最常見的錯誤
    的頭像 發表于 01-12 09:53 ?1349次閱讀
    盤點PCB設計中的常見<b class='flag-5'>錯誤</b>

    bm_image轉cv::Mat時出現錯誤的原因?

    bm_image轉cv::Mat時出現錯誤,堆棧信息如下:
    發表于 01-10 07:27

    CMOS設置錯誤的解決方法

    CMOS設置錯誤的解決方法? CMOS是計算機中的一塊電路,用于存儲電腦的基本配置信息。如果設置錯誤,可能會導致計算機無法正常啟動或運行,因此需要盡早解決。本文將為你詳細介紹如何解決CMOS設置錯誤
    的頭像 發表于 12-28 15:13 ?7991次閱讀

    ug內部錯誤,內存訪問違例怎么解決

    ug內部錯誤,內存訪問違例怎么解決 內部錯誤和內存訪問違例是編程中常見的問題,它們可能會導致應用程序崩潰、數據丟失或系統不穩定。在本文中,我將詳細解釋內部錯誤和內存訪問違例的原因,如何解決這些
    的頭像 發表于 12-27 16:27 ?6100次閱讀

    初學仿真常見的錯誤

    本推文針對Sentaurus初學者頻繁遇到的錯誤進行簡單整理,具體是包括Sde、Sdevice仿真常見錯誤
    的頭像 發表于 12-03 16:24 ?2165次閱讀
    初學仿真常見的<b class='flag-5'>錯誤</b>

    xlookup查詢結果錯誤值什么情況

    XLOOKUP函數是Excel中的一種查找函數,用于在指定范圍中搜索某個值,并返回所查找的結果。當使用XLOOKUP函數時,可能會遇到錯誤值的情況。本文將詳細介紹XLOOKUP函數的錯誤值以及可能
    的頭像 發表于 12-03 10:16 ?1.2w次閱讀

    vlookup常見的12種錯誤

    VLOOKUP是Excel中非常常用的函數之一,它能夠根據指定的值,在某一列范圍內進行查找,并返回相應的值。雖然VLOOKUP是一個強大的函數,但是由于其復雜性和靈活性,常常容易出現一些錯誤。在本文
    的頭像 發表于 12-01 11:19 ?3134次閱讀