91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

什么是段錯(cuò)誤?

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

試圖寫(xiě)入只讀存儲(chǔ)器(如代碼段)

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

4、空指針廢棄

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

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

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

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

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

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

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

還有,比如malloc 動(dòng)態(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段錯(cuò)誤 (核心已轉(zhuǎn)儲(chǔ))

5、堆棧溢出

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

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

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

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

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

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

    關(guān)注

    183

    文章

    7644

    瀏覽量

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

    關(guān)注

    90

    文章

    3716

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中需避免的 7 個(gè)常見(jiàn)錯(cuò)誤與局限性

    無(wú)論你是剛?cè)腴T(mén)還是已經(jīng)從事人工智能模型相關(guān)工作一時(shí)間,機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中都存在一些我們需要時(shí)刻關(guān)注并銘記的常見(jiàn)錯(cuò)誤。如果對(duì)這些錯(cuò)誤置之不理,日后可能會(huì)引發(fā)諸多麻煩!只要我們密切關(guān)注數(shù)據(jù)、模型架構(gòu)
    的頭像 發(fā)表于 01-07 15:37 ?203次閱讀
    機(jī)器學(xué)習(xí)和深度學(xué)習(xí)中需避免的 7 個(gè)常見(jiàn)<b class='flag-5'>錯(cuò)誤</b>與局限性

    瀚海微SD NAND/TF卡數(shù)據(jù)損壞與校驗(yàn)錯(cuò)誤(含CRC錯(cuò)誤、數(shù)據(jù)比對(duì)失?。﹩?wèn)題解析

    數(shù)據(jù)損壞與校驗(yàn)錯(cuò)誤是瀚海微SD NAND/TF卡在數(shù)據(jù)存儲(chǔ)與傳輸過(guò)程中的關(guān)鍵故障,除常見(jiàn)的CRC錯(cuò)誤外,數(shù)據(jù)比對(duì)失敗(讀取數(shù)據(jù)與寫(xiě)入數(shù)據(jù)不一致)是核心表現(xiàn)形式,直接影響數(shù)據(jù)準(zhǔn)確性,在工業(yè)控制、高清存儲(chǔ)等場(chǎng)景中可能引發(fā)嚴(yán)重后果。以下從故障表現(xiàn)、成因及解決方案展開(kāi)詳細(xì)說(shuō)明。
    的頭像 發(fā)表于 11-30 15:15 ?837次閱讀

    路由器TACACS+賬號(hào)登錄時(shí)經(jīng)常報(bào)用戶(hù)密碼錯(cuò)誤的問(wèn)題分析

    某地M6000-S開(kāi)啟TACACS+賬號(hào)登錄認(rèn)證后,發(fā)現(xiàn)設(shè)備登錄經(jīng)常會(huì)上報(bào)用戶(hù)密碼錯(cuò)誤,過(guò)一時(shí)間才恢復(fù)正常。
    的頭像 發(fā)表于 11-14 09:55 ?390次閱讀
    路由器TACACS+賬號(hào)登錄時(shí)經(jīng)常報(bào)用戶(hù)密碼<b class='flag-5'>錯(cuò)誤</b>的問(wèn)題分析

    Cortex-M0+處理器的HardFault錯(cuò)誤介紹

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

    分析負(fù)載特性時(shí),有哪些常見(jiàn)的錯(cuò)誤或誤區(qū)?

    分析負(fù)載特性時(shí),很多人會(huì)因 “想當(dāng)然套用經(jīng)驗(yàn)”“忽略實(shí)際場(chǎng)景細(xì)節(jié)” 或 “混淆概念” 導(dǎo)致判斷偏差,進(jìn)而讓報(bào)警閾值調(diào)整失效(如誤報(bào)、漏報(bào))。以下是 6 個(gè)最常見(jiàn)的錯(cuò)誤 / 誤區(qū),附錯(cuò)誤表現(xiàn)、危害
    的頭像 發(fā)表于 10-10 17:03 ?816次閱讀

    如何解決I/O時(shí)鐘布局器錯(cuò)誤

    在 I/O 時(shí)鐘布局器階段可能會(huì)發(fā)生錯(cuò)誤,指出該工具無(wú)法對(duì)該時(shí)鐘結(jié)構(gòu)進(jìn)行布局,直至最后 BUFG 仍然無(wú)法完成布局。
    的頭像 發(fā)表于 09-23 16:05 ?1057次閱讀

    國(guó)巨貼片電容的電壓標(biāo)識(shí)有哪些常見(jiàn)錯(cuò)誤?

    國(guó)巨貼片電容的電壓標(biāo)識(shí)在識(shí)別和使用過(guò)程中可能存在一些常見(jiàn)錯(cuò)誤,這些錯(cuò)誤可能源于標(biāo)識(shí)本身的模糊性、不同系列產(chǎn)品的差異、對(duì)標(biāo)識(shí)規(guī)則的誤解,或使用環(huán)境的影響。以下是具體分析: 一、標(biāo)識(shí)模糊或缺失導(dǎo)致的錯(cuò)誤
    的頭像 發(fā)表于 08-28 16:51 ?758次閱讀

    【EASY EAI Orin Nano開(kāi)發(fā)板試用體驗(yàn)】PP-OCRV5文字識(shí)別實(shí)例搭建與移植

    魯班貓RK3588s開(kāi)發(fā)板)上安裝完畢: PaddleOCR 3.0提供了一用于測(cè)試軟件功能的Python實(shí)例,只要能運(yùn)行完畢,哪怕是出現(xiàn)了錯(cuò)誤,那也說(shuō)明了軟件安裝成功:from
    發(fā)表于 08-18 16:57

    避雷!樹(shù)莓派初學(xué)者常犯的5個(gè)錯(cuò)誤!

    如果你剛剛?cè)胧謽?shù)莓派,你就會(huì)知道它潛力無(wú)窮,幾乎能實(shí)現(xiàn)你想到的任何功能。然而,這種自由也讓你可能在不知不覺(jué)中做出對(duì)系統(tǒng)有害的操作。在本文中,我將介紹要避免犯哪些錯(cuò)誤。初學(xué)者最常犯的錯(cuò)誤包括:損壞SD
    的頭像 發(fā)表于 07-22 17:16 ?1342次閱讀
    避雷!樹(shù)莓派初學(xué)者常犯的5個(gè)<b class='flag-5'>錯(cuò)誤</b>!

    【EASY EAI Orin Nano開(kāi)發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動(dòng)畫(huà))控件實(shí)現(xiàn)動(dòng)畫(huà)播放以及

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

    電商API常見(jiàn)錯(cuò)誤排查指南:避免集成陷阱

    ? 在電商平臺(tái)開(kāi)發(fā)中,API集成是連接系統(tǒng)、實(shí)現(xiàn)數(shù)據(jù)交換的核心環(huán)節(jié)。然而,許多開(kāi)發(fā)者在集成過(guò)程中常遇到錯(cuò)誤,導(dǎo)致項(xiàng)目延遲、數(shù)據(jù)丟失或用戶(hù)體驗(yàn)下降。本文將逐步介紹常見(jiàn)錯(cuò)誤類(lèi)型、排查方法以及預(yù)防策略
    的頭像 發(fā)表于 07-11 14:21 ?2054次閱讀
    電商API常見(jiàn)<b class='flag-5'>錯(cuò)誤</b>排查指南:避免集成陷阱

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

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

    IGBT IPM的錯(cuò)誤輸出功能

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

    多板 PCB 組裝中最常見(jiàn)的邏輯錯(cuò)誤

    許多電子系統(tǒng)和產(chǎn)品并不只使用1個(gè)PCB,而是可能包含多個(gè)電路板、單個(gè)電路板和多個(gè)外部模塊,或者通過(guò)電纜與外部設(shè)備連接。在多板系統(tǒng)中,兩個(gè)電路板之間可能會(huì)出現(xiàn)邏輯錯(cuò)誤,但如果沒(méi)有全面審查設(shè)計(jì),可能
    的頭像 發(fā)表于 03-14 18:15 ?922次閱讀
    多板 PCB 組裝中最常見(jiàn)的邏輯<b class='flag-5'>錯(cuò)誤</b>

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

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