新聞中心
c語(yǔ)言為什么會(huì)溢出?
C語(yǔ)言程序設(shè)計(jì)過(guò)程中,內(nèi)存溢出是常見(jiàn)的錯(cuò)誤情況。主要是針對(duì)使用指針時(shí)的情況,一種是申請(qǐng)了內(nèi)存,但在后面這個(gè)指針在沒(méi)有釋放的情況下,又指向了另一個(gè)內(nèi)存地址,這樣原內(nèi)存就沒(méi)有任何指針指向它,因而導(dǎo)致無(wú)法釋放空間,所以?xún)?nèi)存就溢出了,也有可能是有多個(gè)指針指向同一地址,從而出現(xiàn)多次釋放的情況。

C/C++函數(shù)調(diào)用,棧溢出,該怎么解決?
棧溢出一般和操作指針有關(guān)系(包括本質(zhì)上是指針的各種形式),比如調(diào)用不定變量個(gè)數(shù)的函數(shù)時(shí)(像printf、scanf這種),沒(méi)有按約定傳入適當(dāng)?shù)膮?shù)個(gè)數(shù);函數(shù)操作傳入的數(shù)組下標(biāo)越界等;得到指向局部變量的指針后,做不合適的偏移操作。以上這些都有可能造成棧溢出。
信息溢出是什么?
各種信息通過(guò)交易或非交易的方式流出原來(lái)?yè)碛械闹黧w的過(guò)程。信息溢出源于信息的流動(dòng)性和擴(kuò)散性。從公共利益角度看,大量的、加速的信息溢出推動(dòng)了整個(gè)社會(huì)的發(fā)展和進(jìn)步;從信息擁有者的角度來(lái)看,信息溢出所帶來(lái)的正面和負(fù)面影響都值得關(guān)注。
在計(jì)算機(jī)中,當(dāng)要表示的數(shù)據(jù)超出計(jì)算機(jī)所使用的數(shù)據(jù)的表示范圍時(shí),則產(chǎn)生數(shù)據(jù)的溢出。
溢出原因
數(shù)據(jù)類(lèi)型超過(guò)了計(jì)算機(jī)字長(zhǎng)的界限就會(huì)出現(xiàn)數(shù)據(jù)溢出的情況。導(dǎo)致內(nèi)存溢出問(wèn)題的原因有很多,比如:
(1) 使用非類(lèi)型安全(non-type-safe)的語(yǔ)言如 C/C++ 等。
(2) 以不可靠的方式存取或者復(fù)制內(nèi)存緩沖區(qū)。
(3)編譯器設(shè)置的內(nèi)存緩沖區(qū)太靠近關(guān)鍵數(shù)據(jù)結(jié)構(gòu)。
因素分析
1.內(nèi)存溢出問(wèn)題是 C 語(yǔ)言或者 C++ 語(yǔ)言所固有的缺陷,它們既不檢查數(shù)組邊界,又不檢查類(lèi)型可靠性(type-safety)。眾所周知,用 C/C++ 語(yǔ)言開(kāi)發(fā)的程序由于目標(biāo)代碼非常接近機(jī)器內(nèi)核,因而能夠直接訪問(wèn)內(nèi)存和寄存器,這種特性大大提升了 C/C++ 語(yǔ)言代碼的性能。只要合理編碼,C/C++應(yīng)用程序在執(zhí)行效率上必然優(yōu)于其它高級(jí)語(yǔ)言。然而,C/C++ 語(yǔ)言導(dǎo)致內(nèi)存溢出問(wèn)題的可能性也要大許多。其他語(yǔ)言也存在內(nèi)存溢出問(wèn)題,但它往往不是程序員的失誤,而是應(yīng)用程序的運(yùn)行時(shí)環(huán)境出錯(cuò)所致。
2. 當(dāng)應(yīng)用程序讀取用戶(hù)(也可能是惡意攻擊者)數(shù)據(jù),試圖復(fù)制到應(yīng)用程序開(kāi)辟的內(nèi)存緩沖區(qū)中,卻無(wú)法保證緩沖區(qū)的空間足夠時(shí)(換言之,假設(shè)代碼申請(qǐng)了 N 字節(jié)大小的內(nèi)存緩沖區(qū),隨后又向其中復(fù)制超過(guò) N 字節(jié)的數(shù)據(jù))。內(nèi)存緩沖區(qū)就可能會(huì)溢出。想一想,如果你向 12 盎司的玻璃杯中倒入 16 盎司水,那么多出來(lái)的 4 盎司水怎么辦?當(dāng)然會(huì)滿到玻璃杯外面了!
3. 最重要的是,C/C++編譯器開(kāi)辟的內(nèi)存緩沖區(qū)常常鄰近重要的數(shù)據(jù)結(jié)構(gòu)。假設(shè)某個(gè)函數(shù)的堆棧緊接在在內(nèi)存緩沖區(qū)后面時(shí),其中保存的函數(shù)返回地址就會(huì)與內(nèi)存緩沖區(qū)相鄰。此時(shí),惡意攻擊者就可以向內(nèi)存緩沖區(qū)復(fù)制大量數(shù)據(jù),從而使得內(nèi)存緩沖區(qū)溢出并覆蓋原先保存于堆棧中的函數(shù)返回地址。這樣,函數(shù)的返回地址就被攻擊者換成了他指定的數(shù)值;一旦函數(shù)調(diào)用完畢,就會(huì)繼續(xù)執(zhí)行“函數(shù)返回地址”處的代碼。非但如此,C++ 的某些其它數(shù)據(jù)結(jié)構(gòu),比如 v-table 、例外事件處理程序、函數(shù)指針等,也可能受到類(lèi)似的攻擊。
到此,以上就是小編對(duì)于c語(yǔ)言?xún)?nèi)存溢出原因的問(wèn)題就介紹到這了,希望這3點(diǎn)解答對(duì)大家有用。
網(wǎng)頁(yè)標(biāo)題:c語(yǔ)言為什么會(huì)溢出?(c語(yǔ)言?xún)?nèi)存溢出如何解決)
URL鏈接:http://m.5511xx.com/article/djojsip.html


咨詢(xún)
建站咨詢(xún)
