2012年4月30日 星期一

內存越界檢查 -- GFLAGS

todo: 要使用windows 32 bit 測試,64bits的行為看來併不正常

內存越界檢查 -- GFLAGS

1. 下載 gflags 程式
此程式屬於 Debugging tools for windows的一部分,可選擇下載路徑進行下載。我的電腦因為已經安裝 WinDDK(Windows Driver Development Kit), 所以裡面已經有此程式了,程式所在路徑如下: C:\WinDDK\7600.16385.1\Debuggers
2. 建立一個簡單的測試程式
如下例,陣列長度為10,合理的存取範圍為 0~9,當存取第11個陣列,此時便存取到非法的記憶體區域。
int main(int argc, char* argv[])
{
   char vpTemp[10];
   printf("Normal Operation\n");
   vpTemp[9] = 0x01;
 
   printf("Access violation\n");
   vpTemp[10] = 0x02;   // Access violation 
   printf("Finish Test\n");     
   return 1;
}


3. 執行結果如下:

albertliao@albertliao-nb /d/temp
$ a.exe
Normal Operation
Access violation
Finish Test
此時已經發生內存越界,但是程式仍然執行正常,但其實此時已經在程式碼內埋下一個不定時炸彈了。 


4. 使用 gflags 設定將要檢查此執行檔,可以使用圖型化介面設定或是直接使用命令列模式
4-1 使用命令列模式,參考MSDN說明
       gflags /p /enable a.exe
  • '/p' command enables standard page heap verification for a.exe program. 
  • '/enable'command enable full page heap verification for the a.exe. program
4-2 使用 GUI 設定,此部份細節可參考 MSDN 


5. 再次執行 a.exe,此時程式會 assert ,並且停留在 vpTemp[10] = 0x02 處。


注意:gflags有32與64位元的版本,根據所要執行的程式為32或64位元,需要使用不同版本的 gflags。


參考資料:
http://msdn.microsoft.com/en-us/library/windows/hardware/ff549609(v=vs.85).aspx