„Puffertúlcsordulás” változatai közötti eltérés

nincs szerkesztési összefoglaló
 
A puffertúlcsordulás kapcsán leggyakrabban a széles körben elterjedt [[C (programozási nyelv)|C]] és a [[C++]] [[programozási nyelv]]eket szokás említeni, mivel ezek nem tartalmaznak beépített védelmet a memória bármilyen területének fölülírása ellen, és a beépített 'buffer' [[Adattípus|típus]] sem végez határellenőrzést.
 
==Technikai leírás==
 
Puffertúlcsordulás akkor történik, amikor egy [[puffer]]be írt [[adat]], a [[határellenőrzés]] hiánya miatt a lefoglalt puffer melletti [[memóriacím]]eken lévő adatokat felülírja. Ez leggyakrabban [[string]]ek egyik pufferből a másikba másolásakor történik.
 
===Példa===
 
A következő példában egy program két, a memóriában egymás mellett elhelyezkedő adatelemet definiált: egy 8 bájt hosszúságú stringpuffert, A-t, és egy kétbájtos egészt, B-t. Kezdetben A csak nulla bájtokat tartalmaz, B pedig a 3-as számot. A példában a stringet alkotó karakterek egybájtosak.
 
{| border="1"
| align="center" colspan="8" bgcolor="#ddddff" | A
| align="center" colspan="2" bgcolor="#ffdddd" | B
|-
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ddddff" | 0
| align="center" width="30" bgcolor="#ffdddd" | 0
| align="center" width="30" bgcolor="#ffdddd" | 3
|}
 
Ezután a program megkísérli a „túlmegyek” stringet eltárolni az A pufferben, [[null karakter]]rel lezárva. A string hosszát nem ellenőrzi a program, így felülírja B értékét:
 
{| border="1"
| align="center" colspan="8" bgcolor="#ddddff" | A
| align="center" colspan="2" bgcolor="#ffdddd" | B
|-
| align="center" width="30" bgcolor="#ddddff" | 't'
| align="center" width="30" bgcolor="#ddddff" | 'ú'
| align="center" width="30" bgcolor="#ddddff" | 'l'
| align="center" width="30" bgcolor="#ddddff" | 'm'
| align="center" width="30" bgcolor="#ddddff" | 'e'
| align="center" width="30" bgcolor="#ddddff" | 'g'
| align="center" width="30" bgcolor="#ddddff" | 'y'
| align="center" width="30" bgcolor="#ddddff" | 'e'
| align="center" width="30" bgcolor="#ddddff" | 'k'
| align="center" width="30" bgcolor="#ddddff" | 0
|}
 
Bár a programozó egyáltalán nem akarta B értékét megváltoztatni, mégis felülírta egy olyan számmal, ami részben egy stringből származik. Ebben a példában, big-endian [[bájtsorrend]]et és [[ASCII]] kódtáblát feltételezve a „k” karakter és a mögötte álló zéró bájt együtt a 27392 számot adja ki. Ha B-n kívül más változót nem használna a program, egy hosszabb, B végén is túlmenő string írásakor valószínűleg hibát okozna, pl. [[segmentation fault]]ot (felszabadított területre mutatási hibát), és a [[processz]] futásának a rendszer véget vetne.
 
==Források==