国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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語言
    +關注

    關注

    183

    文章

    7644

    瀏覽量

    145569
  • 編程
    +關注

    關注

    90

    文章

    3716

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    機器學習和深度學習中需避免的 7 個常見錯誤與局限性

    無論你是剛入門還是已經從事人工智能模型相關工作一時間,機器學習和深度學習中都存在一些我們需要時刻關注并銘記的常見錯誤。如果對這些錯誤置之不理,日后可能會引發諸多麻煩!只要我們密切關注數據、模型架構
    的頭像 發表于 01-07 15:37 ?184次閱讀
    機器學習和深度學習中需避免的 7 個常見<b class='flag-5'>錯誤</b>與局限性

    瀚海微SD NAND/TF卡數據損壞與校驗錯誤(含CRC錯誤、數據比對失敗)問題解析

    數據損壞與校驗錯誤是瀚海微SD NAND/TF卡在數據存儲與傳輸過程中的關鍵故障,除常見的CRC錯誤外,數據比對失敗(讀取數據與寫入數據不一致)是核心表現形式,直接影響數據準確性,在工業控制、高清存儲等場景中可能引發嚴重后果。以下從故障表現、成因及解決方案展開詳細說明。
    的頭像 發表于 11-30 15:15 ?822次閱讀

    路由器TACACS+賬號登錄時經常報用戶密碼錯誤的問題分析

    某地M6000-S開啟TACACS+賬號登錄認證后,發現設備登錄經常會上報用戶密碼錯誤,過一時間才恢復正常。
    的頭像 發表于 11-14 09:55 ?381次閱讀
    路由器TACACS+賬號登錄時經常報用戶密碼<b class='flag-5'>錯誤</b>的問題分析

    Cortex-M0+處理器的HardFault錯誤介紹

    在ARM處理器中,如果一個程序產生了錯誤并且被處理器檢測到,就會產生錯誤異常。Cortex-M0+處理器只有一種異常用以處理錯誤:HardFault。
    的頭像 發表于 10-14 10:50 ?3378次閱讀
    Cortex-M0+處理器的HardFault<b class='flag-5'>錯誤</b>介紹

    分析負載特性時,有哪些常見的錯誤或誤區?

    分析負載特性時,很多人會因 “想當然套用經驗”“忽略實際場景細節” 或 “混淆概念” 導致判斷偏差,進而讓報警閾值調整失效(如誤報、漏報)。以下是 6 個最常見的錯誤 / 誤區,附錯誤表現、危害
    的頭像 發表于 10-10 17:03 ?808次閱讀

    如何解決I/O時鐘布局器錯誤

    在 I/O 時鐘布局器階段可能會發生錯誤,指出該工具無法對該時鐘結構進行布局,直至最后 BUFG 仍然無法完成布局。
    的頭像 發表于 09-23 16:05 ?1037次閱讀

    國巨貼片電容的電壓標識有哪些常見錯誤

    國巨貼片電容的電壓標識在識別和使用過程中可能存在一些常見錯誤,這些錯誤可能源于標識本身的模糊性、不同系列產品的差異、對標識規則的誤解,或使用環境的影響。以下是具體分析: 一、標識模糊或缺失導致的錯誤
    的頭像 發表于 08-28 16:51 ?746次閱讀

    【EASY EAI Orin Nano開發板試用體驗】PP-OCRV5文字識別實例搭建與移植

    魯班貓RK3588s開發板)上安裝完畢: PaddleOCR 3.0提供了一用于測試軟件功能的Python實例,只要能運行完畢,哪怕是出現了錯誤,那也說明了軟件安裝成功:from
    發表于 08-18 16:57

    避雷!樹莓派初學者常犯的5個錯誤

    如果你剛剛入手樹莓派,你就會知道它潛力無窮,幾乎能實現你想到的任何功能。然而,這種自由也讓你可能在不知不覺中做出對系統有害的操作。在本文中,我將介紹要避免犯哪些錯誤。初學者最常犯的錯誤包括:損壞SD
    的頭像 發表于 07-22 17:16 ?1323次閱讀
    避雷!樹莓派初學者常犯的5個<b class='flag-5'>錯誤</b>!

    【EASY EAI Orin Nano開發板試用體驗】使用Linux posix文件讀取接口和LVGL的animimg(圖像動畫)控件實現動畫播放以及

    比較簡單,但是一開始被帶偏了,實現攝像頭顯示直接用lv_image控件即可,并不需要lv_canvas(畫布)控件,畫布的使用方法比較復雜,且容易因操作不當造成錯誤。添加LVGL定時器方法如下
    發表于 07-22 00:34

    電商API常見錯誤排查指南:避免集成陷阱

    ? 在電商平臺開發中,API集成是連接系統、實現數據交換的核心環節。然而,許多開發者在集成過程中常遇到錯誤,導致項目延遲、數據丟失或用戶體驗下降。本文將逐步介紹常見錯誤類型、排查方法以及預防策略
    的頭像 發表于 07-11 14:21 ?2036次閱讀
    電商API常見<b class='flag-5'>錯誤</b>排查指南:避免集成陷阱

    如何驗證CAN控制器的錯誤響應機制?

    CAN節點的穩定性、可靠性和安全性得益于其強大的錯誤管理機制。上一篇文章我們介紹了CAN控制器的錯誤管理機制的工作原理。本文將基于其工作原理及ISO16845-1:2016標準,為大家介紹
    的頭像 發表于 04-30 18:24 ?849次閱讀
    如何驗證CAN控制器的<b class='flag-5'>錯誤</b>響應機制?

    IGBT IPM的錯誤輸出功能

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

    多板 PCB 組裝中最常見的邏輯錯誤

    許多電子系統和產品并不只使用1個PCB,而是可能包含多個電路板、單個電路板和多個外部模塊,或者通過電纜與外部設備連接。在多板系統中,兩個電路板之間可能會出現邏輯錯誤,但如果沒有全面審查設計,可能
    的頭像 發表于 03-14 18:15 ?914次閱讀
    多板 PCB 組裝中最常見的邏輯<b class='flag-5'>錯誤</b>

    快速搞懂C語言程序內存分區!

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