亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

淺析C語言編程中的數組越界問題

2020-05-23 14:13:37
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了淺析C語言編程中的數組越界問題,通過內存空間來討論其導致的程序崩潰問題,需要的朋友可以參考下

因為C語言不檢查數組越界,而數組又是我們經常用的數據結構之一,所以程序中經常會遇到數組越界的情況,并且后果輕者讀寫數據不對,重者程序crash。下面我們來分析一下數組越界的情況:

1) 堆中的數組越界

因為堆是我們自己分配的,如果越界,那么會把堆中其他空間的數據給寫掉,或讀取了其他空間的數據,這樣就會導致其他變量的數據變得不對,如果是一個指針的話,那么有可能會引起crash

2) 棧中的數組越界

因為棧是向下增長的,在進入一個函數之前,會先把參數和下一步要執行的指令地址(通過call實現)壓棧,在函數的入口會把ebp壓棧,并把esp賦值給ebp,在函數返回的時候,將ebp值賦給esp,pop先前棧內的上級函數棧的基地址給ebp,恢復原?;?,然后把調用函數之前的壓入棧的指令地址pop出來(通過ret實現)。

棧是由高往低增長的,而數組的存儲是由低位往高位存的 ,如果越界的話,會把當前函數的ebp和下一跳的指令地址覆蓋掉,如果覆蓋了當前函數的ebp,那么在恢復的時候esp就不能指向正確的地方,從而導致未可知的情況,如果下一跳的地址也被覆蓋掉,那么肯定會導致crash。

-------------------------

壓入的參數和函數指針

-------------------------

aa[4]

aa[3]

合法的數組空間 aa[2]

aa[1]

aa[0]

-------------------------

###sta.c###

 

 
  1. #include <stdio.h> 
  2.  
  3. void f(int ai) 
  4. int aa[5]={1,2,3}; 
  5. int i = 1; 
  6. for (i=0;i<10;i++) 
  7. aa[i]=i; 
  8. printf("f()/n"); 
  9.  
  10. void main() 
  11. f(3); 
  12. printf("ok/n"); 
  13.  
  14.  
  15.  
  16.  
  17.  
  18. ###sta.s### 
  19.  
  20. .file "sta.c" ;說明匯編的源程序 
  21. .section .rodata ;說明以下是只讀數據區 
  22. .LC0: 
  23. .string "f()" ;"f()" 的類型是string,地址為LC0 
  24. .text ;代碼段開始 
  25. .globl f ;f為全局可訪問 
  26. .type f, @function ; f是函數 
  27. f: 
  28. pushl %ebp 
  29. movl %esp, %ebp 
  30. subl $40, %esp 
  31. movl $0, -24(%ebp) 
  32. movl $0, -20(%ebp) 
  33. movl $0, -16(%ebp) 
  34. movl $0, -12(%ebp) 
  35. movl $0, -8(%ebp) 
  36. movl $1, -24(%ebp) 
  37. movl $2, -20(%ebp) 
  38. movl $3, -16(%ebp) 
  39. movl $1, -4(%ebp) 
  40. movl $0, -4(%ebp) 
  41. jmp .L2 
  42. .L3: 
  43. movl -4(%ebp), %edx 
  44. movl -4(%ebp), %eax 
  45. movl %eax, -24(%ebp,%edx,4) 
  46. addl $1, -4(%ebp) 
  47. .L2: 
  48. cmpl $9, -4(%ebp) 
  49. jle .L3 
  50. movl $.LC0, (%esp) 
  51. call puts 
  52. leave 
  53. ret 
  54. .size f, .-f ;用以計算函數f的大小 
  55. .section .rodata 
  56. .LC1: 
  57. .string "ok" 
  58. .text 
  59. .globl main 
  60. .type main, @function 
  61. main: 
  62. leal 4(%esp), %ecx 
  63. andl $-16, %esp 
  64. pushl -4(%ecx) 
  65. pushl %ebp 
  66. movl %esp, %ebp 
  67. pushl %ecx 
  68. subl $4, %esp 
  69. movl $3, (%esp) 
  70. call f 
  71. movl $.LC1, (%esp) 
  72. call puts 
  73. addl $4, %esp 
  74. popl %ecx 
  75. popl %ebp 
  76. leal -4(%ecx), %esp 
  77. ret 
  78. .size main, .-main 
  79. .ident "GCC: (GNU) 4.1.2 20070115 (SUSE Linux)" ;說明是用什么工具編譯的 
  80. .section .note.GNU-stack,"",@progbits 

從main函數開始壓入f函數的參數開始,堆棧的調用情況如下

淺析C語言編程中的數組越界問題

圖1 壓入參數

淺析C語言編程中的數組越界問題

圖二 通過call 命令壓入下一跳地址 IP

淺析C語言編程中的數組越界問題

圖三 函數f 通過pushl %ebp 把 ebp保存起來

淺析C語言編程中的數組越界問題

圖四 函數 f 通過movl %esp, %ebp讓ebp指向esp,這樣esp就可以進行修改,在函數返回的時候用ebp的值對esp進行恢復

淺析C語言編程中的數組越界問題

圖五 函數 f 通過subl $40, %esp 給函數的局部變量預留空間

淺析C語言編程中的數組越界問題

圖六 int數組 aa[5]占用了20個字節的空間,然后 int i占用了4個字節的空間(緊鄰著之前壓入棧的%ebp)

故,如果aa[5]進行賦值,則會把 i 的值覆蓋掉,

如果對aa[6]進行賦值,則會把 棧中的 %ebp 覆蓋掉,那么在函數 f 返回的時候則不能對ebp進行恢復,即main函數的ebp變成了我們覆蓋掉的值,程序不知道會發生什么事情,但因為我們的程序接下來沒有調用棧中的內容,故還是可以運行的。

