關於C語言(VS)中的棧保護機制
棧保護機制(VS軟件)是爲了防止棧溢出而專門設計的一種保護機制。在初始化多個變量,或者初始化數組之後,計算機在棧中開闢內存時,一般會留出“緩衝區”,來降低利用棧溢出漏洞的可能性。
下面我們來看一個非常經典的案例(操作軟件VS2013 Debug版本狀態下):
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("********* ");
}
return 0;
}
運行之後我們會發現一個神奇的現象,它在無限循環。
然而其中的原因就是因爲棧保護機制的觸發。
我們分別將變量i以及數組arr的地址(地址會隨機分配)來看一下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
int i = 0;
int arr[10] = { 0 };
printf("%d\n", &i);
printf("%d,%d\n", &arr[0],&arr[9]);
return 0;
}
我們明顯的能看到&a[9]+12=&i
即數組與變量之間相隔兩個字節,而這兩個字節即爲棧的“緩衝區”。
之所以會無限循環是因爲a[12]=i=0,即在i自增到12時又被置爲0.所以會無限循環。而數組發生越界卻並沒有報錯的原因是程序在執行完之後纔會返回檢查並指出其中的錯誤,而上述的程序在無限循環中顯然沒有執行完畢。
注:
如果將版本改爲Release(面向用戶)版本,程序會正常運行。是因爲這個版本會將程序進行優化與精簡。
如有不足之處請多多見諒