數(shù)據(jù)溢出一定存在嗎 int溢出會變成什么?
int溢出會變成什么?從C語言的內(nèi)部處理機(jī)制來看,int類型數(shù)超出范圍(溢出)是一種正?,F(xiàn)象,只會產(chǎn)生錯誤的計(jì)算結(jié)果或邏輯錯誤,不會觸發(fā)數(shù)據(jù)溢出異常。因此,為了避免整數(shù)溢出引起的程序邏輯或計(jì)算錯誤,程
int溢出會變成什么?
從C語言的內(nèi)部處理機(jī)制來看,int類型數(shù)超出范圍(溢出)是一種正?,F(xiàn)象,只會產(chǎn)生錯誤的計(jì)算結(jié)果或邏輯錯誤,不會觸發(fā)數(shù)據(jù)溢出異常。因此,為了避免整數(shù)溢出引起的程序邏輯或計(jì)算錯誤,程序員必須檢測可能的溢出或確保不會有數(shù)據(jù)溢出。C語言處理int類型超出范圍的數(shù)據(jù)只有一個最簡單的原則:截?cái)?,即超出int位長度范圍的高位字節(jié)被自動截?cái)?。例如,假設(shè)int的長度為16位,則如下代碼:int a=0x77ffffl/*由于超出范圍,高位77將被自動截?cái)?,?shí)際a等于0xFFFF*/a/*自動遞增后,將超出范圍,高位1將被截?cái)?,而?shí)際的a=0*/
數(shù)據(jù)溢出是什么意思?
數(shù)據(jù)溢出
在計(jì)算機(jī)中,當(dāng)要表示的數(shù)據(jù)超出計(jì)算機(jī)所用數(shù)據(jù)的表示范圍時,就會發(fā)生數(shù)據(jù)溢出。
溢出原因
如果數(shù)據(jù)類型超過計(jì)算機(jī)字長的限制,將發(fā)生數(shù)據(jù)溢出。內(nèi)存溢出的原因有很多,例如:
(1)使用非類型安全語言(如C/C)。
(2)以不可靠的方式訪問或復(fù)制內(nèi)存緩沖區(qū)。
(3)編譯器設(shè)置的內(nèi)存緩沖區(qū)太接近密鑰數(shù)據(jù)結(jié)構(gòu)。
因子分析
1。內(nèi)存溢出是C語言或C語言固有的缺陷,它不能檢查數(shù)組邊界和類型安全。眾所周知,C/C語言開發(fā)的目標(biāo)代碼非常接近機(jī)器內(nèi)核,因此可以直接訪問內(nèi)存和寄存器。這一特性極大地提高了C/C語言代碼的性能。只要編碼合理,C/C應(yīng)用程序的執(zhí)行效率將優(yōu)于其他高級語言。然而,C/C語言導(dǎo)致內(nèi)存溢出的可能性要高得多。其他語言也有內(nèi)存溢出的問題,但這不是程序員的錯,而是應(yīng)用程序的運(yùn)行時環(huán)境。
2. 當(dāng)應(yīng)用程序讀取用戶(或惡意攻擊者)的數(shù)據(jù)并試圖將其復(fù)制到應(yīng)用程序打開的內(nèi)存緩沖區(qū)中,但無法保證緩沖區(qū)空間時(換句話說,假設(shè)代碼應(yīng)用了一個n字節(jié)的內(nèi)存緩沖區(qū),然后將多個n字節(jié)的數(shù)據(jù)復(fù)制到該緩沖區(qū)中)。內(nèi)存緩沖區(qū)可能溢出。好好想想。如果你把16盎司的水倒進(jìn)一個12盎司的杯子里,那么多出來的4盎司水呢?當(dāng)然,它會充滿了玻璃
!3. 最重要的是,C/C編譯器打開的內(nèi)存緩沖區(qū)通常與重要的數(shù)據(jù)結(jié)構(gòu)相鄰。假設(shè)函數(shù)堆棧緊跟在內(nèi)存緩沖區(qū)之后,則存儲函數(shù)的返回地址將與內(nèi)存緩沖區(qū)相鄰。此時,惡意攻擊者可以將大量數(shù)據(jù)復(fù)制到內(nèi)存緩沖區(qū),使內(nèi)存緩沖區(qū)溢出并覆蓋原來存儲在堆棧中的函數(shù)的返回地址。這樣,函數(shù)的返回地址就會被攻擊者指定的值替換;一旦調(diào)用函數(shù),“函數(shù)返回地址”處的代碼就會繼續(xù)執(zhí)行。不僅如此,C的其他一些數(shù)據(jù)結(jié)構(gòu),如v-table、異常處理程序、函數(shù)指針等,也可能受到類似的攻擊。