如果對aa[7]進行賦值,則會把棧中的 %IP 覆蓋掉,在函數 f 返回的時候就不能正確地找到下一跳的地址,會crash;


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产黑人绿帽在线第一区| 日韩在线播放av| 日韩精品中文字幕在线播放| 成人精品一区二区三区电影免费| 欧美精品性视频| 国产精品96久久久久久| 中文字幕亚洲情99在线| 国产在线精品播放| 在线观看欧美www| 国产精品久久久久久亚洲影视| 欧美极品欧美精品欧美视频| 精品国内自产拍在线观看| 77777少妇光屁股久久一区| 国产精品毛片a∨一区二区三区|国| 久久九九国产精品怡红院| 性色av一区二区三区在线观看| 中文字幕日韩电影| 日韩欧美综合在线视频| 2019中文字幕在线免费观看| 亚洲成成品网站| 91免费高清视频| 国产欧洲精品视频| 成人日韩av在线| 中文字幕成人精品久久不卡| 色yeye香蕉凹凸一区二区av| 久久久极品av| 国产美女主播一区| 欧美黄色片在线观看| 国产在线精品播放| 欧美一区三区三区高中清蜜桃| 精品在线欧美视频| 欧美肥臀大乳一区二区免费视频| 国产精品久久久久久久久久小说| 日本午夜人人精品| 国产亚洲一区二区在线| 国产美女高潮久久白浆| 色综合久久88色综合天天看泰| 国产综合视频在线观看| 国产精品扒开腿做爽爽爽男男| 久久久欧美精品| 51视频国产精品一区二区| 久久久久久91| 欧美激情久久久久久| 日韩a**中文字幕| 亚洲激情在线观看| 美女少妇精品视频| 亚洲在线视频观看| 欧美主播福利视频| 亚洲精品aⅴ中文字幕乱码| 国产精品video| 久久亚洲精品国产亚洲老地址| 国产在线观看91精品一区| 青青草国产精品一区二区| 在线视频中文亚洲| 久久国产精品视频| 国产精品 欧美在线| 久久乐国产精品| 日韩精品久久久久久久玫瑰园| 欧美激情第一页xxx| 日本一区二区三区在线播放| 在线精品高清中文字幕| 国产视频999| 精品亚洲一区二区三区在线播放| 一区二区三区四区精品| 国产免费一区二区三区在线观看| 日韩在线高清视频| 中文在线资源观看视频网站免费不卡| 国产精品日韩在线播放| 在线午夜精品自拍| 久久精品中文字幕| 中文字幕9999| 亚洲精品福利在线观看| 国产精品久久久久一区二区| 国产一区二区三区在线视频| 精品一区二区三区四区在线| 粉嫩老牛aⅴ一区二区三区| 伊人久久久久久久久久| www.亚洲男人天堂| 欧美高清电影在线看| 亚洲精品福利免费在线观看| 欧美与欧洲交xxxx免费观看| 午夜剧场成人观在线视频免费观看| 久久中文久久字幕| 国产免费久久av| 一区二区三区精品99久久| 亚洲欧美精品一区| 亚洲国产精品字幕| 亚洲综合中文字幕在线观看| www.亚洲免费视频| 久久久久日韩精品久久久男男| 久久久国产在线视频| 亚洲成年网站在线观看| 一本大道香蕉久在线播放29| 国产精品第一页在线| 日韩精品视频免费专区在线播放| 午夜伦理精品一区| 欧美激情视频一区二区三区不卡| 91沈先生在线观看| 海角国产乱辈乱精品视频| 欧美天天综合色影久久精品| 中文字幕欧美在线| 国产美女久久精品| 国产+成+人+亚洲欧洲| 欧美极品在线播放| 2020欧美日韩在线视频| 亚洲国产成人精品久久久国产成人一区| 欧美成人免费全部| 亚洲欧美日韩精品久久| 亚洲精品自产拍| 日本高清不卡在线| 欧美www视频在线观看| 国产欧美一区二区| 亚洲一区免费网站| 岛国av午夜精品| 精品一区二区亚洲| 91成人福利在线| 久久久久久久久91| 最好看的2019年中文视频| 国产精品中文字幕久久久| 欧美大片va欧美在线播放| 国产丝袜一区视频在线观看| 国产成人在线视频| 18一19gay欧美视频网站| 欧美激情一区二区三区成人| 韩国精品美女www爽爽爽视频| 亚洲国产毛片完整版| 欧美日韩高清在线观看| 78m国产成人精品视频| 欧美丝袜一区二区三区| 欧美日韩成人在线观看| 九九久久精品一区| 亚洲人成五月天| 欧美日韩成人在线视频| 97久久精品人搡人人玩| 午夜精品久久久久久久99黑人| 在线色欧美三级视频| 日韩在线视频免费观看| 日韩电影在线观看免费| 午夜精品福利电影| 色狠狠av一区二区三区香蕉蜜桃| 国产99视频精品免视看7| 日韩毛片中文字幕| 国产日产欧美a一级在线| 欧美精品videossex性护士| 久久精品视频一| 国产精品一二区| 亚洲一区二区三区毛片| 日本精品va在线观看| 国产精品亚洲欧美导航| 亚洲人成电影网| 91久久精品国产91久久| 国产免费观看久久黄| 欧美极品少妇xxxxⅹ喷水| 日韩视频免费看| 日韩在线欧美在线| 一区二区三区视频免费在线观看| 欧美精品videossex性护士| 亚洲精品日韩丝袜精品| 中文字幕亚洲无线码a| 8x海外华人永久免费日韩内陆视频| 国产精品视频不卡| 国产一区二区日韩| 久久伊人91精品综合网站| 欧美一级片久久久久久久|